Deleted irrelevant files
[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         qreal cx, cy, rx, ry, dx, dy;
92         qreal r, a;
93         qreal id = 1.0 / divisions;
94         int i, j;
95
96         if (background)
97         {
98                 delete background;
99                 background = 0;
100         }
101
102         r_a_max = 1.0 / a_max;
103         
104         background = new QImage(size(), QImage::Format_ARGB32);
105         paint = new QPainter(background);
106         paint->setRenderHints(QPainter::Antialiasing);
107
108         cx = width() / 2;
109         cy = height() / 2;
110         
111         if (cx > cy)
112         {
113                 ry = cy * r_a_max;
114                 rx = ry;
115         } else {
116                 rx = cx * r_a_max;
117                 ry = rx;
118         }
119         
120         r = sqrt(cx * cx + cy * cy);
121
122         paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 3));
123
124         paint->drawLine(QPointF(cx, 0), QPointF(cx, cy + cy));
125         paint->drawLine(QPointF(0, cy), QPointF(cx + cx, cy));
126
127         for (i = 0; i * rx < cx; i++)
128         {
129                 paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 3));
130                 if (i > 0)
131                 {
132                         paint->drawEllipse(QPointF(cx, cy), rx * i, ry * i);
133                 }
134                 paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 1));
135                 for (j = 0; j < divisions; j++)
136                 {
137                         paint->drawEllipse(QPointF(cx, cy), rx * (i + id * j), ry * (i + id * j));
138                 }
139         }
140
141         for (i = 0; i < 360; i += angle_step)
142         {
143                 a = i * DEG2RAD;
144                 dx = sin(a) * r;
145                 dy = cos(a) * r;
146                 paint->drawLine(QPointF(cx, cy), QPointF(cx + dx, cy + dy));
147         }
148
149     delete paint;
150 }
151
152 bool AMeterWidget::filter(QAccelerometerReading *reading)
153 {
154         qreal k = 1;
155         bx = ax;
156         by = ay;
157         bz = az;
158
159         ax = reading->x() * r_g;
160         ay = reading->y() * r_g;
161         az = reading->z() * r_g;
162
163         if (smoothing > 0 && smoothing < 4)
164         {
165                 k = smoothing_k[smoothing];
166                 ax = ax * k + bx * (1.0 - k);
167                 ay = ay * k + by * (1.0 - k);
168                 az = az * k + bz * (1.0 - k);
169         }
170         
171         update();
172
173         return true;
174 }
175