Removed icon from debian/control
[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 qreal filter_k = 0.5;
13
14 AMeterWidget::AMeterWidget(QWidget *parent)
15     : QWidget(parent)
16 {
17         // Reciprocal of gravity
18         r_g = 1.0 / g_n;
19         r_a_max = 1.0 / a_max;
20
21         background = 0;
22
23         ax = 0;
24         ay = 0;
25         az = 0;
26
27         bx = 0;
28         by = 0;
29         bz = 0;
30 }
31
32 AMeterWidget::~AMeterWidget()
33 {
34
35 }
36
37 int AMeterWidget::setGravity(qreal g)
38 {
39         // Reciprocal of gravity
40         r_g = 1.0 / g;
41
42         drawScale();
43
44         return 0;
45 }
46
47 void AMeterWidget::paintEvent(QPaintEvent *e)
48 {
49         QPainter paint(this);
50         qreal cx, cy, rx, ry;
51         qreal x1, y1, a;
52
53         a = sqrt(ax * ax + ay * ay + az * az);
54
55         if (background)
56         {
57                 paint.drawImage(QPoint(0, 0), *background);
58         }
59
60         paint.setRenderHints(QPainter::Antialiasing);
61
62         cx = width() / 2;
63         cy = height() / 2;
64         rx = cy * r_a_max;
65         ry = cy * r_a_max;
66
67         x1 = cx - ax * rx;
68         y1 = cy + ay * ry;
69
70         paint.setPen(QPen(QBrush(QColor(255, 255, 255, 255)), 3));
71         paint.setBrush(QBrush(QColor(255, 255, 255, 255)));
72         paint.drawEllipse(QPointF(x1, y1), 3, 3);
73         paint.drawLine(QPointF(cx, cy), QPointF(x1, y1));
74 }
75
76 #define DEG2RAD (M_PI / 180.0)
77
78 void AMeterWidget::resizeEvent(QResizeEvent *e)
79 {
80         drawScale();
81 }
82
83 void AMeterWidget::drawScale()
84 {
85         QPainter *paint;
86         qreal cx, cy, rx, ry, dx, dy;
87         qreal r, a;
88         qreal id = 1.0 / divisions;
89         int i, j;
90
91         if (background)
92         {
93                 delete background;
94                 background = 0;
95         }
96
97         r_a_max = 1.0 / a_max;
98         
99         background = new QImage(size(), QImage::Format_ARGB32);
100         paint = new QPainter(background);
101         paint->setRenderHints(QPainter::Antialiasing);
102
103         cx = width() / 2;
104         cy = height() / 2;
105         
106         if (cx > cy)
107         {
108                 ry = cy * r_a_max;
109                 rx = ry;
110         } else {
111                 rx = cx * r_a_max;
112                 ry = rx;
113         }
114         
115         r = sqrt(cx * cx + cy * cy);
116
117         paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 3));
118
119         paint->drawLine(QPointF(cx, 0), QPointF(cx, cy + cy));
120         paint->drawLine(QPointF(0, cy), QPointF(cx + cx, cy));
121
122         for (i = 0; i * rx < cx; i++)
123         {
124                 paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 3));
125                 if (i > 0)
126                 {
127                         paint->drawEllipse(QPointF(cx, cy), rx * i, ry * i);
128                 }
129                 paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 1));
130                 for (j = 0; j < divisions; j++)
131                 {
132                         paint->drawEllipse(QPointF(cx, cy), rx * (i + id * j), ry * (i + id * j));
133                 }
134         }
135
136         for (i = 0; i < 360; i += angle_step)
137         {
138                 a = i * DEG2RAD;
139                 dx = sin(a) * r;
140                 dy = cos(a) * r;
141                 paint->drawLine(QPointF(cx, cy), QPointF(cx + dx, cy + dy));
142         }
143
144     delete paint;
145 }
146
147 bool AMeterWidget::filter(QAccelerometerReading *reading)
148 {
149         bx = ax;
150         by = ay;
151         bz = az;
152
153         ax = reading->x() * r_g;
154         ay = reading->y() * r_g;
155         az = reading->z() * r_g;
156
157         ax = ax * (1.0 - filter_k) + bx * filter_k;
158         ay = ay * (1.0 - filter_k) + by * filter_k;
159         az = az * (1.0 - filter_k) + bz * filter_k;
160         
161         update();
162
163         return true;
164 }