diff --git a/src/displays/menus/graphsmenu.h b/src/displays/menus/graphsmenu.h index afd788c..a599f31 100644 --- a/src/displays/menus/graphsmenu.h +++ b/src/displays/menus/graphsmenu.h @@ -20,7 +20,6 @@ using BremsGraphDisplay = makeComponent, StaticText, using AvgSpeedGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, AvgSpeedStatistics>; using AvgSpeedKmhGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, AvgSpeedKmhStatistics>; using SumCurrentGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, SumCurrentStatistics>; -using SumAbsoluteCurrentGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, SumAbsoluteCurrentStatistics>; using FrontVoltageGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, FrontVoltageStatistics>; using BackVoltageGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, BackVoltageStatistics>; #ifdef FEATURE_BMS @@ -57,7 +56,6 @@ class GraphsMenu : makeComponent, SwitchScreenAction>, makeComponent, SwitchScreenAction>, makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, makeComponent, SwitchScreenAction>, makeComponent, SwitchScreenAction>, #ifdef FEATURE_BMS diff --git a/src/displays/metersdisplay.h b/src/displays/metersdisplay.h index bdcae2c..09285ce 100644 --- a/src/displays/metersdisplay.h +++ b/src/displays/metersdisplay.h @@ -8,6 +8,9 @@ #include "actions/switchscreenaction.h" #include "globals.h" #include "utils.h" +#include "widgets/label.h" +#include "widgets/reverseprogressbar.h" +#include "widgets/progressbar.h" #include "widgets/verticalmeter.h" #include "widgets/vumeter.h" @@ -29,14 +32,19 @@ public: private: VuMeter m_vuMeter; + ReverseProgressBar m_dischargingBar{10, 135, 90, 15, 0, 40, TFT_GREEN}; + ProgressBar m_chargingBar{100, 135, 90, 15, 0, 40, TFT_RED}; + + Label m_sumCurrentLabel{195,135}; + static constexpr auto x = 40; std::array meters{{ - 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} + VerticalMeter{"U f", "%.1fV", 0*x, 160}, + VerticalMeter{"U b", "%.1fV", 1*x, 160}, + VerticalMeter{"Ivl", "%.1fA", 2*x, 160}, + VerticalMeter{"Ivr", "%.1fA", 3*x, 160}, + VerticalMeter{"Ihl", "%.1fA", 4*x, 160}, + VerticalMeter{"Ihr", "%.1fA", 5*x, 160} }}; }; @@ -46,6 +54,11 @@ void MetersDisplay::initScreen() m_vuMeter.start(); + m_dischargingBar.start(); + m_chargingBar.start(); + + m_sumCurrentLabel.start(); + for (auto &meter : meters) meter.start(); } @@ -54,6 +67,13 @@ void MetersDisplay::redraw() { m_vuMeter.redraw(avgSpeedKmh); + m_dischargingBar.redraw(sumCurrent<0.f?(-sumCurrent):0.f); + m_chargingBar.redraw(sumCurrent>0.f?sumCurrent:0.f); + + tft.setTextColor(TFT_WHITE, TFT_BLACK); + tft.setTextFont(2); + m_sumCurrentLabel.redraw(toString(sumCurrent) + 'A'); + 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); diff --git a/src/globals.h b/src/globals.h index 4a22a48..50fd733 100644 --- a/src/globals.h +++ b/src/globals.h @@ -21,7 +21,7 @@ float gas, brems; int16_t raw_gametrakX, raw_gametrakY, raw_gametrakDist; float gametrakX, gametrakY, gametrakDist; #endif -float avgSpeed, avgSpeedKmh, sumCurrent, sumAbsoluteCurrent; +float avgSpeed, avgSpeedKmh, sumCurrent; char deviceName[32]; diff --git a/src/screens.h b/src/screens.h index 09aad72..4fc866b 100644 --- a/src/screens.h +++ b/src/screens.h @@ -195,7 +195,6 @@ union X { AvgSpeedGraphDisplay avgSpeedGraphDisplay; AvgSpeedKmhGraphDisplay avgSpeedKmhGraphDisplay; SumCurrentGraphDisplay sumCurrentGraphDisplay; - SumAbsoluteCurrentGraphDisplay sumAbsoluteCurrentGraphDisplay; FrontVoltageGraphDisplay frontVoltageGraphDisplay; BackVoltageGraphDisplay backVoltageGraphDisplay; #ifdef FEATURE_BMS @@ -348,7 +347,6 @@ template<> decltype(displays.bremsGraphDisplay) & template<> decltype(displays.avgSpeedGraphDisplay) &getRefByType() { return displays.avgSpeedGraphDisplay; } template<> decltype(displays.avgSpeedKmhGraphDisplay) &getRefByType() { return displays.avgSpeedKmhGraphDisplay; } template<> decltype(displays.sumCurrentGraphDisplay) &getRefByType() { return displays.sumCurrentGraphDisplay; } -template<> decltype(displays.sumAbsoluteCurrentGraphDisplay) &getRefByType() { return displays.sumAbsoluteCurrentGraphDisplay; } template<> decltype(displays.frontVoltageGraphDisplay) &getRefByType() { return displays.frontVoltageGraphDisplay; } template<> decltype(displays.backVoltageGraphDisplay) &getRefByType() { return displays.backVoltageGraphDisplay; } #ifdef FEATURE_BMS diff --git a/src/statistics.h b/src/statistics.h index ea4bbba..e21fbc9 100644 --- a/src/statistics.h +++ b/src/statistics.h @@ -9,7 +9,7 @@ namespace { namespace statistics { using ContainerType = ring_buffer; -ContainerType gas, brems, avgSpeed, avgSpeedKmh, sumCurrent, sumAbsoluteCurrent, frontVoltage, backVoltage, frontLeftCurrent, frontRightCurrent, backLeftCurrent, backRightCurrent +ContainerType gas, brems, avgSpeed, avgSpeedKmh, sumCurrent, frontVoltage, backVoltage, frontLeftCurrent, frontRightCurrent, backLeftCurrent, backRightCurrent #ifdef FEATURE_BMS , bmsVoltage, bmsCurrent, bmsPower #endif @@ -23,7 +23,6 @@ void pushStats() statistics::avgSpeed.push_back(avgSpeed); statistics::avgSpeedKmh.push_back(avgSpeedKmh); statistics::sumCurrent.push_back(sumCurrent); - statistics::sumAbsoluteCurrent.push_back(sumAbsoluteCurrent); if (controllers.front.feedbackValid) { statistics::frontVoltage.push_back(fixBatVoltage(controllers.front.feedback.batVoltage)); @@ -61,7 +60,6 @@ using BremsStatistics = BufferAccessorImpl; using AvgSpeedStatistics = BufferAccessorImpl; using AvgSpeedKmhStatistics = BufferAccessorImpl; using SumCurrentStatistics = BufferAccessorImpl; -using SumAbsoluteCurrentStatistics = BufferAccessorImpl; using FrontVoltageStatistics = BufferAccessorImpl; using BackVoltageStatistics = BufferAccessorImpl; #ifdef FEATURE_BMS diff --git a/src/texts.h b/src/texts.h index 4e68beb..b54bf13 100644 --- a/src/texts.h +++ b/src/texts.h @@ -181,7 +181,6 @@ constexpr char TEXT_BREMS[] = "Brems"; constexpr char TEXT_AVGSPEED[] = "Avg. speed"; constexpr char TEXT_AVGSPEEDKMH[] = "Avg. speed KMH"; constexpr char TEXT_SUMCURRENT[] = "Sum current"; -constexpr char TEXT_SUMABSOLUTECURRENT[] = "Sum absolute current"; constexpr char TEXT_FRONTVOLTAGE[] = "Front voltage"; constexpr char TEXT_BACKVOLTAGE[] = "Back voltage"; constexpr char TEXT_BMSVOLTAGE[] = "BMS voltage"; diff --git a/src/utils.h b/src/utils.h index 49992cb..193ff93 100644 --- a/src/utils.h +++ b/src/utils.h @@ -266,7 +266,6 @@ void updateAccumulators() { avgSpeed = 0.f; sumCurrent = 0.f; - sumAbsoluteCurrent = 0.f; uint8_t count{0}; for (const Controller &controller : controllers) @@ -282,10 +281,6 @@ void updateAccumulators() controller.feedback.left.current + controller.feedback.right.current; - sumAbsoluteCurrent += - std::abs(controller.feedback.left.current) + - std::abs(controller.feedback.right.current); - count +=2; } @@ -293,7 +288,6 @@ void updateAccumulators() avgSpeed /= count; sumCurrent = fixCurrent(sumCurrent); - sumAbsoluteCurrent = fixCurrent(sumAbsoluteCurrent); avgSpeedKmh = convertToKmh(avgSpeed); } diff --git a/src/widgets/progressbar.h b/src/widgets/progressbar.h index 24a2f90..9538dd1 100644 --- a/src/widgets/progressbar.h +++ b/src/widgets/progressbar.h @@ -7,9 +7,7 @@ namespace { class ProgressBar { public: - ProgressBar(int x, int y, int width, int height, int min, int max, uint32_t color=TFT_YELLOW) : - m_x{x}, m_y{y}, m_width{width}, m_height{height}, m_min{min}, m_max{max}, m_color{color} - {} + ProgressBar(int x, int y, int width, int height, int min, int max, uint32_t color=TFT_YELLOW); void start(); void redraw(int value); @@ -23,11 +21,17 @@ private: const int m_max; const uint32_t m_color; - int m_lastValue{m_x+1}; + int m_lastValue; }; +ProgressBar::ProgressBar(int x, int y, int width, int height, int min, int max, uint32_t color) : + m_x{x}, m_y{y}, m_width{width}, m_height{height}, m_min{min}, m_max{max}, m_color{color} +{ +} + void ProgressBar::start() { + m_lastValue = m_x+1; tft.drawRect(m_x, m_y, m_width, m_height, TFT_WHITE); } diff --git a/src/widgets/reverseprogressbar.h b/src/widgets/reverseprogressbar.h new file mode 100644 index 0000000..b8c2e2a --- /dev/null +++ b/src/widgets/reverseprogressbar.h @@ -0,0 +1,50 @@ +#pragma once + +#include "globals.h" +#include "utils.h" + +namespace { +class ReverseProgressBar +{ +public: + ReverseProgressBar(int x, int y, int width, int height, int min, int max, uint32_t color=TFT_YELLOW); + + void start(); + void redraw(int value); + +private: + const int m_x; + const int m_y; + const int m_width; + const int m_height; + const int m_min; + const int m_max; + const uint32_t m_color; + + int m_lastValue; +}; + +ReverseProgressBar::ReverseProgressBar(int x, int y, int width, int height, int min, int max, uint32_t color) : + m_x{x}, m_y{y}, m_width{width}, m_height{height}, m_min{min}, m_max{max}, m_color{color} +{ +} + +void ReverseProgressBar::start() +{ + m_lastValue = m_x+m_width-1; + tft.drawRect(m_x, m_y, m_width, m_height, TFT_WHITE); +} + +void ReverseProgressBar::redraw(int value) +{ + value = scaleBetween(value, m_min, m_max, m_x+m_width-1, m_x+1); + + if (value < m_lastValue) + tft.fillRect(value, m_y+1, m_lastValue-value, m_height-2, m_color); + else if (value > m_lastValue) + tft.fillRect(m_lastValue, m_y+1, value-m_lastValue, m_height-2, TFT_BLACK); + + m_lastValue = value; +} + +} diff --git a/src/widgets/verticalmeter.h b/src/widgets/verticalmeter.h index f282aa1..d679cea 100644 --- a/src/widgets/verticalmeter.h +++ b/src/widgets/verticalmeter.h @@ -7,21 +7,22 @@ namespace { class VerticalMeter { public: - VerticalMeter(const char *text, int x, int y); + VerticalMeter(const char *text, const char *format, int x, int y); void start(); void redraw(float value, float min, float max); private: const char * const m_text; + const char * const m_format; const int m_x; const int m_y; float m_oldValue{}; }; -VerticalMeter::VerticalMeter(const char *text, int x, int y) : - m_text{text}, m_x{x}, m_y{y} +VerticalMeter::VerticalMeter(const char *text, const char *format, int x, int y) : + m_text{text}, m_format{format}, m_x{x}, m_y{y} { } @@ -49,8 +50,8 @@ void VerticalMeter::redraw(float value, float min, float max) { tft.setTextColor(TFT_GREEN, TFT_BLACK); - char buf[8]; - dtostrf(value, 4, 0, buf); + char buf[16]; + snprintf(&buf[0], 16, m_format, value); tft.drawRightString(buf, m_x + 36 - 5, 187 - 27 + 155 - 18, 2); const int dx = 3 + m_x;