Files
bobbycar-boardcomputer-firm…/main/displays/menus/statisticsmenu.cpp

201 lines
6.9 KiB
C++
Raw Normal View History

2021-11-15 01:53:35 +01:00
#include "statisticsmenu.h"
2021-12-30 03:17:30 +01:00
// 3rdparty lib includes
#include <menuitem.h>
2021-11-15 01:53:35 +01:00
#include "actions/dummyaction.h"
2022-03-05 22:12:08 +01:00
#include "actions/popscreenaction.h"
2021-11-15 01:53:35 +01:00
#include "actioninterface.h"
#include "fmt/core.h"
#include "icons/back.h"
2021-12-30 03:17:30 +01:00
// local includes
#include "utils.h"
2021-11-15 23:11:46 +01:00
#include "icons/time.h"
#include "icons/reboot.h"
#include "icons/update.h"
2021-11-18 01:14:12 +01:00
#include "drivingstatistics.h"
2021-11-15 01:53:35 +01:00
2021-12-30 03:17:30 +01:00
namespace {
constexpr char TEXT_STATISTICSMENU[] = "Statistics";
constexpr char TEXT_STATSSAVE[] = "Save kilometers";
constexpr char TEXT_STATSCLEAR[] = "Clear current km";
constexpr char TEXT_BACK[] = "Back";
2021-11-21 02:16:37 +01:00
class WhPerKmText : public virtual espgui::TextInterface
{
public:
std::string text() const override
{
2022-01-27 01:09:52 +01:00
if (const auto avgVoltage = controllers.getAvgVoltage(); avgVoltage)
{
auto watt = sumCurrent * *avgVoltage;
auto w_per_kmh = watt / std::abs(avgSpeedKmh);
return fmt::format("{:.0f} Wh/km", w_per_kmh);
}
return "No Battery";
2021-11-15 01:53:35 +01:00
}
};
2021-11-21 02:16:37 +01:00
class UptimeText : public virtual espgui::TextInterface
{
public:
std::string text() const override
{
2022-02-12 19:07:34 +01:00
using namespace std::chrono_literals;
2021-11-21 02:16:37 +01:00
const auto uptime = espchrono::millis_clock::now().time_since_epoch();
auto converted = date::make_time(uptime);
auto msecs = uptime
- converted.hours()
- converted.minutes()
- converted.seconds();
2022-10-13 16:48:32 +02:00
return fmt::format("Up: {:02d}:{:02d}:{:02d}&s&7.{:01d}",
2021-11-21 02:16:37 +01:00
converted.hours().count(),
converted.minutes().count(),
converted.seconds().count(),
2022-02-12 19:07:34 +01:00
msecs / 1ms);
2021-11-15 01:53:35 +01:00
}
};
2021-11-21 02:16:37 +01:00
class CurrentKilometersText : public virtual espgui::TextInterface
{
public:
std::string text() const override
{
2021-11-18 01:14:12 +01:00
return fmt::format("Curr: {:.2f}m", drivingStatistics.meters_driven);
2021-11-15 01:53:35 +01:00
}
};
2021-11-21 02:16:37 +01:00
class TotalKilometersText : public virtual espgui::TextInterface
{
public:
std::string text() const override
{
return fmt::format("total: {:.1f}km", drivingStatistics.totalMeters / 1000.f);
2021-11-15 23:11:46 +01:00
}
};
2021-11-21 02:16:37 +01:00
class TotalMetersText : public virtual espgui::TextInterface
{
public:
std::string text() const override
{
return fmt::format("total: {:.0f}m", drivingStatistics.totalMeters);
2021-11-15 01:53:35 +01:00
}
};
2021-11-21 02:16:37 +01:00
class CurrentDrivingTimeText : public virtual espgui::TextInterface
{
public:
std::string text() const override
{
auto converted = date::make_time(drivingStatistics.currentDrivingTime);
auto msecs = drivingStatistics.currentDrivingTime
- converted.hours()
- converted.minutes()
- converted.seconds();
2022-10-13 16:48:32 +02:00
return fmt::format("Drive: {:02d}:{:02d}:{:02d}&s&7.{:02d}",
2021-11-21 02:16:37 +01:00
converted.hours().count(),
converted.minutes().count(),
converted.seconds().count(),
msecs.count());
2021-11-15 01:53:35 +01:00
}
};
class SavedTotalCentimetersText : public virtual espgui::TextInterface {
public: std::string text() const override {
2022-04-29 22:40:49 +02:00
return fmt::format("saved: {}cm", configs.savedStatistics.totalCentimeters.value() );
2021-11-15 01:53:35 +01:00
}
};
2021-11-18 01:14:12 +01:00
class CurrentWhUsedText : public virtual espgui::TextInterface {
public: std::string text() const override {
return fmt::format("Curr: {:.2f}Wh", drivingStatistics.wh_used );
}
};
class AverageWhUsedText : public virtual espgui::TextInterface {
public: std::string text() const override {
return fmt::format("Avg: {:.1f}Wh/km", drivingStatistics.wh_used / (drivingStatistics.meters_driven / 1000.f) );
}
};
class EfficiencyText : public virtual espgui::TextInterface {
public: std::string text() const override {
return fmt::format("Efficiency: {}", getEfficiencyClassString());
}
};
2022-01-11 11:16:15 +01:00
class AverageSpeedKmhOverTime : public virtual espgui::TextInterface {
public: std::string text() const override {
return fmt::format("Avg speed: {:.1f} km/h", getAvgKmh());
}
};
2022-01-17 10:10:08 +01:00
class EstimatedKmLeft : public virtual espgui::TextInterface {
public: std::string text() const override {
return fmt::format("est km:{}", getRemainingEstimateRangeString());
}
};
2021-11-18 01:14:12 +01:00
class EfficiencyTextColor : public virtual espgui::ColorInterface {
public:
int color() const override
{
return getEfficiencyClassColor();
}
};
2021-11-21 02:16:37 +01:00
class SaveKilometersAction : public virtual espgui::ActionInterface
{
2021-11-15 01:53:35 +01:00
public:
2021-11-21 02:16:37 +01:00
void triggered() override
{
2021-11-15 01:53:35 +01:00
drivingStatistics.last_cm_written = drivingStatistics.totalMeters * 100;
configs.write_config(configs.savedStatistics.totalCentimeters, drivingStatistics.last_cm_written);
2021-11-15 01:53:35 +01:00
}
};
2021-11-21 02:16:37 +01:00
class ClearCurrentStatsAction : public virtual espgui::ActionInterface
{
2021-11-15 01:53:35 +01:00
public:
2021-11-21 02:16:37 +01:00
void triggered() override
{
2022-06-12 17:51:31 +02:00
drivingStatistics.meters_driven = 0.f;
2021-11-21 01:36:44 +01:00
drivingStatistics.currentDrivingTime = {};
2022-06-12 17:51:31 +02:00
drivingStatistics.wh_used = 0.f;
drivingStatistics.batteryWhEstimate = 0.f;
2021-11-15 01:53:35 +01:00
}
};
2021-12-30 03:17:30 +01:00
} // namespace
2021-11-21 02:16:37 +01:00
2021-11-15 01:53:35 +01:00
StatisticsMenu::StatisticsMenu()
{
2021-12-30 03:17:30 +01:00
using namespace espgui;
constructMenuItem<makeComponent<MenuItem, WhPerKmText, DummyAction>>();
constructMenuItem<makeComponent<MenuItem, UptimeText, DummyAction, StaticMenuItemIcon<&bobbyicons::time>>>();
constructMenuItem<makeComponent<MenuItem, CurrentKilometersText, DummyAction>>();
constructMenuItem<makeComponent<MenuItem, CurrentDrivingTimeText, DummyAction>>();
constructMenuItem<makeComponent<MenuItem, TotalKilometersText, DummyAction>>();
// constructMenuItem<makeComponent<MenuItem, SavedTotalCentimetersText, DummyAction>>();
constructMenuItem<makeComponent<MenuItem, CurrentWhUsedText, DummyAction>>();
constructMenuItem<makeComponent<MenuItem, AverageWhUsedText, DummyAction>>();
2022-01-11 11:16:15 +01:00
constructMenuItem<makeComponent<MenuItem, AverageSpeedKmhOverTime, DummyAction>>();
2022-01-26 18:02:01 +01:00
constructMenuItem<makeComponent<MenuItem, EstimatedKmLeft, DummyAction>>();
2021-12-30 03:17:30 +01:00
constructMenuItem<makeComponent<MenuItem, EfficiencyText, EfficiencyTextColor, DummyAction>>();
2022-01-26 18:02:01 +01:00
constructMenuItem<makeComponent<MenuItem, TotalMetersText, DummyAction>>();
2021-12-30 03:17:30 +01:00
constructMenuItem<makeComponent<MenuItem, EmptyText, DummyAction>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_STATSSAVE>, SaveKilometersAction, StaticMenuItemIcon<&bobbyicons::update>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_STATSCLEAR>, ClearCurrentStatsAction, StaticMenuItemIcon<&bobbyicons::reboot>>>();
2022-03-05 22:12:08 +01:00
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACK>, PopScreenAction, StaticMenuItemIcon<&espgui::icons::back>>>();
2021-12-30 03:17:30 +01:00
}
2023-08-14 15:34:31 +02:00
std::string StatisticsMenu::title() const
2021-12-30 03:17:30 +01:00
{
return TEXT_STATISTICSMENU;
2021-11-15 01:53:35 +01:00
}
void StatisticsMenu::back()
{
2022-03-05 22:12:08 +01:00
espgui::popScreen();
2021-11-15 01:53:35 +01:00
}