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

Revision 542, 33.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                                        Network::write(Network::getNameServerContact(),cmd,reply);
250                                        cmd.clear();
251                                        cmd.addString("unsubscribe");
252                                        cmd.addString(SamCons[bb].GetDad()->GetRealName().c_str());
253                                        cmd.addString(SamCons[bb].GetMom()->GetRealName().c_str());
254                                        Network::write(Network::getNameServerContact(),cmd,reply);
255                                        Network::disconnect(TempConnect.GetMom()->GetRealName().c_str(),TempConnect.GetDad()->GetRealName().c_str());
256
257                                }
258                                if(TempConnect.GetDad()==SamCons[bb].GetMom() && TempConnect.GetMom()==SamCons[bb].GetDad() &&  SamCons[bb].GetValid()==true)
259                                {
260                                        SamCons[bb].SetValid(false);
261                                        SamCons[bb].SetConnected(false);
262                                        NewonetoAdd=false;
263
264                                        cmd.clear();
265                                        cmd.addString("unsubscribe");
266                                        cmd.addString(SamCons[bb].GetMom()->GetRealName().c_str());
267                                        cmd.addString(SamCons[bb].GetDad()->GetRealName().c_str());
268                                        Network::write(Network::getNameServerContact(),cmd,reply);
269                                        cmd.clear();
270                                        cmd.addString("unsubscribe");
271                                        cmd.addString(SamCons[bb].GetDad()->GetRealName().c_str());
272                                        cmd.addString(SamCons[bb].GetMom()->GetRealName().c_str());
273                                        Network::write(Network::getNameServerContact(),cmd,reply);
274
275                                        Network::disconnect(TempConnect.GetMom()->GetRealName().c_str(),TempConnect.GetDad()->GetRealName().c_str());
276                                }
277
278                }
279
280                this->scene()->update();
281
282                if(NewonetoAdd) // if its a new one
283                {
284
285                for(int bb =0;bb<maxconns;bb++) // find a empty space
286                        {
287                                if(SamCons[bb].GetValid()==false)
288                                {
289                                        SamCons[bb].SetConn(TempConnect.GetConn());// could do = but then wouldn't be thread safe
290                                        SamCons[bb].SetMom(TempConnect.GetMom());
291                                        SamCons[bb].SetDad(TempConnect.GetDad());
292                                        SamCons[bb].SetValid(true);
293                                //      yarphelp.connect
294                                        string conny;
295                                                        if(SamCons[bb].GetConn()==0){conny="udp";}
296                                        else    if(SamCons[bb].GetConn()==1){conny="tcp";}
297                                        else    if(SamCons[bb].GetConn()==2){conny="local";}
298                                        else                                                            {conny="shmem";}
299
300
301                                        Bottle cmd,reply;
302                                        cmd.clear();
303                                        cmd.addString("subscribe");
304                                        cmd.addString(TempConnect.GetMom()->GetRealName().c_str());
305                                        cmd.addString(TempConnect.GetDad()->GetRealName().c_str());
306                                        cmd.addString(conny.c_str());
307                                        Network::write(Network::getNameServerContact(),cmd,reply);
308                                        cmd.clear();
309                                        cmd.addString("subscribe");
310                                        cmd.addString(TempConnect.GetDad()->GetRealName().c_str());
311                                        cmd.addString(TempConnect.GetMom()->GetRealName().c_str());
312                                        cmd.addString(conny.c_str());
313                                        Network::write(Network::getNameServerContact(),cmd,reply);
314                                        //Network::connect(TempConnect.GetMom()->myRealName.c_str(),TempConnect.GetDad()->myRealName.c_str(),conny.c_str());
315                                        //Network::connect(TempConnect.GetDad()->myRealName.c_str(),TempConnect.GetMom()->myRealName.c_str(),conny.c_str());
316                                        return;
317                                }
318
319                        }
320                }
321}
322
323
324void SetName(string name){QMutexLocker locker(&mutex);myName=name;}
325void SetRealName(string name){QMutexLocker locker(&mutex);myRealName=name;}
326void SetParentName(string name) {QMutexLocker locker(&mutex);myParentsName=name;}
327string GetName(void){QMutexLocker locker(&mutex);return myName;}
328string GetRealName(void){QMutexLocker locker(&mutex);return myRealName;}
329string GetParentName(void){QMutexLocker locker(&mutex);return myParentsName;}
330};
331
332
333
334
335
336
337
338class ModuleIcon : public QGraphicsItem
339 {
340        public:
341        bool dragOver;
342        bool clicked;
343        bool IsRunning;
344        bool IExist;
345        bool online;
346        double place;
347        PortIcon *firstport[maxports];
348        QPixmap myiconpic;
349        QPixmap Rotatingpic;
350        string myName;
351        int howmanyportsiown;
352
353        ModuleIcon(void)
354        {
355        IExist = false;
356        howmanyportsiown=0;
357        }
358
359     ModuleIcon(string name,string Pname[maxports])
360         {
361                 myName=name;
362                 IExist = true;
363                 IsRunning = false;
364                 online = false;
365                 place = 0;
366                 myiconpic.load("Sprites.png");
367                 Rotatingpic.load("Rotate.png");
368                 myiconpic.setMask(myiconpic.createHeuristicMask());
369                 Rotatingpic.setMask(Rotatingpic.createHeuristicMask());
370
371
372                 for(int bb =0;bb<maxports;bb++)
373                 {
374                         string hh = myName;
375                         if(!Pname[bb].empty())
376                        {
377                                hh.append("_");
378                                hh.append(Pname[bb]);
379                                firstport[bb] = new PortIcon(Pname[bb],hh);
380                                firstport[bb]->setParentItem(this);
381                                firstport[bb]->mynum=bb;
382                                firstport[bb]->SetParentName(myName);
383                                howmanyportsiown=bb;
384                firstport[bb]->IExist=true;
385                        }
386                //       else
387                //      {
388                //              firstport[bb] = new PortIcon("Shouldn't Exist","shouldn't exist");
389                //              firstport[bb]->setParentItem(this);
390        //        firstport[bb]->IExist=false;
391                //      }
392                 }
393    //     firstport = new PortIcon();
394        //       firstport->setParentItem(this);
395
396
397                 this->setAcceptDrops(true);
398                 clicked = false;
399                 setFlag(QGraphicsItem::ItemIsMovable, true);
400                 setFlag(QGraphicsItem::ItemIsSelectable, true);
401
402         }
403 
404
405     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget)
406         {
407
408                QRectF target(-40, -40, 100.0, 100.0);
409                QRectF target2(-50, -50, 100.0, 100.0);
410                QRectF Nsource(2.0, 1.0, 100.0, 100.0);
411                QRectF Ssource(211.0, 0.0, 100.0, 100.0);
412                QRectF Asource(0.0, 0.0, 100.0, 100.0);
413                QRectF Osource(100.0, 100.0, 100.0, 100.0);
414                QRectF SOsource(211.0, 100.0, 100.0, 100.0);
415               
416                        painter->save();
417                        painter->translate( -5,-5 );
418                        painter->rotate( place );
419                        if(IsRunning){ place++;}
420                        if(place>360){place=0;}
421                        painter->drawPixmap(target2,Rotatingpic, Asource);
422                   painter->restore();
423               
424
425
426       
427
428                 if(this->isSelected())
429                {
430                        if(online){painter->drawPixmap(target,myiconpic, Ssource);}
431                        else      {painter->drawPixmap(target,myiconpic, SOsource);}
432                 }
433                 else
434                 {
435                         if(online){painter->drawPixmap(target,myiconpic, Nsource);}
436                         else      {painter->drawPixmap(target,myiconpic, Osource);}
437                 }
438
439
440
441                QRectF target3(-30, -40, 80.0, 80.0);
442                QFont font;// = QApplication::font();
443                font.setPixelSize(15);
444                font.setBold(true);
445                painter->setFont( font );
446
447                 QRect bound(0,0,100,100);
448                 QTextOption hey;
449                 hey.setWrapMode(hey.WrapAtWordBoundaryOrAnywhere);
450                 hey.setAlignment(Qt::AlignHCenter|Qt::AlignVCenter  );
451                 painter->drawText(target3,myName.c_str(),hey);
452
453         }
454        QRectF boundingRect() const
455        {
456     qreal adjust = 0.5;
457     return QRectF(-70,-70,140,140);
458        }
459
460         protected:
461     void advance(int step)
462         {
463                 this->update();
464         }
465
466
467       
468
469 };
470
471
472class LogReadoutWindow : public QWidget
473 {
474    Q_OBJECT
475
476 private:
477         QGridLayout mainLayout;
478         QGridLayout ButtonLayout;
479     QTextEdit *Text;
480         QPushButton *ClearButton;
481         QPushButton *SaveButton;
482         QPushButton *ZoomInButton;
483         QPushButton *ZoomOutButton;
484
485 public:
486     LogReadoutWindow(QWidget *parent = 0)
487         {
488
489
490         ClearButton = new QPushButton("Clear",this);
491         SaveButton  = new QPushButton("Save",this);
492
493
494                 this->resize(200,300);
495                 this->show();
496                 this->setWindowTitle(" SamgarLogWindow");
497
498                 QGridLayout *mainLayout = new QGridLayout; // a layout, using it incase i want to add more later
499                 QGridLayout *ButtonLayout = new QGridLayout;
500
501
502                 Text = new QTextEdit;
503                 Text->setReadOnly(true);
504
505       
506                 //Text->zoomOut
507                 ButtonLayout->addWidget(ClearButton, 0, 0);
508                 ButtonLayout->addWidget(SaveButton, 0, 1);
509                 mainLayout->addLayout(ButtonLayout,0,0);
510             mainLayout->addWidget(Text, 1, 0);
511         setLayout(mainLayout);
512
513PrintHeader();
514
515                 connect(ClearButton, SIGNAL(clicked()),this, SLOT(ClearText()));
516                 connect(SaveButton, SIGNAL(clicked()),this, SLOT(SaveTxt()));
517         }
518
519
520         void WriteToLog(string input,bool Good)
521         {
522                 QTime time = QTime::currentTime();
523             QString timeString = time.toString();
524                 timeString = timeString + ": " + input.c_str();
525                 if(Good){Text->setTextColor(QColor(0,100,0));}
526                 else    {Text->setTextColor(QColor(100,0,0));}
527                 Text->append(timeString);
528         }
529
530         void PrintHeader(void)
531         {
532                QTime StartTime = QTime::currentTime();
533                QDate StartDate = QDate::currentDate();
534                QString header = StartDate.toString() + " " + StartTime.toString();
535                Text->setTextColor(QColor(0,0,0));
536                Text->append(header);
537
538         }
539private slots:
540
541         void ClearText(void)
542         {
543                 Text->clear();
544                PrintHeader();
545         }
546         void SaveTxt(void)
547         {
548
549                // QString nameoffile = StartDate.toString();
550                  QString fileName = QFileDialog::getSaveFileName(Text,"Save Log",QString(),".SAMlog");
551                  QFile file(fileName);
552                  if (!file.open(QFile::WriteOnly | QFile::Text))
553                  {
554          QMessageBox::warning(this, tr("Application"),
555                tr("Cannot write file %1:\n%2.")
556                .arg(fileName)
557                .arg(file.errorString()));
558                  }
559                    QTextStream out(&file);
560                    QApplication::setOverrideCursor(Qt::WaitCursor);
561                        out << Text->toPlainText();
562                        QApplication::restoreOverrideCursor();
563         }
564
565
566 };
567
568class ToolWindow : public QWidget
569 {
570// private:
571Q_OBJECT
572  public:
573 QSlider *ZoomSlider;
574 QLabel  *ZoomLabel;
575 QPushButton *MSave,*MLoad,*About;
576 QWidget *Thanky;
577 QLabel *mylab;
578 QComboBox *contypebox;
579
580        ToolWindow()
581        {
582    resize(50,50);
583        show();
584        setWindowTitle(" Samgar Tool Window");
585
586        ZoomLabel = new QLabel(tr("Zoom"));
587        ZoomSlider = new QSlider(Qt::Horizontal,this);
588        MSave = new QPushButton("Save",this);
589        MLoad = new QPushButton("Load",this);
590    About = new QPushButton("About Us",this);
591        contypebox = new QComboBox(this);
592        contypebox->addItem("UDP (Network,lossy)");
593        contypebox->addItem("TCP (Network,unlossy)");
594        contypebox->addItem("Process(process,unlossy)(use if possible)");
595        contypebox->addItem("Platform(shared mem,unlossy)(unstable)");
596
597
598             ZoomSlider->setTickPosition(QSlider::TicksBothSides);
599         ZoomSlider->setTickInterval(1);
600         ZoomSlider->setSingleStep(1);
601                 ZoomSlider->setMaximum(25);
602                 ZoomSlider->setMinimum(1);
603
604
605         QGridLayout *mainLayout = new QGridLayout; // a layout, using it incase i want to add more later
606         QGridLayout *SLayout = new QGridLayout;
607                 QGridLayout *BLayout = new QGridLayout;
608                 
609                 
610                 SLayout->addWidget(ZoomSlider, 0,1);
611         SLayout->addWidget(ZoomLabel, 0, 0);
612             BLayout->addWidget(MSave,0,0);
613                 BLayout->addWidget(MLoad,0,1);
614               
615                 mainLayout->addLayout(SLayout,0,0);
616                 mainLayout->addLayout(BLayout,1,0);
617                 mainLayout->addWidget(About,3,0);
618                 mainLayout->addWidget(contypebox,2,0);
619         setLayout(mainLayout);
620
621       connect(About, SIGNAL(clicked()),this, SLOT(Thanks()));
622           connect(contypebox, SIGNAL(currentIndexChanged(int)),this, SLOT(connectionchanged(int)));
623
624        // QGridLayout *mainLayout = new QGridLayout;
625
626
627        }
628private slots:
629
630        void connectionchanged(int c)
631        {
632        Currentconntype = c;
633
634        }
635         void Thanks(void)
636         {
637                Thanky = new QWidget();
638                Thanky->setWindowTitle("About");
639                mylab =  new QLabel(Thanky);
640                //mylab->setTextFormat(Qt:
641                //
642                mylab->setAlignment(Qt::AlignHCenter);
643                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");
644                Thanky->resize(300,450);
645
646               
647                //mylab.
648
649                Thanky->show();
650
651         }
652
653};
654
655
656
657
658
659
660class MyConnectionView : public QGraphicsView
661 {
662 Q_OBJECT
663
664 private:
665 QGraphicsScene *scene;
666 mutable QMutex mutex;
667 ToolWindow *myToolWindow;
668 
669 ModuleIcon *myModuleIcon[maxmodules];
670 string hh[50];
671 //static string fakenames[10];
672static string fakenames[10];
673 int howmanymodulesexist;
674 int lastnum;
675QTimer timer;
676QGraphicsLineItem *myline1;
677QGraphicsLineItem *myline2;
678QGraphicsLineItem *myline3;
679
680QGraphicsLineItem *myCline1[100];
681QGraphicsLineItem *myCline2[100];
682QGraphicsLineItem *myCline3[100];
683
684 //int ConnectionStatusSAM = 0;// 0 nothing,1 one connected,2 finnished
685 public:
686        LogReadoutWindow *mylogwindow;
687
688
689        MyConnectionView()
690         {
691                for(int gg =0;gg<maxmodules;gg++)
692                {
693                myModuleIcon[gg] = new ModuleIcon();
694                }
695
696        mylogwindow = new LogReadoutWindow();
697       
698        howmanymodulesexist = 0;
699         lastnum =1;
700         myToolWindow = new ToolWindow;
701         QRectF SizeOfMap(QPointF(-1000,-1000),QPointF(1000,1000));
702         scene = new QGraphicsScene();
703
704         scene->setSceneRect(SizeOfMap);
705     scene->setItemIndexMethod(QGraphicsScene::NoIndex);
706
707         myline1 = new QGraphicsLineItem(0,0,1,1);
708         myline1 = scene->addLine(0,0,0,0);
709         myline2 = new QGraphicsLineItem(0,0,1,1);
710         myline2 = scene->addLine(0,0,0,0);
711         myline3 = new QGraphicsLineItem(0,0,1,1);
712         myline3 = scene->addLine(0,0,0,0);
713
714         for(int yu = 0;yu<100;yu++)
715         {
716                myCline1[yu] = new QGraphicsLineItem(0,0,1,1);
717                myCline1[yu] = scene->addLine(0,0,0,0);
718                myCline2[yu] = new QGraphicsLineItem(0,0,1,1);
719                myCline2[yu] = scene->addLine(0,0,0,0);
720                myCline3[yu] = new QGraphicsLineItem(0,0,1,1);
721                myCline3[yu] = scene->addLine(0,0,0,0);
722         }
723
724
725
726         setBackgroundBrush(QPixmap("BackGround.png"));
727
728
729         setScene(scene);
730     setRenderHint(QPainter::Antialiasing);
731     setCacheMode(QGraphicsView::CacheBackground);
732     setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
733     setDragMode(QGraphicsView::ScrollHandDrag);
734     setWindowTitle(QT_TRANSLATE_NOOP(QGraphicsView, "Connection Window"));
735     resize(700, 600);
736         show();
737
738
739     QObject::connect(&timer, SIGNAL(timeout()), scene, SLOT(advance()));
740     QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(updateline()));
741     timer.start(1000 / 100);
742
743
744         connect(myToolWindow->ZoomSlider, SIGNAL(valueChanged(int)), this, SLOT(zoom(int)));
745         connect(myToolWindow->MSave,       SIGNAL(clicked()), this, SLOT(SaveAllM()));
746         connect(myToolWindow->MLoad,       SIGNAL(clicked()), this, SLOT(LoadAllM()));
747
748         }
749       
750
751// everything that alters the state of the modules must go through this, as it will stop thread/interupt clashes
752// also makes it easer to see the flow of data
753        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)
754{
755 QMutexLocker locker(&mutex); // this method can only be processed once, others have to wait or fail,
756 
757
758 if(purpose == SAMdef::add_module)                              {       AddMod(name,Pnames,x,y,online);}
759 else if(purpose ==SAMdef::online_module)               {       OffOnMod(name,true);}
760 else if(purpose ==SAMdef::offline_module)              {       OffOnMod(name,false);}
761 else if(purpose ==SAMdef::deleate_module)              {       DeleateMod(name);}
762 else if(purpose ==SAMdef::save_modules)                {   SaveAllmod2(); }
763 else if(purpose == SAMdef::load_modules)               {       LoadAll2();}
764 else if(purpose == SAMdef::add_connection)             {   CreateConnection(dadname,momname,conntype,start,isconn);}
765 else if(purpose == SAMdef::offline_connection) {       updateconnection(dadname,momname,false,false);}
766 else if(purpose == SAMdef::online_connection)  {       updateconnection(dadname,momname,false,true);}
767 else if(purpose == SAMdef::deleate_connection) {       updateconnection(dadname,momname,true,isconn);}
768
769
770//updateconnection(string d,string m,bool deleate,bool connected)
771}
772
773
774
775
776void DeleateMod(string name)
777{
778string report = name;
779for(int yy =0;yy<maxmodules;yy++)
780        {
781                if(myModuleIcon[yy]->IExist && myModuleIcon[yy]->myName.compare(name)==0) // find one with the right name
782                {
783                        myModuleIcon[yy]->IExist=false;
784                        scene->removeItem(myModuleIcon[yy]);
785                        report.append(" has been deleated ");
786                        mylogwindow->WriteToLog(report,false);
787                        return;
788                }
789        }
790
791}
792
793void OffOnMod(string name,bool online)
794{
795        string report = name;
796 for(int yy =0;yy<maxmodules;yy++)
797        {
798                if(myModuleIcon[yy]->IExist && myModuleIcon[yy]->myName.compare(name)==0) // find one with the right name
799                {
800                        myModuleIcon[yy]->online=online;
801                        if(online==true){report.append(" is now online ");}
802                        else                    {report.append(" is now offline ");}
803                        mylogwindow->WriteToLog(report,online);
804                        //return;
805            }
806        }
807
808        for(int uu =0;uu<maxconns;uu++)
809        {
810
811                if(SamCons[uu].GetValid()) // empty space
812                {
813                        if(name.compare(SamCons[uu].GetDad()->GetParentName())==0){SamCons[uu].SetConnected(false);}
814                        if(name.compare(SamCons[uu].GetMom()->GetParentName())==0){SamCons[uu].SetConnected(false);}
815                }
816        }
817}
818
819void AddMod(string name,string Pnames[10],int x=0,int y=0,bool online = false)
820{
821       
822        string mystring = "module ";
823        mystring.append(name);
824
825        // need to check it doesn't already exist
826for(int yy =0;yy<maxmodules;yy++)
827        {
828        if(myModuleIcon[yy]->IExist) // find a empty one
829                {
830                        if(myModuleIcon[yy]->myName.compare(name)==0)
831                        {
832                                mystring.append(" already exists, will not add to system ");
833                                mylogwindow->WriteToLog(mystring,false);
834                                myModuleIcon[yy]->online=online;
835                        return;
836                        }
837                }
838        }
839// doesn't exist, add one in a available spot
840for(int yy =0;yy<maxmodules;yy++)
841        {
842                if(!myModuleIcon[yy]->IExist) // find a empty one
843                {
844                mystring.append(" has been addid to the system sucsesfully ");
845                mylogwindow->WriteToLog(mystring,true);
846                myModuleIcon[yy]= new ModuleIcon(name,Pnames);
847                scene->addItem(myModuleIcon[yy]);
848                myModuleIcon[yy]->setPos(x,y);
849                myModuleIcon[yy]->online=online;
850                return;
851                }
852        }
853mystring.append(" could not be addid to system, no empty spaces ");
854mylogwindow->WriteToLog(mystring,false);
855
856}
857
858void SaveAllmod2()
859         {
860          QString Fname = QFileDialog::getSaveFileName(this,"Save Log",QString(),".SAMstate");
861          QFile f( Fname );     
862      f.open( QIODevice::WriteOnly );
863          QTextStream out(&f);
864          QString name;
865          QTime StartTime = QTime::currentTime();
866          QDate StartDate = QDate::currentDate();
867          QString header = StartDate.toString() + " " + StartTime.toString();
868         
869          out << "this is the SAMGAR savefile \nCreated: " << header << "\n" << "************************Modules & Ports************* \nModule name,# of ports -1,x,y,ports...\n";
870         
871          for(int hh = 0;hh<maxmodules;hh++)//void*
872          {
873                 if(myModuleIcon[hh]->IExist)
874                        {
875                        name = myModuleIcon[hh]->myName.c_str();
876                        out << "\n"<< name << "," << myModuleIcon[hh]->howmanyportsiown << "," << myModuleIcon[hh]->pos().x() << "," << myModuleIcon[hh]->pos().y() << ",";
877                       
878                        for(int ii=0;ii<=myModuleIcon[hh]->howmanyportsiown;ii++)
879                                {
880                                        name = myModuleIcon[hh]->firstport[ii]->GetName().c_str();
881                                        out << name << ",";
882                                }
883                        }
884          }
885          out << "\n\n******************connections************************** \n\nPort1,Port2,connection type \n"; // new line so we can tell
886         for(int hh =0;hh<maxconns ;hh++)
887         {
888                 if(SamCons[hh].GetValid())
889                 {
890                         out << "\n" << SamCons[hh].GetDad()->GetRealName().c_str() << "," << SamCons[hh].GetMom()->GetRealName().c_str() << "," << SamCons[hh].GetConn() ;
891                 }
892         }
893
894  }
895void LoadAll2(void)
896         {
897          QString filename = QFileDialog::getOpenFileName(this,"Samgar File Load",QString(),".SAMstate");
898      QFile f( filename );
899          f.open( QIODevice::ReadOnly );
900          QTextStream in(&f);
901       
902          QString name;
903          in.readLine(); in.readLine();in.readLine();in.readLine();in.readLine();// ignore first couple of lines cos there for humans
904
905          QString Data = in.readLine(); // get first valid line
906          while(!Data.isEmpty()&&!Data.isNull())
907          {
908                string Pdata[10];// = {" "};
909
910                QStringList list1 = Data.split(",");
911                string name=list1.at(0).toStdString();
912                int x = list1.at(2).toInt();
913                int y = list1.at(3).toInt();
914       
915                for(int zz = 4;zz<list1.size();zz++)
916                        {
917                         Pdata[zz-4]=list1.at(zz).toStdString();
918                        }
919          AddMod(name,Pdata,x,y);
920          Data = in.readLine();
921          }
922        in.readLine(); in.readLine();in.readLine();in.readLine();
923       
924        // load connections // put stuff here to load connections, dont worry about threads as the conns themselves should be thread safe
925
926        Data = in.readLine(); // get first valid line
927         string fake[maxports];
928          while(!Data.isEmpty()&&!Data.isNull())
929          {
930                QStringList list1 = Data.split(",");
931                string dname=list1.at(0).toStdString();
932                string mname=list1.at(1).toStdString();
933                int conntype = list1.at(2).toInt();
934                CreateConnection(dname,mname,conntype,true,false);
935          Data = in.readLine();
936          }
937
938
939        f.close();
940
941         }
942
943void updateconnection(string d,string m,bool deleate,bool connected)
944{
945 //mylogwindow->WriteToLog("looking for connection",true);
946for(int uu =0;uu<maxconns;uu++)
947                 {     
948                         if(SamCons[uu].GetValid()) // empty space
949                         {
950                                 if(d.compare(SamCons[uu].GetDad()->GetRealName())==0 && m.compare(SamCons[uu].GetMom()->GetRealName())==0)
951                                 {
952                                ///      mylogwindow->WriteToLog("found connection",true);
953                                         if(deleate){SamCons[uu].SetValid(false);return;}
954                                         else           {SamCons[uu].SetConnected(connected);return;}
955                                        // SamCons[uu].
956                                 }
957                                 if(m.compare(SamCons[uu].GetDad()->GetRealName())==0 && d.compare(SamCons[uu].GetMom()->GetRealName())==0)
958                                {
959                                        //mylogwindow->WriteToLog("found connection",true);
960                                         if(deleate){SamCons[uu].SetValid(false);return;}
961                                        else            {SamCons[uu].SetConnected(connected);return;}
962                                }
963                         }
964                 }
965
966
967}
968
969
970
971
972void CreateConnection(string d,string m,int conntype,bool startcon,bool iscon)
973         {
974                 if(startcon){}// write actull yarp code to start it
975                SamConnection BuiltCon;
976
977                bool gotmom = false;
978                bool gotdad = false;
979                 QString Dtota = d.c_str();
980                 QString Mtota = m.c_str();
981                 QStringList Dlist = Dtota.split("_");
982                 QStringList Mlist = Mtota.split("_");
983               
984        /*       mylogwindow->WriteToLog("trying to connect",true);
985                 mylogwindow->WriteToLog(d,false);
986                 mylogwindow->WriteToLog(m,false);
987               
988
989                 mylogwindow->WriteToLog(Dlist.at(0).toStdString(),false);
990                 mylogwindow->WriteToLog(Dlist.at(1).toStdString(),false);
991                 mylogwindow->WriteToLog(Mlist.at(0).toStdString(),false);
992                 mylogwindow->WriteToLog(Mlist.at(1).toStdString(),false);
993*/
994                 for(int uu =0;uu<maxmodules;uu++)
995                 {                                                                              // if it exists and has the right name
996                         if(myModuleIcon[uu]->IExist && myModuleIcon[uu]->myName.compare(Dlist.at(0).toStdString())==0)
997                         {
998                        //       mylogwindow->WriteToLog("found dad module",true);
999                                for(int pp=0;pp<myModuleIcon[uu]->howmanyportsiown+1;pp++)
1000                                {
1001                                        if(myModuleIcon[uu]->firstport[pp]->GetName().compare(Dlist.at(1).toStdString())==0)
1002                                        {
1003                                                BuiltCon.SetDad(myModuleIcon[uu]->firstport[pp]);
1004                                                gotdad=true;
1005                                //              mylogwindow->WriteToLog("got dad port",true);
1006                                        }
1007//
1008                                }
1009                        }
1010                        if(myModuleIcon[uu]->IExist && myModuleIcon[uu]->myName.compare(Mlist.at(0).toStdString())==0)
1011                         {
1012                        //       mylogwindow->WriteToLog("found mom module",true);
1013                                 for(int pp=0;pp<myModuleIcon[uu]->howmanyportsiown+1;pp++)
1014                                {
1015                                        if(myModuleIcon[uu]->firstport[pp]->GetName().compare(Mlist.at(1).toStdString())==0)
1016                                        {
1017                                                BuiltCon.SetMom(myModuleIcon[uu]->firstport[pp]);
1018                                                gotmom=true;
1019                                //              mylogwindow->WriteToLog("got mom port",true);
1020                                        }
1021
1022                                }
1023                        }
1024                 }
1025                for(int uu =0;uu<maxconns;uu++)
1026                 {     
1027                         if(!SamCons[uu].GetValid()&&gotmom&&gotdad) // empty space
1028                         {
1029                                 SamCons[uu].SetConn(conntype);
1030                                 SamCons[uu].SetConnected(iscon);
1031                                 SamCons[uu].SetMom(BuiltCon.GetMom());
1032                                 SamCons[uu].SetDad(BuiltCon.GetDad());
1033                                 SamCons[uu].SetValid(true);
1034                                 string conny;
1035                                                        if(SamCons[uu].GetConn()==0){conny="udp";}
1036                                        else    if(SamCons[uu].GetConn()==1){conny="tcp";}
1037                                        else    if(SamCons[uu].GetConn()==2){conny="local";}
1038                                        else                                                            {conny="shmem";}
1039
1040                                        Bottle cmd,reply;
1041                                        cmd.clear();
1042                                        cmd.addString("subscribe");
1043                                        cmd.addString(BuiltCon.GetMom()->GetRealName().c_str());
1044                                        cmd.addString(BuiltCon.GetDad()->GetRealName().c_str());
1045                                        cmd.addString(conny.c_str());
1046                                        Network::write(Network::getNameServerContact(),cmd,reply);
1047                                        cmd.clear();
1048                                        cmd.addString("subscribe");
1049                                        cmd.addString(BuiltCon.GetDad()->GetRealName().c_str());
1050                                        cmd.addString(BuiltCon.GetMom()->GetRealName().c_str());
1051                                        cmd.addString(conny.c_str());
1052                                        Network::write(Network::getNameServerContact(),cmd,reply);
1053                                        //Network::connect(BuiltCon.GetMom()->GetRealName().c_str(),BuiltCon.GetDad()->GetRealName().c_str(),conny.c_str());
1054                                        //Network::connect(BuiltCon.GetDad()->GetRealName().c_str(),BuiltCon.GetMom()->GetRealName().c_str(),conny.c_str());
1055
1056                                 return;
1057                         }
1058                }
1059
1060                // can just do what you want cause the actull data will be mutexed
1061
1062
1063        }
1064 private slots:
1065
1066        // 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
1067
1068        void SaveAllM(void)
1069        {
1070                AddAlterModule(SAMdef::save_modules);
1071        }
1072
1073
1074
1075
1076
1077         void LoadAllM(void)
1078         {
1079                 AddAlterModule(SAMdef::load_modules);
1080         }
1081
1082         void updateline(void)
1083         {
1084                double Sx,Sy,Fx,Fy;
1085
1086                QPen mypenforc;
1087                //stuff draws connections
1088                for(int cc=0;cc<100;cc++)
1089                {
1090
1091                        if(SamCons[cc].GetValid())
1092                        {
1093                                Sx = SamCons[cc].GetDad()->scenePos().rx() + ((SamCons[cc].GetDad()->mynum+1)*100);
1094                                Fx = SamCons[cc].GetMom()->scenePos().rx() + ((SamCons[cc].GetMom()->mynum+1)*100);
1095
1096                                Sy = SamCons[cc].GetDad()->scenePos().ry();
1097                                Fy = SamCons[cc].GetMom()->scenePos().ry();     
1098                               
1099                                mypenforc.setWidth(4);
1100                               
1101                                if(SamCons[cc].GetConnected()) {mypenforc.setStyle(Qt::SolidLine);}
1102                                else                                               {mypenforc.setStyle(Qt::DashLine);}
1103
1104                                if(SamCons[cc].GetConn()==0){mypenforc.setColor(QColor(50,50,50));}
1105                                if(SamCons[cc].GetConn()==1){mypenforc.setColor(QColor(150,50,50));}
1106                                if(SamCons[cc].GetConn()==2){mypenforc.setColor(QColor(50,150,50));}
1107                                if(SamCons[cc].GetConn()==3){mypenforc.setColor(QColor(50,50,150));}
1108
1109
1110                                myCline1[cc]->setPen(mypenforc);
1111                                myCline2[cc]->setPen(mypenforc);
1112                                myCline3[cc]->setPen(mypenforc);
1113                                myCline1[cc]->setLine(Sx,Sy,Sx,((Fy-Sy)/2)+Sy);
1114                                myCline2[cc]->setLine(Sx,((Fy-Sy)/2)+Sy,Fx,((Fy-Sy)/2)+Sy);
1115                                myCline3[cc]->setLine(Fx,((Fy-Sy)/2)+Sy,Fx,Fy);
1116
1117                        }
1118                        else
1119                        {
1120                                myCline1[cc]->setLine(0,0,0,0);
1121                                myCline2[cc]->setLine(0,0,0,0);
1122                                myCline3[cc]->setLine(0,0,0,0);
1123                        }
1124                }
1125
1126       
1127
1128                 /// this stuff is for dynamic drawing of lines if you have started to draw one
1129                 if(Connecting == 1)
1130                 {
1131               
1132
1133                QPen mypen;
1134                mypen.setWidth(5);
1135
1136
1137                if(Currentconntype==0){mypen.setColor(QColor(50,50,50));}
1138                if(Currentconntype==1){mypen.setColor(QColor(150,50,50));}
1139                if(Currentconntype==2){mypen.setColor(QColor(50,150,50));}
1140                if(Currentconntype==3){mypen.setColor(QColor(50,50,150));}
1141                //
1142                myline1->setPen(mypen);
1143                myline2->setPen(mypen);
1144                myline3->setPen(mypen);
1145
1146                double x = this->cursor().pos().rx()-this->pos().rx()-(this->size().width()/2);
1147                double y = this->cursor().pos().ry()-this->pos().ry()-(this->size().height()/2);
1148
1149
1150                 double YoffSet =0;
1151
1152                 if(y>connstarty+25){YoffSet=0;}
1153                 else                           {YoffSet=0;}
1154
1155
1156                 double xdiff = x - (connstartx+Xshift);
1157                 double ydiff = y - (connstarty+YoffSet);
1158
1159                         
1160                 myline1->setLine(connstartx+Xshift,connstarty+YoffSet,connstartx+Xshift,connstarty+YoffSet+(ydiff/2));// straight down but only half value
1161                 myline2->setLine(connstartx+Xshift,connstarty+YoffSet+(ydiff/2),connstartx+Xshift+xdiff,connstarty+YoffSet+(ydiff/2));
1162                 myline3->setLine(connstartx+Xshift+xdiff,connstarty+YoffSet+(ydiff/2),connstartx+Xshift+xdiff,connstarty+YoffSet+(ydiff));
1163
1164
1165                 scene->update();
1166                 }
1167                 else
1168                 {
1169                 myline1->setLine(0,0,0,0);
1170                 myline2->setLine(0,0,0,0);
1171                 myline3->setLine(0,0,0,0);
1172                 }
1173
1174         }
1175
1176         void zoom(int num)     
1177         {
1178                 this->resetTransform();
1179
1180                 double bitty=num/10;
1181                 scale(1/(1+bitty),1/(1+bitty));
1182
1183                 lastnum=num;
1184         
1185         }
1186     void zoomOut(void)     { scale(1 / 1.2, 1 / 1.2); }
1187     void rotateLeft(void)  { rotate(-10); }
1188     void rotateRight(void) { rotate(10); }
1189 };
1190
1191 
Note: See TracBrowser for help on using the repository browser.