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

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