diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index 73d2c1f0d..0933f8e7b 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -196,7 +196,7 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags) this->setWindowIcon(QIcon(QString::fromUtf8(":/icons/logo_128.png"))); /* Create all the dialogs of which we only want one instance */ - _bandwidthGraph = new BandwidthGraph(); + _bandwidthGraph = NULL ; #ifdef UNFINISHED applicationWindow = new ApplicationWindow(); @@ -559,7 +559,7 @@ void MainWindow::createTrayIcon() #ifdef ENABLE_WEBUI trayMenu->addAction(QIcon(":/images/emblem-web.png"), tr("Show web interface"), this, SLOT(showWebinterface())); #endif // ENABLE_WEBUI - trayMenu->addAction(QIcon(IMAGE_BWGRAPH), tr("Bandwidth Graph"), _bandwidthGraph, SLOT(showWindow())); + trayMenu->addAction(QIcon(IMAGE_BWGRAPH), tr("Bandwidth Graph"), this, SLOT(showBandwidthGraph())); trayMenu->addAction(QIcon(IMAGE_DHT), tr("Statistics"), this, SLOT(showStatisticsWindow())); @@ -585,6 +585,14 @@ void MainWindow::createTrayIcon() trayIcon->show(); } +void MainWindow::showBandwidthGraph() +{ + if(_bandwidthGraph == NULL) + _bandwidthGraph = new BandwidthGraph(); + + _bandwidthGraph->showWindow(); +} + void MainWindow::createNotifyIcons() { /* create notify icons */ diff --git a/retroshare-gui/src/gui/MainWindow.h b/retroshare-gui/src/gui/MainWindow.h index 9b7d9d08e..0297690ae 100644 --- a/retroshare-gui/src/gui/MainWindow.h +++ b/retroshare-gui/src/gui/MainWindow.h @@ -198,6 +198,7 @@ public slots: //! Go to a specific part of the control panel. void setNewPage(int page); void setCompactStatusMode(bool compact); + void showBandwidthGraph(); void toggleStatusToolTip(bool toggle); protected: diff --git a/retroshare-gui/src/gui/common/RSGraphWidget.cpp b/retroshare-gui/src/gui/common/RSGraphWidget.cpp index e66a57a6d..0a929590a 100644 --- a/retroshare-gui/src/gui/common/RSGraphWidget.cpp +++ b/retroshare-gui/src/gui/common/RSGraphWidget.cpp @@ -102,8 +102,8 @@ QString RSGraphSource::displayValue(float v) const void RSGraphSource::getCumulatedValues(std::vector& vals) const { - for(std::map::const_iterator it = _totals.begin();it!=_totals.end();++it) - vals.push_back(it->second) ; + for(std::map::const_iterator it = _totals.begin();it!=_totals.end();++it) + vals.push_back(it->second.v) ; } void RSGraphSource::getCurrentValues(std::vector& vals) const { @@ -196,10 +196,15 @@ void RSGraphSource::update() lst.push_back(std::make_pair(ms,it->second)) ; - for(std::list >::iterator it2=lst.begin();it2!=lst.end();) + float& total ( _totals[it->first].v ); + + total += it->second ; + + for(std::list >::iterator it2=lst.begin();it2!=lst.end();) // This loop should be very fast, since we only remove the first elements, if applicable. if( ms - (*it2).first > _time_limit_msecs) { //std::cerr << " removing old value with time " << (*it).first/1000.0f << std::endl; + total -= (*it2).second ; it2 = lst.erase(it2) ; } else @@ -210,33 +215,34 @@ void RSGraphSource::update() for(std::map > >::iterator it=_points.begin();it!=_points.end();) if(it->second.empty()) - { - std::map > >::iterator tmp(it) ; - ++tmp; - _points.erase(it) ; - it=tmp ; - } + { + std::map > >::iterator tmp(it) ; + ++tmp; + _totals.erase(it->first) ; + _points.erase(it) ; + it=tmp ; + } else ++it ; - - updateTotals(); } +#ifdef TO_REMOVE void RSGraphSource::updateTotals() { + std::cerr << "RsGraphSource::updateTotals() for " << _points.size() << " values" << std::endl; // now compute totals _totals.clear(); for(std::map > >::const_iterator it(_points.begin());it!=_points.end();++it) { - float& f = _totals[it->first] ; + float& f = _totals[it->first].v ; - f = 0.0f ; for(std::list >::const_iterator it2=it->second.begin();it2!=it->second.end();++it2) f += (*it2).second ; } } +#endif void RSGraphSource::reset() { diff --git a/retroshare-gui/src/gui/common/RSGraphWidget.h b/retroshare-gui/src/gui/common/RSGraphWidget.h index f35b8717e..9e2b41b17 100644 --- a/retroshare-gui/src/gui/common/RSGraphWidget.h +++ b/retroshare-gui/src/gui/common/RSGraphWidget.h @@ -43,6 +43,17 @@ #define RSDHT_COLOR Qt::magenta #define ALLDHT_COLOR Qt::yellow +struct ZeroInitFloat +{ + ZeroInitFloat() { v=0; } + ZeroInitFloat(float f) { v=f; } + + float operator()() const { return v ; } + float& operator()() { return v ; } + + float v ; +}; + // This class provides a source value that the graph can retrieve on demand. // In order to use your own source, derive from RSGraphSource and overload the value() method. // @@ -102,13 +113,15 @@ protected slots: protected: virtual void getValues(std::map& values) const = 0 ;// overload this in your own class to fill in the values you want to display. +#ifdef TO_REMOVE void updateTotals(); +#endif qint64 getTime() const ; // returns time in ms since RS has started // Storage of collected events. The string is any string used to represent the collected data. std::map > > _points ; - std::map _totals ; + std::map _totals ; QTimer *_timer ; diff --git a/retroshare-gui/src/gui/statistics/BWGraph.cpp b/retroshare-gui/src/gui/statistics/BWGraph.cpp index 15405f608..e40826c05 100644 --- a/retroshare-gui/src/gui/statistics/BWGraph.cpp +++ b/retroshare-gui/src/gui/statistics/BWGraph.cpp @@ -88,12 +88,17 @@ void BWGraphSource::update() lst.push_back(std::make_pair(ms,it->second)) ; + float& total(_totals[it->first].v) ; + + total += it->second ; + unused_vals.erase(it->first) ; for(std::list >::iterator it2=lst.begin();it2!=lst.end();) if( ms - (*it2).first > _time_limit_msecs) { //std::cerr << " removing old value with time " << (*it).first/1000.0f << std::endl; + total -=(*it2).second ; it2 = lst.erase(it2) ; } else @@ -114,6 +119,7 @@ void BWGraphSource::update() { std::map > >::iterator tmp(it) ; ++tmp; + _totals.erase(it->first) ; _points.erase(it) ; it=tmp ; } @@ -147,19 +153,31 @@ void BWGraphSource::update() break ; } + _total_duration_seconds = duration/1000.0 ; + // now update the totals, and possibly convert into an average if the unit requires it. - updateTotals(); + // updateTotals(); - if(_current_unit == UNIT_KILOBYTES) - for(std::map::iterator it(_totals.begin());it!=_totals.end();++it) - it->second /= (duration/1000.0) ; + // if(_current_unit == UNIT_KILOBYTES) + // for(std::map::iterator it(_totals.begin());it!=_totals.end();++it) + // it->second.v /= (duration/1000.0) ; #ifdef BWGRAPH_DEBUG std::cerr << "Traffic history has size " << mTrafficHistory.size() << std::endl; #endif } +void BWGraphSource::getCumulatedValues(std::vector& vals) const +{ + if(_current_unit == UNIT_KILOBYTES && _total_duration_seconds > 0.0) + for(std::map::const_iterator it = _totals.begin();it!=_totals.end();++it) + vals.push_back(it->second.v/_total_duration_seconds) ; + else + for(std::map::const_iterator it = _totals.begin();it!=_totals.end();++it) + vals.push_back(it->second.v) ; +} + std::string BWGraphSource::makeSubItemName(uint16_t service_id,uint8_t sub_item_type) const { RsServiceInfoWithNames& s(mServiceInfoMap[service_id]) ; diff --git a/retroshare-gui/src/gui/statistics/BWGraph.h b/retroshare-gui/src/gui/statistics/BWGraph.h index efa4a8a4e..ebf4e417b 100644 --- a/retroshare-gui/src/gui/statistics/BWGraph.h +++ b/retroshare-gui/src/gui/statistics/BWGraph.h @@ -32,6 +32,7 @@ public: // re-derived from RSGraphSource + virtual void getCumulatedValues(std::vector& vals) const; virtual void getValues(std::map& values) const; virtual QString displayValue(float v) const; virtual QString legend(int i,float v,bool show_value=true) const; @@ -67,6 +68,8 @@ private: int _friend_graph_type ; int _service_graph_type ; + float _total_duration_seconds ; + RsPeerId _current_selected_friend ; uint16_t _current_selected_service ; int _current_unit ;