MetersDisplay now shows real values instead of sinus

This commit is contained in:
2020-06-13 01:01:51 +02:00
parent c899e5922b
commit c3f298bab5
3 changed files with 31 additions and 32 deletions

View File

@@ -29,16 +29,14 @@ public:
private: private:
VuMeter m_vuMeter; VuMeter m_vuMeter;
int d = 0;
static constexpr auto x = 40; static constexpr auto x = 40;
std::array<VerticalMeter, 6> meters{{ std::array<VerticalMeter, 6> meters{{
VerticalMeter{"A0", 0*x, 160}, VerticalMeter{"U f", 0*x, 160},
VerticalMeter{"A1", 1*x, 160}, VerticalMeter{"U b", 1*x, 160},
VerticalMeter{"A2", 2*x, 160}, VerticalMeter{"Ivl", 2*x, 160},
VerticalMeter{"A3", 3*x, 160}, VerticalMeter{"Ivr", 3*x, 160},
VerticalMeter{"A4", 4*x, 160}, VerticalMeter{"Ihl", 4*x, 160},
VerticalMeter{"A5", 5*x, 160} VerticalMeter{"Ihr", 5*x, 160}
}}; }};
}; };
@@ -56,11 +54,12 @@ void MetersDisplay::redraw()
{ {
m_vuMeter.redraw(avgSpeedKmh); m_vuMeter.redraw(avgSpeedKmh);
int i{}; meters[0].redraw(fixBatVoltage(controllers.front.feedback.batVoltage), 35, 50);
for (auto &meter : meters) meters[1].redraw(fixBatVoltage(controllers.back.feedback.batVoltage), 35, 50);
meter.redraw(50 + 50 * sin((d + (i++ * 60)) * 0.0174532925)); meters[2].redraw(fixCurrent(controllers.front.feedback.left.current), -10, 10);
meters[3].redraw(fixCurrent(controllers.front.feedback.right.current), -10, 10);
d += 4; if (d >= 360) d -= 360; 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) void MetersDisplay::rotate(int offset)

View File

@@ -54,7 +54,7 @@ float convertFromInch(float val)
float fixCurrent(int16_t value) float fixCurrent(int16_t value)
{ {
return std::abs(value/50.); return -value/50.;
} }
float fixBatVoltage(int16_t value) float fixBatVoltage(int16_t value)

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
#include "globals.h" #include "globals.h"
#include "utils.h"
namespace { namespace {
class VerticalMeter class VerticalMeter
@@ -9,14 +10,14 @@ public:
VerticalMeter(const char *text, int x, int y); VerticalMeter(const char *text, int x, int y);
void start(); void start();
void redraw(int value); void redraw(float value, float min, float max);
private: private:
const char * const m_text; const char * const m_text;
const int m_x; const int m_x;
const int m_y; const int m_y;
int m_oldValue{}; float m_oldValue{};
}; };
VerticalMeter::VerticalMeter(const char *text, int x, int y) : 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); 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); 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); tft.drawRightString(buf, m_x + 36 - 5, 187 - 27 + 155 - 18, 2);
const int dx = 3 + m_x; const int dx = 3 + m_x;
if (value < 0.f) value = 0; // Limit value to emulate needle end stops value = scaleBetween<float>(value, min, max, 0.f, 100.f);
if (value > 100.f) value = 100;
while (value != m_oldValue) { while (m_oldValue > value)
{
const int dy = 187 + 100 - m_oldValue; 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 - 5, dx + 16, dy, TFT_WHITE); tft.drawLine(dx, dy + 6, dx + 16, dy + 1, TFT_RED);
m_oldValue--; }
tft.drawLine(dx, dy + 6, dx + 16, dy + 1, TFT_RED);
} while (m_oldValue < value)
else {
{ const int dy = 187 + 100 - m_oldValue;
tft.drawLine(dx, dy + 5, dx + 16, dy, TFT_WHITE); tft.drawLine(dx, dy + 5, dx + 16, dy, TFT_WHITE);
m_oldValue++; m_oldValue++;
tft.drawLine(dx, dy - 6, dx + 16, dy - 1, TFT_RED); tft.drawLine(dx, dy - 6, dx + 16, dy - 1, TFT_RED);
}
} }
} }