diff options
Diffstat (limited to 'src/knetstatsview.h')
-rw-r--r-- | src/knetstatsview.h | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/src/knetstatsview.h b/src/knetstatsview.h new file mode 100644 index 0000000..e8cc0b8 --- /dev/null +++ b/src/knetstatsview.h @@ -0,0 +1,260 @@ +/*************************************************************************** +* (c) 2015 Timothy Pearson <kb9vqf@pearsoncomputing.net> * +* Copyright (C) 2004-2005 by Hugo Parente Lima * +* hugo_pl@users.sourceforge.net * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the * +* Free Software Foundation, Inc., * +* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * +***************************************************************************/ + +#ifndef KNETSTATSVIEW_H +#define KNETSTATSVIEW_H + +#include <ksystemtray.h> +#include <tqpixmap.h> +#include <tqstringlist.h> +#include <tqcolor.h> + +#include <arpa/inet.h> +#include <linux/netdevice.h> + +class TQTimer; +class TQMouseEvent; +class TQPainter; +class TQPaintEvent; +class Statistics; +class KNetStats; + +/** +* Main class +*/ +class KNetStatsView : public KSystemTray +{ + Q_OBJECT + + + enum { + HISTORY_SIZE = 50, // Speed history buffer size + SPEED_BUFFER_SIZE = 10 // Speed normalization buffer size + }; + +public: + /** + * KNetstats view mode on system tray. + */ + enum Mode { + Icon, Text, Graphic + }; + + /** + * Visualization options. + */ + struct Options { + // general + int mUpdateInterval; + Mode mViewMode; + bool mMonitoring; + // txt view + TQFont mTxtFont; + TQColor mTxtUplColor; + TQColor mTxtDldColor; + // icon view + int mTheme; + // chart view + TQColor mChartUplColor; + TQColor mChartDldColor; + TQColor mChartBgColor; + bool mChartTransparentBackground; + }; + + KNetStatsView(KNetStats* parent, const TQString& interface); + ~KNetStatsView(); + + void say(const TQString& message); + void updateViewOptions(); + // read a value from /sys/class/net/interface/name + unsigned long readInterfaceNumValue(const char* name); + // read a value from /sys/class/net/interface/name + TQString readInterfaceStringValue(const char* name, int maxlength); + TQString getIp(); + TQString getNetmask(); + + const double* speedHistoryRx() const { return mSpeedHistoryRx; } + const double* speedHistoryTx() const { return mSpeedHistoryTx; } + const int historyBufferSize() const { return HISTORY_SIZE; } + const int* historyPointer() const { return &mSpeedHistoryPtr; } + const double* maxSpeed() const { return &mMaxSpeed; } + + /// Return a copy of the current view options. + Options options() const { return mOptions; } + /// read the interface view options + static void readOptions( const TQString& name, Options* opts, bool defaultVisibility = false ); + + /// The current monitored network interface + inline const TQString& interface() const; + /// The current Update Interval in miliseconds + inline int updateInterval() const; + /// We are in textmode? + inline Mode viewMode() const; + + /// Total of bytes receiveds + inline unsigned long totalBytesRx() const; + /// Total of bytes transmitted + inline unsigned long totalBytesTx() const; + /// Total of packets receiveds + inline unsigned long totalPktRx() const; + /// Total of packets transmitted + inline unsigned long totalPktTx() const; + /// RX Speed in bytes per second + inline double byteSpeedRx() const; + /// TX Speed in bytes per second + inline double byteSpeedTx() const; + /// RX Speed in packets per second + inline double pktSpeedRx() const; + /// TX Speed in packets per second + inline double pktSpeedTx() const; + +protected: + void mousePressEvent( TQMouseEvent* ev ); + void paintEvent( TQPaintEvent* ev ); + +private: + + int mFdSock; // Kernel-knetstats socket + struct ifreq mDevInfo; // info struct about our interface + + + TQString mSysDevPath; // Path to the device. + bool mCarrier; // Interface carrier is on? + bool mConnected; // Interface exists? + + TDEPopupMenu* mContextMenu; // Global ContextMenu + Statistics* mStatistics; // Statistics window + TQString mInterface; // Current interface + Options mOptions; // View options + + // Icons + TQPixmap mIconError, mIconNone, mIconTx, mIconRx, mIconBoth; + TQPixmap* mCurrentIcon; // Current state + TQTimer* mTimer; // Timer + + // Rx e Tx to bytes and packets + unsigned long mBRx, mBTx, mPRx, mPTx; + // Statistics + unsigned long mTotalBytesRx, mTotalBytesTx, mTotalPktRx, mTotalPktTx; + // Speed buffers + double mSpeedBufferRx[SPEED_BUFFER_SIZE], mSpeedBufferTx[SPEED_BUFFER_SIZE]; + double mSpeedBufferPRx[SPEED_BUFFER_SIZE], mSpeedBufferPTx[SPEED_BUFFER_SIZE]; + // pointer to current speed buffer position + int mSpeedBufferPtr; + + bool mFirstUpdate; + + // History buffer TODO: Make it configurable! + double mSpeedHistoryRx[HISTORY_SIZE]; + double mSpeedHistoryTx[HISTORY_SIZE]; + int mSpeedHistoryPtr; + double mMaxSpeed; + int mMaxSpeedAge; + + + // setup the view. + void setup(); + void drawText(TQPainter& paint); + void drawGraphic(TQPainter& paint); + // Reset speed and history buffers + void resetBuffers(); + // calc tha max. speed stored in the history buffer + inline void calcMaxSpeed(); + // calc the speed using a speed buffer + inline double calcSpeed(const double* buffer) const; + + bool openFdSocket(); + +private slots: + // Called by the timer to update statistics + void updateStats(); + +}; + +void KNetStatsView::calcMaxSpeed() { + double max = 0.0; + int ptr = mSpeedHistoryPtr; + for (int i = 0; i < HISTORY_SIZE; ++i) { + if (mSpeedHistoryRx[i] > max) { + max = mSpeedHistoryRx[i]; + ptr = i; + } + if (mSpeedHistoryTx[i] > max) { + max = mSpeedHistoryTx[i]; + ptr = i; + } + } + mMaxSpeed = max; + mMaxSpeedAge = (mSpeedHistoryPtr > ptr) ? (mSpeedHistoryPtr - ptr) : (mSpeedHistoryPtr + HISTORY_SIZE - ptr); +} + +double KNetStatsView::calcSpeed(const double* buffer) const { + double total = 0.0; + for (int i = 0; i < SPEED_BUFFER_SIZE; ++i) + total += buffer[i]; + return total/SPEED_BUFFER_SIZE; +} + +const TQString& KNetStatsView::interface() const { + return mInterface; +} + +int KNetStatsView::updateInterval() const { + return mOptions.mUpdateInterval; +} + +KNetStatsView::Mode KNetStatsView::viewMode() const { + return mOptions.mViewMode; +} + +unsigned long KNetStatsView::totalBytesRx() const { + return mTotalBytesRx; +} + +unsigned long KNetStatsView::totalBytesTx() const { + return mTotalBytesTx; +} + +unsigned long KNetStatsView::totalPktRx() const { + return mTotalPktRx; +} + +unsigned long KNetStatsView::totalPktTx() const { + return mTotalPktTx; +} + +double KNetStatsView::byteSpeedRx() const { + return mSpeedHistoryRx[mSpeedHistoryPtr]; +} + +double KNetStatsView::byteSpeedTx() const { + return mSpeedHistoryTx[mSpeedHistoryPtr]; +} + +double KNetStatsView::pktSpeedRx() const { + return calcSpeed(mSpeedBufferPRx); +} + +double KNetStatsView::pktSpeedTx() const { + return calcSpeed(mSpeedBufferPTx); +} + +#endif |