1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * This program is free software; you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License version 2 as
5  * published by the Free Software Foundation;
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software
14  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15  *
16  * Author: John Abraham <john.abraham.in@gmail.com>
17  */
18 
19 #include "animatorscene.h"
20 #include "animatormode.h"
21 #include "animnode.h"
22 #include "routingxmlparser.h"
23 #include "statisticsconstants.h"
24 #include "statsmode.h"
25 #include "statsview.h"
26 #include "interfacestatsscene.h"
27 #include "routingstatsscene.h"
28 #include "flowmonstatsscene.h"
29 #include "flowmonxmlparser.h"
30 #include "countertablesscene.h"
31 #include "textbubble.h"
32 #include "timevalue.h"
33 
34 
35 #define STATS_ALLOWED_NODES "0:1:2:3:4:5:6:7:8:9"
36 #define STATS_ALLOWED_NODES_WITH 300
37 
38 
39 namespace netanim
40 {
41 
42 StatsMode * pStatsMode = 0;
43 
44 StatsMode *
getInstance()45 StatsMode::getInstance ()
46 {
47   if (!pStatsMode)
48     {
49       pStatsMode = new StatsMode ();
50     }
51   return pStatsMode;
52 }
53 
StatsMode()54 StatsMode::StatsMode ():
55   m_parsingXMLDialog (0),
56   m_fileOpenButton (0),
57   m_qLcdNumber (0),
58   m_simulationTimeSlider (0),
59   m_flowMonFileButton (0),
60   m_statType (StatsMode::IPMAC),
61   m_currentFontSize (10),
62   m_showChart (true)
63 {
64   init ();
65 }
66 
67 QWidget *
getCentralWidget()68 StatsMode::getCentralWidget ()
69 {
70   return m_centralWidget;
71 }
72 
73 QString
getTabName()74 StatsMode::getTabName ()
75 {
76   return "Stats";
77 }
78 
79 qreal
getCurrentTime()80 StatsMode::getCurrentTime ()
81 {
82   return m_currentTime;
83 }
84 
85 void
init()86 StatsMode::init ()
87 {
88   m_state = INIT;
89   initToolbars ();
90 
91   StatsView::getInstance ()->setScene (InterfaceStatsScene::getInstance ());
92   m_hLayout = new QHBoxLayout;
93   m_hLayout->addWidget (m_nodeToolbarScrollArea);
94   m_hLayout->addWidget (StatsView::getInstance ());
95 
96   m_vLayout = new QVBoxLayout;
97   m_vLayout->addWidget (m_topToolbar);
98   m_vLayout->setSpacing (0);
99   m_vLayout->addLayout (m_hLayout);
100   m_vLayout->addWidget (m_bottomToolbar);
101   m_centralWidget = new QWidget;
102   m_centralWidget->setLayout (m_vLayout);
103   setWindowTitle ("NetAnim");
104 
105   statTypeChangedSlot (IPMAC);
106   initControls ();
107 }
108 
109 void
initControls()110 StatsMode::initControls ()
111 {
112   m_fontSizeSpinBox->setValue (STATS_FONTSIZE_DEFAULT);
113 }
114 
115 void
initToolbars()116 StatsMode::initToolbars ()
117 {
118   initNodeToolbar ();
119   initTopToolbar ();
120   initBottomToolbar ();
121 }
122 
123 void
initTopToolbar()124 StatsMode::initTopToolbar ()
125 {
126   m_topToolbar = new QToolBar;
127   m_statTypeComboBox = new QComboBox;
128   m_statTypeComboBox->addItem ("IP-MAC");
129   m_statTypeComboBox->addItem ("Routing");
130   m_statTypeComboBox->addItem ("Flow-monitor");
131   m_statTypeComboBox->addItem ("Counter Tables");
132   m_topToolbar->addWidget (m_statTypeComboBox);
133   m_fileOpenButton = new QToolButton;
134   m_fileOpenButton->setEnabled (false);
135   m_fileOpenButton->setToolTip ("Open Routing XML trace file");
136   m_fileOpenButton->setIcon (QIcon (":/resources/animator_fileopen.svg"));
137   connect (m_fileOpenButton,SIGNAL (clicked ()), this, SLOT (clickRoutingTraceFileOpenSlot ()));
138   m_topToolbar->addWidget (m_fileOpenButton);
139   QSize iconSize (ICON_WIDTH_DEFAULT, ICON_HEIGHT_DEFAULT);
140   m_topToolbar->setIconSize (iconSize);
141 
142   m_simulationTimeSlider = new QSlider (Qt::Horizontal);
143   m_simulationTimeSlider->setToolTip ("Set Simulation Time");
144   m_simulationTimeSlider->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
145   connect (m_simulationTimeSlider, SIGNAL (valueChanged (int)), this, SLOT (updateTimelineSlot (int)));
146 
147 
148   m_qLcdNumber = new QLCDNumber;
149   m_qLcdNumber->setAutoFillBackground (true);
150   m_qLcdNumber->setToolTip ("Current simulation time");
151   m_qLcdNumber->setStyleSheet ("QLCDNumber {background:black; color: black;}");
152 
153   m_simTimeLabel = new QLabel ("Sim Time");
154   m_topToolbar->addWidget (m_simTimeLabel);
155   m_topToolbar->addWidget (m_simulationTimeSlider);
156   m_topToolbar->addWidget (m_qLcdNumber);
157 
158   m_fontSizeLabel = new QLabel ("Font Size");
159   m_fontSizeSpinBox = new QSpinBox;
160   connect (m_fontSizeSpinBox, SIGNAL (valueChanged (int)), this, SLOT (fontSizeSlot (int)));
161   m_fontSizeSpinBox->setRange (1, STATS_FONTSIZE_MAX);
162   m_topToolbar->addWidget (m_fontSizeLabel);
163   m_topToolbar->addWidget (m_fontSizeSpinBox);
164 
165   m_flowMonFileButton = new QPushButton ("FlowMon file");
166   connect (m_flowMonFileButton,SIGNAL (clicked ()), this, SLOT (clickFlowMonTraceFileOpenSlot ()));
167   m_topToolbar->addWidget (m_flowMonFileButton);
168 
169   m_counterTablesCombobox = new QComboBox;
170   connect (m_counterTablesCombobox, SIGNAL(currentIndexChanged(QString)), this, SLOT(counterIndexChangedSlot(QString)));
171   m_topToolbar->addWidget (m_counterTablesCombobox);
172 
173   m_allowedNodesEdit = new QLineEdit;
174   m_allowedNodesEdit->setMaximumWidth (STATS_ALLOWED_NODES_WITH);
175   connect (m_allowedNodesEdit, SIGNAL(textChanged(QString)), this, SLOT(allowedNodesChangedSlot(QString)));
176   m_allowedNodesLabel = new QLabel ("Nodes");
177   m_topToolbar->addWidget (m_allowedNodesLabel);
178   m_topToolbar->addWidget (m_allowedNodesEdit);
179   connect (m_statTypeComboBox, SIGNAL (currentIndexChanged (int)), this, SLOT (statTypeChangedSlot (int)));
180   m_showChartButton = new QPushButton ("Show Table");
181   connect (m_showChartButton, SIGNAL(clicked()), this, SLOT(showChartSlot()));
182   m_topToolbar->addWidget (m_showChartButton);
183 
184 }
185 
186 void
initBottomToolbar()187 StatsMode::initBottomToolbar ()
188 {
189   m_parseProgressBar = new QProgressBar;
190   m_bottomStatusLabel = new QLabel;
191   m_bottomToolbar = new QToolBar;
192   m_bottomToolbar->addWidget (m_bottomStatusLabel);
193   m_bottomToolbar->addWidget (m_parseProgressBar);
194 }
195 
196 
197 void
initNodeToolbar()198 StatsMode::initNodeToolbar ()
199 {
200   m_nodeToolbarScrollArea = new QScrollArea;
201   m_nodeToolbar = new QToolBar;
202   m_nodeToolbar->setOrientation (Qt::Vertical);
203   m_nodeToolbarScrollArea->setVisible (false);
204   m_selectAllNodesButton = new QPushButton ("All");
205   connect (m_selectAllNodesButton, SIGNAL (clicked ()), this, SLOT (selectAllNodesSlot ()));
206   m_deselectAllNodesButton = new QPushButton ("None");
207   connect (m_deselectAllNodesButton, SIGNAL (clicked ()), this, SLOT (deselectAllNodesSlot ()));
208 
209 
210   /* QPushButton * testButton = new QPushButton ("Test");
211    connect (testButton, SIGNAL (clicked ()), this, SLOT (testSlot ()));
212    m_nodeToolbar->addWidget (testButton);
213   */
214 
215 }
216 
217 void
setMaxSimulationTime(double maxTime)218 StatsMode::setMaxSimulationTime (double maxTime)
219 {
220   m_parsedMaxSimulationTime = maxTime;
221   m_simulationTimeSlider->setRange (0, m_parsedMaxSimulationTime * SIMTIME_SLIDER_MULTIPLIER);
222 }
223 
224 void
setMinSimulationTime(double minTime)225 StatsMode::setMinSimulationTime (double minTime)
226 {
227   m_simulationTimeSlider->setRange (minTime * SIMTIME_SLIDER_MULTIPLIER, m_parsedMaxSimulationTime * SIMTIME_SLIDER_MULTIPLIER);
228 }
229 
230 void
setParsingCount(uint64_t parsingCount)231 StatsMode::setParsingCount (uint64_t parsingCount)
232 {
233   m_bottomStatusLabel->setText ("Parsing Count:" + QString::number (parsingCount) + "/" + QString::number (m_rtCount));
234   m_parseProgressBar->setValue (parsingCount);
235 }
236 
237 void
setProgressBarRange(uint64_t rxCount)238 StatsMode::setProgressBarRange (uint64_t rxCount)
239 {
240   m_parseProgressBar->setMaximum (rxCount);
241   m_parseProgressBar->setVisible (true);
242 }
243 
244 void
setFocus(bool focus)245 StatsMode::setFocus (bool focus)
246 {
247   //focus?qDebug (QString ("Stats Focus")):qDebug (QString ("Stats lost Focus"));
248   if (focus)
249     {
250       AnimatorMode::getInstance ()->externalPauseEvent ();
251       InterfaceStatsScene::getInstance ()->reloadContent ();
252       RoutingStatsScene::getInstance ()->reloadContent ();
253       FlowMonStatsScene::getInstance ()->reloadContent ();
254       setAvailableCounters ();
255       if (m_statType == CounterTables)
256         {
257 
258           CounterTablesScene::getInstance ()->reloadContent ();
259         }
260     }
261 }
262 
263 qreal
getCurrentFontSize()264 StatsMode::getCurrentFontSize ()
265 {
266   return m_currentFontSize;
267 }
268 
269 uint32_t
getCurrentNodeCount()270 StatsMode::getCurrentNodeCount ()
271 {
272   if (m_statType == IPMAC)
273     {
274       return AnimNodeMgr::getInstance ()->getCount ();
275     }
276   else if (m_statType == Routing)
277     {
278       return RoutingStatsScene::getInstance ()->getNodeCount ();
279     }
280   else if (m_statType == FlowMon)
281     {
282       return FlowMonStatsScene::getInstance ()->getNodeCount ();
283     }
284   return 0;
285 }
286 
287 void
addNodesToToolbar(bool zeroIndexed)288 StatsMode::addNodesToToolbar (bool zeroIndexed)
289 {
290   m_activeNodes.clear ();
291   m_nodeToolbarScrollArea->setVisible (false);
292   m_hLayout->removeWidget (m_nodeToolbarScrollArea);
293   initNodeToolbar ();
294 
295   uint32_t currentNodeCount = getCurrentNodeCount ();
296   if (!currentNodeCount)
297     {
298       return;
299     }
300   m_nodeButtonVector.clear ();
301   m_nodeToolbar->addWidget (m_selectAllNodesButton);
302   m_nodeToolbar->addWidget (m_deselectAllNodesButton);
303 
304   uint32_t i = 0;
305   if (!zeroIndexed)
306     {
307       ++i;
308     }
309   for (; i < currentNodeCount; ++i)
310     {
311       NodeButton * button = new NodeButton (i);
312       m_nodeButtonVector.push_back (button);
313       m_nodeToolbar->addWidget (button);
314       m_nodeToolbarScrollArea->setVisible (true);
315       if (i<INITIAL_NODES_ENABLED_DEFAULT)
316         {
317           button->click ();
318           button->setChecked (true);
319         }
320     }
321   m_nodeToolbarScrollArea->setWidget (m_nodeToolbar);
322   m_nodeToolbarScrollArea->setMaximumWidth (m_nodeToolbar->width ());
323   m_nodeToolbarScrollArea->setVisible (true);
324   m_nodeToolbarScrollArea->setMaximumHeight (1000);
325   m_hLayout->insertWidget (0, m_nodeToolbarScrollArea);
326 
327 }
328 
329 void
systemReset()330 StatsMode::systemReset ()
331 {
332   m_state = INIT;
333   InterfaceStatsScene::getInstance ()->systemReset ();
334   addNodesToToolbar ();
335   m_state = READY;
336 }
337 
338 void
showParsingXmlDialog(bool show)339 StatsMode::showParsingXmlDialog (bool show)
340 {
341   if (!m_parsingXMLDialog)
342     {
343       m_parsingXMLDialog = new QDialog (this);
344       m_parsingXMLDialog->setWindowTitle ("Parsing XML trace file");
345       QVBoxLayout * vboxLayout = new QVBoxLayout;
346       vboxLayout->addWidget (new QLabel ("Please Wait.Parsing XML trace file"));
347       m_parsingXMLDialog->setLayout (vboxLayout);
348     }
349   if (show)
350     {
351       m_parsingXMLDialog->show ();
352       m_parsingXMLDialog->raise ();
353       m_parsingXMLDialog->activateWindow ();
354     }
355   else
356     {
357       m_parsingXMLDialog->hide ();
358     }
359 }
360 
361 bool
parseRoutingXMLTraceFile(QString traceFileName)362 StatsMode::parseRoutingXMLTraceFile (QString traceFileName)
363 {
364   m_rtCount = 0;
365   RoutingXmlparser parser (traceFileName);
366   if (!parser.isFileValid ())
367     {
368       showPopup ("Trace file is invalid");
369       m_fileOpenButton->setEnabled (true);
370       return false;
371     }
372   routingPreParse ();
373 
374   showParsingXmlDialog (true);
375   m_rtCount = parser.getRtCount ();
376   setProgressBarRange (m_rtCount);
377 
378   parser.doParse ();
379   showParsingXmlDialog (false);
380   setMaxSimulationTime (parser.getMaxSimulationTime ());
381   setMinSimulationTime (parser.getMinSimulationTime ());
382 
383   routingPostParse ();
384   return true;
385 }
386 
387 bool
parseFlowMonXMLTraceFile(QString traceFileName)388 StatsMode::parseFlowMonXMLTraceFile (QString traceFileName)
389 {
390   Q_UNUSED (traceFileName);
391   FlowMonXmlparser parser (traceFileName);
392   if (!parser.isFileValid ())
393     {
394       showPopup ("Trace file is invalid");
395       m_fileOpenButton->setEnabled (true);
396       return false;
397     }
398   flowMonPreParse ();
399   showParsingXmlDialog (true);
400   parser.doParse ();
401   showParsingXmlDialog (false);
402   flowMonPostParse ();
403   return true;
404 }
405 
406 void
showPopup(QString msg)407 StatsMode::showPopup (QString msg)
408 {
409   QMessageBox msgBox;
410   msgBox.setText (msg);
411   msgBox.exec ();
412 }
413 
414 
415 void
routingPostParse()416 StatsMode::routingPostParse ()
417 {
418   m_bottomStatusLabel->setText ("Parsing Complete");
419 
420 }
421 
422 void
routingPreParse()423 StatsMode::routingPreParse ()
424 {
425   m_bottomStatusLabel->setText ("Parsing...Please Wait");
426   m_parseProgressBar->reset ();
427   m_parseProgressBar->setVisible (false);
428 }
429 
430 void
flowMonPostParse()431 StatsMode::flowMonPostParse ()
432 {
433   m_bottomStatusLabel->setText ("Parsing Complete");
434 
435 }
436 
437 void
flowMonPreParse()438 StatsMode::flowMonPreParse ()
439 {
440   m_bottomStatusLabel->setText ("Parsing...Please Wait");
441   m_parseProgressBar->reset ();
442   m_parseProgressBar->setVisible (false);
443 }
444 
445 
446 void
testSlot()447 StatsMode::testSlot ()
448 {
449 
450   for (ActiveNodesMap_t::const_iterator i = m_activeNodes.begin ();
451       i != m_activeNodes.end ();
452       ++i)
453     {
454     }
455 
456 }
457 
458 void
fontSizeSlot(int value)459 StatsMode::fontSizeSlot (int value)
460 {
461   m_currentFontSize = value;
462   RoutingStatsScene::getInstance ()->reloadContent (true);
463   InterfaceStatsScene::getInstance ()->reloadContent (true);
464   FlowMonStatsScene::getInstance ()->reloadContent (true);
465 
466 }
467 
468 void
updateTimelineSlot(int value)469 StatsMode::updateTimelineSlot (int value)
470 {
471   if (value == m_oldTimelineValue)
472     return;
473   m_oldTimelineValue = value;
474   m_currentTime = (qreal)value/SIMTIME_SLIDER_MULTIPLIER;
475   m_qLcdNumber->display (m_currentTime);
476   RoutingStatsScene::getInstance ()->reloadContent ();
477 }
478 
479 void
enableCounterTables(bool enable)480 StatsMode::enableCounterTables (bool enable)
481 {
482   if (m_counterTablesCombobox)
483     {
484       m_counterTablesCombobox->setEnabled (enable);
485       m_counterTablesCombobox->setVisible (enable);
486       m_allowedNodesEdit->setEnabled (enable);
487       m_showChartButton->setEnabled (enable);
488     }
489 
490 }
491 
492 void
enableFlowMonControls(bool enable)493 StatsMode::enableFlowMonControls (bool enable)
494 {
495   if (m_flowMonFileButton)
496     {
497       m_flowMonFileButton->setEnabled (enable);
498       m_flowMonFileButton->setVisible (enable);
499     }
500 }
501 
502 void
setAvailableCounters()503 StatsMode::setAvailableCounters ()
504 {
505   m_counterTablesCombobox->clear ();
506   AnimNodeMgr::CounterIdName_t doubleCounterNames = AnimNodeMgr::getInstance ()->getDoubleCounterNames ();
507   for (AnimNodeMgr::CounterIdName_t::const_iterator i = doubleCounterNames.begin ();
508        i != doubleCounterNames.end ();
509        ++i)
510     {
511       m_counterTablesCombobox->addItem (i->second);
512 
513     }
514   AnimNodeMgr::CounterIdName_t uint32CounterNames = AnimNodeMgr::getInstance ()->getUint32CounterNames ();
515   for (AnimNodeMgr::CounterIdName_t::const_iterator i = uint32CounterNames.begin ();
516        i != uint32CounterNames.end ();
517        ++i)
518     {
519       m_counterTablesCombobox->addItem (i->second);
520     }
521   CounterTablesScene::getInstance ()->setCurrentCounterName (m_counterTablesCombobox->currentText ());
522   uint32_t nodeCount = AnimNodeMgr::getInstance ()->getCount ();
523   QVector <uint32_t> allowedNodes;
524   for (uint32_t i = 0; i < nodeCount; ++i)
525     {
526       //if (i>10)
527       //  break;
528       allowedNodes.push_back (i);
529     }
530   m_allowedNodesEdit->setText (nodeVectorToString (allowedNodes));
531 }
532 
533 
534 void
enableIpMacControls(bool enable)535 StatsMode::enableIpMacControls (bool enable)
536 {
537   Q_UNUSED (enable);
538 }
539 
540 void
enableRoutingStatsControls(bool enable)541 StatsMode::enableRoutingStatsControls (bool enable)
542 {
543   if (m_fileOpenButton)
544     {
545       m_fileOpenButton->setEnabled (enable);
546       m_fileOpenButton->setVisible (enable);
547     }
548   if (m_simulationTimeSlider)
549     {
550       m_simulationTimeSlider->setEnabled (enable);
551       m_simulationTimeSlider->setVisible (enable);
552     }
553   if (m_qLcdNumber)
554     {
555       m_qLcdNumber->setEnabled (enable);
556       m_qLcdNumber->setVisible (enable);
557     }
558 }
559 
560 
561 void
enableControlsForState()562 StatsMode::enableControlsForState ()
563 {
564   enableRoutingStatsControls (false);
565   enableFlowMonControls (false);
566   enableIpMacControls (false);
567   enableCounterTables (false);
568 
569   if (m_statType == Routing)
570     {
571       enableRoutingStatsControls (true);
572     }
573   else if (m_statType == IPMAC)
574     {
575       enableIpMacControls (true);
576 
577     }
578   else if (m_statType == FlowMon)
579     {
580       enableFlowMonControls (true);
581     }
582   else if (m_statType == CounterTables)
583     {
584       enableCounterTables (true);
585     }
586   //m_hLayout->update ();
587 
588 }
589 
590 void
statTypeChangedSlot(int index)591 StatsMode::statTypeChangedSlot (int index)
592 {
593   m_statType = (StatType_t) index;
594   if (!m_nodeButtonVector.empty ())
595     m_nodeToolbar->setVisible (true);
596 
597   if (m_fileOpenButton)
598     {
599       m_fileOpenButton->setEnabled (m_statType == Routing);
600     }
601   if (m_statType == Routing)
602     {
603       StatsView::getInstance ()->setScene (RoutingStatsScene::getInstance ());
604     }
605   else if (m_statType == IPMAC)
606     {
607       StatsView::getInstance ()->setScene (InterfaceStatsScene::getInstance ());
608     }
609   else if (m_statType == FlowMon)
610     {
611       StatsView::getInstance ()->setScene (FlowMonStatsScene::getInstance ());
612     }
613   else if (m_statType == CounterTables)
614     {
615       StatsView::getInstance ()->setScene (CounterTablesScene::getInstance ());
616       m_nodeToolbar->setVisible (false);
617     }
618   enableControlsForState ();
619 }
620 
621 void
selectAllNodesSlot()622 StatsMode::selectAllNodesSlot ()
623 {
624   if (m_nodeButtonVector.empty ())
625     {
626       return;
627     }
628   for (NodeButtonVector_t::const_iterator i = m_nodeButtonVector.begin ();
629       i != m_nodeButtonVector.end ();
630       ++i)
631     {
632       NodeButton * button = *i;
633       button->setChecked (true);
634       button->buttonClickedSlot ();
635     }
636 }
637 
638 
639 void
deselectAllNodesSlot()640 StatsMode::deselectAllNodesSlot ()
641 {
642   if (m_nodeButtonVector.empty ())
643     {
644       return;
645     }
646   for (NodeButtonVector_t::const_iterator i = m_nodeButtonVector.begin ();
647       i != m_nodeButtonVector.end ();
648       ++i)
649     {
650       NodeButton * button = *i;
651       button->setChecked (false);
652       button->buttonClickedSlot ();
653     }
654 }
655 
656 void
clickRoutingTraceFileOpenSlot()657 StatsMode::clickRoutingTraceFileOpenSlot ()
658 {
659   RoutingStatsScene::getInstance ()->systemReset ();
660 
661   QFileDialog fileDialog;
662   fileDialog.setFileMode (QFileDialog::ExistingFiles);
663   QString traceFileName = "";
664   if (fileDialog.exec ())
665     {
666       traceFileName = fileDialog.selectedFiles ().at (0);
667       //qDebug ((traceFileName));
668       if (traceFileName != "")
669         {
670           if (parseRoutingXMLTraceFile (traceFileName))
671             {
672               m_fileOpenButton->setEnabled (true);
673               addNodesToToolbar ();
674             }
675         }
676     }
677   QApplication::processEvents ();
678 
679 }
680 
681 void
clickFlowMonTraceFileOpenSlot()682 StatsMode::clickFlowMonTraceFileOpenSlot ()
683 {
684   FlowMonStatsScene::getInstance ()->systemReset ();
685 
686   QFileDialog fileDialog;
687   fileDialog.setFileMode (QFileDialog::ExistingFiles);
688   QString traceFileName = "";
689   if (fileDialog.exec ())
690     {
691       traceFileName = fileDialog.selectedFiles ().at (0);
692       //qDebug ((traceFileName));
693       if (traceFileName != "")
694         {
695           if (parseFlowMonXMLTraceFile (traceFileName))
696             {
697               m_fileOpenButton->setEnabled (true);
698               addNodesToToolbar (false);
699             }
700         }
701     }
702   QApplication::processEvents ();
703 
704 }
705 
706 void
setNodeActive(uint32_t nodeId,bool active)707 StatsMode::setNodeActive (uint32_t nodeId, bool active)
708 {
709   //qDebug ("NodeId:" + QString::number (nodeId) + QString::number (active));
710   InterfaceStatsScene::getInstance ()->systemReset ();
711   if (m_activeNodes.find (nodeId) == m_activeNodes.end ())
712     {
713       if (active)
714         {
715           m_activeNodes[nodeId] = active;
716         }
717       if (m_state == READY)
718         {
719           InterfaceStatsScene::getInstance ()->reloadContent ();
720         }
721       RoutingStatsScene::getInstance ()->reloadContent ();
722       FlowMonStatsScene::getInstance ()->reloadContent ();
723 
724       return;
725     }
726   if (active)
727     {
728       m_activeNodes[nodeId] = active;
729     }
730   else
731     {
732       m_activeNodes.erase (nodeId);
733     }
734   InterfaceStatsScene::getInstance ()->reloadContent ();
735   RoutingStatsScene::getInstance ()->reloadContent ();
736   FlowMonStatsScene::getInstance ()->reloadContent ();
737 
738 
739 }
740 
741 
742 QVector <uint32_t>
stringToNodeVector(QString nodeString)743 StatsMode::stringToNodeVector (QString nodeString)
744 {
745   QStringList nodes = nodeString.split (":", QString::SkipEmptyParts);
746   QVector <uint32_t> v;
747   foreach (QString s ,nodes)
748     {
749       v.push_back (s.toUInt ());
750     }
751   return v;
752 }
753 
754 QString
nodeVectorToString(QVector<uint32_t> nodeVector)755 StatsMode::nodeVectorToString (QVector<uint32_t> nodeVector)
756 {
757   QString s;
758   for (int i = 0; i < nodeVector.size (); ++i)
759     {
760       s += QString::number (nodeVector[i]) + ":";
761     }
762   return s;
763 }
764 
765 
766 bool
isNodeActive(uint32_t nodeId)767 StatsMode::isNodeActive (uint32_t nodeId)
768 {
769   return (m_activeNodes.find (nodeId)!=m_activeNodes.end ());
770 }
771 
772 void
counterIndexChangedSlot(QString counterString)773 StatsMode::counterIndexChangedSlot (QString counterString)
774 {
775   CounterTablesScene::getInstance ()->setCurrentCounterName (counterString);
776 }
777 
778 
779 void
allowedNodesChangedSlot(QString allowedNodes)780 StatsMode::allowedNodesChangedSlot (QString allowedNodes)
781 {
782   CounterTablesScene::getInstance ()->setAllowedNodesVector (stringToNodeVector (allowedNodes));
783   CounterTablesScene::getInstance ()->reloadContent ();
784 }
785 
786 void
showChartSlot()787 StatsMode::showChartSlot ()
788 {
789   m_showChart = !m_showChart;
790   CounterTablesScene::getInstance ()->showChart (m_showChart);
791   if (m_showChart)
792     m_showChartButton->setText ("Show Table");
793   else
794     m_showChartButton->setText ("Show Chart");
795 }
796 
NodeButton(uint32_t nodeId)797 NodeButton::NodeButton (uint32_t nodeId): QPushButton (QString::number (nodeId)),m_nodeId (nodeId)
798 {
799   connect (this, SIGNAL (clicked ()), this, SLOT (buttonClickedSlot ()));
800   setCheckable (true);
801 }
802 
803 void
buttonClickedSlot()804 NodeButton::buttonClickedSlot ()
805 {
806   setNodeActive (isChecked ());
807 }
808 
809 void
setNodeActive(bool active)810 NodeButton::setNodeActive (bool active)
811 {
812   StatsMode::getInstance ()->setNodeActive (m_nodeId, active);
813 }
814 
815 
816 
817 
818 } // namespace netanim
819