Added build flags for BMS and OTA

This commit is contained in:
2020-05-24 16:47:33 +02:00
parent 3334bf3c3a
commit 04bec4e0c1
22 changed files with 82 additions and 2 deletions

View File

@@ -58,6 +58,7 @@ build_flags =
-DPINS_TX2=26
-DPINS_GAS=35
-DPINS_BREMS=33
-DFEATURE_OTA
@@ -83,6 +84,7 @@ build_flags =
-DDEFAULT_GASMAX=3700
-DDEFAULT_BREMSMIN=1300
-DDEFAULT_BREMSMAX=4000
-DFEATURE_BMS
[env:feedc0de_usb]
platform = ${common_env_data.platform}
@@ -152,7 +154,7 @@ build_flags =
platform = ${common_env_data.platform}
board = ${common_env_data.board}
framework = ${common_env_data.framework}
board_build.partitions = ${common_env_data.board_build.partitions}
board_build.partitions = bobbycar_noota.csv
lib_deps = ${common_env_data.lib_deps}
lib_compat_mode = ${common_env_data.lib_compat_mode}
build_unflags = ${common_env_data.build_unflags}

View File

@@ -6,6 +6,7 @@
#include "globals.h"
namespace {
#ifdef FEATURE_BMS
class BluetoothConnectBmsAction : public virtual ActionInterface
{
public:
@@ -19,4 +20,5 @@ public:
}
}
};
#endif
}

View File

@@ -4,6 +4,7 @@
#include "bmsutils.h"
namespace {
#ifdef FEATURE_BMS
class BmsTurnOffChargeAction : public virtual ActionInterface
{
public:
@@ -16,4 +17,5 @@ public:
}
}
};
#endif
}

View File

@@ -4,6 +4,7 @@
#include "bmsutils.h"
namespace {
#ifdef FEATURE_BMS
class BmsTurnOffDischargeAction : public virtual ActionInterface
{
public:
@@ -16,4 +17,5 @@ public:
}
}
};
#endif
}

View File

@@ -4,6 +4,7 @@
#include "bmsutils.h"
namespace {
#ifdef FEATURE_BMS
class BmsTurnOnChargeAction : public virtual ActionInterface
{
public:
@@ -16,4 +17,5 @@ public:
}
}
};
#endif
}

View File

@@ -4,6 +4,7 @@
#include "bmsutils.h"
namespace {
#ifdef FEATURE_BMS
class BmsTurnOnDischargeAction : public virtual ActionInterface
{
public:
@@ -16,4 +17,5 @@ public:
}
}
};
#endif
}

View File

@@ -3,6 +3,7 @@
#include "globals.h"
namespace {
#ifdef FEATURE_BMS
namespace bms {
constexpr auto autoReconnect = false; // causes hangs when not available
@@ -119,4 +120,5 @@ void update()
}
}
}
#endif
}

View File

@@ -14,6 +14,7 @@ class MetersDisplay;
class StatusDisplay;
}
namespace {
#ifdef FEATURE_BMS
class BmsDisplay : public DemoDisplay, public SwitchScreenAction<MainMenu>
{
public:
@@ -86,4 +87,5 @@ void BmsDisplay::rotate(int offset)
else if (offset > 0)
switchScreen<StatusDisplay>();
}
#endif
}

View File

@@ -21,6 +21,7 @@ class MainMenu;
}
namespace {
#ifdef FEATURE_BMS
class BmsMenu :
public MenuDisplay,
public StaticText<TEXT_BMS>,
@@ -36,4 +37,5 @@ class BmsMenu :
makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<MainMenu>, StaticMenuItemIcon<&icons::back>>
>
{};
#endif
}

View File

@@ -23,6 +23,7 @@ using SumCurrentGraphDisplay = makeComponent<GraphDisplay<1>, StaticText<TEXT_SU
using SumAbsoluteCurrentGraphDisplay = makeComponent<GraphDisplay<1>, StaticText<TEXT_SUMABSOLUTECURRENT>, MultiStatisticsSingleImpl, SumAbsoluteCurrentStatistics>;
using FrontVoltageGraphDisplay = makeComponent<GraphDisplay<1>, StaticText<TEXT_FRONTVOLTAGE>, MultiStatisticsSingleImpl, FrontVoltageStatistics>;
using BackVoltageGraphDisplay = makeComponent<GraphDisplay<1>, StaticText<TEXT_BACKVOLTAGE>, MultiStatisticsSingleImpl, BackVoltageStatistics>;
#ifdef FEATURE_BMS
using BmsVoltageGraphDisplay = makeComponent<GraphDisplay<1>, StaticText<TEXT_BMSVOLTAGE>, MultiStatisticsSingleImpl, BmsVoltageStatistics>;
using BmsCurrentGraphDisplay = makeComponent<GraphDisplay<1>, StaticText<TEXT_BMSCURRENT>, MultiStatisticsSingleImpl, BmsCurrentStatistics>;
using BmsPowerGraphDisplay = makeComponent<GraphDisplay<1>, StaticText<TEXT_BMSPOWER>, MultiStatisticsSingleImpl, BmsPowerStatistics>;
@@ -35,6 +36,7 @@ class SumCurrentsComparisonStatistics : public virtual MultiStatisticsInterface<
}
};
using SumCurrentsComparisonGraphDisplay = makeComponent<GraphDisplay<2>, StaticText<TEXT_SUMCURRENTSCOMPARISON>, SumCurrentsComparisonStatistics>;
#endif
class MotorCurrentsStatistics : public virtual MultiStatisticsInterface<4>
{
@@ -58,10 +60,12 @@ class GraphsMenu :
makeComponent<MenuItem, StaticText<TEXT_SUMABSOLUTECURRENT>, SwitchScreenAction<SumAbsoluteCurrentGraphDisplay>>,
makeComponent<MenuItem, StaticText<TEXT_FRONTVOLTAGE>, SwitchScreenAction<FrontVoltageGraphDisplay>>,
makeComponent<MenuItem, StaticText<TEXT_BACKVOLTAGE>, SwitchScreenAction<BackVoltageGraphDisplay>>,
#ifdef FEATURE_BMS
makeComponent<MenuItem, StaticText<TEXT_BMSVOLTAGE>, SwitchScreenAction<BmsVoltageGraphDisplay>>,
makeComponent<MenuItem, StaticText<TEXT_BMSCURRENT>, SwitchScreenAction<BmsCurrentGraphDisplay>>,
makeComponent<MenuItem, StaticText<TEXT_BMSPOWER>, SwitchScreenAction<BmsPowerGraphDisplay>>,
makeComponent<MenuItem, StaticText<TEXT_SUMCURRENTSCOMPARISON>, SwitchScreenAction<SumCurrentsComparisonGraphDisplay>>,
#endif
makeComponent<MenuItem, StaticText<TEXT_MOTORCURRENTS>, SwitchScreenAction<MotorCurrentsGraphDisplay>>,
makeComponent<MenuItem, StaticText<TEXT_DUALGRAPHS>, SwitchScreenAction<DualGraphDisplay>>,
makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<MainMenu>, StaticMenuItemIcon<&icons::back>>

View File

@@ -40,7 +40,9 @@ class MainMenu :
makeComponent<MenuItem, StaticText<TEXT_SELECTMODE>, SwitchScreenAction<SelectModeMenu>, StaticMenuItemIcon<&icons::modes>>,
makeComponent<MenuItem, StaticText<TEXT_PRESETS>, SwitchScreenAction<PresetsMenu>, StaticMenuItemIcon<&icons::presets>>,
makeComponent<MenuItem, StaticText<TEXT_GRAPHS>, SwitchScreenAction<GraphsMenu>, StaticMenuItemIcon<&icons::graph>>,
#ifdef FEATURE_BMS
makeComponent<MenuItem, StaticText<TEXT_BMS>, SwitchScreenAction<BmsMenu>, StaticMenuItemIcon<&icons::bms>>,
#endif
makeComponent<MenuItem, StaticText<TEXT_SETTINGS>, SwitchScreenAction<SettingsMenu>, StaticMenuItemIcon<&icons::settings>>,
makeComponent<MenuItem, StaticText<TEXT_LOCKVEHICLE>, SwitchScreenAction<Lockscreen>, StaticMenuItemIcon<&icons::lock>>,
makeComponent<MenuItem, StaticText<TEXT_DEMOS>, SwitchScreenAction<DemosMenu>, StaticMenuItemIcon<&icons::demos>>,

View File

@@ -45,7 +45,9 @@ class SettingsMenu :
makeComponent<MenuItem, StaticText<TEXT_MODESSETTINGS>, SwitchScreenAction<ModesSettingsMenu>>,
makeComponent<MenuItem, StaticText<TEXT_CONTROLLERHARDWARESETTINGS>, SwitchScreenAction<ControllerHardwareSettingsMenu>, StaticMenuItemIcon<&icons::hardware>>,
makeComponent<MenuItem, StaticText<TEXT_BOARDCOMPUTERHARDWARESETTINGS>, SwitchScreenAction<BoardcomputerHardwareSettingsMenu>, StaticMenuItemIcon<&icons::hardware>>,
#ifdef FEATURE_BMS
makeComponent<MenuItem, StaticText<TEXT_AUTOCONNECTBMS>, ToggleBoolAction, CheckboxIcon, AutoConnectBmsAccessor>,
#endif
makeComponent<MenuItem, StaticText<TEXT_BUZZER>, SwitchScreenAction<BuzzerMenu>, StaticMenuItemIcon<&icons::buzzer>>,
makeComponent<MenuItem, StaticText<TEXT_FRONTLED>, ToggleBoolAction, CheckboxIcon, FrontLedAccessor>,
makeComponent<MenuItem, StaticText<TEXT_BACKLED>, ToggleBoolAction, CheckboxIcon, BackLedAccessor>,

View File

@@ -87,7 +87,11 @@ void MetersDisplay::rotate(int offset)
if (offset < 0)
switchScreen<StatusDisplay>();
else if (offset > 0)
#ifdef FEATURE_BMS
switchScreen<BmsDisplay>();
#else
switchScreen<StatusDisplay>();
#endif
}
void MetersDisplay::analogMeter()

View File

@@ -163,7 +163,11 @@ void StatusDisplay::redraw()
void StatusDisplay::rotate(int offset)
{
if (offset < 0)
#ifdef FEATURE_BMS
switchScreen<BmsDisplay>();
#else
switchScreen<MetersDisplay>();
#endif
else if (offset > 0)
switchScreen<MetersDisplay>();
}

View File

@@ -18,6 +18,7 @@ class StatusDisplay;
}
namespace {
#ifdef FEATURE_OTA
class UpdateDisplay : public Display
{
public:
@@ -90,4 +91,5 @@ void UpdateDisplay::confirm()
if (m_finished)
switchScreen<StatusDisplay>();
}
#endif
}

View File

@@ -67,8 +67,10 @@ void setup()
//WiFi.begin("McDonalds Free WiFi 2.4GHz", "Passwort_123");
BluetoothBeginMasterAction{}.triggered();
#ifdef FEATURE_BMS
if (settings.autoConnectBms)
BluetoothConnectBmsAction{}.triggered();
#endif
front.serial.get().begin(38400, SERIAL_8N1, PINS_RX1, PINS_TX1);
back.serial.get().begin(38400, SERIAL_8N1, PINS_RX2, PINS_TX2);
@@ -83,7 +85,9 @@ void setup()
currentMode = &modes::defaultMode;
#ifdef FEATURE_OTA
initOta();
#endif
initWebserver();
@@ -160,9 +164,13 @@ void loop()
handleSerial();
#ifdef FEATURE_OTA
handleOta();
#endif
handleWebserver();
#ifdef FEATURE_BMS
bms::update();
#endif
}

View File

@@ -1,11 +1,14 @@
#pragma once
#ifdef FEATURE_OTA
#include <ArduinoOTA.h>
#endif
#include "screens.h"
#include "displays/updatedisplay.h"
namespace {
#ifdef FEATURE_OTA
void initOta()
{
ArduinoOTA
@@ -42,4 +45,5 @@ void handleOta()
{
ArduinoOTA.handle();
}
#endif
}

View File

@@ -68,7 +68,9 @@ constexpr Settings::LarsmMode defaultLarsmMode {
};
constexpr Settings defaultSettings{
#ifdef FEATURE_BMS
.autoConnectBms = false,
#endif
.reverseBeep = true,
.reverseBeepFreq0 = 3,
.reverseBeepFreq1 = 0,

View File

@@ -55,7 +55,9 @@ union X {
AboutMenu aboutMenu;
AccessPointWifiSettingsMenu accessPointWifiSettingsMenu;
BluetoothSettingsMenu bluetoothSettingsMenu;
#ifdef FEATURE_BMS
BmsMenu bmsMenu;
#endif
BuzzerMenu buzzerMenu;
FrontCommandDebugMenu frontCommandDebugMenu;
BackCommandDebugMenu backCommandDebugMenu;
@@ -91,7 +93,9 @@ union X {
WifiScanMenu wifiScanMenu;
WifiSettingsMenu wifiSettingsMenu;
#ifdef FEATURE_BMS
BmsDisplay bmsDisplay;
#endif
CalibrateDisplay calibrateDisplay;
DualGraphDisplay dualGraphDisplay;
GameOfLifeDisplay gameOfLifeDisplay;
@@ -102,7 +106,9 @@ union X {
SpiroDisplay spiroDisplay;
StarfieldDisplay starFieldDisplay;
StatusDisplay statusDisplay;
#ifdef FEATURE_OTA
UpdateDisplay updateDisplay;
#endif
FrontFreqChangeScreen changeFrontFreq;
FrontPatternChangeScreen changeFrontPattern;
@@ -158,10 +164,12 @@ union X {
SumAbsoluteCurrentGraphDisplay sumAbsoluteCurrentGraphDisplay;
FrontVoltageGraphDisplay frontVoltageGraphDisplay;
BackVoltageGraphDisplay backVoltageGraphDisplay;
#ifdef FEATURE_BMS
BmsVoltageGraphDisplay bmsVoltageGraphDisplay;
BmsCurrentGraphDisplay bmsCurrentGraphDisplay;
BmsPowerGraphDisplay bmsPowerGraphDisplay;
SumCurrentsComparisonGraphDisplay sumCurrentsComparisonGraphDisplay;
#endif
MotorCurrentsGraphDisplay motorCurrentsGraphDisplay;
} displays;
@@ -169,7 +177,9 @@ template<typename T> T &getRefByType() = delete;
template<> decltype(displays.aboutMenu) &getRefByType<decltype(displays.aboutMenu)>() { return displays.aboutMenu; }
template<> decltype(displays.accessPointWifiSettingsMenu) &getRefByType<decltype(displays.accessPointWifiSettingsMenu)>() { return displays.accessPointWifiSettingsMenu; }
template<> decltype(displays.bluetoothSettingsMenu) &getRefByType<decltype(displays.bluetoothSettingsMenu)>() { return displays.bluetoothSettingsMenu; }
#ifdef FEATURE_BMS
template<> decltype(displays.bmsMenu) &getRefByType<decltype(displays.bmsMenu)>() { return displays.bmsMenu; }
#endif
template<> decltype(displays.buzzerMenu) &getRefByType<decltype(displays.buzzerMenu)>() { return displays.buzzerMenu; }
template<> decltype(displays.boardcomputerHardwareSettingsMenu) &getRefByType<decltype(displays.boardcomputerHardwareSettingsMenu)>() { return displays.boardcomputerHardwareSettingsMenu; }
template<> decltype(displays.controllerHardwareSettingsMenu) &getRefByType<decltype(displays.controllerHardwareSettingsMenu)>() { return displays.controllerHardwareSettingsMenu; }
@@ -205,7 +215,9 @@ template<> decltype(displays.stationWifiSettingsMenu) &
template<> decltype(displays.wifiScanMenu) &getRefByType<decltype(displays.wifiScanMenu)>() { return displays.wifiScanMenu; }
template<> decltype(displays.wifiSettingsMenu) &getRefByType<decltype(displays.wifiSettingsMenu)>() { return displays.wifiSettingsMenu; }
#ifdef FEATURE_BMS
template<> decltype(displays.bmsDisplay) &getRefByType<decltype(displays.bmsDisplay)>() { return displays.bmsDisplay; }
#endif
template<> decltype(displays.calibrateDisplay) &getRefByType<decltype(displays.calibrateDisplay)>() { return displays.calibrateDisplay; }
template<> decltype(displays.dualGraphDisplay) &getRefByType<decltype(displays.dualGraphDisplay)>() { return displays.dualGraphDisplay; }
template<> decltype(displays.gameOfLifeDisplay) &getRefByType<decltype(displays.gameOfLifeDisplay)>() { return displays.gameOfLifeDisplay; }
@@ -216,7 +228,9 @@ template<> decltype(displays.poweroffDisplay) &
template<> decltype(displays.spiroDisplay) &getRefByType<decltype(displays.spiroDisplay)>() { return displays.spiroDisplay; }
template<> decltype(displays.starFieldDisplay) &getRefByType<decltype(displays.starFieldDisplay)>() { return displays.starFieldDisplay; }
template<> decltype(displays.statusDisplay) &getRefByType<decltype(displays.statusDisplay)>() { return displays.statusDisplay; }
#ifdef FEATURE_OTA
template<> decltype(displays.updateDisplay) &getRefByType<decltype(displays.updateDisplay)>() { return displays.updateDisplay; }
#endif
template<> decltype(displays.changeFrontFreq) &getRefByType<decltype(displays.changeFrontFreq)>() { return displays.changeFrontFreq; }
template<> decltype(displays.changeFrontPattern) &getRefByType<decltype(displays.changeFrontPattern)>() { return displays.changeFrontPattern; }
@@ -272,10 +286,12 @@ template<> decltype(displays.sumCurrentGraphDisplay) &
template<> decltype(displays.sumAbsoluteCurrentGraphDisplay) &getRefByType<decltype(displays.sumAbsoluteCurrentGraphDisplay)>() { return displays.sumAbsoluteCurrentGraphDisplay; }
template<> decltype(displays.frontVoltageGraphDisplay) &getRefByType<decltype(displays.frontVoltageGraphDisplay)>() { return displays.frontVoltageGraphDisplay; }
template<> decltype(displays.backVoltageGraphDisplay) &getRefByType<decltype(displays.backVoltageGraphDisplay)>() { return displays.backVoltageGraphDisplay; }
#ifdef FEATURE_BMS
template<> decltype(displays.bmsVoltageGraphDisplay) &getRefByType<decltype(displays.bmsVoltageGraphDisplay)>() { return displays.bmsVoltageGraphDisplay; }
template<> decltype(displays.bmsCurrentGraphDisplay) &getRefByType<decltype(displays.bmsCurrentGraphDisplay)>() { return displays.bmsCurrentGraphDisplay; }
template<> decltype(displays.bmsPowerGraphDisplay) &getRefByType<decltype(displays.bmsPowerGraphDisplay)>() { return displays.bmsPowerGraphDisplay; }
template<> decltype(displays.sumCurrentsComparisonGraphDisplay) &getRefByType<decltype(displays.sumCurrentsComparisonGraphDisplay)>() { return displays.sumCurrentsComparisonGraphDisplay; }
#endif
template<> decltype(displays.motorCurrentsGraphDisplay) &getRefByType<decltype(displays.motorCurrentsGraphDisplay)>() { return displays.motorCurrentsGraphDisplay; }

View File

@@ -9,7 +9,9 @@ enum class LarsmModeMode : uint8_t { Mode1, Mode2, Mode3, Mode4 };
struct Settings
{
#ifdef FEATURE_BMS
bool autoConnectBms;
#endif
bool reverseBeep;
uint8_t reverseBeepFreq0;
uint8_t reverseBeepFreq1;
@@ -71,7 +73,9 @@ struct Settings
template<typename T>
void Settings::executeForEverySetting(T &&callable)
{
#ifdef FEATURE_BMS
callable("autoConnectBms", autoConnectBms);
#endif
callable("reverseBeep", reverseBeep);
callable("revBeepFreq0", reverseBeepFreq0);
callable("revBeepFreq1", reverseBeepFreq1);

View File

@@ -12,7 +12,9 @@ struct RefAccessorSaveSettings : public virtual RefAccessor<T>
void setValue(T value) override { RefAccessor<T>::setValue(value); saveSettings(); };
};
#ifdef FEATURE_BMS
struct AutoConnectBmsAccessor : public RefAccessorSaveSettings<bool> { bool &getRef() const override { return settings.autoConnectBms; } };
#endif
struct ReverseBeepAccessor : public RefAccessorSaveSettings<bool> { bool &getRef() const override { return settings.reverseBeep; } };
struct ReverseBeepFreq0Accessor : public RefAccessorSaveSettings<uint8_t> { uint8_t &getRef() const override { return settings.reverseBeepFreq0; } };
struct ReverseBeepFreq1Accessor : public RefAccessorSaveSettings<uint8_t> { uint8_t &getRef() const override { return settings.reverseBeepFreq1; } };

View File

@@ -9,7 +9,11 @@
namespace {
namespace statistics {
using ContainerType = ring_buffer<float, 200>;
ContainerType gas, brems, avgSpeed, avgSpeedKmh, sumCurrent, sumAbsoluteCurrent, frontVoltage, backVoltage, frontLeftCurrent, frontRightCurrent, backLeftCurrent, backRightCurrent, bmsVoltage, bmsCurrent, bmsPower;
ContainerType gas, brems, avgSpeed, avgSpeedKmh, sumCurrent, sumAbsoluteCurrent, frontVoltage, backVoltage, frontLeftCurrent, frontRightCurrent, backLeftCurrent, backRightCurrent
#ifdef FEATURE_BMS
, bmsVoltage, bmsCurrent, bmsPower
#endif
;
}
void pushStats()
@@ -32,9 +36,11 @@ void pushStats()
statistics::backLeftCurrent.push_back(fixCurrent(back.feedback.left.current));
statistics::backRightCurrent.push_back(fixCurrent(back.feedback.right.current));
}
#ifdef FEATURE_BMS
statistics::bmsVoltage.push_back(bms::voltage);
statistics::bmsCurrent.push_back(bms::current);
statistics::bmsPower.push_back(bms::power);
#endif
}
class BufferAccessorInterface
@@ -58,9 +64,11 @@ using SumCurrentStatistics = BufferAccessorImpl<statistics::sumCurrent>;
using SumAbsoluteCurrentStatistics = BufferAccessorImpl<statistics::sumAbsoluteCurrent>;
using FrontVoltageStatistics = BufferAccessorImpl<statistics::frontVoltage>;
using BackVoltageStatistics = BufferAccessorImpl<statistics::backVoltage>;
#ifdef FEATURE_BMS
using BmsVoltageStatistics = BufferAccessorImpl<statistics::bmsVoltage>;
using BmsCurrentStatistics = BufferAccessorImpl<statistics::bmsCurrent>;
using BmsPowerStatistics = BufferAccessorImpl<statistics::bmsPower>;
#endif
using FrontLeftCurrentStatistics = BufferAccessorImpl<statistics::frontLeftCurrent>;
using FrontRightCurrentStatistics = BufferAccessorImpl<statistics::frontRightCurrent>;
using BackLeftCurrentStatistics = BufferAccessorImpl<statistics::backLeftCurrent>;