source: libs/SAMGAR V2/GUI/server3Gui.h @ 513

Revision 513, 32.3 KB checked in by KDucasse, 9 years ago (diff)
Line 
1
2/*
3Server Gui:
4
5No Cpp file needid for graphics, its all in this header as a class
6
7made one mistep, my first attempted i tryed to acess varibles that could be in conflict due to multiple threads
8through one method (so only mutexed in one place), made the code messy.
9
10Although for connections the varibles themselves are mutexed
11
12Max connections,modules and ports are predefined, makes it easer for memory and speed (scince memory is predefined and speed becouse theres no create/deleate)
13*/
14
15
16
17
18
19
20#include "conio.h"
21#include <math.h>
22#include <QtGui/QApplication>
23#include <QtGui/QMainWindow>
24#include <QtGui/QGridLayout>
25#include <QtGui/QTextEdit>
26#include <QtGui/QPushButton>
27#include <QtGui/QFileDialog>
28#include <QtGui/QMessageBox>
29#include <QtGui/QGraphicsScene>
30#include <QtGui/QGraphicsView>
31#include <QtGui/QSlider>
32#include <QtGui/QLabel>
33#include <QtCore/QMimeData>
34#include <QtGui/QGraphicsItem>
35
36 #include <QtGui/QGraphicsSceneMouseEvent>
37#include <QtGui/QBitmap>
38#include <QtCore/QTime>
39#include <QtCore/QDate>
40#include <QtCore/QTextStream>
41#include <QtCore/QTimer>
42#include <QtGui/QMouseEvent>
43#include <QtGui/QDrag>
44#include <QtGui/QComboBox>
45#include <QtGui/QMenu>
46#include <QtCore/QMutex>
47
48
49#include "string.h"
50#include <stdio.h>
51#include <stdlib.h>
52
53#include <stdio.h>
54#include <stdlib.h>
55
56#include <yarp/os/all.h>
57
58#include <yarp/name/NameServerManager.h>
59#include <yarp/name/BootstrapServer.h>
60
61#include "TripleSourceCreator.h"
62#include "NameServiceOnTriples.h"
63#include "AllocatorOnTriples.h"
64#include "SubscriberOnSql.h"
65#include "ComposedNameService.h"
66#include "ParseName.h"
67
68
69using namespace yarp::os;
70using namespace yarp::name;
71using namespace std;
72//#include <QtGui>
73
74// not using proper lists, only arrays so we can easily preallocated memory
75// so define the max sizes
76
77#define maxmodules 50
78#define maxconns   100
79#define maxports   10
80
81
82using namespace std;
83
84
85//extern Network yarphelp;
86extern int Connecting,Currentconntype,numofconnections;
87extern double connstartx,connstarty,Xshift;
88
89class PortIcon; 
90class SamConnection;
91extern SamConnection TempConnect;
92extern SamConnection SamCons[100];
93
94class SAMdef
95{
96public:
97static const int add_module     = 1;
98static const int online_module  = 2;
99static const int offline_module = 3;
100static const int deleate_module = 4;
101static const int save_modules   = 5;
102static const int load_modules   = 6;
103
104static const int add_connection     =7;
105static const int deleate_connection =8;
106static const int online_connection  =9;
107static const int offline_connection =10;
108};
109
110
111class SamConnection
112{
113public:
114
115
116        PortIcon* GetDad(void)          {QMutexLocker locker(&mutex);return dad;}
117        PortIcon* GetMom(void)          {QMutexLocker locker(&mutex);return mom;}
118        void SetDad(PortIcon *d)        {QMutexLocker locker(&mutex);dad=d;}
119        void SetMom(PortIcon *m)        {QMutexLocker locker(&mutex);mom=m;}
120        int GetConn(void)                       {QMutexLocker locker(&mutex);return conn;}
121        void SetConn(int x)                     {QMutexLocker locker(&mutex);conn=x;}
122        bool GetValid(void)                     {QMutexLocker locker(&mutex);return valid;}
123        void SetValid(bool x)           {QMutexLocker locker(&mutex);valid=x;}
124        bool GetConnected(void)         {QMutexLocker locker(&mutex);return isConnected;}
125        void SetConnected(bool x)       {QMutexLocker locker(&mutex);isConnected=x;}
126
127private:
128mutable QMutex mutex;
129        PortIcon *dad;
130        PortIcon *mom;
131        int conn;
132        bool isConnected;
133        bool valid;
134};
135
136
137class PortIcon : public QGraphicsItem
138{
139private:
140string myName;
141string myRealName;
142string myParentsName;
143mutable QMutex mutex;
144public:
145QPixmap pm;
146int mynum;
147bool IExist;
148bool clicked;
149        PortIcon(void)
150        {
151        IExist = false;
152        }
153
154        PortIcon(string name,string realname)
155        {
156                IExist = true;
157                myName=name;
158                myRealName=realname;
159                mynum = 1;
160                clicked = false;
161             setFlag(QGraphicsItem::ItemIsSelectable, true);
162                 pm.load("Sprites.png");
163                 pm.setMask(pm.createHeuristicMask(true));
164        }
165
166
167        void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget)
168         {
169                        QRectF target2(55+(mynum*95), -33, 100.0, 100.0);
170                        QRectF source2(0, 108.0, 100.0, 100.0);
171                       
172
173                        if(this->isSelected())
174                        {
175                        painter->drawPixmap(target2,pm, source2);
176                        }
177                        else
178                        {
179                        painter->drawPixmap(target2,pm, source2);
180                        }
181                QRectF target3(75+(mynum*95),-25,60,80);
182                QFont font;// = QApplication::font();
183                font.setPixelSize(15);
184                font.setBold(true);
185                painter->setFont( font );
186
187                 QTextOption hey;
188                 hey.setWrapMode(hey.WrapAtWordBoundaryOrAnywhere);
189                 hey.setAlignment(Qt::AlignHCenter|Qt::AlignVCenter  );
190                 painter->drawText(target3,myName.c_str(),hey);
191         }
192
193        QRectF boundingRect() const
194        {
195     qreal adjust = 0.5;
196     return QRectF(45+(mynum*95),-50,110,100);
197         
198        }
199
200 void mousePressEvent(QGraphicsSceneMouseEvent *event)
201        {
202            this->update(this->boundingRect());
203
204                if(Connecting==0) // nothing already connected
205                {
206                connstartx= this->scenePos().rx();
207                connstarty= this->scenePos().ry();
208                Connecting = 1;
209                Xshift = 75+((mynum)*95);
210                TempConnect.SetDad(this);
211                //SamCons[numofconnections].SetDad(this);
212                }
213                else if(Connecting==1)
214                {
215                connstartx= this->scenePos().rx();
216                connstarty= this->scenePos().ry();
217                Connecting=0;
218                TempConnect.SetMom(this);
219                CreateDeleateCons();
220                }
221
222
223        }
224
225void CreateDeleateCons(void)
226{
227
228        //AddAlterConnection
229                bool NewonetoAdd = true;
230                TempConnect.SetConn(Currentconntype);
231               
232                if(TempConnect.GetMom()==TempConnect.GetDad()){puts("I'm sorry, Dave. I'm afraid I can't do that"); return;}// dont allow a port to attach to itself;
233                // check for the connection already existing
234                Bottle cmd,reply;
235                for(int bb =0;bb<maxconns;bb++)
236                {
237                       
238                                if(TempConnect.GetMom()==SamCons[bb].GetMom() && TempConnect.GetDad()==SamCons[bb].GetDad() &&  SamCons[bb].GetValid()==true)
239                                {
240                                        SamCons[bb].SetValid(false);
241                                        SamCons[bb].SetConnected(false);
242                                        NewonetoAdd=false;
243
244
245                                        cmd.clear();
246                                        cmd.addString("unsubscribe");
247                                        cmd.addString(SamCons[bb].GetMom()->GetRealName().c_str());
248                                        cmd.addString(SamCons[bb].GetDad()->GetRealName().c_str());
249                                        //cmd.addString(conny.c_str());
250                                        Network::write(Network::getNameServerContact(),cmd,reply);
251
252                                        Network::disconnect(TempConnect.GetMom()->GetRealName().c_str(),TempConnect.GetDad()->GetRealName().c_str());
253                                }
254                                if(TempConnect.GetDad()==SamCons[bb].GetMom() && TempConnect.GetMom()==SamCons[bb].GetDad() &&  SamCons[bb].GetValid()==true)
255                                {
256                                        SamCons[bb].SetValid(false);
257                                        SamCons[bb].SetConnected(false);
258                                        NewonetoAdd=false;
259
260                                        cmd.clear();
261                                        cmd.addString("unsubscribe");
262                                        cmd.addString(SamCons[bb].GetMom()->GetRealName().c_str());
263                                        cmd.addString(SamCons[bb].GetDad()->GetRealName().c_str());
264                                        //cmd.addString(conny.c_str());
265                                        Network::write(Network::getNameServerContact(),cmd,reply);
266
267                                        Network::disconnect(TempConnect.GetMom()->GetRealName().c_str(),TempConnect.GetDad()->GetRealName().c_str());
268                                }
269
270                }
271
272                this->scene()->update();
273
274                if(NewonetoAdd) // if its a new one
275                {
276
277                for(int bb =0;bb<maxconns;bb++) // find a empty space
278                        {
279                                if(SamCons[bb].GetValid()==false)
280                                {
281                                        SamCons[bb].SetConn(TempConnect.GetConn());// could do = but then wouldn't be thread safe
282                                        SamCons[bb].SetMom(TempConnect.GetMom());
283                                        SamCons[bb].SetDad(TempConnect.GetDad());
284                                        SamCons[bb].SetValid(true);
285                                //      yarphelp.connect
286                                        string conny;
287                                                        if(SamCons[bb].GetConn()==0){conny="udp";}
288                                        else    if(SamCons[bb].GetConn()==1){conny="tcp";}
289                                        else    if(SamCons[bb].GetConn()==2){conny="local";}
290                                        else                                                            {conny="shmem";}
291
292
293                                        Bottle cmd,reply;
294                                        cmd.clear();
295                                        cmd.addString("subscribe");
296                                        cmd.addString(TempConnect.GetMom()->GetRealName().c_str());
297                                        cmd.addString(TempConnect.GetDad()->GetRealName().c_str());
298                                        cmd.addString(conny.c_str());
299                                        Network::write(Network::getNameServerContact(),cmd,reply);
300                                        //Network::connect(TempConnect.GetMom()->myRealName.c_str(),TempConnect.GetDad()->myRealName.c_str(),conny.c_str());
301                                        //Network::connect(TempConnect.GetDad()->myRealName.c_str(),TempConnect.GetMom()->myRealName.c_str(),conny.c_str());
302                                        return;
303                                }
304
305                        }
306                }
307}
308
309
310void SetName(string name){QMutexLocker locker(&mutex);myName=name;}
311void SetRealName(string name){QMutexLocker locker(&mutex);myRealName=name;}
312void SetParentName(string name) {QMutexLocker locker(&mutex);myParentsName=name;}
313string GetName(void){QMutexLocker locker(&mutex);return myName;}
314string GetRealName(void){QMutexLocker locker(&mutex);return myRealName;}
315string GetParentName(void){QMutexLocker locker(&mutex);return myParentsName;}
316};
317
318
319
320
321
322
323
324class ModuleIcon : public QGraphicsItem
325 {
326        public:
327        bool dragOver;
328        bool clicked;
329        bool IsRunning;
330        bool IExist;
331        bool online;
332        double place;
333        PortIcon *firstport[maxports];
334        QPixmap myiconpic;
335        QPixmap Rotatingpic;
336        string myName;
337        int howmanyportsiown;
338
339        ModuleIcon(void)
340        {
341        IExist = false;
342        howmanyportsiown=0;
343        }
344
345     ModuleIcon(string name,string Pname[maxports])
346         {
347                 myName=name;
348                 IExist = true;
349                 IsRunning = false;
350                 online = false;
351                 place = 0;
352                 myiconpic.load("Sprites.png");
353                 Rotatingpic.load("Rotate.png");
354                 myiconpic.setMask(myiconpic.createHeuristicMask());
355                 Rotatingpic.setMask(Rotatingpic.createHeuristicMask());
356
357
358                 for(int bb =0;bb<maxports;bb++)
359                 {
360                         string hh = myName;
361                         if(!Pname[bb].empty())
362                        {
363                                hh.append("_");
364                                hh.append(Pname[bb]);
365                                firstport[bb] = new PortIcon(Pname[bb],hh);
366                                firstport[bb]->setParentItem(this);
367                                firstport[bb]->mynum=bb;
368                                firstport[bb]->SetParentName(myName);
369                                howmanyportsiown=bb;
370                firstport[bb]->IExist=true;
371                        }
372                //       else
373                //      {
374                //              firstport[bb] = new PortIcon("Shouldn't Exist","shouldn't exist");
375                //              firstport[bb]->setParentItem(this);
376        //        firstport[bb]->IExist=false;
377                //      }
378                 }
379    //     firstport = new PortIcon();
380        //       firstport->setParentItem(this);
381
382
383                 this->setAcceptDrops(true);
384                 clicked = false;
385                 setFlag(QGraphicsItem::ItemIsMovable, true);
386                 setFlag(QGraphicsItem::ItemIsSelectable, true);
387
388         }
389 
390
391     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget)
392         {
393
394                QRectF target(-40, -40, 100.0, 100.0);
395                QRectF target2(-50, -50, 100.0, 100.0);
396                QRectF Nsource(2.0, 1.0, 100.0, 100.0);
397                QRectF Ssource(211.0, 0.0, 100.0, 100.0);
398                QRectF Asource(0.0, 0.0, 100.0, 100.0);
399                QRectF Osource(100.0, 100.0, 100.0, 100.0);
400                QRectF SOsource(211.0, 100.0, 100.0, 100.0);
401               
402                        painter->save();
403                        painter->translate( -5,-5 );
404                        painter->rotate( place );
405                        if(IsRunning){ place++;}
406                        if(place>360){place=0;}
407                        painter->drawPixmap(target2,Rotatingpic, Asource);
408                   painter->restore();
409               
410
411
412       
413
414                 if(this->isSelected())
415                {
416                        if(online){painter->drawPixmap(target,myiconpic, Ssource);}
417                        else      {painter->drawPixmap(target,myiconpic, SOsource);}
418                 }
419                 else
420                 {
421                         if(online){painter->drawPixmap(target,myiconpic, Nsource);}
422                         else      {painter->drawPixmap(target,myiconpic, Osource);}
423                 }
424
425
426
427                QRectF target3(-30, -40, 80.0, 80.0);
428                QFont font;// = QApplication::font();
429                font.setPixelSize(15);
430                font.setBold(true);
431                painter->setFont( font );
432
433                 QRect bound(0,0,100,100);
434                 QTextOption hey;
435                 hey.setWrapMode(hey.WrapAtWordBoundaryOrAnywhere);
436                 hey.setAlignment(Qt::AlignHCenter|Qt::AlignVCenter  );
437                 painter->drawText(target3,myName.c_str(),hey);
438
439         }
440        QRectF boundingRect() const
441        {
442     qreal adjust = 0.5;
443     return QRectF(-70,-70,140,140);
444        }
445
446         protected:
447     void advance(int step)
448         {
449                 this->update();
450         }
451
452
453       
454
455 };
456
457
458class LogReadoutWindow : public QWidget
459 {
460    Q_OBJECT
461
462 private:
463         QGridLayout mainLayout;
464         QGridLayout ButtonLayout;
465     QTextEdit *Text;
466         QPushButton *ClearButton;
467         QPushButton *SaveButton;
468         QPushButton *ZoomInButton;
469         QPushButton *ZoomOutButton;
470
471 public:
472     LogReadoutWindow(QWidget *parent = 0)
473         {
474
475
476         ClearButton = new QPushButton("Clear",this);
477         SaveButton  = new QPushButton("Save",this);
478
479
480                 this->resize(200,300);
481                 this->show();
482                 this->setWindowTitle(" SamgarLogWindow");
483
484                 QGridLayout *mainLayout = new QGridLayout; // a layout, using it incase i want to add more later
485                 QGridLayout *ButtonLayout = new QGridLayout;
486
487
488                 Text = new QTextEdit;
489                 Text->setReadOnly(true);
490
491       
492                 //Text->zoomOut
493                 ButtonLayout->addWidget(ClearButton, 0, 0);
494                 ButtonLayout->addWidget(SaveButton, 0, 1);
495                 mainLayout->addLayout(ButtonLayout,0,0);
496             mainLayout->addWidget(Text, 1, 0);
497         setLayout(mainLayout);
498
499PrintHeader();
500
501                 connect(ClearButton, SIGNAL(clicked()),this, SLOT(ClearText()));
502                 connect(SaveButton, SIGNAL(clicked()),this, SLOT(SaveTxt()));
503         }
504
505
506         void WriteToLog(string input,bool Good)
507         {
508                 QTime time = QTime::currentTime();
509             QString timeString = time.toString();
510                 timeString = timeString + ": " + input.c_str();
511                 if(Good){Text->setTextColor(QColor(0,100,0));}
512                 else    {Text->setTextColor(QColor(100,0,0));}
513                 Text->append(timeString);
514         }
515
516         void PrintHeader(void)
517         {
518                QTime StartTime = QTime::currentTime();
519                QDate StartDate = QDate::currentDate();
520                QString header = StartDate.toString() + " " + StartTime.toString();
521                Text->setTextColor(QColor(0,0,0));
522                Text->append(header);
523
524         }
525private slots:
526
527         void ClearText(void)
528         {
529                 Text->clear();
530                PrintHeader();
531         }
532         void SaveTxt(void)
533         {
534
535                // QString nameoffile = StartDate.toString();
536                  QString fileName = QFileDialog::getSaveFileName(Text,"Save Log",QString(),".SAMlog");
537                  QFile file(fileName);
538                  if (!file.open(QFile::WriteOnly | QFile::Text))
539                  {
540          QMessageBox::warning(this, tr("Application"),
541                tr("Cannot write file %1:\n%2.")
542                .arg(fileName)
543                .arg(file.errorString()));
544                  }
545                    QTextStream out(&file);
546                    QApplication::setOverrideCursor(Qt::WaitCursor);
547                        out << Text->toPlainText();
548                        QApplication::restoreOverrideCursor();
549         }
550
551
552 };
553
554class ToolWindow : public QWidget
555 {
556// private:
557Q_OBJECT
558  public:
559 QSlider *ZoomSlider;
560 QLabel  *ZoomLabel;
561 QPushButton *MSave,*MLoad,*About;
562 QWidget *Thanky;
563 QLabel *mylab;
564 QComboBox *contypebox;
565
566        ToolWindow()
567        {
568    resize(50,50);
569        show();
570        setWindowTitle(" Samgar Tool Window");
571
572        ZoomLabel = new QLabel(tr("Zoom"));
573        ZoomSlider = new QSlider(Qt::Horizontal,this);
574        MSave = new QPushButton("Save",this);
575        MLoad = new QPushButton("Load",this);
576    About = new QPushButton("About Us",this);
577        contypebox = new QComboBox(this);
578        contypebox->addItem("UDP (Network,lossy)");
579        contypebox->addItem("TCP (Network,unlossy)");
580        contypebox->addItem("Process(process,unlossy)(use if possible)");
581        contypebox->addItem("Platform(shared mem,unlossy)(unstable)");
582
583
584             ZoomSlider->setTickPosition(QSlider::TicksBothSides);
585         ZoomSlider->setTickInterval(1);
586         ZoomSlider->setSingleStep(1);
587                 ZoomSlider->setMaximum(25);
588                 ZoomSlider->setMinimum(1);
589
590
591         QGridLayout *mainLayout = new QGridLayout; // a layout, using it incase i want to add more later
592         QGridLayout *SLayout = new QGridLayout;
593                 QGridLayout *BLayout = new QGridLayout;
594                 
595                 
596                 SLayout->addWidget(ZoomSlider, 0,1);
597         SLayout->addWidget(ZoomLabel, 0, 0);
598             BLayout->addWidget(MSave,0,0);
599                 BLayout->addWidget(MLoad,0,1);
600               
601                 mainLayout->addLayout(SLayout,0,0);
602                 mainLayout->addLayout(BLayout,1,0);
603                 mainLayout->addWidget(About,3,0);
604                 mainLayout->addWidget(contypebox,2,0);
605         setLayout(mainLayout);
606
607       connect(About, SIGNAL(clicked()),this, SLOT(Thanks()));
608           connect(contypebox, SIGNAL(currentIndexChanged(int)),this, SLOT(connectionchanged(int)));
609
610        // QGridLayout *mainLayout = new QGridLayout;
611
612
613        }
614private slots:
615
616        void connectionchanged(int c)
617        {
618        Currentconntype = c;
619
620        }
621         void Thanks(void)
622         {
623                Thanky = new QWidget();
624                Thanky->setWindowTitle("About");
625                mylab =  new QLabel(Thanky);
626                //mylab->setTextFormat(Qt:
627                //
628                mylab->setAlignment(Qt::AlignHCenter);
629                mylab->setText(" \n \n ******************Samgar V3********************* \n \n Built upon yarp 2.3.0 \n http://eris.liralab.it/yarp/ \n \n \n Thanks to \n \n Supervisors \n Kerstin Dautenhahn \n Steve Ho \n Khenglee Koay \n \n Debuggers \n Fotis Papadopoulos \n Mike Bowler \n \n \n Part of LIREC \n (http://lirec.eu/) \n \n \n Also a special thanks to A.Openshaw : Coffee Fairy \n \n Author K.Du Casse \n K.Du-Casse@herts.ac.uk");
630                Thanky->resize(300,450);
631
632               
633                //mylab.
634
635                Thanky->show();
636
637         }
638
639};
640
641
642
643
644
645
646class MyConnectionView : public QGraphicsView
647 {
648 Q_OBJECT
649
650 private:
651 QGraphicsScene *scene;
652 mutable QMutex mutex;
653 ToolWindow *myToolWindow;
654 
655 ModuleIcon *myModuleIcon[maxmodules];
656 string hh[50];
657 //static string fakenames[10];
658static string fakenames[10];
659 int howmanymodulesexist;
660 int lastnum;
661QTimer timer;
662QGraphicsLineItem *myline1;
663QGraphicsLineItem *myline2;
664QGraphicsLineItem *myline3;
665
666QGraphicsLineItem *myCline1[100];
667QGraphicsLineItem *myCline2[100];
668QGraphicsLineItem *myCline3[100];
669
670 //int ConnectionStatusSAM = 0;// 0 nothing,1 one connected,2 finnished
671 public:
672        LogReadoutWindow *mylogwindow;
673
674
675        MyConnectionView()
676         {
677                for(int gg =0;gg<maxmodules;gg++)
678                {
679                myModuleIcon[gg] = new ModuleIcon();
680                }
681
682        mylogwindow = new LogReadoutWindow();
683       
684        howmanymodulesexist = 0;
685         lastnum =1;
686         myToolWindow = new ToolWindow;
687         QRectF SizeOfMap(QPointF(-1000,-1000),QPointF(1000,1000));
688         scene = new QGraphicsScene();
689
690         scene->setSceneRect(SizeOfMap);
691     scene->setItemIndexMethod(QGraphicsScene::NoIndex);
692
693         myline1 = new QGraphicsLineItem(0,0,1,1);
694         myline1 = scene->addLine(0,0,0,0);
695         myline2 = new QGraphicsLineItem(0,0,1,1);
696         myline2 = scene->addLine(0,0,0,0);
697         myline3 = new QGraphicsLineItem(0,0,1,1);
698         myline3 = scene->addLine(0,0,0,0);
699
700         for(int yu = 0;yu<100;yu++)
701         {
702                myCline1[yu] = new QGraphicsLineItem(0,0,1,1);
703                myCline1[yu] = scene->addLine(0,0,0,0);
704                myCline2[yu] = new QGraphicsLineItem(0,0,1,1);
705                myCline2[yu] = scene->addLine(0,0,0,0);
706                myCline3[yu] = new QGraphicsLineItem(0,0,1,1);
707                myCline3[yu] = scene->addLine(0,0,0,0);
708         }
709
710
711
712         setBackgroundBrush(QPixmap("BackGround.png"));
713
714
715         setScene(scene);
716     setRenderHint(QPainter::Antialiasing);
717     setCacheMode(QGraphicsView::CacheBackground);
718     setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
719     setDragMode(QGraphicsView::ScrollHandDrag);
720     setWindowTitle(QT_TRANSLATE_NOOP(QGraphicsView, "Connection Window"));
721     resize(700, 600);
722         show();
723
724
725     QObject::connect(&timer, SIGNAL(timeout()), scene, SLOT(advance()));
726     QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(updateline()));
727     timer.start(1000 / 100);
728
729
730         connect(myToolWindow->ZoomSlider, SIGNAL(valueChanged(int)), this, SLOT(zoom(int)));
731         connect(myToolWindow->MSave,       SIGNAL(clicked()), this, SLOT(SaveAllM()));
732         connect(myToolWindow->MLoad,       SIGNAL(clicked()), this, SLOT(LoadAllM()));
733
734         }
735       
736
737// everything that alters the state of the modules must go through this, as it will stop thread/interupt clashes
738// also makes it easer to see the flow of data
739        void AddAlterModule(int purpose, string name = " ",string Pnames[10] = fakenames ,int x =0,int y =0,bool online = false,string dadname = "  ",string momname = " ",int conntype = 0,bool start = false,bool isconn = false)
740{
741 QMutexLocker locker(&mutex); // this method can only be processed once, others have to wait or fail,
742 
743
744 if(purpose == SAMdef::add_module)                              {       AddMod(name,Pnames,x,y,online);}
745 else if(purpose ==SAMdef::online_module)               {       OffOnMod(name,true);}
746 else if(purpose ==SAMdef::offline_module)              {       OffOnMod(name,false);}
747 else if(purpose ==SAMdef::deleate_module)              {       DeleateMod(name);}
748 else if(purpose ==SAMdef::save_modules)                {   SaveAllmod2(); }
749 else if(purpose == SAMdef::load_modules)               {       LoadAll2();}
750 else if(purpose == SAMdef::add_connection)             {   CreateConnection(dadname,momname,conntype,start,isconn);}
751 else if(purpose == SAMdef::offline_connection) {       updateconnection(dadname,momname,false,false);}
752 else if(purpose == SAMdef::online_connection)  {       updateconnection(dadname,momname,false,true);}
753 else if(purpose == SAMdef::deleate_connection) {       updateconnection(dadname,momname,true,isconn);}
754
755
756//updateconnection(string d,string m,bool deleate,bool connected)
757}
758
759
760
761
762void DeleateMod(string name)
763{
764string report = name;
765for(int yy =0;yy<maxmodules;yy++)
766        {
767                if(myModuleIcon[yy]->IExist && myModuleIcon[yy]->myName.compare(name)==0) // find one with the right name
768                {
769                        myModuleIcon[yy]->IExist=false;
770                        scene->removeItem(myModuleIcon[yy]);
771                        report.append(" has been deleated ");
772                        mylogwindow->WriteToLog(report,false);
773                        return;
774                }
775        }
776
777}
778
779void OffOnMod(string name,bool online)
780{
781        string report = name;
782 for(int yy =0;yy<maxmodules;yy++)
783        {
784                if(myModuleIcon[yy]->IExist && myModuleIcon[yy]->myName.compare(name)==0) // find one with the right name
785                {
786                        myModuleIcon[yy]->online=online;
787                        if(online==true){report.append(" is now online ");}
788                        else                    {report.append(" is now offline ");}
789                        mylogwindow->WriteToLog(report,online);
790                        //return;
791            }
792        }
793
794        for(int uu =0;uu<maxconns;uu++)
795        {
796
797                if(SamCons[uu].GetValid()) // empty space
798                {
799                        if(name.compare(SamCons[uu].GetDad()->GetParentName())==0){SamCons[uu].SetConnected(false);}
800                        if(name.compare(SamCons[uu].GetMom()->GetParentName())==0){SamCons[uu].SetConnected(false);}
801                }
802        }
803}
804
805void AddMod(string name,string Pnames[10],int x=0,int y=0,bool online = false)
806{
807       
808        string mystring = "module ";
809        mystring.append(name);
810
811        // need to check it doesn't already exist
812for(int yy =0;yy<maxmodules;yy++)
813        {
814        if(myModuleIcon[yy]->IExist) // find a empty one
815                {
816                        if(myModuleIcon[yy]->myName.compare(name)==0)
817                        {
818                                mystring.append(" already exists, will not add to system ");
819                                mylogwindow->WriteToLog(mystring,false);
820                                myModuleIcon[yy]->online=online;
821                        return;
822                        }
823                }
824        }
825// doesn't exist, add one in a available spot
826for(int yy =0;yy<maxmodules;yy++)
827        {
828                if(!myModuleIcon[yy]->IExist) // find a empty one
829                {
830                mystring.append(" has been addid to the system sucsesfully ");
831                mylogwindow->WriteToLog(mystring,true);
832                myModuleIcon[yy]= new ModuleIcon(name,Pnames);
833                scene->addItem(myModuleIcon[yy]);
834                myModuleIcon[yy]->setPos(x,y);
835                myModuleIcon[yy]->online=online;
836                return;
837                }
838        }
839mystring.append(" could not be addid to system, no empty spaces ");
840mylogwindow->WriteToLog(mystring,false);
841
842}
843
844void SaveAllmod2()
845         {
846          QString Fname = QFileDialog::getSaveFileName(this,"Save Log",QString(),".SAMstate");
847          QFile f( Fname );     
848      f.open( QIODevice::WriteOnly );
849          QTextStream out(&f);
850          QString name;
851          QTime StartTime = QTime::currentTime();
852          QDate StartDate = QDate::currentDate();
853          QString header = StartDate.toString() + " " + StartTime.toString();
854         
855          out << "this is the SAMGAR savefile \nCreated: " << header << "\n" << "************************Modules & Ports************* \nModule name,# of ports -1,x,y,ports...\n";
856         
857          for(int hh = 0;hh<maxmodules;hh++)//void*
858          {
859                 if(myModuleIcon[hh]->IExist)
860                        {
861                        name = myModuleIcon[hh]->myName.c_str();
862                        out << "\n"<< name << "," << myModuleIcon[hh]->howmanyportsiown << "," << myModuleIcon[hh]->pos().x() << "," << myModuleIcon[hh]->pos().y() << ",";
863                       
864                        for(int ii=0;ii<=myModuleIcon[hh]->howmanyportsiown;ii++)
865                                {
866                                        name = myModuleIcon[hh]->firstport[ii]->GetName().c_str();
867                                        out << name << ",";
868                                }
869                        }
870          }
871          out << "\n\n******************connections************************** \n\nPort1,Port2,connection type \n"; // new line so we can tell
872         for(int hh =0;hh<maxconns ;hh++)
873         {
874                 if(SamCons[hh].GetValid())
875                 {
876                         out << "\n" << SamCons[hh].GetDad()->GetRealName().c_str() << "," << SamCons[hh].GetMom()->GetRealName().c_str() << "," << SamCons[hh].GetConn() ;
877                 }
878         }
879
880  }
881void LoadAll2(void)
882         {
883          QString filename = QFileDialog::getOpenFileName(this,"Samgar File Load",QString(),".SAMstate");
884      QFile f( filename );
885          f.open( QIODevice::ReadOnly );
886          QTextStream in(&f);
887       
888          QString name;
889          in.readLine(); in.readLine();in.readLine();in.readLine();in.readLine();// ignore first couple of lines cos there for humans
890
891          QString Data = in.readLine(); // get first valid line
892          while(!Data.isEmpty()&&!Data.isNull())
893          {
894                string Pdata[10];// = {" "};
895
896                QStringList list1 = Data.split(",");
897                string name=list1.at(0).toStdString();
898                int x = list1.at(2).toInt();
899                int y = list1.at(3).toInt();
900       
901                for(int zz = 4;zz<list1.size();zz++)
902                        {
903                         Pdata[zz-4]=list1.at(zz).toStdString();
904                        }
905          AddMod(name,Pdata,x,y);
906          Data = in.readLine();
907          }
908        in.readLine(); in.readLine();in.readLine();in.readLine();
909       
910        // load connections // put stuff here to load connections, dont worry about threads as the conns themselves should be thread safe
911
912        Data = in.readLine(); // get first valid line
913         string fake[maxports];
914          while(!Data.isEmpty()&&!Data.isNull())
915          {
916                QStringList list1 = Data.split(",");
917                string dname=list1.at(0).toStdString();
918                string mname=list1.at(1).toStdString();
919                int conntype = list1.at(2).toInt();
920                CreateConnection(dname,mname,conntype,true,false);
921          Data = in.readLine();
922          }
923
924
925        f.close();
926
927         }
928
929void updateconnection(string d,string m,bool deleate,bool connected)
930{
931 //mylogwindow->WriteToLog("looking for connection",true);
932for(int uu =0;uu<maxconns;uu++)
933                 {     
934                         if(SamCons[uu].GetValid()) // empty space
935                         {
936                                 if(d.compare(SamCons[uu].GetDad()->GetRealName())==0 && m.compare(SamCons[uu].GetMom()->GetRealName())==0)
937                                 {
938                                ///      mylogwindow->WriteToLog("found connection",true);
939                                         if(deleate){SamCons[uu].SetValid(false);return;}
940                                         else           {SamCons[uu].SetConnected(connected);return;}
941                                        // SamCons[uu].
942                                 }
943                                 if(m.compare(SamCons[uu].GetDad()->GetRealName())==0 && d.compare(SamCons[uu].GetMom()->GetRealName())==0)
944                                {
945                                        //mylogwindow->WriteToLog("found connection",true);
946                                         if(deleate){SamCons[uu].SetValid(false);return;}
947                                        else            {SamCons[uu].SetConnected(connected);return;}
948                                }
949                         }
950                 }
951
952
953}
954
955
956
957
958void CreateConnection(string d,string m,int conntype,bool startcon,bool iscon)
959         {
960                 if(startcon){}// write actull yarp code to start it
961                SamConnection BuiltCon;
962
963                bool gotmom = false;
964                bool gotdad = false;
965                 QString Dtota = d.c_str();
966                 QString Mtota = m.c_str();
967                 QStringList Dlist = Dtota.split("_");
968                 QStringList Mlist = Mtota.split("_");
969               
970        /*       mylogwindow->WriteToLog("trying to connect",true);
971                 mylogwindow->WriteToLog(d,false);
972                 mylogwindow->WriteToLog(m,false);
973               
974
975                 mylogwindow->WriteToLog(Dlist.at(0).toStdString(),false);
976                 mylogwindow->WriteToLog(Dlist.at(1).toStdString(),false);
977                 mylogwindow->WriteToLog(Mlist.at(0).toStdString(),false);
978                 mylogwindow->WriteToLog(Mlist.at(1).toStdString(),false);
979*/
980                 for(int uu =0;uu<maxmodules;uu++)
981                 {                                                                              // if it exists and has the right name
982                         if(myModuleIcon[uu]->IExist && myModuleIcon[uu]->myName.compare(Dlist.at(0).toStdString())==0)
983                         {
984                        //       mylogwindow->WriteToLog("found dad module",true);
985                                for(int pp=0;pp<myModuleIcon[uu]->howmanyportsiown+1;pp++)
986                                {
987                                        if(myModuleIcon[uu]->firstport[pp]->GetName().compare(Dlist.at(1).toStdString())==0)
988                                        {
989                                                BuiltCon.SetDad(myModuleIcon[uu]->firstport[pp]);
990                                                gotdad=true;
991                                //              mylogwindow->WriteToLog("got dad port",true);
992                                        }
993//
994                                }
995                        }
996                        if(myModuleIcon[uu]->IExist && myModuleIcon[uu]->myName.compare(Mlist.at(0).toStdString())==0)
997                         {
998                        //       mylogwindow->WriteToLog("found mom module",true);
999                                 for(int pp=0;pp<myModuleIcon[uu]->howmanyportsiown+1;pp++)
1000                                {
1001                                        if(myModuleIcon[uu]->firstport[pp]->GetName().compare(Mlist.at(1).toStdString())==0)
1002                                        {
1003                                                BuiltCon.SetMom(myModuleIcon[uu]->firstport[pp]);
1004                                                gotmom=true;
1005                                //              mylogwindow->WriteToLog("got mom port",true);
1006                                        }
1007
1008                                }
1009                        }
1010                 }
1011                for(int uu =0;uu<maxconns;uu++)
1012                 {     
1013                         if(!SamCons[uu].GetValid()&&gotmom&&gotdad) // empty space
1014                         {
1015                                 SamCons[uu].SetConn(conntype);
1016                                 SamCons[uu].SetConnected(iscon);
1017                                 SamCons[uu].SetMom(BuiltCon.GetMom());
1018                                 SamCons[uu].SetDad(BuiltCon.GetDad());
1019                                 SamCons[uu].SetValid(true);
1020                                 string conny;
1021                                                        if(SamCons[uu].GetConn()==0){conny="udp";}
1022                                        else    if(SamCons[uu].GetConn()==1){conny="tcp";}
1023                                        else    if(SamCons[uu].GetConn()==2){conny="local";}
1024                                        else                                                            {conny="shmem";}
1025
1026                                        Bottle cmd,reply;
1027                                        cmd.clear();
1028                                        cmd.addString("subscribe");
1029                                        cmd.addString(BuiltCon.GetMom()->GetRealName().c_str());
1030                                        cmd.addString(BuiltCon.GetDad()->GetRealName().c_str());
1031                                        cmd.addString(conny.c_str());
1032                                        Network::write(Network::getNameServerContact(),cmd,reply);
1033                                        //Network::connect(BuiltCon.GetMom()->GetRealName().c_str(),BuiltCon.GetDad()->GetRealName().c_str(),conny.c_str());
1034                                        //Network::connect(BuiltCon.GetDad()->GetRealName().c_str(),BuiltCon.GetMom()->GetRealName().c_str(),conny.c_str());
1035
1036                                 return;
1037                         }
1038                }
1039
1040                // can just do what you want cause the actull data will be mutexed
1041
1042
1043        }
1044 private slots:
1045
1046        // wanted to save and load from the modules direcly instead of doing it here but QT was a bit funny and i didn't have time
1047
1048        void SaveAllM(void)
1049        {
1050                AddAlterModule(SAMdef::save_modules);
1051        }
1052
1053
1054
1055
1056
1057         void LoadAllM(void)
1058         {
1059                 AddAlterModule(SAMdef::load_modules);
1060         }
1061
1062         void updateline(void)
1063         {
1064                double Sx,Sy,Fx,Fy;
1065
1066                QPen mypenforc;
1067                //stuff draws connections
1068                for(int cc=0;cc<100;cc++)
1069                {
1070
1071                        if(SamCons[cc].GetValid())
1072                        {
1073                                Sx = SamCons[cc].GetDad()->scenePos().rx() + ((SamCons[cc].GetDad()->mynum+1)*100);
1074                                Fx = SamCons[cc].GetMom()->scenePos().rx() + ((SamCons[cc].GetMom()->mynum+1)*100);
1075
1076                                Sy = SamCons[cc].GetDad()->scenePos().ry();
1077                                Fy = SamCons[cc].GetMom()->scenePos().ry();     
1078                               
1079                                mypenforc.setWidth(4);
1080                               
1081                                if(SamCons[cc].GetConnected()) {mypenforc.setStyle(Qt::SolidLine);}
1082                                else                                               {mypenforc.setStyle(Qt::DashLine);}
1083
1084                                if(SamCons[cc].GetConn()==0){mypenforc.setColor(QColor(50,50,50));}
1085                                if(SamCons[cc].GetConn()==1){mypenforc.setColor(QColor(150,50,50));}
1086                                if(SamCons[cc].GetConn()==2){mypenforc.setColor(QColor(50,150,50));}
1087                                if(SamCons[cc].GetConn()==3){mypenforc.setColor(QColor(50,50,150));}
1088
1089
1090                                myCline1[cc]->setPen(mypenforc);
1091                                myCline2[cc]->setPen(mypenforc);
1092                                myCline3[cc]->setPen(mypenforc);
1093                                myCline1[cc]->setLine(Sx,Sy,Sx,((Fy-Sy)/2)+Sy);
1094                                myCline2[cc]->setLine(Sx,((Fy-Sy)/2)+Sy,Fx,((Fy-Sy)/2)+Sy);
1095                                myCline3[cc]->setLine(Fx,((Fy-Sy)/2)+Sy,Fx,Fy);
1096
1097                        }
1098                        else
1099                        {
1100                                myCline1[cc]->setLine(0,0,0,0);
1101                                myCline2[cc]->setLine(0,0,0,0);
1102                                myCline3[cc]->setLine(0,0,0,0);
1103                        }
1104                }
1105
1106       
1107
1108                 /// this stuff is for dynamic drawing of lines if you have started to draw one
1109                 if(Connecting == 1)
1110                 {
1111               
1112
1113                QPen mypen;
1114                mypen.setWidth(5);
1115
1116
1117                if(Currentconntype==0){mypen.setColor(QColor(50,50,50));}
1118                if(Currentconntype==1){mypen.setColor(QColor(150,50,50));}
1119                if(Currentconntype==2){mypen.setColor(QColor(50,150,50));}
1120                if(Currentconntype==3){mypen.setColor(QColor(50,50,150));}
1121                //
1122                myline1->setPen(mypen);
1123                myline2->setPen(mypen);
1124                myline3->setPen(mypen);
1125
1126                double x = this->cursor().pos().rx()-this->pos().rx()-(this->size().width()/2);
1127                double y = this->cursor().pos().ry()-this->pos().ry()-(this->size().height()/2);
1128
1129
1130                 double YoffSet =0;
1131
1132                 if(y>connstarty+25){YoffSet=0;}
1133                 else                           {YoffSet=0;}
1134
1135
1136                 double xdiff = x - (connstartx+Xshift);
1137                 double ydiff = y - (connstarty+YoffSet);
1138
1139                         
1140                 myline1->setLine(connstartx+Xshift,connstarty+YoffSet,connstartx+Xshift,connstarty+YoffSet+(ydiff/2));// straight down but only half value
1141                 myline2->setLine(connstartx+Xshift,connstarty+YoffSet+(ydiff/2),connstartx+Xshift+xdiff,connstarty+YoffSet+(ydiff/2));
1142                 myline3->setLine(connstartx+Xshift+xdiff,connstarty+YoffSet+(ydiff/2),connstartx+Xshift+xdiff,connstarty+YoffSet+(ydiff));
1143
1144
1145                 scene->update();
1146                 }
1147                 else
1148                 {
1149                 myline1->setLine(0,0,0,0);
1150                 myline2->setLine(0,0,0,0);
1151                 myline3->setLine(0,0,0,0);
1152                 }
1153
1154         }
1155
1156         void zoom(int num)     
1157         {
1158                 this->resetTransform();
1159
1160                 double bitty=num/10;
1161                 scale(1/(1+bitty),1/(1+bitty));
1162
1163                 lastnum=num;
1164         
1165         }
1166     void zoomOut(void)     { scale(1 / 1.2, 1 / 1.2); }
1167     void rotateLeft(void)  { rotate(-10); }
1168     void rotateRight(void) { rotate(10); }
1169 };
1170
1171 
Note: See TracBrowser for help on using the repository browser.