From dfcf841db4170ebb23951ef5027ea472d4bd5a70 Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Thu, 30 Sep 2021 21:03:13 +0200 Subject: [PATCH 1/5] Added optional beep when blinking --- main/accessors/settingsaccessors.h | 1 + main/displays/menus/ledstripmenu.h | 4 +++- main/ledstrip.h | 11 +++++++++++ main/presets.h | 3 ++- main/settings.h | 2 ++ main/texts.h | 1 + 6 files changed, 20 insertions(+), 2 deletions(-) diff --git a/main/accessors/settingsaccessors.h b/main/accessors/settingsaccessors.h index 2a7efd5..2f5f49b 100644 --- a/main/accessors/settingsaccessors.h +++ b/main/accessors/settingsaccessors.h @@ -158,6 +158,7 @@ struct CenterOffsetAccessor : public RefAccessorSaveSettings { int16_t struct SmallOffsetAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.ledstrip.smallOffset; } }; struct BigOffsetAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.ledstrip.bigOffset; } }; struct DeziampereAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.ledstrip.deziampere; } }; +struct EnableBeepWhenBlinkAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.ledstrip.enableBeepWhenBlink; } }; #endif struct LockscreenAllowPresetSwitchAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.lockscreen.allowPresetSwitch; } }; diff --git a/main/displays/menus/ledstripmenu.h b/main/displays/menus/ledstripmenu.h index 49d9886..48c559e 100644 --- a/main/displays/menus/ledstripmenu.h +++ b/main/displays/menus/ledstripmenu.h @@ -1,5 +1,5 @@ #pragma once - +#define FEATURE_LEDSTRIP // local includes #include "menudisplay.h" #include "menuitem.h" @@ -88,7 +88,9 @@ public: { constructMenuItem, ToggleBoolAction, CheckboxIcon, EnableLedAnimationAccessor>>(); constructMenuItem, ToggleBoolAction, CheckboxIcon, EnableBrakeLightsAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, EnableBeepWhenBlinkAccessor>>(); constructMenuItem, SwitchScreenAction>>(); + // constructMenuItem, SwitchScreenAction>>(); constructMenuItem, SwitchScreenAction>>(); constructMenuItem, SwitchScreenAction>>(); diff --git a/main/ledstrip.h b/main/ledstrip.h index 97c4410..c18d190 100644 --- a/main/ledstrip.h +++ b/main/ledstrip.h @@ -37,6 +37,11 @@ void updateLedStrip() if (espchrono::millis_clock::now().time_since_epoch() % 750ms < 375ms) { + if (settings.ledstrip.enableBeepWhenBlink) + { + for (Controller &controller : controllers) + controller.command.buzzer.freq = 3; + } auto color = CRGB{255, 255, 0}; const auto center = (std::begin(leds) + (leds.size() / 2) + settings.ledstrip.centerOffset); @@ -51,6 +56,12 @@ void updateLedStrip() if (blinkAnimation != LEDSTRIP_ANIMATION_BLINKRIGHT) std::fill(center + settings.ledstrip.smallOffset, center + settings.ledstrip.bigOffset, color); #endif + } else { + if (settings.ledstrip.enableBeepWhenBlink) + { + for (Controller &controller : controllers) + controller.command.buzzer.freq = 0; + } } } else diff --git a/main/presets.h b/main/presets.h index fdf29fb..f87b48a 100644 --- a/main/presets.h +++ b/main/presets.h @@ -230,7 +230,8 @@ constexpr Settings::Ledstrip defaultLedstrip { .centerOffset = 1, .smallOffset = 4, .bigOffset = 10, - .deziampere = 30 + .deziampere = 30, + .enableBeepWhenBlink = false }; #endif diff --git a/main/settings.h b/main/settings.h index 1d331c7..bdd6284 100644 --- a/main/settings.h +++ b/main/settings.h @@ -161,6 +161,7 @@ struct Settings int16_t smallOffset; int16_t bigOffset; int16_t deziampere; + bool enableBeepWhenBlink; } ledstrip; #endif @@ -260,6 +261,7 @@ void Settings::executeForEveryCommonSetting(T &&callable) callable("smallOffset", ledstrip.smallOffset); callable("bigOffset", ledstrip.bigOffset); callable("deziampere", ledstrip.deziampere); + callable("beeppwhenblink", ledstrip.enableBeepWhenBlink); #endif callable("lockAlwPresetSw", lockscreen.allowPresetSwitch); diff --git a/main/texts.h b/main/texts.h index 45ca6fd..30361f8 100644 --- a/main/texts.h +++ b/main/texts.h @@ -248,6 +248,7 @@ constexpr char TEXT_CENTEROFFSET[] = "Center Offset"; constexpr char TEXT_SMALLOFFSET[] = "Small Offset"; constexpr char TEXT_BIGOFFSET[] = "Big Offset"; constexpr char TEXT_LEDSTRIP_MILLIAMP[] = "Ledstrip 0.1A"; +constexpr char TEXT_BLINKBEEP[] = "Blink Beep"; //constexpr char TEXT_BACK[] = "Back"; //LedstripSelectAnimationMenu From 53edd82feface6f4125ecf80fe0d56bf3e0eb787 Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Thu, 30 Sep 2021 21:18:42 +0200 Subject: [PATCH 2/5] Removed dev-define --- main/displays/menus/ledstripmenu.h | 1 - 1 file changed, 1 deletion(-) diff --git a/main/displays/menus/ledstripmenu.h b/main/displays/menus/ledstripmenu.h index 48c559e..72d490e 100644 --- a/main/displays/menus/ledstripmenu.h +++ b/main/displays/menus/ledstripmenu.h @@ -1,5 +1,4 @@ #pragma once -#define FEATURE_LEDSTRIP // local includes #include "menudisplay.h" #include "menuitem.h" From f756d482324896d76795a0a2a9701db1dae585d4 Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Thu, 30 Sep 2021 23:17:42 +0200 Subject: [PATCH 3/5] Added 6 Wire and FEATURE_GSCHISSENE_DIODE --- config_comred.cmake | 51 +++-- main/CMakeLists.txt | 4 + main/accessors/settingsaccessors.h | 2 +- main/displays/dpad6wiredebugdisplay.h | 92 ++++++++ .../menus/boardcomputerhardwaresettingsmenu.h | 4 +- main/dpad6wire.h | 213 ++++++++++++++++++ main/main.cpp | 16 ++ main/presets.h | 2 +- main/settings.h | 2 +- 9 files changed, 367 insertions(+), 19 deletions(-) create mode 100644 main/displays/dpad6wiredebugdisplay.h create mode 100644 main/dpad6wire.h diff --git a/config_comred.cmake b/config_comred.cmake index 2026453..251df02 100644 --- a/config_comred.cmake +++ b/config_comred.cmake @@ -44,21 +44,44 @@ set(BOBBYCAR_BUILDFLAGS -DAP_PASSWORD=Passwort_123 -DFEATURE_WEBSERVER -DFEATURE_OTA - -DFEATURE_DPAD_5WIRESW - -DPINS_DPAD_5WIRESW_OUT=4 - -DPINS_DPAD_5WIRESW_IN1=5 - -DPINS_DPAD_5WIRESW_IN2=27 - -DPINS_DPAD_5WIRESW_IN3=18 - -DPINS_DPAD_5WIRESW_IN4=19 - -DDPAD_5WIRESW_UP=1 - -DDPAD_5WIRESW_DOWN=5 - -DDPAD_5WIRESW_CONFIRM=2 - -DDPAD_5WIRESW_BACK=6 - -DDPAD_5WIRESW_PROFILE0=4 - -DDPAD_5WIRESW_PROFILE1=0 - -DDPAD_5WIRESW_PROFILE2=7 - -DDPAD_5WIRESW_PROFILE3=3 +# -DFEATURE_DPAD_5WIRESW +# -DPINS_DPAD_5WIRESW_OUT=4 +# -DPINS_DPAD_5WIRESW_IN1=5 +# -DPINS_DPAD_5WIRESW_IN2=27 +# -DPINS_DPAD_5WIRESW_IN3=18 +# -DPINS_DPAD_5WIRESW_IN4=19 +# -DPINS_DPAD_EXTRASW_IN5=25 + -DFEATURE_DPAD_6WIRESW + -DPINS_DPAD_6WIRESW_OUT=4 + -DPINS_DPAD_6WIRESW_IN1=5 + -DPINS_DPAD_6WIRESW_IN2=27 + -DPINS_DPAD_6WIRESW_IN3=18 + -DPINS_DPAD_6WIRESW_IN4=19 + -DPINS_DPAD_6WIRESW_IN5=26 + +# -DDPAD_5WIRESW_UP=1 +# -DDPAD_5WIRESW_DOWN=5 +# -DDPAD_5WIRESW_CONFIRM=2 +# -DDPAD_5WIRESW_BACK=6 +# -DDPAD_5WIRESW_PROFILE0=4 +# -DDPAD_5WIRESW_PROFILE1=0 +# -DDPAD_5WIRESW_PROFILE2=7 +# -DDPAD_5WIRESW_PROFILE3=3 # -DDPAD_5WIRESW_DEBUG + + -DDPAD_6WIRESW_UP=1 + -DDPAD_6WIRESW_DOWN=5 + -DDPAD_6WIRESW_CONFIRM=2 + -DDPAD_6WIRESW_BACK=6 + -DDPAD_6WIRESW_PROFILE0=4 + -DDPAD_6WIRESW_PROFILE1=0 + -DDPAD_6WIRESW_PROFILE2=7 + -DDPAD_6WIRESW_PROFILE3=3 + -DDPAD_6WIRESW_BLINK_LEFT=9 + -DDPAD_6WIRESW_BLINK_RIGHT=8 +# -DDPAD_6WIRESW_DEBUG + -DFEATURE_GSCHISSENE_DIODE + -DDEFAULT_GASMIN=842 -DDEFAULT_GASMAX=2480 -DDEFAULT_BREMSMIN=826 diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index cdbff58..1431cc9 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -85,6 +85,8 @@ set(headers displays/bmsdisplay.h displays/calibratedisplay.h displays/dpad5wiredebugdisplay.h + displays/dpad5wire2outdebugdisplay.h + displays/dpad6wiredebugdisplay.h displays/gametrakcalibratedisplay.h displays/garagedisplay.h displays/lockscreen.h @@ -133,6 +135,8 @@ set(headers dpad.h dpad3wire.h dpad5wire.h + dpad5wire_2out.h + dpad6wire.h feedbackparser.h globals.h macros_bobbycar.h diff --git a/main/accessors/settingsaccessors.h b/main/accessors/settingsaccessors.h index 2f5f49b..a81e7fa 100644 --- a/main/accessors/settingsaccessors.h +++ b/main/accessors/settingsaccessors.h @@ -101,7 +101,7 @@ struct GasMinAccessor : public RefAccessorSaveSettings { int16_t &getRe struct GasMaxAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.boardcomputerHardware.gasMax; } }; struct BremsMinAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.boardcomputerHardware.bremsMin; } }; struct BremsMaxAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.boardcomputerHardware.bremsMax; } }; -#if defined(FEATURE_DPAD) || defined(FEATURE_DPAD_3WIRESW) || defined(FEATURE_DPAD_5WIRESW) || defined(FEATURE_DPAD_5WIRESW_2OUT) +#if defined(FEATURE_DPAD) || defined(FEATURE_DPAD_3WIRESW) || defined(FEATURE_DPAD_5WIRESW) || defined(FEATURE_DPAD_5WIRESW_2OUT) || defined (FEATURE_DPAD_6WIRESW) struct DPadDebounceAccessor : public RefAccessorSaveSettings { uint8_t &getRef() const override { return settings.boardcomputerHardware.dpadDebounce; } }; #endif #ifdef FEATURE_GAMETRAK diff --git a/main/displays/dpad6wiredebugdisplay.h b/main/displays/dpad6wiredebugdisplay.h new file mode 100644 index 0000000..783651c --- /dev/null +++ b/main/displays/dpad6wiredebugdisplay.h @@ -0,0 +1,92 @@ +#pragma once + +#include "display.h" +#include "globals.h" +#include "widgets/label.h" +#include "dpad6wire.h" + +namespace { +#ifdef FEATURE_DPAD_6WIRESW +class DPad6WireDebugDisplay : public Display, public virtual DummyConfirm, public virtual DummyBack +{ +public: + void initScreen() override; + void redraw() override; + +private: + Label m_labelRaw{0, 50}; + Label m_labelUp{175, 75}; + Label m_labelDown{175, 100}; + Label m_labelBack{175, 125}; + Label m_labelConfirm{175, 150}; + Label m_labelProfile0{175, 175}; + Label m_labelProfile1{175, 200}; + Label m_labelProfile2{175, 225}; + Label m_labelProfile3{175, 250}; + Label m_labelGas{175, 275}; + Label m_labelBrems{175, 300}; +}; + +void DPad6WireDebugDisplay::initScreen() +{ + tft.fillScreen(TFT_BLACK); + tft.setTextFont(4); + tft.setTextColor(TFT_YELLOW); + + tft.drawString("DPad 5wire debug", 5, 5); + + tft.fillRect(0, 34, tft.width(), 3, TFT_WHITE); + + tft.setTextColor(TFT_WHITE, TFT_BLACK); + + tft.drawString("UP:", 30, 75); + tft.drawString("DOWN:", 30, 100); + tft.drawString("CONFIRM:", 30, 125); + tft.drawString("BACK:", 30, 150); + tft.drawString("PROFILE0:", 30, 175); + tft.drawString("PROFILE1:", 30, 200); + tft.drawString("PROFILE2:", 30, 225); + tft.drawString("PROFILE3:", 30, 250); + tft.drawString("GAS:", 30, 275); + tft.drawString("BREMS:", 30, 300); + + m_labelRaw.start(); + m_labelUp.start(); + m_labelDown.start(); + m_labelBack.start(); + m_labelConfirm.start(); + m_labelProfile0.start(); + m_labelProfile1.start(); + m_labelProfile2.start(); + m_labelProfile3.start(); + m_labelGas.start(); + m_labelBrems.start(); +} + +void DPad6WireDebugDisplay::redraw() +{ + m_labelRaw.redraw(std::string{} + + (std::get<0>(dpad6wire::lastState) ? 'Z' : '0') + ' ' + + (std::get<1>(dpad6wire::lastState) ? '1' : '0') + ' ' + + (std::get<2>(dpad6wire::lastState) ? '2' : '0') + ' ' + + (std::get<3>(dpad6wire::lastState) ? '3' : '0') + ' ' + + (std::get<4>(dpad6wire::lastState) ? '4' : '0') + ' ' + + (std::get<5>(dpad6wire::lastState) ? '5' : '0') + ' ' + + (std::get<6>(dpad6wire::lastState) ? '6' : '0') + ' ' + + (std::get<7>(dpad6wire::lastState) ? '7' : '0') + ' ' + + (std::get<8>(dpad6wire::lastState) ? '8' : '0') + ' ' + + (std::get<9>(dpad6wire::lastState) ? '9' : '0')); + + m_labelUp.redraw(std::get(dpad6wire::lastState) ? "1" : "0"); + m_labelDown.redraw(std::get(dpad6wire::lastState) ? "1" : "0"); + m_labelBack.redraw(std::get(dpad6wire::lastState) ? "1" : "0"); + m_labelConfirm.redraw(std::get(dpad6wire::lastState) ? "1" : "0"); + m_labelProfile0.redraw(std::get(dpad6wire::lastState) ? "1" : "0"); + m_labelProfile1.redraw(std::get(dpad6wire::lastState) ? "1" : "0"); + m_labelProfile2.redraw(std::get(dpad6wire::lastState) ? "1" : "0"); + m_labelProfile3.redraw(std::get(dpad6wire::lastState) ? "1" : "0"); + m_labelGas.redraw(raw_gas ? std::to_string(*raw_gas) : "?"); + m_labelBrems.redraw(raw_brems ? std::to_string(*raw_brems) : "?"); +} +#endif +} diff --git a/main/displays/menus/boardcomputerhardwaresettingsmenu.h b/main/displays/menus/boardcomputerhardwaresettingsmenu.h index 29d0e85..182f54e 100644 --- a/main/displays/menus/boardcomputerhardwaresettingsmenu.h +++ b/main/displays/menus/boardcomputerhardwaresettingsmenu.h @@ -86,7 +86,7 @@ using BremsMaxChangeScreen = makeComponent< SwitchScreenAction >; -#if defined(FEATURE_DPAD) || defined(FEATURE_DPAD_3WIRESW) || defined(FEATURE_DPAD_5WIRESW) || defined(FEATURE_DPAD_5WIRESW_2OUT) +#if defined(FEATURE_DPAD) || defined(FEATURE_DPAD_3WIRESW) || defined(FEATURE_DPAD_5WIRESW) || defined(FEATURE_DPAD_5WIRESW_2OUT) || defined (FEATURE_DPAD_6WIRESW) using DPadDebounceChangeScreen = makeComponent< ChangeValueDisplay, StaticText, @@ -171,7 +171,7 @@ public: constructMenuItem, SwitchScreenAction>>(); constructMenuItem, SwitchScreenAction>>(); constructMenuItem, SwitchScreenAction>>(); -#if defined(FEATURE_DPAD) || defined(FEATURE_DPAD_3WIRESW) || defined(FEATURE_DPAD_5WIRESW) || defined(FEATURE_DPAD_5WIRESW_2OUT) +#if defined(FEATURE_DPAD) || defined(FEATURE_DPAD_3WIRESW) || defined(FEATURE_DPAD_5WIRESW) || defined(FEATURE_DPAD_5WIRESW_2OUT) || defined (FEATURE_DPAD_6WIRESW) constructMenuItem, SwitchScreenAction>>(); #endif #ifdef FEATURE_GAMETRAK diff --git a/main/dpad6wire.h b/main/dpad6wire.h new file mode 100644 index 0000000..b9b86f7 --- /dev/null +++ b/main/dpad6wire.h @@ -0,0 +1,213 @@ +#pragma once +#define FEATURE_DPAD_6WIRESW +// system includes +#include + +// Arduino includes +#include + +// 3rdparty lib includes +#include +#include + +// local includes +#include "buttons.h" +#include "types.h" + +namespace { +namespace dpad6wire { +#ifdef FEATURE_DPAD_6WIRESW +class State : public std::array +{ +public: + State() : std::array{false, false, false, false, false, false, false, false, false, false} {} + State(const std::array &other) : std::array{} {} + + State &operator=(const std::array &other) + { + std::array::operator=(other); + return *this; + } + + State &operator=(const State &other) + { + std::array::operator=(other); + return *this; + } + + bool &up{this->at(DPAD_6WIRESW_UP)}; + bool &down{this->at(DPAD_6WIRESW_DOWN)}; + bool &confirm{this->at(DPAD_6WIRESW_CONFIRM)}; + bool &back{this->at(DPAD_6WIRESW_BACK)}; + bool &profile0{this->at(DPAD_6WIRESW_PROFILE0)}; + bool &profile1{this->at(DPAD_6WIRESW_PROFILE1)}; + bool &profile2{this->at(DPAD_6WIRESW_PROFILE2)}; + bool &profile3{this->at(DPAD_6WIRESW_PROFILE3)}; + + bool &blink_left{this->at(DPAD_6WIRESW_BLINK_LEFT)}; + bool &blink_right{this->at(DPAD_6WIRESW_BLINK_RIGHT)}; +}; + +template +class Helper +{ +public: + static constexpr auto OutPin = OUT; + static constexpr auto In1Pin = IN1; + static constexpr auto In2Pin = IN2; + static constexpr auto In3Pin = IN3; + static constexpr auto In4Pin = IN4; + static constexpr auto In5Pin = IN5; + + void begin(); + + State read(); +}; + +template +void Helper::begin() +{ + pinMode(OUT, OUTPUT); +} + +template +State Helper::read() +{ + State result; + + digitalWrite(OUT, LOW); + + pinMode(IN1, INPUT_PULLUP); + pinMode(IN2, INPUT_PULLUP); + pinMode(IN3, INPUT_PULLUP); + pinMode(IN4, INPUT_PULLUP); + pinMode(IN5, INPUT_PULLUP); + + vPortYield(); + + result[0] = digitalRead(IN1)==LOW; + result[1] = digitalRead(IN2)==LOW; + result[2] = digitalRead(IN3)==LOW; + result[3] = digitalRead(IN4)==LOW; + result[8] = digitalRead(IN5)==LOW; + + digitalWrite(OUT, HIGH); + + pinMode(IN1, INPUT_PULLDOWN); + pinMode(IN2, INPUT_PULLDOWN); + pinMode(IN3, INPUT_PULLDOWN); + pinMode(IN4, INPUT_PULLDOWN); + pinMode(IN5, INPUT_PULLDOWN); + + vPortYield(); + + result[4] = digitalRead(IN1); + result[5] = digitalRead(IN2); + result[6] = digitalRead(IN3); + result[7] = digitalRead(IN4); + result[9] = digitalRead(IN5); + +#ifdef FEATURE_GSCHISSENE_DIODE + if (result[8] && result[9]) result[9] = 0; +#endif + + return result; +} + +Helper helper; +State lastState; +espchrono::millis_clock::time_point debounceUp, debounceDown, debounceConfirm, debounceBack, debounceProfile0, debounceProfile1, debounceProfile2, debounceProfile3, debounceBlinkLeft, debounceBlinkRight; + +void init() +{ + helper.begin(); + debounceUp = debounceDown = debounceConfirm = debounceBack = debounceProfile0 = debounceProfile1 = debounceProfile2 = debounceProfile3 = debounceBlinkLeft = debounceBlinkRight = espchrono::millis_clock::now(); +} + +void update() +{ + const auto newState = helper.read(); + +#ifdef DPAD_6WIRESW_DEBUG + lastState = newState; + return; +#endif + + const auto now = espchrono::millis_clock::now(); + + const std::chrono::milliseconds dpadDebounce{settings.boardcomputerHardware.dpadDebounce}; + + if (lastState.up != newState.up && now - debounceUp > dpadDebounce) + { + lastState.up = newState.up; + InputDispatcher::upButton(newState.up); + debounceUp = now; + } + + if (lastState.down != newState.down && now - debounceDown > dpadDebounce) + { + lastState.down = newState.down; + InputDispatcher::downButton(newState.down); + debounceDown = now; + } + + if (lastState.confirm != newState.confirm && now - debounceConfirm > dpadDebounce) + { + lastState.confirm = newState.confirm; + InputDispatcher::confirmButton(newState.confirm); + debounceConfirm = now; + } + + if (lastState.back != newState.back && now - debounceBack > dpadDebounce) + { + lastState.back = newState.back; + InputDispatcher::backButton(newState.back); + debounceBack = now; + } + + if (lastState.profile0 != newState.profile0 && now - debounceProfile0 > dpadDebounce) + { + lastState.profile0 = newState.profile0; + InputDispatcher::profileButton(0, newState.profile0); + debounceProfile0 = now; + } + + if (lastState.profile1 != newState.profile1 && now - debounceProfile1 > dpadDebounce) + { + lastState.profile1 = newState.profile1; + InputDispatcher::profileButton(1, newState.profile1); + debounceProfile1 = now; + } + + if (lastState.profile2 != newState.profile2 && now - debounceProfile2 > dpadDebounce) + { + lastState.profile2 = newState.profile2; + InputDispatcher::profileButton(2, newState.profile2); + debounceProfile2 = now; + } + + if (lastState.profile3 != newState.profile3 && now - debounceProfile3 > dpadDebounce) + { + lastState.profile3 = newState.profile3; + InputDispatcher::profileButton(3, newState.profile3); + debounceProfile3 = now; + } + + if (lastState.blink_left != newState.blink_left && now - debounceBlinkLeft > dpadDebounce) + { + lastState.blink_left = newState.blink_left; + InputDispatcher::blinkLeftButton(newState.blink_left); + debounceBlinkLeft = now; + } + + if (lastState.blink_right != newState.blink_right && now - debounceBlinkRight > dpadDebounce) + { + lastState.blink_right = newState.blink_right; + InputDispatcher::blinkRightButton(newState.blink_right); + debounceBlinkRight = now; + } +} +#endif + +} // namespace dpad6wire +} // namespace diff --git a/main/main.cpp b/main/main.cpp index ce6c348..534b9f3 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -85,6 +85,9 @@ using namespace std::chrono_literals; #ifdef FEATURE_DPAD_5WIRESW_2OUT #include "displays/dpad5wire2outdebugdisplay.h" #endif +#ifdef FEATURE_DPAD_6WIRESW +#include "displays/dpad6wiredebugdisplay.h" +#endif #include "displays/gameoflifedisplay.h" #ifdef FEATURE_GARAGE #include "displays/garagedisplay.h" @@ -114,6 +117,9 @@ using namespace std::chrono_literals; #ifdef FEATURE_DPAD_5WIRESW_2OUT #include "dpad5wire_2out.h" #endif +#ifdef FEATURE_DPAD_6WIRESW +#include "dpad6wire.h" +#endif #ifdef FEATURE_ROTARY #include "rotary.h" #endif @@ -236,6 +242,11 @@ extern "C" void app_main() dpad5wire_2out::init(); #endif +#ifdef FEATURE_DPAD_6WIRESW + bootLabel.redraw("dpad6wire"); + dpad6wire::init(); +#endif + #ifdef FEATURE_ROTARY bootLabel.redraw("rotary"); initRotary(); @@ -339,6 +350,8 @@ extern "C" void app_main() switchScreen(); #elif defined(FEATURE_DPAD_5WIRESW_2OUT) && defined(DPAD_5WIRESW_DEBUG) switchScreen(); +#elif defined(FEATURE_DPAD_6WIRESW) && defined(DPAD_6WIRESW_DEBUG) + switchScreen(); #else if (!gas || !brems || *gas > 200.f || *brems > 200.f) @@ -374,6 +387,9 @@ extern "C" void app_main() #ifdef FEATURE_DPAD_5WIRESW_2OUT dpad5wire_2out::update(); #endif +#ifdef FEATURE_DPAD_6WIRESW + dpad6wire::update(); +#endif if (!lastPotiRead || now - *lastPotiRead >= 1000ms/settings.boardcomputerHardware.timersSettings.potiReadRate) { diff --git a/main/presets.h b/main/presets.h index 5518604..23c19b3 100644 --- a/main/presets.h +++ b/main/presets.h @@ -154,7 +154,7 @@ constexpr Settings::BoardcomputerHardware defaultBoardcomputerHardware { .gasMax = DEFAULT_GASMAX, .bremsMin = DEFAULT_BREMSMIN, .bremsMax = DEFAULT_BREMSMAX, -#if defined(FEATURE_DPAD) || defined(FEATURE_DPAD_3WIRESW) || defined(FEATURE_DPAD_5WIRESW) || defined(FEATURE_DPAD_5WIRESW_2OUT) +#if defined(FEATURE_DPAD) || defined(FEATURE_DPAD_3WIRESW) || defined(FEATURE_DPAD_5WIRESW) || defined(FEATURE_DPAD_5WIRESW_2OUT) || defined (FEATURE_DPAD_6WIRESW) .dpadDebounce = 25, #endif #ifdef FEATURE_GAMETRAK diff --git a/main/settings.h b/main/settings.h index edc5b3f..287f236 100644 --- a/main/settings.h +++ b/main/settings.h @@ -93,7 +93,7 @@ struct Settings struct BoardcomputerHardware { int16_t sampleCount; int16_t gasMin, gasMax, bremsMin, bremsMax; -#if defined(FEATURE_DPAD) || defined(FEATURE_DPAD_3WIRESW) || defined(FEATURE_DPAD_5WIRESW) || defined(FEATURE_DPAD_5WIRESW_2OUT) +#if defined(FEATURE_DPAD) || defined(FEATURE_DPAD_3WIRESW) || defined(FEATURE_DPAD_5WIRESW) || defined(FEATURE_DPAD_5WIRESW_2OUT) || defined (FEATURE_DPAD_6WIRESW) uint8_t dpadDebounce; #endif #ifdef FEATURE_GAMETRAK From 7c8e416d667a98cafb65afe1106917d26bad1133 Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Fri, 1 Oct 2021 14:33:28 +0200 Subject: [PATCH 4/5] Added beep-blink, 6Wire and more --- main/accessors/settingsaccessors.h | 1 + main/actions/ledstripblinkactions.h | 20 +++++++++-- main/displays/menus/ledstripmenu.h | 2 ++ main/dpad6wire.h | 1 - main/ledstrip.h | 54 ++++++++++++++++++++--------- main/ledstripdefines.h | 9 +++-- main/presets.h | 5 +-- main/settings.h | 2 ++ main/texts.h | 1 + 9 files changed, 72 insertions(+), 23 deletions(-) diff --git a/main/accessors/settingsaccessors.h b/main/accessors/settingsaccessors.h index a81e7fa..3e640c0 100644 --- a/main/accessors/settingsaccessors.h +++ b/main/accessors/settingsaccessors.h @@ -159,6 +159,7 @@ struct SmallOffsetAccessor : public RefAccessorSaveSettings { int16_t & struct BigOffsetAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.ledstrip.bigOffset; } }; struct DeziampereAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.ledstrip.deziampere; } }; struct EnableBeepWhenBlinkAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.ledstrip.enableBeepWhenBlink; } }; +struct EnableFullBlinkAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.ledstrip.enableFullBlink; } }; #endif struct LockscreenAllowPresetSwitchAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.lockscreen.allowPresetSwitch; } }; diff --git a/main/actions/ledstripblinkactions.h b/main/actions/ledstripblinkactions.h index a7db559..06c5f8d 100644 --- a/main/actions/ledstripblinkactions.h +++ b/main/actions/ledstripblinkactions.h @@ -18,13 +18,29 @@ public: class LedstripAnimationBlinkLeftAction : public virtual ActionInterface { public: - void triggered() override { blinkAnimation = LEDSTRIP_OVERWRITE_BLINKLEFT; } +#ifndef LEDSTRIP_WRONG_DIRECTION + void triggered() override { + blinkAnimation = LEDSTRIP_OVERWRITE_BLINKLEFT; + } +#else + void triggered() override { + blinkAnimation = LEDSTRIP_OVERWRITE_BLINKRIGHT; + } +#endif }; class LedstripAnimationBlinkRightAction : public virtual ActionInterface { public: - void triggered() override { blinkAnimation = LEDSTRIP_OVERWRITE_BLINKRIGHT; } +#ifndef LEDSTRIP_WRONG_DIRECTION + void triggered() override { + blinkAnimation = LEDSTRIP_OVERWRITE_BLINKRIGHT; + } +#else + void triggered() override { + blinkAnimation = LEDSTRIP_OVERWRITE_BLINKLEFT; + } +#endif }; class LedstripAnimationBlinkBothAction : public virtual ActionInterface diff --git a/main/displays/menus/ledstripmenu.h b/main/displays/menus/ledstripmenu.h index 63dfb72..a635a8f 100644 --- a/main/displays/menus/ledstripmenu.h +++ b/main/displays/menus/ledstripmenu.h @@ -78,6 +78,8 @@ public: { constructMenuItem, ToggleBoolAction, CheckboxIcon, EnableLedAnimationAccessor>>(); constructMenuItem, ToggleBoolAction, CheckboxIcon, EnableBrakeLightsAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, EnableBeepWhenBlinkAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, EnableFullBlinkAccessor>>(); constructMenuItem, SwitchScreenAction>>(); constructMenuItem, SwitchScreenAction>>(); constructMenuItem, SwitchScreenAction>>(); diff --git a/main/dpad6wire.h b/main/dpad6wire.h index b9b86f7..8eb1eef 100644 --- a/main/dpad6wire.h +++ b/main/dpad6wire.h @@ -1,5 +1,4 @@ #pragma once -#define FEATURE_DPAD_6WIRESW // system includes #include diff --git a/main/ledstrip.h b/main/ledstrip.h index a3ec98a..4ed7647 100644 --- a/main/ledstrip.h +++ b/main/ledstrip.h @@ -1,4 +1,5 @@ #pragma once +#define FEATURE_LEDSTRIP #ifdef FEATURE_LEDSTRIP // 3rdparty lib includes #include @@ -32,37 +33,43 @@ void initLedStrip() void updateLedStrip() { EVERY_N_MILLISECONDS( 20 ) { gHue++; } + static bool have_disabled_beeper = false; if (cpputils::is_in(blinkAnimation, LEDSTRIP_OVERWRITE_BLINKLEFT, LEDSTRIP_OVERWRITE_BLINKRIGHT, LEDSTRIP_OVERWRITE_BLINKBOTH)) { std::fill(std::begin(leds), std::end(leds), CRGB{0, 0, 0}); - if (espchrono::millis_clock::now().time_since_epoch() % 750ms < 375ms) { if (settings.ledstrip.enableBeepWhenBlink) { - for (Controller &controller : controllers) - controller.command.buzzer.freq = 3; + for (Controller &controller : controllers) + controller.command.buzzer.freq = 3; } auto color = CRGB{255, 255, 0}; const auto center = (std::begin(leds) + (leds.size() / 2) + settings.ledstrip.centerOffset); -#ifndef LEDSTRIP_WRONG_DIRECTION - if (blinkAnimation != LEDSTRIP_OVERWRITE_BLINKRIGHT) + if (blinkAnimation != LEDSTRIP_OVERWRITE_BLINKRIGHT && !settings.ledstrip.enableFullBlink) + { std::fill(center - settings.ledstrip.bigOffset, center - settings.ledstrip.smallOffset, color); - if (blinkAnimation != LEDSTRIP_OVERWRITE_BLINKLEFT) + } + else if(blinkAnimation != LEDSTRIP_OVERWRITE_BLINKRIGHT && settings.ledstrip.enableFullBlink) + { + std::fill(std::begin(leds), center, color); + } + if (blinkAnimation != LEDSTRIP_OVERWRITE_BLINKLEFT && !settings.ledstrip.enableFullBlink) + { std::fill(center + settings.ledstrip.smallOffset, center + settings.ledstrip.bigOffset, color); -#else - if (blinkAnimation != LEDSTRIP_OVERWRITE_BLINKLEFT) - std::fill(center - settings.ledstrip.bigOffset, center - settings.ledstrip.smallOffset, color); - if (blinkAnimation != LEDSTRIP_OVERWRITE_BLINKRIGHT) - std::fill(center + settings.ledstrip.smallOffset, center + settings.ledstrip.bigOffset, color); -#endif + } + else if(blinkAnimation != LEDSTRIP_OVERWRITE_BLINKLEFT && settings.ledstrip.enableFullBlink) + { + std::fill(center, std::end(leds), color); + } + } else { if (settings.ledstrip.enableBeepWhenBlink) { - for (Controller &controller : controllers) - controller.command.buzzer.freq = 0; + for (Controller &controller : controllers) + controller.command.buzzer.freq = 0; } } } @@ -86,8 +93,15 @@ void updateLedStrip() const auto center = (std::begin(leds) + (leds.size() / 2) + settings.ledstrip.centerOffset); std::fill(std::begin(leds), std::end(leds), CRGB{0, 0, 0}); - std::fill(center - settings.ledstrip.bigOffset, center - settings.ledstrip.smallOffset, color); - std::fill(center + settings.ledstrip.smallOffset, center + settings.ledstrip.bigOffset, color); + if (settings.ledstrip.enableFullBlink) + { + std::fill(std::begin(leds), std::end(leds), color); + } + else + { + std::fill(center - settings.ledstrip.bigOffset, center - settings.ledstrip.smallOffset, color); + std::fill(center + settings.ledstrip.smallOffset, center + settings.ledstrip.bigOffset, color); + } } else { @@ -100,6 +114,14 @@ void updateLedStrip() } } + if (have_disabled_beeper == false && !(cpputils::is_in(blinkAnimation, LEDSTRIP_OVERWRITE_BLINKLEFT, LEDSTRIP_OVERWRITE_BLINKRIGHT, LEDSTRIP_OVERWRITE_BLINKBOTH))) + { + for (Controller &controller : controllers) + controller.command.buzzer.freq = 0; + have_disabled_beeper = true; + } + else if (cpputils::is_in(blinkAnimation, LEDSTRIP_OVERWRITE_BLINKLEFT, LEDSTRIP_OVERWRITE_BLINKRIGHT, LEDSTRIP_OVERWRITE_BLINKBOTH)) have_disabled_beeper = false; + FastLED.setMaxPowerInVoltsAndMilliamps(5,settings.ledstrip.deziampere * 100); FastLED.show(); } diff --git a/main/ledstripdefines.h b/main/ledstripdefines.h index f292349..772848c 100644 --- a/main/ledstripdefines.h +++ b/main/ledstripdefines.h @@ -4,9 +4,14 @@ */ #define LEDSTRIP_OVERWRITE_NONE 0 -#define LEDSTRIP_OVERWRITE_BLINKLEFT 1 +#ifndef LEDSTRIP_WRONG_DIRECTION +#define LEDSTRIP_OVERWRITE_BLINKLEFT 1 #define LEDSTRIP_OVERWRITE_BLINKRIGHT 2 -#define LEDSTRIP_OVERWRITE_BLINKBOTH 3 +#else +#define LEDSTRIP_OVERWRITE_BLINKLEFT 2 +#define LEDSTRIP_OVERWRITE_BLINKRIGHT 1 +#endif +#define LEDSTRIP_OVERWRITE_BLINKBOTH 3 #define LEDSTRIP_ANIMATION_TYPE_DEFAULTRAINBOW 0 diff --git a/main/presets.h b/main/presets.h index 23c19b3..fe0640f 100644 --- a/main/presets.h +++ b/main/presets.h @@ -234,10 +234,11 @@ constexpr Settings::Ledstrip defaultLedstrip { .deziampere = 30, .enableBeepWhenBlink = false, #ifdef LEDSTRIP_ANIMATION_DEFAULT - .animationType = LEDSTRIP_ANIMATION_DEFAULT + .animationType = LEDSTRIP_ANIMATION_DEFAULT, #else - .animationType = LEDSTRIP_ANIMATION_TYPE_DEFAULTRAINBOW + .animationType = LEDSTRIP_ANIMATION_TYPE_DEFAULTRAINBOW, #endif + .enableFullBlink = false }; #endif diff --git a/main/settings.h b/main/settings.h index 287f236..8092b81 100644 --- a/main/settings.h +++ b/main/settings.h @@ -163,6 +163,7 @@ struct Settings int16_t deziampere; bool enableBeepWhenBlink; int16_t animationType; + bool enableFullBlink; } ledstrip; #endif @@ -264,6 +265,7 @@ void Settings::executeForEveryCommonSetting(T &&callable) callable("deziampere", ledstrip.deziampere); callable("beeppwhenblink", ledstrip.enableBeepWhenBlink); // callable("animationType", ledstrip.animationType); + callable("fullblink", ledstrip.enableFullBlink); #endif callable("lockAlwPresetSw", lockscreen.allowPresetSwitch); diff --git a/main/texts.h b/main/texts.h index 49cc0a0..10f6cbc 100644 --- a/main/texts.h +++ b/main/texts.h @@ -250,6 +250,7 @@ constexpr char TEXT_SMALLOFFSET[] = "Small Offset"; constexpr char TEXT_BIGOFFSET[] = "Big Offset"; constexpr char TEXT_LEDSTRIP_MILLIAMP[] = "Ledstrip 0.1A"; constexpr char TEXT_BLINKBEEP[] = "Blink Beep"; +constexpr char TEXT_FULLBLINK[] = "Full blink"; //constexpr char TEXT_BACK[] = "Back"; //LedstripSelectAnimationMenu From fbb2ba1905ad6a444809195b77d3fda1da5cac2c Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Fri, 1 Oct 2021 15:58:59 +0200 Subject: [PATCH 5/5] Should fix bug that beeper won't turn off if turning the feature off in ledstrip menu --- main/ledstrip.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main/ledstrip.h b/main/ledstrip.h index 4ed7647..6f47a74 100644 --- a/main/ledstrip.h +++ b/main/ledstrip.h @@ -114,13 +114,13 @@ void updateLedStrip() } } - if (have_disabled_beeper == false && !(cpputils::is_in(blinkAnimation, LEDSTRIP_OVERWRITE_BLINKLEFT, LEDSTRIP_OVERWRITE_BLINKRIGHT, LEDSTRIP_OVERWRITE_BLINKBOTH))) + if (have_disabled_beeper == false && (!(cpputils::is_in(blinkAnimation, LEDSTRIP_OVERWRITE_BLINKLEFT, LEDSTRIP_OVERWRITE_BLINKRIGHT, LEDSTRIP_OVERWRITE_BLINKBOTH)) || !settings.ledstrip.enableBeepWhenBlink)) { for (Controller &controller : controllers) controller.command.buzzer.freq = 0; have_disabled_beeper = true; } - else if (cpputils::is_in(blinkAnimation, LEDSTRIP_OVERWRITE_BLINKLEFT, LEDSTRIP_OVERWRITE_BLINKRIGHT, LEDSTRIP_OVERWRITE_BLINKBOTH)) have_disabled_beeper = false; + else if ((cpputils::is_in(blinkAnimation, LEDSTRIP_OVERWRITE_BLINKLEFT, LEDSTRIP_OVERWRITE_BLINKRIGHT, LEDSTRIP_OVERWRITE_BLINKBOTH)) && settings.ledstrip.enableBeepWhenBlink) have_disabled_beeper = false; FastLED.setMaxPowerInVoltsAndMilliamps(5,settings.ledstrip.deziampere * 100); FastLED.show();