added menus for ledstrip

This commit is contained in:
2021-09-04 22:44:21 +02:00
parent 872945d089
commit d3ed93ef5f
10 changed files with 149 additions and 44 deletions

View File

@ -54,6 +54,7 @@ set(headers
displays/menus/graphsmenu.h displays/menus/graphsmenu.h
displays/menus/invertmenu.h displays/menus/invertmenu.h
displays/menus/larsmmodesettingsmenu.h displays/menus/larsmmodesettingsmenu.h
displays/menus/ledstripmenu.h
displays/menus/modessettingsmenu.h displays/menus/modessettingsmenu.h
displays/menus/mosfetsmenu.h displays/menus/mosfetsmenu.h
displays/menus/motorstatedebugmenu.h displays/menus/motorstatedebugmenu.h

View File

@ -18,11 +18,11 @@ struct RefAccessorSaveSettings : public virtual RefAccessor<T>
#ifdef FEATURE_BMS #ifdef FEATURE_BMS
struct AutoConnectBmsAccessor : public RefAccessorSaveSettings<bool> { bool &getRef() const override { return settings.autoConnectBms; } }; struct AutoConnectBmsAccessor : public RefAccessorSaveSettings<bool> { bool &getRef() const override { return settings.autoConnectBms; } };
#endif #endif
struct ReverseBeepAccessor : public RefAccessorSaveSettings<bool> { bool &getRef() const override { return settings.reverseBeep; } }; struct ReverseBeepAccessor : public RefAccessorSaveSettings<bool> { bool &getRef() const override { return settings.buzzer.reverseBeep; } };
struct ReverseBeepFreq0Accessor : public RefAccessorSaveSettings<uint8_t> { uint8_t &getRef() const override { return settings.reverseBeepFreq0; } }; struct ReverseBeepFreq0Accessor : public RefAccessorSaveSettings<uint8_t> { uint8_t &getRef() const override { return settings.buzzer.reverseBeepFreq0; } };
struct ReverseBeepFreq1Accessor : public RefAccessorSaveSettings<uint8_t> { uint8_t &getRef() const override { return settings.reverseBeepFreq1; } }; struct ReverseBeepFreq1Accessor : public RefAccessorSaveSettings<uint8_t> { uint8_t &getRef() const override { return settings.buzzer.reverseBeepFreq1; } };
struct ReverseBeepDuration0Accessor : public RefAccessorSaveSettings<int16_t> { int16_t &getRef() const override { return settings.reverseBeepDuration0; } }; struct ReverseBeepDuration0Accessor : public RefAccessorSaveSettings<int16_t> { int16_t &getRef() const override { return settings.buzzer.reverseBeepDuration0; } };
struct ReverseBeepDuration1Accessor : public RefAccessorSaveSettings<int16_t> { int16_t &getRef() const override { return settings.reverseBeepDuration1; } }; struct ReverseBeepDuration1Accessor : public RefAccessorSaveSettings<int16_t> { int16_t &getRef() const override { return settings.buzzer.reverseBeepDuration1; } };
struct IMotMaxAccessor : public RefAccessorSaveSettings<int16_t> { int16_t &getRef() const override { return settings.limits.iMotMax; } }; struct IMotMaxAccessor : public RefAccessorSaveSettings<int16_t> { int16_t &getRef() const override { return settings.limits.iMotMax; } };
struct IDcMaxAccessor : public RefAccessorSaveSettings<int16_t> { int16_t &getRef() const override { return settings.limits.iDcMax; } }; struct IDcMaxAccessor : public RefAccessorSaveSettings<int16_t> { int16_t &getRef() const override { return settings.limits.iDcMax; } };
@ -142,4 +142,8 @@ struct TempomatModeModelModeAccessor : public RefAccessorSaveSettings<UnifiedMod
struct LarsmModeModelModeAccessor : public RefAccessorSaveSettings<UnifiedModelMode> { UnifiedModelMode &getRef() const override { return settings.larsmMode.modelMode; } }; struct LarsmModeModelModeAccessor : public RefAccessorSaveSettings<UnifiedModelMode> { UnifiedModelMode &getRef() const override { return settings.larsmMode.modelMode; } };
struct LarsmModeModeAccessor : public RefAccessorSaveSettings<LarsmModeMode> { LarsmModeMode &getRef() const override { return settings.larsmMode.mode; } }; struct LarsmModeModeAccessor : public RefAccessorSaveSettings<LarsmModeMode> { LarsmModeMode &getRef() const override { return settings.larsmMode.mode; } };
struct LarsmModeIterationsAccessor : public RefAccessorSaveSettings<uint8_t> { uint8_t &getRef() const override { return settings.larsmMode.iterations; } }; struct LarsmModeIterationsAccessor : public RefAccessorSaveSettings<uint8_t> { uint8_t &getRef() const override { return settings.larsmMode.iterations; } };
#ifdef FEATURE_LEDSTRIP
struct EnableBrakeLightsAccessor : public RefAccessorSaveSettings<bool> { bool &getRef() const override { return settings.ledstrip.enableBrakeLights; } };
#endif
} }

View File

@ -0,0 +1,42 @@
#pragma once
// local includes
#include "menudisplay.h"
#include "menuitem.h"
#include "actions/toggleboolaction.h"
#include "actions/switchscreenaction.h"
#include "texts.h"
#include "icons/back.h"
#include "checkboxicon.h"
#include "globals.h"
#include "accessors/settingsaccessors.h"
#ifdef FEATURE_LEDSTRIP
#include "ledstrip.h"
#endif
// forward declares
namespace {
class MainWindow;
} // namespace
using namespace espgui;
namespace {
#ifdef FEATURE_LEDSTRIP
struct EnableLedAnimationAccessor : public RefAccessor<bool> { bool &getRef() const override { return enableLedAnimation; } };
class LedstripMenu :
public MenuDisplay,
public StaticText<TEXT_LEDSTRIP>,
public BackActionInterface<SwitchScreenAction<MainMenu>>
{
public:
LedstripMenu()
{
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_LEDANIMATION>, ToggleBoolAction, CheckboxIcon, EnableLedAnimationAccessor>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BRAKELIGHTS>, ToggleBoolAction, CheckboxIcon, EnableBrakeLightsAccessor>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<MainMenu>, StaticMenuItemIcon<&espgui::icons::back>>>();
}
};
#endif
} // namespace

View File

@ -27,6 +27,7 @@
namespace { namespace {
class StatusDisplay; class StatusDisplay;
class SelectModeMenu; class SelectModeMenu;
class LedstripMenu;
class ProfilesMenu; class ProfilesMenu;
class PresetsMenu; class PresetsMenu;
class GraphsMenu; class GraphsMenu;
@ -55,6 +56,9 @@ public:
{ {
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_STATUS>, SwitchScreenAction<StatusDisplay>, StaticMenuItemIcon<&espgui::icons::back>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_STATUS>, SwitchScreenAction<StatusDisplay>, StaticMenuItemIcon<&espgui::icons::back>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_SELECTMODE>, SwitchScreenAction<SelectModeMenu>, StaticMenuItemIcon<&icons::modes>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_SELECTMODE>, SwitchScreenAction<SelectModeMenu>, StaticMenuItemIcon<&icons::modes>>>();
#ifdef FEATURE_LEDSTRIP
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_LEDSTRIP>, SwitchScreenAction<LedstripMenu>>>();
#endif
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_MODESETTINGS>, ModeSettingsAction>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_MODESETTINGS>, ModeSettingsAction>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_PRESETS>, SwitchScreenAction<PresetsMenu>, StaticMenuItemIcon<&icons::presets>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_PRESETS>, SwitchScreenAction<PresetsMenu>, StaticMenuItemIcon<&icons::presets>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_PROFILES>, SwitchScreenAction<ProfilesMenu>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_PROFILES>, SwitchScreenAction<ProfilesMenu>>>();

View File

@ -8,9 +8,13 @@
#include "globals.h" #include "globals.h"
namespace { namespace {
bool enableLedAnimation{false};
std::array<CRGB, LEDSTRIP_LENGTH> leds; std::array<CRGB, LEDSTRIP_LENGTH> leds;
uint8_t gHue = 0; uint8_t gHue = 0;
void showDefaultLedstrip();
void initLedStrip() void initLedStrip()
{ {
FastLED.addLeds<NEOPIXEL, PINS_LEDSTRIP>(std::begin(leds), leds.size()) FastLED.addLeds<NEOPIXEL, PINS_LEDSTRIP>(std::begin(leds), leds.size())
@ -21,6 +25,8 @@ void updateLedStrip()
{ {
EVERY_N_MILLISECONDS( 20 ) { gHue++; } EVERY_N_MILLISECONDS( 20 ) { gHue++; }
if (settings.ledstrip.enableBrakeLights)
{
float avgPwm{}; float avgPwm{};
for (const Controller &controller : controllers) for (const Controller &controller : controllers)
{ {
@ -30,7 +36,7 @@ void updateLedStrip()
} }
avgPwm /= 4; avgPwm /= 4;
if (avgPwm < -50.f) if (avgPwm < -1.f)
{ {
auto color = avgSpeedKmh < -0.1f ? CRGB{255, 255, 255} : CRGB{255, 0, 0}; auto color = avgSpeedKmh < -0.1f ? CRGB{255, 255, 255} : CRGB{255, 0, 0};
constexpr auto kleinerOffset = 4; constexpr auto kleinerOffset = 4;
@ -43,6 +49,21 @@ void updateLedStrip()
std::fill(center + kleinerOffset, center + grosserOffset, color); std::fill(center + kleinerOffset, center + grosserOffset, color);
} }
else else
{
showDefaultLedstrip();
}
}
else
{
showDefaultLedstrip();
}
FastLED.show();
}
void showDefaultLedstrip()
{
if (enableLedAnimation)
{ {
fadeToBlackBy(std::begin(leds), leds.size(), 20); fadeToBlackBy(std::begin(leds), leds.size(), 20);
@ -53,8 +74,8 @@ void updateLedStrip()
dothue += 32; dothue += 32;
} }
} }
else
FastLED.show(); std::fill(std::begin(leds), std::end(leds), CRGB{0, 0, 0});
} }
} // namespace } // namespace
#endif #endif

View File

@ -52,6 +52,9 @@ using namespace std::chrono_literals;
#include "displays/menus/controllerhardwaresettingsmenu.h" #include "displays/menus/controllerhardwaresettingsmenu.h"
#include "displays/menus/invertmenu.h" #include "displays/menus/invertmenu.h"
#include "displays/menus/larsmmodesettingsmenu.h" #include "displays/menus/larsmmodesettingsmenu.h"
#ifdef FEATURE_LEDSTRIP
#include "displays/menus/ledstripmenu.h"
#endif
#include "displays/menus/limitssettingsmenu.h" #include "displays/menus/limitssettingsmenu.h"
#include "displays/menus/mainmenu.h" #include "displays/menus/mainmenu.h"
#include "displays/menus/tempomatmodesettingsmenu.h" #include "displays/menus/tempomatmodesettingsmenu.h"

View File

@ -24,6 +24,14 @@ constexpr Settings::Limits defaultLimits {
.phaseAdvMax = DEFAULT_FIELDADVMAX .phaseAdvMax = DEFAULT_FIELDADVMAX
}; };
constexpr Settings::Buzzer defaultBuzzer {
.reverseBeep = false,
.reverseBeepFreq0 = 3,
.reverseBeepFreq1 = 0,
.reverseBeepDuration0 = 500,
.reverseBeepDuration1 = 500,
};
constexpr Settings::Limits kidsLimits { constexpr Settings::Limits kidsLimits {
.iMotMax = 5, .iMotMax = 5,
.iDcMax = 7, .iDcMax = 7,
@ -205,15 +213,17 @@ constexpr Settings::LarsmMode defaultLarsmMode {
.iterations = 100 .iterations = 100
}; };
#ifdef FEATURE_LEDSTRIP
constexpr Settings::Ledstrip defaultLedstrip {
.enableBrakeLights = true
};
#endif
constexpr Settings defaultSettings { constexpr Settings defaultSettings {
#ifdef FEATURE_BMS #ifdef FEATURE_BMS
.autoConnectBms = false, .autoConnectBms = false,
#endif #endif
.reverseBeep = false, .buzzer = defaultBuzzer,
.reverseBeepFreq0 = 3,
.reverseBeepFreq1 = 0,
.reverseBeepDuration0 = 500,
.reverseBeepDuration1 = 500,
.limits = defaultLimits, .limits = defaultLimits,
.wifiSettings = defaultWifiSettings, .wifiSettings = defaultWifiSettings,
#ifdef FEATURE_BLUETOOTH #ifdef FEATURE_BLUETOOTH
@ -230,7 +240,10 @@ constexpr Settings defaultSettings {
#endif #endif
.defaultMode = defaultDefaultMode, .defaultMode = defaultDefaultMode,
.tempomatMode = defaultTempomatMode, .tempomatMode = defaultTempomatMode,
.larsmMode = defaultLarsmMode .larsmMode = defaultLarsmMode,
#ifdef FEATURE_LEDSTRIP
.ledstrip = defaultLedstrip,
#endif
}; };
StringSettings makeDefaultStringSettings() StringSettings makeDefaultStringSettings()

View File

@ -30,11 +30,13 @@ struct Settings
bool autoConnectBms; bool autoConnectBms;
#endif #endif
struct Buzzer {
bool reverseBeep; bool reverseBeep;
uint8_t reverseBeepFreq0; uint8_t reverseBeepFreq0;
uint8_t reverseBeepFreq1; uint8_t reverseBeepFreq1;
int16_t reverseBeepDuration0; int16_t reverseBeepDuration0;
int16_t reverseBeepDuration1; int16_t reverseBeepDuration1;
} buzzer;
struct Limits { struct Limits {
int16_t iMotMax; // [A] Maximum motor current limit int16_t iMotMax; // [A] Maximum motor current limit
@ -145,6 +147,11 @@ struct Settings
uint8_t iterations; uint8_t iterations;
} larsmMode; } larsmMode;
#ifdef FEATURE_LEDSTRIP
struct Ledstrip {
bool enableBrakeLights;
} ledstrip;
#endif
template<typename T> template<typename T>
void executeForEveryCommonSetting(T &&callable); void executeForEveryCommonSetting(T &&callable);
@ -160,6 +167,12 @@ void Settings::executeForEveryCommonSetting(T &&callable)
callable("autoConnectBms", autoConnectBms); callable("autoConnectBms", autoConnectBms);
#endif #endif
callable("reverseBeep", buzzer.reverseBeep);
callable("revBeepFreq0", buzzer.reverseBeepFreq0);
callable("revBeepFreq1", buzzer.reverseBeepFreq1);
callable("revBeepDur0", buzzer.reverseBeepDuration0);
callable("revBeepDur1", buzzer.reverseBeepDuration1);
callable("wifiEnabled", wifiSettings.wifiEnabled); callable("wifiEnabled", wifiSettings.wifiEnabled);
#ifdef FEATURE_BLUETOOTH #ifdef FEATURE_BLUETOOTH
@ -221,17 +234,15 @@ void Settings::executeForEveryCommonSetting(T &&callable)
callable("cloudEnabled", cloudSettings.cloudEnabled); callable("cloudEnabled", cloudSettings.cloudEnabled);
callable("clodTransmTmout", cloudSettings.cloudTransmitTimeout); callable("clodTransmTmout", cloudSettings.cloudTransmitTimeout);
#endif #endif
#ifdef FEATURE_LEDSTRIP
callable("enableBrakeLigh", ledstrip.enableBrakeLights);
#endif
} }
template<typename T> template<typename T>
void Settings::executeForEveryProfileSetting(T &&callable) void Settings::executeForEveryProfileSetting(T &&callable)
{ {
callable("reverseBeep", reverseBeep);
callable("revBeepFreq0", reverseBeepFreq0);
callable("revBeepFreq1", reverseBeepFreq1);
callable("revBeepDur0", reverseBeepDuration0);
callable("revBeepDur1", reverseBeepDuration1);
callable("iMotMax", limits.iMotMax); callable("iMotMax", limits.iMotMax);
callable("iDcMax", limits.iDcMax); callable("iDcMax", limits.iDcMax);
callable("nMotMax", limits.nMotMax); callable("nMotMax", limits.nMotMax);

View File

@ -232,6 +232,12 @@ constexpr char TEXT_SETMODE[] = "Set mode";
constexpr char TEXT_SETITERATIONS[] = "Set iterations"; constexpr char TEXT_SETITERATIONS[] = "Set iterations";
//constexpr char TEXT_BACK[] = "Back"; //constexpr char TEXT_BACK[] = "Back";
//LedstripMenu
constexpr char TEXT_LEDSTRIP[] = "Ledstrip";
constexpr char TEXT_LEDANIMATION[] = "LED Animation";
constexpr char TEXT_BRAKELIGHTS[] = "Brake Lights";
//constexpr char TEXT_BACK[] = "Back";
//ModesSettingsMenu //ModesSettingsMenu
//constexpr char TEXT_MODESSETTINGS[] = "Modes settings"; //constexpr char TEXT_MODESSETTINGS[] = "Modes settings";
constexpr char TEXT_DEFAULTMODESETTIGNS[] = "Default mode settings"; constexpr char TEXT_DEFAULTMODESETTIGNS[] = "Default mode settings";

View File

@ -138,7 +138,7 @@ void fixCommonParams()
motor.phaseAdvMax = settings.limits.phaseAdvMax; motor.phaseAdvMax = settings.limits.phaseAdvMax;
} }
if (settings.reverseBeep) if (settings.buzzer.reverseBeep)
{ {
const auto x = motors(); const auto x = motors();
const auto shouldBeep = std::all_of(std::begin(x), std::end(x), [](const bobbycar::protocol::serial::MotorState &motor){ return motor.pwm < 0; }); const auto shouldBeep = std::all_of(std::begin(x), std::end(x), [](const bobbycar::protocol::serial::MotorState &motor){ return motor.pwm < 0; });
@ -150,7 +150,7 @@ void fixCommonParams()
reverseBeepToggle = true; reverseBeepToggle = true;
lastReverseBeepToggle = espchrono::millis_clock::now(); lastReverseBeepToggle = espchrono::millis_clock::now();
for (auto &controller : controllers) for (auto &controller : controllers)
controller.command.buzzer = {.freq=settings.reverseBeepFreq0, .pattern=0}; controller.command.buzzer = {.freq=settings.buzzer.reverseBeepFreq0, .pattern=0};
} }
else else
for (auto &controller : controllers) for (auto &controller : controllers)
@ -158,12 +158,12 @@ void fixCommonParams()
currentlyReverseBeeping = shouldBeep; currentlyReverseBeeping = shouldBeep;
} }
else if (shouldBeep && espchrono::millis_clock::now() - lastReverseBeepToggle >= std::chrono::milliseconds{reverseBeepToggle?settings.reverseBeepDuration0:settings.reverseBeepDuration1}) else if (shouldBeep && espchrono::millis_clock::now() - lastReverseBeepToggle >= std::chrono::milliseconds{reverseBeepToggle?settings.buzzer.reverseBeepDuration0:settings.buzzer.reverseBeepDuration1})
{ {
reverseBeepToggle = !reverseBeepToggle; reverseBeepToggle = !reverseBeepToggle;
for (auto &controller : controllers) for (auto &controller : controllers)
controller.command.buzzer = {.freq=uint8_t(reverseBeepToggle?settings.reverseBeepFreq0:settings.reverseBeepFreq1), .pattern=0}; controller.command.buzzer = {.freq=uint8_t(reverseBeepToggle?settings.buzzer.reverseBeepFreq0:settings.buzzer.reverseBeepFreq1), .pattern=0};
lastReverseBeepToggle = espchrono::millis_clock::now(); lastReverseBeepToggle = espchrono::millis_clock::now();
} }