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