From 1f801e5c8604df02403c33921241c2be539b571b Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Sun, 20 Sep 2020 04:53:05 +0200 Subject: [PATCH] Implemented dpad5wire --- platformio.ini | 19 +++-- src/actions/switchprofileaction.h | 3 + src/displays/dpad5wiredebugdisplay.h | 54 ++++++++++++++ src/displays/menus/presetsmenu.h | 24 +++--- src/displays/menus/profilesmenu.h | 20 ++--- src/dpad5wire.h | 107 ++++++++++----------------- src/main.cpp | 6 ++ src/screens.h | 7 ++ 8 files changed, 145 insertions(+), 95 deletions(-) create mode 100644 src/displays/dpad5wiredebugdisplay.h diff --git a/platformio.ini b/platformio.ini index b86297a..a4ac334 100644 --- a/platformio.ini +++ b/platformio.ini @@ -129,11 +129,20 @@ build_flags = -DAP_PASSWORD=Passwort_123 -DFEATURE_WEBSERVER -DFEATURE_DPAD_5WIRESW - -DPINS_DPAD_5WIRESW_OUT=0 - -DPINS_DPAD_5WIRESW_IN1=16 - -DPINS_DPAD_5WIRESW_IN2=27 - -DPINS_DPAD_5WIRESW_IN3=16 - -DPINS_DPAD_5WIRESW_IN4=27 + -DPINS_DPAD_5WIRESW_OUT=32 + -DPINS_DPAD_5WIRESW_IN1=25 + -DPINS_DPAD_5WIRESW_IN2=26 + -DPINS_DPAD_5WIRESW_IN3=27 + -DPINS_DPAD_5WIRESW_IN4=21 + -DDPAD_5WIRESW_UP=4 + -DDPAD_5WIRESW_DOWN=3 + -DDPAD_5WIRESW_CONFIRM=7 + -DDPAD_5WIRESW_BACK=0 + -DDPAD_5WIRESW_PROFILE0=1 + -DDPAD_5WIRESW_PROFILE1=5 + -DDPAD_5WIRESW_PROFILE2=2 + -DDPAD_5WIRESW_PROFILE3=6 +; -DDPAD_5WIRESW_DEBUG -DDEFAULT_GASMIN=850 -DDEFAULT_GASMAX=3700 -DDEFAULT_BREMSMIN=1300 diff --git a/src/actions/switchprofileaction.h b/src/actions/switchprofileaction.h index 84137d5..797e4c2 100644 --- a/src/actions/switchprofileaction.h +++ b/src/actions/switchprofileaction.h @@ -4,6 +4,7 @@ #include "actioninterface.h" #include "globals.h" +#include "presets.h" namespace { template @@ -12,6 +13,8 @@ class SwitchProfileAction : public virtual ActionInterface public: void triggered() override { + settings = presets::defaultSettings; + if (settingsPersister.openProfile(profile)) { if (!settingsPersister.load(settings)) diff --git a/src/displays/dpad5wiredebugdisplay.h b/src/displays/dpad5wiredebugdisplay.h new file mode 100644 index 0000000..bb5905e --- /dev/null +++ b/src/displays/dpad5wiredebugdisplay.h @@ -0,0 +1,54 @@ +#pragma once + +#include "display.h" +#include "globals.h" +#include "widgets/label.h" +#include "dpad5wire.h" + +namespace { +#ifdef FEATURE_DPAD_5WIRESW +class DPad5WireDebugDisplay : public Display, public virtual DummyConfirm, public virtual DummyBack +{ +public: + void initScreen() override; + void redraw() override; + +private: + Label m_label0{30, 100}; + Label m_label1{30, 125}; + Label m_label2{30, 150}; +}; + +void DPad5WireDebugDisplay::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); + + m_label0.start(); + m_label1.start(); + m_label2.start(); +} + +void DPad5WireDebugDisplay::redraw() +{ + m_label0.redraw(String{} + + (std::get<0>(dpad5wire::lastState) ? '1' : '0') + ' ' + + (std::get<1>(dpad5wire::lastState) ? '1' : '0') + ' ' + + (std::get<2>(dpad5wire::lastState) ? '1' : '0') + ' ' + + (std::get<3>(dpad5wire::lastState) ? '1' : '0') + ' ' + + (std::get<4>(dpad5wire::lastState) ? '1' : '0') + ' ' + + (std::get<5>(dpad5wire::lastState) ? '1' : '0') + ' ' + + (std::get<6>(dpad5wire::lastState) ? '1' : '0') + ' ' + + (std::get<7>(dpad5wire::lastState) ? '1' : '0')); + m_label1.redraw(String{raw_gas}); + m_label2.redraw(String{raw_brems}); +} +#endif +} diff --git a/src/displays/menus/presetsmenu.h b/src/displays/menus/presetsmenu.h index 8c28979..aff3b55 100644 --- a/src/displays/menus/presetsmenu.h +++ b/src/displays/menus/presetsmenu.h @@ -4,7 +4,7 @@ #include "menudisplay.h" #include "staticmenudefinition.h" #include "utils.h" -#include "actions/dummyaction.h" +#include "actions/multiaction.h" #include "actions/switchscreenaction.h" #include "icons/back.h" #include "texts.h" @@ -77,17 +77,17 @@ class PresetsMenu : public StaticText, public BackActionInterface>, public StaticMenuDefinition< - makeComponent, ApplySettingsPresetAction<&presets::defaultSettings>>, - makeComponent, ApplyLimitsPresetAction<&presets::defaultLimits>>, - makeComponent, ApplyLimitsPresetAction<&presets::kidsLimits>>, - makeComponent, ApplyControllerHardwarePresetAction<&presets::defaultControllerHardware>>, - makeComponent, ApplyControllerHardwarePresetAction<&presets::mosfetsOffControllerHardware>>, - makeComponent, ApplyControllerHardwarePresetAction<&presets::spinnerControllerHardware>>, - makeComponent, ApplyBoardcomputerHardwarePresetAction<&presets::defaultBoardcomputerHardware>>, - makeComponent, ApplyDefaultModePresetAction<&presets::defaultDefaultMode>>, - makeComponent, ApplyDefaultModePresetAction<&presets::sinusoidalDefaultMode>>, - makeComponent, ApplyTempomatModePresetAction<&presets::defaultTempomatMode>>, - makeComponent, ApplyLarsmModePresetAction<&presets::defaultLarsmMode>>, + makeComponent, MultiAction, SwitchScreenAction>>, + makeComponent, MultiAction, SwitchScreenAction>>, + makeComponent, MultiAction, SwitchScreenAction>>, + makeComponent, MultiAction, SwitchScreenAction>>, + makeComponent, MultiAction, SwitchScreenAction>>, + makeComponent, MultiAction, SwitchScreenAction>>, + makeComponent, MultiAction, SwitchScreenAction>>, + makeComponent, MultiAction, SwitchScreenAction>>, + makeComponent, MultiAction, SwitchScreenAction>>, + makeComponent, MultiAction, SwitchScreenAction>>, + makeComponent, MultiAction, SwitchScreenAction>>, makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> > {}; diff --git a/src/displays/menus/profilesmenu.h b/src/displays/menus/profilesmenu.h index 56a3a84..4727234 100644 --- a/src/displays/menus/profilesmenu.h +++ b/src/displays/menus/profilesmenu.h @@ -13,15 +13,15 @@ class MainMenu; namespace { class ProfilesMenu : - public MenuDisplay, - public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, SwitchProfileAction<0>>, - makeComponent, SwitchProfileAction<1>>, - makeComponent, SwitchProfileAction<2>>, - makeComponent, SwitchProfileAction<3>>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > + public MenuDisplay, + public StaticText, + public BackActionInterface>, + public StaticMenuDefinition< + makeComponent, SwitchProfileAction<0>>, + makeComponent, SwitchProfileAction<1>>, + makeComponent, SwitchProfileAction<2>>, + makeComponent, SwitchProfileAction<3>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > {}; } diff --git a/src/dpad5wire.h b/src/dpad5wire.h index d0ca12a..90e70b5 100644 --- a/src/dpad5wire.h +++ b/src/dpad5wire.h @@ -3,10 +3,10 @@ #include #include -#include #include "globals.h" #include "types.h" +#include "actions/switchprofileaction.h" namespace { namespace dpad5wire @@ -53,10 +53,10 @@ State Helper::read() digitalWrite(OUT, HIGH); - pinMode(IN1, INPUT_PULLUP); - pinMode(IN2, INPUT_PULLUP); - pinMode(IN3, INPUT_PULLUP); - pinMode(IN4, INPUT_PULLUP); + pinMode(IN1, INPUT_PULLDOWN); + pinMode(IN2, INPUT_PULLDOWN); + pinMode(IN3, INPUT_PULLDOWN); + pinMode(IN4, INPUT_PULLDOWN); delay(1); @@ -82,103 +82,74 @@ void init() void update() { const auto state = helper.read(); + +#ifdef DPAD_5WIRESW_DEBUG + lastState = state; + return; +#endif + const auto now = millis(); - enum { - ButtonUp = 3, - ButtonDown = 0, - ButtonConfirm = 1, - ButtonBack = 2, - ButtonProfile0 = 4, - ButtonProfile1 = 5, - ButtonProfile2 = 6, - ButtonProfile3 = 7, - }; - - if (std::get(lastState) != std::get(state) && now-debounceUp > settings.boardcomputerHardware.dpadDebounce) + if (std::get(lastState) != std::get(state) && now-debounceUp > settings.boardcomputerHardware.dpadDebounce) { - if (std::get(state)) + if (std::get(state)) InputDispatcher::rotate(-1); - std::get(lastState) = std::get(state); + std::get(lastState) = std::get(state); debounceUp = now; } - if (std::get(lastState) != std::get(state) && now-debounceDown > settings.boardcomputerHardware.dpadDebounce) + if (std::get(lastState) != std::get(state) && now-debounceDown > settings.boardcomputerHardware.dpadDebounce) { - if (std::get(state)) + if (std::get(state)) InputDispatcher::rotate(1); - std::get(lastState) = std::get(state); + std::get(lastState) = std::get(state); debounceDown = now; } - if (std::get(lastState) != std::get(state) && now-debounceConfirm > settings.boardcomputerHardware.dpadDebounce) + if (std::get(lastState) != std::get(state) && now-debounceConfirm > settings.boardcomputerHardware.dpadDebounce) { - InputDispatcher::confirmButton(std::get(state)); - std::get(lastState) = std::get(state); + InputDispatcher::confirmButton(std::get(state)); + std::get(lastState) = std::get(state); debounceConfirm = now; } - if (std::get(lastState) != std::get(state) && now-debounceBack > settings.boardcomputerHardware.dpadDebounce) + if (std::get(lastState) != std::get(state) && now-debounceBack > settings.boardcomputerHardware.dpadDebounce) { - InputDispatcher::backButton(std::get(state)); - std::get(lastState) = std::get(state); + InputDispatcher::backButton(std::get(state)); + std::get(lastState) = std::get(state); debounceBack = now; } - if (std::get(lastState) != std::get(state) && now-debounceProfile0 > settings.boardcomputerHardware.dpadDebounce) + if (std::get(lastState) != std::get(state) && now-debounceProfile0 > settings.boardcomputerHardware.dpadDebounce) { - if (std::get(state)) + if (std::get(state)) { - if (settingsPersister.openProfile(0)) - { - if (!settingsPersister.load(settings)) - Serial.println("dpad5wire::update() load 0 failed"); - } - else - Serial.println("dpad5wire::update() openProfile 0 failed"); + SwitchProfileAction<0>{}.triggered(); } - std::get(lastState) = std::get(state); + std::get(lastState) = std::get(state); debounceProfile0 = now; } - if (std::get(lastState) != std::get(state) && now-debounceProfile1 > settings.boardcomputerHardware.dpadDebounce) + if (std::get(lastState) != std::get(state) && now-debounceProfile1 > settings.boardcomputerHardware.dpadDebounce) { - if (std::get(state)) + if (std::get(state)) { - if (settingsPersister.openProfile(1)) - { - if (!settingsPersister.load(settings)) - Serial.println("dpad5wire::update() load 1 failed"); - } - else - Serial.println("dpad5wire::update() openProfile 1 failed"); + SwitchProfileAction<1>{}.triggered(); } - std::get(lastState) = std::get(state); + std::get(lastState) = std::get(state); debounceProfile1 = now; } - if (std::get(lastState) != std::get(state) && now-debounceProfile2 > settings.boardcomputerHardware.dpadDebounce) + if (std::get(lastState) != std::get(state) && now-debounceProfile2 > settings.boardcomputerHardware.dpadDebounce) { - if (std::get(state)) + if (std::get(state)) { - if (settingsPersister.openProfile(2)) - { - if (!settingsPersister.load(settings)) - Serial.println("dpad5wire::update() load 2 failed"); - } - else - Serial.println("dpad5wire::update() openProfile 2 failed"); + SwitchProfileAction<2>{}.triggered(); } - std::get(lastState) = std::get(state); + std::get(lastState) = std::get(state); debounceProfile2 = now; } - if (std::get(lastState) != std::get(state) && now-debounceProfile3 > settings.boardcomputerHardware.dpadDebounce) + if (std::get(lastState) != std::get(state) && now-debounceProfile3 > settings.boardcomputerHardware.dpadDebounce) { - if (std::get(state)) + if (std::get(state)) { - if (settingsPersister.openProfile(3)) - { - if (!settingsPersister.load(settings)) - Serial.println("dpad5wire::update() load 3 failed"); - } - else - Serial.println("dpad5wire::update() openProfile 3 failed"); + SwitchProfileAction<3>{}.triggered(); } - std::get(lastState) = std::get(state); + std::get(lastState) = std::get(state); debounceProfile3 = now; } } diff --git a/src/main.cpp b/src/main.cpp index 22684b5..ff9ea69 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,6 +12,7 @@ #include "globals.h" #include "modes/defaultmode.h" #include "modes/tempomatmode.h" +#include "displays/dpad5wiredebugdisplay.h" #include "screens.h" #include "dpad.h" #include "dpad3wire.h" @@ -167,6 +168,11 @@ void setup() bootLabel.redraw("potis"); readPotis(); +#if defined(FEATURE_DPAD_5WIRESW) && defined(DPAD_5WIRESW_DEBUG) + switchScreen(); + return; +#endif + if (gas > 200.f || brems > 200.f) switchScreen(true); else diff --git a/src/screens.h b/src/screens.h index 2569496..9a7c752 100644 --- a/src/screens.h +++ b/src/screens.h @@ -38,6 +38,7 @@ #include "displays/menus/wifisettingsmenu.h" #include "displays/bmsdisplay.h" #include "displays/calibratedisplay.h" +#include "displays/dpad5wiredebugdisplay.h" #include "displays/gameoflifedisplay.h" #include "displays/gametrakcalibratedisplay.h" #include "displays/lockscreen.h" @@ -114,6 +115,9 @@ union X { BmsDisplay bmsDisplay; #endif CalibrateDisplay calibrateDisplay; +#if defined(FEATURE_DPAD_5WIRESW) && defined(DPAD_5WIRESW_DEBUG) + DPad5WireDebugDisplay dPad5WireDebugDisplay; +#endif GameOfLifeDisplay gameOfLifeDisplay; #ifdef FEATURE_GAMETRAK GametrakCalibrateDisplay gametrakCalibrateDisplay; @@ -270,6 +274,9 @@ template<> decltype(displays.wifiSettingsMenu) & template<> decltype(displays.bmsDisplay) &getRefByType() { return displays.bmsDisplay; } #endif template<> decltype(displays.calibrateDisplay) &getRefByType() { return displays.calibrateDisplay; } +#if defined(FEATURE_DPAD_5WIRESW) && defined(DPAD_5WIRESW_DEBUG) +template<> decltype(displays.dPad5WireDebugDisplay) &getRefByType() { return displays.dPad5WireDebugDisplay; } +#endif template<> decltype(displays.gameOfLifeDisplay) &getRefByType() { return displays.gameOfLifeDisplay; } #ifdef FEATURE_GAMETRAK template<> decltype(displays.gametrakCalibrateDisplay) &getRefByType() { return displays.gametrakCalibrateDisplay; }