added menus for ledstrip
This commit is contained in:
@ -54,6 +54,7 @@ set(headers
|
||||
displays/menus/graphsmenu.h
|
||||
displays/menus/invertmenu.h
|
||||
displays/menus/larsmmodesettingsmenu.h
|
||||
displays/menus/ledstripmenu.h
|
||||
displays/menus/modessettingsmenu.h
|
||||
displays/menus/mosfetsmenu.h
|
||||
displays/menus/motorstatedebugmenu.h
|
||||
|
@ -18,11 +18,11 @@ struct RefAccessorSaveSettings : public virtual RefAccessor<T>
|
||||
#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; } };
|
||||
struct ReverseBeepDuration0Accessor : public RefAccessorSaveSettings<int16_t> { int16_t &getRef() const override { return settings.reverseBeepDuration0; } };
|
||||
struct ReverseBeepDuration1Accessor : public RefAccessorSaveSettings<int16_t> { int16_t &getRef() const override { return settings.reverseBeepDuration1; } };
|
||||
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.buzzer.reverseBeepFreq0; } };
|
||||
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.buzzer.reverseBeepDuration0; } };
|
||||
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 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 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; } };
|
||||
|
||||
#ifdef FEATURE_LEDSTRIP
|
||||
struct EnableBrakeLightsAccessor : public RefAccessorSaveSettings<bool> { bool &getRef() const override { return settings.ledstrip.enableBrakeLights; } };
|
||||
#endif
|
||||
}
|
||||
|
42
main/displays/menus/ledstripmenu.h
Normal file
42
main/displays/menus/ledstripmenu.h
Normal 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
|
@ -27,6 +27,7 @@
|
||||
namespace {
|
||||
class StatusDisplay;
|
||||
class SelectModeMenu;
|
||||
class LedstripMenu;
|
||||
class ProfilesMenu;
|
||||
class PresetsMenu;
|
||||
class GraphsMenu;
|
||||
@ -55,6 +56,9 @@ public:
|
||||
{
|
||||
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_STATUS>, SwitchScreenAction<StatusDisplay>, StaticMenuItemIcon<&espgui::icons::back>>>();
|
||||
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_PRESETS>, SwitchScreenAction<PresetsMenu>, StaticMenuItemIcon<&icons::presets>>>();
|
||||
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_PROFILES>, SwitchScreenAction<ProfilesMenu>>>();
|
||||
|
@ -8,9 +8,13 @@
|
||||
#include "globals.h"
|
||||
|
||||
namespace {
|
||||
bool enableLedAnimation{false};
|
||||
|
||||
std::array<CRGB, LEDSTRIP_LENGTH> leds;
|
||||
uint8_t gHue = 0;
|
||||
|
||||
void showDefaultLedstrip();
|
||||
|
||||
void initLedStrip()
|
||||
{
|
||||
FastLED.addLeds<NEOPIXEL, PINS_LEDSTRIP>(std::begin(leds), leds.size())
|
||||
@ -21,28 +25,45 @@ void updateLedStrip()
|
||||
{
|
||||
EVERY_N_MILLISECONDS( 20 ) { gHue++; }
|
||||
|
||||
float avgPwm{};
|
||||
for (const Controller &controller : controllers)
|
||||
if (settings.ledstrip.enableBrakeLights)
|
||||
{
|
||||
avgPwm +=
|
||||
controller.command.left.pwm * (controller.invertLeft ? -1 : 1) +
|
||||
controller.command.right.pwm * (controller.invertRight ? -1 : 1);
|
||||
}
|
||||
avgPwm /= 4;
|
||||
float avgPwm{};
|
||||
for (const Controller &controller : controllers)
|
||||
{
|
||||
avgPwm +=
|
||||
controller.command.left.pwm * (controller.invertLeft ? -1 : 1) +
|
||||
controller.command.right.pwm * (controller.invertRight ? -1 : 1);
|
||||
}
|
||||
avgPwm /= 4;
|
||||
|
||||
if (avgPwm < -50.f)
|
||||
{
|
||||
auto color = avgSpeedKmh < -0.1f ? CRGB{255, 255, 255} : CRGB{255, 0, 0};
|
||||
constexpr auto kleinerOffset = 4;
|
||||
constexpr auto grosserOffset = 10;
|
||||
if (avgPwm < -1.f)
|
||||
{
|
||||
auto color = avgSpeedKmh < -0.1f ? CRGB{255, 255, 255} : CRGB{255, 0, 0};
|
||||
constexpr auto kleinerOffset = 4;
|
||||
constexpr auto grosserOffset = 10;
|
||||
|
||||
const auto center = std::begin(leds) + (leds.size() / 2) + 1;
|
||||
const auto center = std::begin(leds) + (leds.size() / 2) + 1;
|
||||
|
||||
std::fill(std::begin(leds), std::end(leds), CRGB{0, 0, 0});
|
||||
std::fill(center - grosserOffset, center - kleinerOffset, color);
|
||||
std::fill(center + kleinerOffset, center + grosserOffset, color);
|
||||
std::fill(std::begin(leds), std::end(leds), CRGB{0, 0, 0});
|
||||
std::fill(center - grosserOffset, center - kleinerOffset, color);
|
||||
std::fill(center + kleinerOffset, center + grosserOffset, color);
|
||||
}
|
||||
else
|
||||
{
|
||||
showDefaultLedstrip();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
showDefaultLedstrip();
|
||||
}
|
||||
|
||||
FastLED.show();
|
||||
}
|
||||
|
||||
void showDefaultLedstrip()
|
||||
{
|
||||
if (enableLedAnimation)
|
||||
{
|
||||
fadeToBlackBy(std::begin(leds), leds.size(), 20);
|
||||
|
||||
@ -53,8 +74,8 @@ void updateLedStrip()
|
||||
dothue += 32;
|
||||
}
|
||||
}
|
||||
|
||||
FastLED.show();
|
||||
else
|
||||
std::fill(std::begin(leds), std::end(leds), CRGB{0, 0, 0});
|
||||
}
|
||||
} // namespace
|
||||
#endif
|
||||
|
@ -52,6 +52,9 @@ using namespace std::chrono_literals;
|
||||
#include "displays/menus/controllerhardwaresettingsmenu.h"
|
||||
#include "displays/menus/invertmenu.h"
|
||||
#include "displays/menus/larsmmodesettingsmenu.h"
|
||||
#ifdef FEATURE_LEDSTRIP
|
||||
#include "displays/menus/ledstripmenu.h"
|
||||
#endif
|
||||
#include "displays/menus/limitssettingsmenu.h"
|
||||
#include "displays/menus/mainmenu.h"
|
||||
#include "displays/menus/tempomatmodesettingsmenu.h"
|
||||
|
@ -24,6 +24,14 @@ constexpr Settings::Limits defaultLimits {
|
||||
.phaseAdvMax = DEFAULT_FIELDADVMAX
|
||||
};
|
||||
|
||||
constexpr Settings::Buzzer defaultBuzzer {
|
||||
.reverseBeep = false,
|
||||
.reverseBeepFreq0 = 3,
|
||||
.reverseBeepFreq1 = 0,
|
||||
.reverseBeepDuration0 = 500,
|
||||
.reverseBeepDuration1 = 500,
|
||||
};
|
||||
|
||||
constexpr Settings::Limits kidsLimits {
|
||||
.iMotMax = 5,
|
||||
.iDcMax = 7,
|
||||
@ -205,15 +213,17 @@ constexpr Settings::LarsmMode defaultLarsmMode {
|
||||
.iterations = 100
|
||||
};
|
||||
|
||||
#ifdef FEATURE_LEDSTRIP
|
||||
constexpr Settings::Ledstrip defaultLedstrip {
|
||||
.enableBrakeLights = true
|
||||
};
|
||||
#endif
|
||||
|
||||
constexpr Settings defaultSettings {
|
||||
#ifdef FEATURE_BMS
|
||||
.autoConnectBms = false,
|
||||
#endif
|
||||
.reverseBeep = false,
|
||||
.reverseBeepFreq0 = 3,
|
||||
.reverseBeepFreq1 = 0,
|
||||
.reverseBeepDuration0 = 500,
|
||||
.reverseBeepDuration1 = 500,
|
||||
.buzzer = defaultBuzzer,
|
||||
.limits = defaultLimits,
|
||||
.wifiSettings = defaultWifiSettings,
|
||||
#ifdef FEATURE_BLUETOOTH
|
||||
@ -230,7 +240,10 @@ constexpr Settings defaultSettings {
|
||||
#endif
|
||||
.defaultMode = defaultDefaultMode,
|
||||
.tempomatMode = defaultTempomatMode,
|
||||
.larsmMode = defaultLarsmMode
|
||||
.larsmMode = defaultLarsmMode,
|
||||
#ifdef FEATURE_LEDSTRIP
|
||||
.ledstrip = defaultLedstrip,
|
||||
#endif
|
||||
};
|
||||
|
||||
StringSettings makeDefaultStringSettings()
|
||||
|
@ -30,11 +30,13 @@ struct Settings
|
||||
bool autoConnectBms;
|
||||
#endif
|
||||
|
||||
bool reverseBeep;
|
||||
uint8_t reverseBeepFreq0;
|
||||
uint8_t reverseBeepFreq1;
|
||||
int16_t reverseBeepDuration0;
|
||||
int16_t reverseBeepDuration1;
|
||||
struct Buzzer {
|
||||
bool reverseBeep;
|
||||
uint8_t reverseBeepFreq0;
|
||||
uint8_t reverseBeepFreq1;
|
||||
int16_t reverseBeepDuration0;
|
||||
int16_t reverseBeepDuration1;
|
||||
} buzzer;
|
||||
|
||||
struct Limits {
|
||||
int16_t iMotMax; // [A] Maximum motor current limit
|
||||
@ -145,6 +147,11 @@ struct Settings
|
||||
uint8_t iterations;
|
||||
} larsmMode;
|
||||
|
||||
#ifdef FEATURE_LEDSTRIP
|
||||
struct Ledstrip {
|
||||
bool enableBrakeLights;
|
||||
} ledstrip;
|
||||
#endif
|
||||
|
||||
template<typename T>
|
||||
void executeForEveryCommonSetting(T &&callable);
|
||||
@ -160,6 +167,12 @@ void Settings::executeForEveryCommonSetting(T &&callable)
|
||||
callable("autoConnectBms", autoConnectBms);
|
||||
#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);
|
||||
|
||||
#ifdef FEATURE_BLUETOOTH
|
||||
@ -221,17 +234,15 @@ void Settings::executeForEveryCommonSetting(T &&callable)
|
||||
callable("cloudEnabled", cloudSettings.cloudEnabled);
|
||||
callable("clodTransmTmout", cloudSettings.cloudTransmitTimeout);
|
||||
#endif
|
||||
|
||||
#ifdef FEATURE_LEDSTRIP
|
||||
callable("enableBrakeLigh", ledstrip.enableBrakeLights);
|
||||
#endif
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
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("iDcMax", limits.iDcMax);
|
||||
callable("nMotMax", limits.nMotMax);
|
||||
|
@ -232,6 +232,12 @@ constexpr char TEXT_SETMODE[] = "Set mode";
|
||||
constexpr char TEXT_SETITERATIONS[] = "Set iterations";
|
||||
//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
|
||||
//constexpr char TEXT_MODESSETTINGS[] = "Modes settings";
|
||||
constexpr char TEXT_DEFAULTMODESETTIGNS[] = "Default mode settings";
|
||||
|
@ -138,7 +138,7 @@ void fixCommonParams()
|
||||
motor.phaseAdvMax = settings.limits.phaseAdvMax;
|
||||
}
|
||||
|
||||
if (settings.reverseBeep)
|
||||
if (settings.buzzer.reverseBeep)
|
||||
{
|
||||
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; });
|
||||
@ -150,7 +150,7 @@ void fixCommonParams()
|
||||
reverseBeepToggle = true;
|
||||
lastReverseBeepToggle = espchrono::millis_clock::now();
|
||||
for (auto &controller : controllers)
|
||||
controller.command.buzzer = {.freq=settings.reverseBeepFreq0, .pattern=0};
|
||||
controller.command.buzzer = {.freq=settings.buzzer.reverseBeepFreq0, .pattern=0};
|
||||
}
|
||||
else
|
||||
for (auto &controller : controllers)
|
||||
@ -158,12 +158,12 @@ void fixCommonParams()
|
||||
|
||||
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;
|
||||
|
||||
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();
|
||||
}
|
||||
|
Reference in New Issue
Block a user