Added battery status display

This commit is contained in:
CommanderRedYT
2022-06-07 22:52:24 +02:00
parent b9961e2e2f
commit a5ee6bb557
9 changed files with 184 additions and 27 deletions

View File

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

View File

@ -0,0 +1,78 @@
#include "batteryinfodisplay.h"
// 3rdparty lib includes
#include <screenmanager.h>
#include <tftinstance.h>
// 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<MainMenu>();
break;
case Button::Up:
espgui::switchScreen<StatusDisplay>();
break;
case Button::Down:
espgui::switchScreen<SpeedInfoDisplay>();
break;
default:;
}
}

View File

@ -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};
};

View File

@ -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<MainMenu>(); break;
case Button::Up: switchScreen<MetersDisplay>(); break;
case Button::Up: switchScreen<SpeedInfoDisplay>(); break;
case Button::Down: switchScreen<StatusDisplay>(); break;
default:;
}

View File

@ -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<MainMenu>(); break;
case Button::Up: switchScreen<StatusDisplay>(); break;
case Button::Right:
pushScreen<MainMenu>();
break;
case Button::Up:
case Button::Down:
#ifdef FEATURE_BMS
switchScreen<BmsDisplay>();
#else
switchScreen<StatusDisplay>();
#endif
break;
default:;
}

View File

@ -0,0 +1,42 @@
#include "speedinfodisplay.h"
// 3rdparty lib includes
#include <screenmanager.h>
// 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<MainMenu>();
break;
case Button::Up:
espgui::switchScreen<BatteryInfoDisplay>();
break;
case Button::Down:
#ifdef FEATURE_BMS
espgui::switchScreen<BmsDisplay>();
#else
espgui::switchScreen<StatusDisplay>();
#endif
break;
default:;
}
}

View File

@ -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;
};

View File

@ -4,23 +4,23 @@
#include <esp_log.h>
// 3rdparty lib includes
#include <fmt/core.h>
#include <espwifistack.h>
#include <fmt/core.h>
#include <tftinstance.h>
#include <schedulertask.h>
// 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<MainMenu>(); break;
case Button::Right:
pushScreen<MainMenu>();
break;
case Button::Up:
if (simplified)
return;
#ifdef FEATURE_BMS
switchScreen<BmsDisplay>();
#else
switchScreen<MetersDisplay>();
switchScreen<SpeedInfoDisplay>();
#endif
break;
case Button::Down:
if (simplified)
return;
switchScreen<MetersDisplay>();
break;
default:
switchScreen<BatteryInfoDisplay>();
break;
default:;
}
}

View File

@ -4,17 +4,17 @@
#include <esp_heap_caps.h>
// 3rdparty lib includes
#include <espchrono.h>
#include <widgets/label.h>
#include <widgets/progressbar.h>
#include <espchrono.h>
// 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
{