1 #include <QtCore/QFile>
2 #include <QtGui/QPainter>
6 #include "ameterwidget.h"
13 // Smoothing: 0 - none, 1 - light, 2 - medium, 3 - strong
15 qreal smoothing_k[] = {1, 0.5, 0.25, 0.125};
17 AMeterWidget::AMeterWidget(QWidget *parent)
20 // Reciprocal of gravity
22 r_a_max = 1.0 / a_max;
35 AMeterWidget::~AMeterWidget()
40 int AMeterWidget::setGravity(qreal g)
42 // Reciprocal of gravity
50 // This method is called on every update, keep division operations out
52 void AMeterWidget::paintEvent(QPaintEvent *e)
58 a = sqrt(ax * ax + ay * ay + az * az);
62 paint.drawImage(QPoint(0, 0), *background);
65 paint.setRenderHints(QPainter::Antialiasing);
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));
81 #define DEG2RAD (M_PI / 180.0)
83 void AMeterWidget::resizeEvent(QResizeEvent *e)
88 void AMeterWidget::drawScale()
92 qreal cx, cy, rx, ry, dx, dy;
94 qreal id = 1.0 / divisions;
103 r_a_max = 1.0 / a_max;
105 background = new QImage(size(), QImage::Format_ARGB32);
106 paint = new QPainter(background);
107 paint->setRenderHints(QPainter::Antialiasing);
121 r = sqrt(cx * cx + cy * cy);
123 paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 3));
125 paint->drawLine(QPointF(cx, 0), QPointF(cx, cy + cy));
126 paint->drawLine(QPointF(0, cy), QPointF(cx + cx, cy));
128 for (i = 0; i * rx < cx; i++)
130 paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 3));
133 paint->drawEllipse(QPointF(cx, cy), rx * i, ry * i);
136 paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 1));
137 for (j = 0; j < divisions; j++)
139 paint->drawEllipse(QPointF(cx, cy), rx * (i + id * j), ry * (i + id * j));
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);
151 for (i = 0; i < 360; i += angle_step)
156 paint->drawLine(QPointF(cx, cy), QPointF(cx + dx, cy + dy));
162 bool AMeterWidget::filter(QAccelerometerReading *reading)
169 ax = reading->x() * r_g;
170 ay = reading->y() * r_g;
171 az = reading->z() * r_g;
173 if (smoothing > 0 && smoothing < 4)
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);