1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
/***************************************************************************
statistics.cpp - description
-------------------
begin : Mon Aug 19 2002
copyright : (C) 2002 by Stefan Winter
email : mail@stefan-winter.de
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#include <qwidget.h>
#include <qpainter.h>
#include <klocale.h>
#include "statistics.h"
#include "interface_wireless.h"
Statistics::Statistics (Interface_wireless * device, bool showStatsNoise):QWidget (0,
"KWiFiManager")
{
this->setCaption (i18n ("Statistics - KWiFiManager"));
this->device = device;
this->showStatsNoise = showStatsNoise;
}
void
Statistics::paintEvent (QPaintEvent *)
{
statpainter = new QPainter (this);
QColor farbe (255, 255, 255);
statpainter->drawText (40, 30, i18n ("Noise/Signal Level Statistics"));
statpainter->drawText (150, 260,
i18n ("BLUE = signal level, RED = noise level"));
statpainter->drawLine (41, 244, 41, 260);
statpainter->drawLine (520, 244, 520, 260);
statpainter->drawText (21, 274, i18n ("-240 s"));
statpainter->drawText (510, 274, i18n ("now"));
statpainter->fillRect (41, 41, 480, 201, farbe);
QPointArray datensatz (240);
QPointArray datensatz2 (240);
// we may need to scale the output to fit into the window, so here we
// determine the range of values
int bottom =
(device->sigLevelMin >
device->noiseLevelMin) ? device->noiseLevelMin : device->sigLevelMin;
int top =
(device->sigLevelMax >
device->noiseLevelMax) ? device->sigLevelMax : device->noiseLevelMax;
int datarange = top - bottom;
statpainter->drawText (10, 50, QString ("%1").arg (top));
statpainter->drawText (10, 240, QString ("%1").arg (bottom));
// if values are all below 0, this indicates proper dBm values
if (top < 0) {
statpainter->drawText (2,65, "dBm");
statpainter->drawText (2,255, "dBm");
}
double scaleRatio;
if (datarange != 0)
{
scaleRatio = 200. / datarange;
}
else
{
scaleRatio = 1.;
}
int i = 0;
bool atLeastOneValid = false;
for (int j = device->current; j < device->current + MAX_HISTORY; j++)
{
if (device->valid[j % MAX_HISTORY])
{
atLeastOneValid = true;
datensatz.setPoint (i, 40 + (i * 2),
241 -
(int) (((device->sigLevel[j % MAX_HISTORY] + device->sigLevel[(j-1) % MAX_HISTORY]) / 2 -
bottom) * scaleRatio));
datensatz2.setPoint (i, 40 + (i * 2),
241 -
(int) (((device->noiseLevel[j % MAX_HISTORY] + device->noiseLevel[(j-1) % MAX_HISTORY]) / 2 -
bottom) * scaleRatio));
}
else
{
datensatz.setPoint (i, 40 + (i * 2), 241);
datensatz2.setPoint (i, 40 + (i * 2), 241);
}
i++;
};
// the above point array is only useful if at least one entry has its
// valid flag set. This fact is determined in the iteration before.
// Only paint the point array if there is one valid entry
if (atLeastOneValid)
{
if (showStatsNoise) {
statpainter->setPen (red);
statpainter->drawPolyline (datensatz2, 1);
}
statpainter->setPen (blue);
statpainter->drawPolyline (datensatz, 1);
}
delete statpainter;
}
|