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:
VuMeter m_vuMeter;
int d = 0;
static constexpr auto x = 40;
std::array<VerticalMeter, 6> 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)

View File

@ -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)

View File

@ -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<float>(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);
}
}