diff --git a/src/displays/metersdisplay.h b/src/displays/metersdisplay.h index 4395471..bdcae2c 100644 --- a/src/displays/metersdisplay.h +++ b/src/displays/metersdisplay.h @@ -29,16 +29,14 @@ public: private: VuMeter m_vuMeter; - int d = 0; - static constexpr auto x = 40; std::array meters{{ - VerticalMeter{"A0", 0*x, 160}, - VerticalMeter{"A1", 1*x, 160}, - VerticalMeter{"A2", 2*x, 160}, - VerticalMeter{"A3", 3*x, 160}, - VerticalMeter{"A4", 4*x, 160}, - VerticalMeter{"A5", 5*x, 160} + VerticalMeter{"U f", 0*x, 160}, + VerticalMeter{"U b", 1*x, 160}, + VerticalMeter{"Ivl", 2*x, 160}, + VerticalMeter{"Ivr", 3*x, 160}, + VerticalMeter{"Ihl", 4*x, 160}, + VerticalMeter{"Ihr", 5*x, 160} }}; }; @@ -56,11 +54,12 @@ void MetersDisplay::redraw() { m_vuMeter.redraw(avgSpeedKmh); - int i{}; - for (auto &meter : meters) - meter.redraw(50 + 50 * sin((d + (i++ * 60)) * 0.0174532925)); - - d += 4; if (d >= 360) d -= 360; + meters[0].redraw(fixBatVoltage(controllers.front.feedback.batVoltage), 35, 50); + meters[1].redraw(fixBatVoltage(controllers.back.feedback.batVoltage), 35, 50); + meters[2].redraw(fixCurrent(controllers.front.feedback.left.current), -10, 10); + meters[3].redraw(fixCurrent(controllers.front.feedback.right.current), -10, 10); + meters[4].redraw(fixCurrent(controllers.back.feedback.left.current), -10, 10); + meters[5].redraw(fixCurrent(controllers.back.feedback.right.current), -10, 10); } void MetersDisplay::rotate(int offset) diff --git a/src/utils.h b/src/utils.h index 38f621f..49992cb 100644 --- a/src/utils.h +++ b/src/utils.h @@ -54,7 +54,7 @@ float convertFromInch(float val) float fixCurrent(int16_t value) { - return std::abs(value/50.); + return -value/50.; } float fixBatVoltage(int16_t value) diff --git a/src/widgets/verticalmeter.h b/src/widgets/verticalmeter.h index 9b9de10..f282aa1 100644 --- a/src/widgets/verticalmeter.h +++ b/src/widgets/verticalmeter.h @@ -1,6 +1,7 @@ #pragma once #include "globals.h" +#include "utils.h" namespace { class VerticalMeter @@ -9,14 +10,14 @@ public: VerticalMeter(const char *text, int x, int y); void start(); - void redraw(int value); + void redraw(float value, float min, float max); private: const char * const m_text; const int m_x; const int m_y; - int m_oldValue{}; + float m_oldValue{}; }; VerticalMeter::VerticalMeter(const char *text, int x, int y) : @@ -44,7 +45,7 @@ void VerticalMeter::start() tft.drawCentreString("---", m_x + w / 2, m_y + 155 - 18, 2); } -void VerticalMeter::redraw(int value) +void VerticalMeter::redraw(float value, float min, float max) { tft.setTextColor(TFT_GREEN, TFT_BLACK); @@ -53,23 +54,22 @@ void VerticalMeter::redraw(int value) tft.drawRightString(buf, m_x + 36 - 5, 187 - 27 + 155 - 18, 2); const int dx = 3 + m_x; - if (value < 0.f) value = 0; // Limit value to emulate needle end stops - if (value > 100.f) value = 100; + value = scaleBetween(value, min, max, 0.f, 100.f); - while (value != m_oldValue) { + while (m_oldValue > value) + { const int dy = 187 + 100 - m_oldValue; - if (m_oldValue > value) - { - tft.drawLine(dx, dy - 5, dx + 16, dy, TFT_WHITE); - m_oldValue--; - tft.drawLine(dx, dy + 6, dx + 16, dy + 1, TFT_RED); - } - else - { - tft.drawLine(dx, dy + 5, dx + 16, dy, TFT_WHITE); - m_oldValue++; - tft.drawLine(dx, dy - 6, dx + 16, dy - 1, TFT_RED); - } + tft.drawLine(dx, dy - 5, dx + 16, dy, TFT_WHITE); + m_oldValue--; + tft.drawLine(dx, dy + 6, dx + 16, dy + 1, TFT_RED); + } + + while (m_oldValue < value) + { + const int dy = 187 + 100 - m_oldValue; + tft.drawLine(dx, dy + 5, dx + 16, dy, TFT_WHITE); + m_oldValue++; + tft.drawLine(dx, dy - 6, dx + 16, dy - 1, TFT_RED); } }