Reset indicator when the screen is locked
[ameter] / ameterwidget.cpp
index f2377e2..4d2203d 100644 (file)
@@ -9,7 +9,10 @@ qreal g_n = 9.80665;
 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)
@@ -27,6 +30,8 @@ AMeterWidget::AMeterWidget(QWidget *parent)
        bx = 0;
        by = 0;
        bz = 0;
+
+       in_reset = 1;
 }
 
 AMeterWidget::~AMeterWidget()
@@ -44,19 +49,24 @@ int AMeterWidget::setGravity(qreal g)
        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;
@@ -83,6 +93,7 @@ void AMeterWidget::resizeEvent(QResizeEvent *e)
 void AMeterWidget::drawScale()
 {
        QPainter *paint;
+       QString str;
        qreal cx, cy, rx, ry, dx, dy;
        qreal r, a;
        qreal id = 1.0 / divisions;
@@ -126,11 +137,20 @@ void AMeterWidget::drawScale()
                {
                        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)
@@ -146,6 +166,7 @@ void AMeterWidget::drawScale()
 
 bool AMeterWidget::filter(QAccelerometerReading *reading)
 {
+       qreal k = 1;
        bx = ax;
        by = ay;
        bz = az;
@@ -154,11 +175,25 @@ bool AMeterWidget::filter(QAccelerometerReading *reading)
        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;
+}
+