Numbers on gravity scale
[ameter] / ameterwidget.cpp
1 #include <QtCore/QFile>
2 #include <QtGui/QPainter>
3
4 #include <math.h>
5
6 #include "ameterwidget.h"
7
8 qreal g_n = 9.80665;
9 qreal a_max = 2;
10 int  angle_step = 30;
11 int divisions = 4;
12
13 // Smoothing: 0 - none, 1 - light, 2 - medium, 3 - strong
14 int smoothing = 1;
15 qreal smoothing_k[] = {1, 0.5, 0.25, 0.125};
16
17 AMeterWidget::AMeterWidget(QWidget *parent)
18     : QWidget(parent)
19 {
20         // Reciprocal of gravity
21         r_g = 1.0 / g_n;
22         r_a_max = 1.0 / a_max;
23
24         background = 0;
25
26         ax = 0;
27         ay = 0;
28         az = 0;
29
30         bx = 0;
31         by = 0;
32         bz = 0;
33 }
34
35 AMeterWidget::~AMeterWidget()
36 {
37
38 }
39
40 int AMeterWidget::setGravity(qreal g)
41 {
42         // Reciprocal of gravity
43         r_g = 1.0 / g;
44
45         drawScale();
46
47         return 0;
48 }
49
50 // This method is called on every update, keep division operations out
51
52 void AMeterWidget::paintEvent(QPaintEvent *e)
53 {
54         QPainter paint(this);
55         qreal cx, cy, rx, ry;
56         qreal x1, y1, a;
57
58         a = sqrt(ax * ax + ay * ay + az * az);
59
60         if (background)
61         {
62                 paint.drawImage(QPoint(0, 0), *background);
63         }
64
65         paint.setRenderHints(QPainter::Antialiasing);
66
67         cx = width() / 2;
68         cy = height() / 2;
69         rx = cy * r_a_max;
70         ry = cy * r_a_max;
71
72         x1 = cx - ax * rx;
73         y1 = cy + ay * ry;
74
75         paint.setPen(QPen(QBrush(QColor(255, 255, 255, 255)), 3));
76         paint.setBrush(QBrush(QColor(255, 255, 255, 255)));
77         paint.drawEllipse(QPointF(x1, y1), 3, 3);
78         paint.drawLine(QPointF(cx, cy), QPointF(x1, y1));
79 }
80
81 #define DEG2RAD (M_PI / 180.0)
82
83 void AMeterWidget::resizeEvent(QResizeEvent *e)
84 {
85         drawScale();
86 }
87
88 void AMeterWidget::drawScale()
89 {
90         QPainter *paint;
91         QString str;
92         qreal cx, cy, rx, ry, dx, dy;
93         qreal r, a;
94         qreal id = 1.0 / divisions;
95         int i, j;
96
97         if (background)
98         {
99                 delete background;
100                 background = 0;
101         }
102
103         r_a_max = 1.0 / a_max;
104         
105         background = new QImage(size(), QImage::Format_ARGB32);
106         paint = new QPainter(background);
107         paint->setRenderHints(QPainter::Antialiasing);
108
109         cx = width() / 2;
110         cy = height() / 2;
111         
112         if (cx > cy)
113         {
114                 ry = cy * r_a_max;
115                 rx = ry;
116         } else {
117                 rx = cx * r_a_max;
118                 ry = rx;
119         }
120         
121         r = sqrt(cx * cx + cy * cy);
122
123         paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 3));
124
125         paint->drawLine(QPointF(cx, 0), QPointF(cx, cy + cy));
126         paint->drawLine(QPointF(0, cy), QPointF(cx + cx, cy));
127
128         for (i = 0; i * rx < cx; i++)
129         {
130                 paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 3));
131                 if (i > 0)
132                 {
133                         paint->drawEllipse(QPointF(cx, cy), rx * i, ry * i);
134                 }
135
136                 paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 1));
137                 for (j = 0; j < divisions; j++)
138                 {
139                         paint->drawEllipse(QPointF(cx, cy), rx * (i + id * j), ry * (i + id * j));
140                 }
141                 if (i != 0) {
142                         str = QString::number(i) + "g";
143                         paint->setPen(QPen(QBrush(QColor(192, 192, 192, 255)), 1));
144                         paint->drawText(QPointF(cx - rx * i, cy), str);
145                         paint->drawText(QPointF(cx + rx * i, cy), str);
146                         paint->drawText(QPointF(cx, cy - ry * i), str);
147                         paint->drawText(QPointF(cx, cy + ry * i), str);
148                 }
149         }
150
151         for (i = 0; i < 360; i += angle_step)
152         {
153                 a = i * DEG2RAD;
154                 dx = sin(a) * r;
155                 dy = cos(a) * r;
156                 paint->drawLine(QPointF(cx, cy), QPointF(cx + dx, cy + dy));
157         }
158
159     delete paint;
160 }
161
162 bool AMeterWidget::filter(QAccelerometerReading *reading)
163 {
164         qreal k = 1;
165         bx = ax;
166         by = ay;
167         bz = az;
168
169         ax = reading->x() * r_g;
170         ay = reading->y() * r_g;
171         az = reading->z() * r_g;
172
173         if (smoothing > 0 && smoothing < 4)
174         {
175                 k = smoothing_k[smoothing];
176                 ax = ax * k + bx * (1.0 - k);
177                 ay = ay * k + by * (1.0 - k);
178                 az = az * k + bz * (1.0 - k);
179         }
180         
181         update();
182
183         return true;
184 }
185