qreal a_max = 2;
int angle_step = 30;
int divisions = 4;
-qreal filter_k = 0.5;
+
+// Smoothing: 0 - none, 1 - light, 2 - medium, 3 - strong
+int smoothing = 1;
+qreal smoothing_k[] = {1, 0.5, 0.25, 0.125};
AMeterWidget::AMeterWidget(QWidget *parent)
: QWidget(parent)
bx = 0;
by = 0;
bz = 0;
+
+ in_reset = 1;
}
AMeterWidget::~AMeterWidget()
return 0;
}
+// This method is called on every update, keep division operations out
+
void AMeterWidget::paintEvent(QPaintEvent *e)
{
QPainter paint(this);
qreal cx, cy, rx, ry;
qreal x1, y1, a;
- a = sqrt(ax * ax + ay * ay + az * az);
-
if (background)
{
paint.drawImage(QPoint(0, 0), *background);
}
+ if (in_reset) {
+ return;
+ }
+
+ a = sqrt(ax * ax + ay * ay + az * az);
paint.setRenderHints(QPainter::Antialiasing);
cx = width() / 2;
void AMeterWidget::drawScale()
{
QPainter *paint;
+ QString str;
qreal cx, cy, rx, ry, dx, dy;
qreal r, a;
qreal id = 1.0 / divisions;
{
paint->drawEllipse(QPointF(cx, cy), rx * i, ry * i);
}
+
paint->setPen(QPen(QBrush(QColor(64, 64, 64, 255)), 1));
for (j = 0; j < divisions; j++)
{
paint->drawEllipse(QPointF(cx, cy), rx * (i + id * j), ry * (i + id * j));
}
+ if (i != 0) {
+ str = QString::number(i) + "g";
+ paint->setPen(QPen(QBrush(QColor(192, 192, 192, 255)), 1));
+ paint->drawText(QPointF(cx - rx * i, cy), str);
+ paint->drawText(QPointF(cx + rx * i, cy), str);
+ paint->drawText(QPointF(cx, cy - ry * i), str);
+ paint->drawText(QPointF(cx, cy + ry * i), str);
+ }
}
for (i = 0; i < 360; i += angle_step)
bool AMeterWidget::filter(QAccelerometerReading *reading)
{
+ qreal k = 1;
bx = ax;
by = ay;
bz = az;
ay = reading->y() * r_g;
az = reading->z() * r_g;
- ax = ax * (1.0 - filter_k) + bx * filter_k;
- ay = ay * (1.0 - filter_k) + by * filter_k;
- az = az * (1.0 - filter_k) + bz * filter_k;
-
+ if (!in_reset && smoothing > 0 && smoothing < 4)
+ {
+ k = smoothing_k[smoothing];
+ ax = ax * k + bx * (1.0 - k);
+ ay = ay * k + by * (1.0 - k);
+ az = az * k + bz * (1.0 - k);
+ }
+
+ in_reset = 0;
update();
return true;
}
+
+void AMeterWidget::reset()
+{
+ in_reset = 0;
+ ax = 0;
+ ay = 0;
+ az = 0;
+}
+