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()
91 qreal cx, cy, rx, ry, dx, dy;
93 qreal id = 1.0 / divisions;
102 r_a_max = 1.0 / a_max;
104 background = new QImage(size(), QImage::Format_ARGB32);
105 paint = new QPainter(background);
106 paint->setRenderHints(QPainter::Antialiasing);
120 r = sqrt(cx * cx + cy * cy);
122 paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 3));
124 paint->drawLine(QPointF(cx, 0), QPointF(cx, cy + cy));
125 paint->drawLine(QPointF(0, cy), QPointF(cx + cx, cy));
127 for (i = 0; i * rx < cx; i++)
129 paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 3));
132 paint->drawEllipse(QPointF(cx, cy), rx * i, ry * i);
134 paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 1));
135 for (j = 0; j < divisions; j++)
137 paint->drawEllipse(QPointF(cx, cy), rx * (i + id * j), ry * (i + id * j));
141 for (i = 0; i < 360; i += angle_step)
146 paint->drawLine(QPointF(cx, cy), QPointF(cx + dx, cy + dy));
152 bool AMeterWidget::filter(QAccelerometerReading *reading)
159 ax = reading->x() * r_g;
160 ay = reading->y() * r_g;
161 az = reading->z() * r_g;
163 if (smoothing > 0 && smoothing < 4)
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);