diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 3930740..14b9740 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -62,6 +62,7 @@ set(headers debuginputhandler.h debugtexthelpers.h displays/batterygraphdisplay.h + displays/batteryinfodisplay.h displays/bmsdisplay.h displays/bobbychangevaluedisplay.h displays/bobbydisplay.h @@ -156,10 +157,12 @@ set(headers displays/qrcodedebug.h displays/qrdisplay.h displays/qrimportdisplay.h + displays/speedinfodisplay.h displays/spirodisplay.h displays/starfielddisplay.h displays/statusdisplay.h displays/updatedisplay.h + displays/xydebugdisplay.h dnsannounce.h dpad.h dpad3wire.h @@ -308,6 +311,7 @@ set(sources debuginputhandler.cpp debugtexthelpers.cpp displays/batterygraphdisplay.cpp + displays/batteryinfodisplay.cpp displays/bmsdisplay.cpp displays/bobbychangevaluedisplay.cpp displays/bobbydisplay.cpp @@ -400,10 +404,12 @@ set(sources displays/qrcodedebug.cpp displays/qrdisplay.cpp displays/qrimportdisplay.cpp + displays/speedinfodisplay.cpp displays/spirodisplay.cpp displays/starfielddisplay.cpp displays/statusdisplay.cpp displays/updatedisplay.cpp + displays/xydebugdisplay.cpp dnsannounce.cpp dpad.cpp dpad3wire.cpp diff --git a/main/displays/batteryinfodisplay.cpp b/main/displays/batteryinfodisplay.cpp new file mode 100644 index 0000000..c1b7b76 --- /dev/null +++ b/main/displays/batteryinfodisplay.cpp @@ -0,0 +1,78 @@ +#include "batteryinfodisplay.h" + +// 3rdparty lib includes +#include +#include + +// local includes +#include "battery.h" +#include "displays/menus/mainmenu.h" +#include "displays/speedinfodisplay.h" +#include "displays/statusdisplay.h" + +// display with big battery and ten bars (0-100%) + +void BatteryInfoDisplay::initScreen() +{ + using namespace espgui; + Base::initScreen(); + + tft.drawRoundRect(m_offset, m_offset, tft.width() - (m_offset * 2), tft.height() - (m_offset * 2), 10, TFT_WHITE); + tft.drawRoundRect((tft.width() / 2) - (m_offset / 2), m_offset / 2, m_offset, m_offset / 2, 3, TFT_WHITE); + m_lastBarCount = 0; +} + +void BatteryInfoDisplay::redraw() +{ + using namespace espgui; + Base::redraw(); + + // calculate height of space available for all bars + const auto min_x = m_offset + 3; // leave 2 pixels + 1 pixel for border + const auto max_x = tft.width() - m_offset - 3; + const auto topY = m_offset + 3; + const auto bottomY = tft.height() - m_offset - 3; + const auto height = bottomY - topY; + const auto width = max_x - min_x; + const uint16_t segment_height = (height / 10); + + if (const auto avgVoltage = controllers.getAvgVoltage(); avgVoltage) + { + const auto cellType = configs.battery.cellType.value(); + const uint16_t percentage = getBatteryPercentage(*avgVoltage, cellType); + const auto segment_count = std::max(percentage / 10, 1); + + if (segment_count != m_lastBarCount) + { + m_lastBarCount = segment_count; + // draw battery + for (auto i = 0; i < 10; ++i) + { + const auto y = bottomY - (i * segment_height) - segment_height; + tft.fillRoundRect(min_x, y, width, segment_height - 2, 10, segment_count > i ? TFT_GREEN : TFT_DARKGREY); + } + } + } + + // tft.fillRect(0, 0, tft.width(), topY, TFT_CYAN); + // tft.fillRect(0, bottomY, tft.width(), tft.height()-bottomY, TFT_YELLOW); +} + +void BatteryInfoDisplay::buttonPressed(espgui::Button button) +{ + Base::buttonPressed(button); + + switch (button) { + using espgui::Button; + case Button::Right: + espgui::pushScreen(); + break; + case Button::Up: + espgui::switchScreen(); + break; + case Button::Down: + espgui::switchScreen(); + break; + default:; + } +} diff --git a/main/displays/batteryinfodisplay.h b/main/displays/batteryinfodisplay.h new file mode 100644 index 0000000..3e68fc8 --- /dev/null +++ b/main/displays/batteryinfodisplay.h @@ -0,0 +1,18 @@ +#pragma once + +// local includes +#include "bobbydisplay.h" + +class BatteryInfoDisplay : public BobbyDisplay +{ + using Base = BobbyDisplay; + +public: + void initScreen() override; + void redraw() override; + + void buttonPressed(espgui::Button button) override; +private: + static constexpr const auto m_offset = 40; + uint16_t m_lastBarCount{0}; +}; diff --git a/main/displays/bmsdisplay.cpp b/main/displays/bmsdisplay.cpp index 0be70c2..e2e7d24 100644 --- a/main/displays/bmsdisplay.cpp +++ b/main/displays/bmsdisplay.cpp @@ -2,7 +2,7 @@ #if defined(FEATURE_BLUETOOTH) && defined(FEATURE_BMS) #include "displays/menus/mainmenu.h" -#include "displays/metersdisplay.h" +#include "displays/speedinfodisplay.h" #include "displays/statusdisplay.h" #include "screenmanager.h" #include "tftinstance.h" @@ -102,7 +102,7 @@ void BmsDisplay::buttonPressed(espgui::Button button) { using espgui::Button; case Button::Right: pushScreen(); break; - case Button::Up: switchScreen(); break; + case Button::Up: switchScreen(); break; case Button::Down: switchScreen(); break; default:; } diff --git a/main/displays/metersdisplay.cpp b/main/displays/metersdisplay.cpp index e413fd8..499e39e 100644 --- a/main/displays/metersdisplay.cpp +++ b/main/displays/metersdisplay.cpp @@ -9,7 +9,6 @@ #include "utils.h" #include "displays/menus/mainmenu.h" #include "displays/statusdisplay.h" -#include "displays/bmsdisplay.h" using namespace espgui; @@ -58,14 +57,12 @@ void MetersDisplay::buttonPressed(espgui::Button button) switch (button) { using espgui::Button; - case Button::Right: pushScreen(); break; - case Button::Up: switchScreen(); break; + case Button::Right: + pushScreen(); + break; + case Button::Up: case Button::Down: -#ifdef FEATURE_BMS - switchScreen(); -#else switchScreen(); -#endif break; default:; } diff --git a/main/displays/speedinfodisplay.cpp b/main/displays/speedinfodisplay.cpp new file mode 100644 index 0000000..a60eee7 --- /dev/null +++ b/main/displays/speedinfodisplay.cpp @@ -0,0 +1,42 @@ +#include "speedinfodisplay.h" + +// 3rdparty lib includes +#include + +// local includes +#include "displays/batteryinfodisplay.h" +#include "displays/menus/mainmenu.h" +#include "displays/statusdisplay.h" + +void SpeedInfoDisplay::initScreen() +{ + Base::initScreen(); +} + +void SpeedInfoDisplay::redraw() +{ + Base::redraw(); +} + +void SpeedInfoDisplay::buttonPressed(espgui::Button button) +{ + Base::buttonPressed(button); + + switch (button) { + using espgui::Button; + case Button::Right: + espgui::pushScreen(); + break; + case Button::Up: + espgui::switchScreen(); + break; + case Button::Down: +#ifdef FEATURE_BMS + espgui::switchScreen(); +#else + espgui::switchScreen(); +#endif + break; + default:; + } +} diff --git a/main/displays/speedinfodisplay.h b/main/displays/speedinfodisplay.h new file mode 100644 index 0000000..0524a77 --- /dev/null +++ b/main/displays/speedinfodisplay.h @@ -0,0 +1,15 @@ +#pragma once + +// local includes +#include "bobbydisplay.h" + +class SpeedInfoDisplay : public BobbyDisplay +{ + using Base = BobbyDisplay; + +public: + void initScreen() override; + void redraw() override; + + void buttonPressed(espgui::Button button) override; +}; diff --git a/main/displays/statusdisplay.cpp b/main/displays/statusdisplay.cpp index d4743ee..4eb7cd6 100644 --- a/main/displays/statusdisplay.cpp +++ b/main/displays/statusdisplay.cpp @@ -4,23 +4,23 @@ #include // 3rdparty lib includes -#include #include +#include #include -#include // local includes -#include "displays/menus/mainmenu.h" +#include "displays/batteryinfodisplay.h" +#include "displays/speedinfodisplay.h" #ifdef FEATURE_BMS #include "displays/bmsdisplay.h" -#else -#include "displays/metersdisplay.h" #endif +#include "displays/menus/mainmenu.h" +#include "displays/metersdisplay.h" #include "drivingstatistics.h" -#include "udpcloud.h" #include "modes/defaultmode.h" -#include "taskmanager.h" #include "newsettings.h" +#include "taskmanager.h" +#include "udpcloud.h" using namespace std::chrono_literals; using namespace espgui; @@ -230,23 +230,24 @@ void StatusDisplay::buttonPressed(espgui::Button button) switch (button) { using espgui::Button; - case Button::Right: pushScreen(); break; + case Button::Right: + pushScreen(); + break; case Button::Up: if (simplified) return; #ifdef FEATURE_BMS switchScreen(); #else - switchScreen(); + switchScreen(); #endif break; case Button::Down: if (simplified) return; - switchScreen(); - break; - default: + switchScreen(); break; + default:; } } diff --git a/main/displays/statusdisplay.h b/main/displays/statusdisplay.h index 469b9dc..ddeffd2 100644 --- a/main/displays/statusdisplay.h +++ b/main/displays/statusdisplay.h @@ -4,17 +4,17 @@ #include // 3rdparty lib includes +#include #include #include -#include // local includes -#include "bobbydisplay.h" -#include "modeinterface.h" -#include "globals.h" -#include "utils.h" -#include "icons/alert.h" #include "battery.h" +#include "bobbydisplay.h" +#include "globals.h" +#include "icons/alert.h" +#include "modeinterface.h" +#include "utils.h" class StatusDisplay : public BobbyDisplay {