Reset indicator when the screen is locked
[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         in_reset = 1;
35 }
36
37 AMeterWidget::~AMeterWidget()
38 {
39
40 }
41
42 int AMeterWidget::setGravity(qreal g)
43 {
44         // Reciprocal of gravity
45         r_g = 1.0 / g;
46
47         drawScale();
48
49         return 0;
50 }
51
52 // This method is called on every update, keep division operations out
53
54 void AMeterWidget::paintEvent(QPaintEvent *e)
55 {
56         QPainter paint(this);
57         qreal cx, cy, rx, ry;
58         qreal x1, y1, a;
59
60         if (background)
61         {
62                 paint.drawImage(QPoint(0, 0), *background);
63         }
64
65         if (in_reset) {
66                 return;
67         }
68
69         a = sqrt(ax * ax + ay * ay + az * az);
70         paint.setRenderHints(QPainter::Antialiasing);
71
72         cx = width() / 2;
73         cy = height() / 2;
74         rx = cy * r_a_max;
75         ry = cy * r_a_max;
76
77         x1 = cx - ax * rx;
78         y1 = cy + ay * ry;
79
80         paint.setPen(QPen(QBrush(QColor(255, 255, 255, 255)), 3));
81         paint.setBrush(QBrush(QColor(255, 255, 255, 255)));
82         paint.drawEllipse(QPointF(x1, y1), 3, 3);
83         paint.drawLine(QPointF(cx, cy), QPointF(x1, y1));
84 }
85
86 #define DEG2RAD (M_PI / 180.0)
87
88 void AMeterWidget::resizeEvent(QResizeEvent *e)
89 {
90         drawScale();
91 }
92
93 void AMeterWidget::drawScale()
94 {
95         QPainter *paint;
96         QString str;
97         qreal cx, cy, rx, ry, dx, dy;
98         qreal r, a;
99         qreal id = 1.0 / divisions;
100         int i, j;
101
102         if (background)
103         {
104                 delete background;
105                 background = 0;
106         }
107
108         r_a_max = 1.0 / a_max;
109         
110         background = new QImage(size(), QImage::Format_ARGB32);
111         paint = new QPainter(background);
112         paint->setRenderHints(QPainter::Antialiasing);
113
114         cx = width() / 2;
115         cy = height() / 2;
116         
117         if (cx > cy)
118         {
119                 ry = cy * r_a_max;
120                 rx = ry;
121         } else {
122                 rx = cx * r_a_max;
123                 ry = rx;
124         }
125         
126         r = sqrt(cx * cx + cy * cy);
127
128         paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 3));
129
130         paint->drawLine(QPointF(cx, 0), QPointF(cx, cy + cy));
131         paint->drawLine(QPointF(0, cy), QPointF(cx + cx, cy));
132
133         for (i = 0; i * rx < cx; i++)
134         {
135                 paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 3));
136                 if (i > 0)
137                 {
138                         paint->drawEllipse(QPointF(cx, cy), rx * i, ry * i);
139                 }
140
141                 paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 1));
142                 for (j = 0; j < divisions; j++)
143                 {
144                         paint->drawEllipse(QPointF(cx, cy), rx * (i + id * j), ry * (i + id * j));
145                 }
146                 if (i != 0) {
147                         str = QString::number(i) + "g";
148                         paint->setPen(QPen(QBrush(QColor(192, 192, 192, 255)), 1));
149                         paint->drawText(QPointF(cx - rx * i, cy), str);
150                         paint->drawText(QPointF(cx + rx * i, cy), str);
151                         paint->drawText(QPointF(cx, cy - ry * i), str);
152                         paint->drawText(QPointF(cx, cy + ry * i), str);
153                 }
154         }
155
156         for (i = 0; i < 360; i += angle_step)
157         {
158                 a = i * DEG2RAD;
159                 dx = sin(a) * r;
160                 dy = cos(a) * r;
161                 paint->drawLine(QPointF(cx, cy), QPointF(cx + dx, cy + dy));
162         }
163
164     delete paint;
165 }
166
167 bool AMeterWidget::filter(QAccelerometerReading *reading)
168 {
169         qreal k = 1;
170         bx = ax;
171         by = ay;
172         bz = az;
173
174         ax = reading->x() * r_g;
175         ay = reading->y() * r_g;
176         az = reading->z() * r_g;
177
178         if (!in_reset && smoothing > 0 && smoothing < 4)
179         {
180                 k = smoothing_k[smoothing];
181                 ax = ax * k + bx * (1.0 - k);
182                 ay = ay * k + by * (1.0 - k);
183                 az = az * k + bz * (1.0 - k);
184         }
185
186         in_reset = 0;   
187         update();
188
189         return true;
190 }
191
192 void AMeterWidget::reset()
193 {
194         in_reset = 0;
195         ax = 0;
196         ay = 0;
197         az = 0;
198 }
199