Implemented dpad5wire

This commit is contained in:
2020-09-20 04:53:05 +02:00
parent cdc154528a
commit 1f801e5c86
8 changed files with 145 additions and 95 deletions

View File

@ -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

View File

@ -4,6 +4,7 @@
#include "actioninterface.h"
#include "globals.h"
#include "presets.h"
namespace {
template<uint8_t profile>
@ -12,6 +13,8 @@ class SwitchProfileAction : public virtual ActionInterface
public:
void triggered() override
{
settings = presets::defaultSettings;
if (settingsPersister.openProfile(profile))
{
if (!settingsPersister.load(settings))

View File

@ -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
}

View File

@ -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<TEXT_PRESETS>,
public BackActionInterface<SwitchScreenAction<MainMenu>>,
public StaticMenuDefinition<
makeComponent<MenuItem, StaticText<TEXT_DEFAULTEVERYTHING>, ApplySettingsPresetAction<&presets::defaultSettings>>,
makeComponent<MenuItem, StaticText<TEXT_DEFAULTLIMITS>, ApplyLimitsPresetAction<&presets::defaultLimits>>,
makeComponent<MenuItem, StaticText<TEXT_KIDSLIMITS>, ApplyLimitsPresetAction<&presets::kidsLimits>>,
makeComponent<MenuItem, StaticText<TEXT_DEFAULTCONTROLLERHARDWARE>, ApplyControllerHardwarePresetAction<&presets::defaultControllerHardware>>,
makeComponent<MenuItem, StaticText<TEXT_MOSFETSOFFCONTROLLERHARDWARE>, ApplyControllerHardwarePresetAction<&presets::mosfetsOffControllerHardware>>,
makeComponent<MenuItem, StaticText<TEXT_SPINNERCONTROLLERHARDWARE>, ApplyControllerHardwarePresetAction<&presets::spinnerControllerHardware>>,
makeComponent<MenuItem, StaticText<TEXT_DEFAULTBOARDCOMPUTERHARDWARE>, ApplyBoardcomputerHardwarePresetAction<&presets::defaultBoardcomputerHardware>>,
makeComponent<MenuItem, StaticText<TEXT_DEFAULTDEFAULTMODE>, ApplyDefaultModePresetAction<&presets::defaultDefaultMode>>,
makeComponent<MenuItem, StaticText<TEXT_SINUSOIDALDEFAULTMODE>, ApplyDefaultModePresetAction<&presets::sinusoidalDefaultMode>>,
makeComponent<MenuItem, StaticText<TEXT_DEFAULTTEMPOMATMODE>, ApplyTempomatModePresetAction<&presets::defaultTempomatMode>>,
makeComponent<MenuItem, StaticText<TEXT_DEFAULTLARSMMODE>, ApplyLarsmModePresetAction<&presets::defaultLarsmMode>>,
makeComponent<MenuItem, StaticText<TEXT_DEFAULTEVERYTHING>, MultiAction<ApplySettingsPresetAction<&presets::defaultSettings>, SwitchScreenAction<MainMenu>>>,
makeComponent<MenuItem, StaticText<TEXT_DEFAULTLIMITS>, MultiAction<ApplyLimitsPresetAction<&presets::defaultLimits>, SwitchScreenAction<MainMenu>>>,
makeComponent<MenuItem, StaticText<TEXT_KIDSLIMITS>, MultiAction<ApplyLimitsPresetAction<&presets::kidsLimits>, SwitchScreenAction<MainMenu>>>,
makeComponent<MenuItem, StaticText<TEXT_DEFAULTCONTROLLERHARDWARE>, MultiAction<ApplyControllerHardwarePresetAction<&presets::defaultControllerHardware>, SwitchScreenAction<MainMenu>>>,
makeComponent<MenuItem, StaticText<TEXT_MOSFETSOFFCONTROLLERHARDWARE>, MultiAction<ApplyControllerHardwarePresetAction<&presets::mosfetsOffControllerHardware>, SwitchScreenAction<MainMenu>>>,
makeComponent<MenuItem, StaticText<TEXT_SPINNERCONTROLLERHARDWARE>, MultiAction<ApplyControllerHardwarePresetAction<&presets::spinnerControllerHardware>, SwitchScreenAction<MainMenu>>>,
makeComponent<MenuItem, StaticText<TEXT_DEFAULTBOARDCOMPUTERHARDWARE>, MultiAction<ApplyBoardcomputerHardwarePresetAction<&presets::defaultBoardcomputerHardware>, SwitchScreenAction<MainMenu>>>,
makeComponent<MenuItem, StaticText<TEXT_DEFAULTDEFAULTMODE>, MultiAction<ApplyDefaultModePresetAction<&presets::defaultDefaultMode>, SwitchScreenAction<MainMenu>>>,
makeComponent<MenuItem, StaticText<TEXT_SINUSOIDALDEFAULTMODE>, MultiAction<ApplyDefaultModePresetAction<&presets::sinusoidalDefaultMode>, SwitchScreenAction<MainMenu>>>,
makeComponent<MenuItem, StaticText<TEXT_DEFAULTTEMPOMATMODE>, MultiAction<ApplyTempomatModePresetAction<&presets::defaultTempomatMode>, SwitchScreenAction<MainMenu>>>,
makeComponent<MenuItem, StaticText<TEXT_DEFAULTLARSMMODE>, MultiAction<ApplyLarsmModePresetAction<&presets::defaultLarsmMode>, SwitchScreenAction<MainMenu>>>,
makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<MainMenu>, StaticMenuItemIcon<&icons::back>>
>
{};

View File

@ -13,15 +13,15 @@ class MainMenu;
namespace {
class ProfilesMenu :
public MenuDisplay,
public StaticText<TEXT_PROFILES>,
public BackActionInterface<SwitchScreenAction<MainMenu>>,
public StaticMenuDefinition<
makeComponent<MenuItem, StaticText<TEXT_PROFILE0>, SwitchProfileAction<0>>,
makeComponent<MenuItem, StaticText<TEXT_PROFILE1>, SwitchProfileAction<1>>,
makeComponent<MenuItem, StaticText<TEXT_PROFILE2>, SwitchProfileAction<2>>,
makeComponent<MenuItem, StaticText<TEXT_PROFILE3>, SwitchProfileAction<3>>,
makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<MainMenu>, StaticMenuItemIcon<&icons::back>>
>
public MenuDisplay,
public StaticText<TEXT_PROFILES>,
public BackActionInterface<SwitchScreenAction<MainMenu>>,
public StaticMenuDefinition<
makeComponent<MenuItem, StaticText<TEXT_PROFILE0>, SwitchProfileAction<0>>,
makeComponent<MenuItem, StaticText<TEXT_PROFILE1>, SwitchProfileAction<1>>,
makeComponent<MenuItem, StaticText<TEXT_PROFILE2>, SwitchProfileAction<2>>,
makeComponent<MenuItem, StaticText<TEXT_PROFILE3>, SwitchProfileAction<3>>,
makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<MainMenu>, StaticMenuItemIcon<&icons::back>>
>
{};
}

View File

@ -3,10 +3,10 @@
#include <tuple>
#include <Arduino.h>
#include <HardwareSerial.h>
#include "globals.h"
#include "types.h"
#include "actions/switchprofileaction.h"
namespace {
namespace dpad5wire
@ -53,10 +53,10 @@ State Helper<OUT, IN1, IN2, IN3, IN4>::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<ButtonUp>(lastState) != std::get<ButtonUp>(state) && now-debounceUp > settings.boardcomputerHardware.dpadDebounce)
if (std::get<DPAD_5WIRESW_UP>(lastState) != std::get<DPAD_5WIRESW_UP>(state) && now-debounceUp > settings.boardcomputerHardware.dpadDebounce)
{
if (std::get<ButtonUp>(state))
if (std::get<DPAD_5WIRESW_UP>(state))
InputDispatcher::rotate(-1);
std::get<ButtonUp>(lastState) = std::get<ButtonUp>(state);
std::get<DPAD_5WIRESW_UP>(lastState) = std::get<DPAD_5WIRESW_UP>(state);
debounceUp = now;
}
if (std::get<ButtonDown>(lastState) != std::get<ButtonDown>(state) && now-debounceDown > settings.boardcomputerHardware.dpadDebounce)
if (std::get<DPAD_5WIRESW_DOWN>(lastState) != std::get<DPAD_5WIRESW_DOWN>(state) && now-debounceDown > settings.boardcomputerHardware.dpadDebounce)
{
if (std::get<ButtonDown>(state))
if (std::get<DPAD_5WIRESW_DOWN>(state))
InputDispatcher::rotate(1);
std::get<ButtonDown>(lastState) = std::get<ButtonDown>(state);
std::get<DPAD_5WIRESW_DOWN>(lastState) = std::get<DPAD_5WIRESW_DOWN>(state);
debounceDown = now;
}
if (std::get<ButtonConfirm>(lastState) != std::get<ButtonConfirm>(state) && now-debounceConfirm > settings.boardcomputerHardware.dpadDebounce)
if (std::get<DPAD_5WIRESW_CONFIRM>(lastState) != std::get<DPAD_5WIRESW_CONFIRM>(state) && now-debounceConfirm > settings.boardcomputerHardware.dpadDebounce)
{
InputDispatcher::confirmButton(std::get<ButtonConfirm>(state));
std::get<ButtonConfirm>(lastState) = std::get<ButtonConfirm>(state);
InputDispatcher::confirmButton(std::get<DPAD_5WIRESW_CONFIRM>(state));
std::get<DPAD_5WIRESW_CONFIRM>(lastState) = std::get<DPAD_5WIRESW_CONFIRM>(state);
debounceConfirm = now;
}
if (std::get<ButtonBack>(lastState) != std::get<ButtonBack>(state) && now-debounceBack > settings.boardcomputerHardware.dpadDebounce)
if (std::get<DPAD_5WIRESW_BACK>(lastState) != std::get<DPAD_5WIRESW_BACK>(state) && now-debounceBack > settings.boardcomputerHardware.dpadDebounce)
{
InputDispatcher::backButton(std::get<ButtonBack>(state));
std::get<ButtonBack>(lastState) = std::get<ButtonBack>(state);
InputDispatcher::backButton(std::get<DPAD_5WIRESW_BACK>(state));
std::get<DPAD_5WIRESW_BACK>(lastState) = std::get<DPAD_5WIRESW_BACK>(state);
debounceBack = now;
}
if (std::get<ButtonProfile0>(lastState) != std::get<ButtonProfile0>(state) && now-debounceProfile0 > settings.boardcomputerHardware.dpadDebounce)
if (std::get<DPAD_5WIRESW_PROFILE0>(lastState) != std::get<DPAD_5WIRESW_PROFILE0>(state) && now-debounceProfile0 > settings.boardcomputerHardware.dpadDebounce)
{
if (std::get<ButtonProfile0>(state))
if (std::get<DPAD_5WIRESW_PROFILE0>(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<ButtonProfile0>(lastState) = std::get<ButtonProfile0>(state);
std::get<DPAD_5WIRESW_PROFILE0>(lastState) = std::get<DPAD_5WIRESW_PROFILE0>(state);
debounceProfile0 = now;
}
if (std::get<ButtonProfile1>(lastState) != std::get<ButtonProfile1>(state) && now-debounceProfile1 > settings.boardcomputerHardware.dpadDebounce)
if (std::get<DPAD_5WIRESW_PROFILE1>(lastState) != std::get<DPAD_5WIRESW_PROFILE1>(state) && now-debounceProfile1 > settings.boardcomputerHardware.dpadDebounce)
{
if (std::get<ButtonProfile1>(state))
if (std::get<DPAD_5WIRESW_PROFILE1>(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<ButtonProfile1>(lastState) = std::get<ButtonProfile1>(state);
std::get<DPAD_5WIRESW_PROFILE1>(lastState) = std::get<DPAD_5WIRESW_PROFILE1>(state);
debounceProfile1 = now;
}
if (std::get<ButtonProfile2>(lastState) != std::get<ButtonProfile2>(state) && now-debounceProfile2 > settings.boardcomputerHardware.dpadDebounce)
if (std::get<DPAD_5WIRESW_PROFILE2>(lastState) != std::get<DPAD_5WIRESW_PROFILE2>(state) && now-debounceProfile2 > settings.boardcomputerHardware.dpadDebounce)
{
if (std::get<ButtonProfile2>(state))
if (std::get<DPAD_5WIRESW_PROFILE2>(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<ButtonProfile2>(lastState) = std::get<ButtonProfile2>(state);
std::get<DPAD_5WIRESW_PROFILE2>(lastState) = std::get<DPAD_5WIRESW_PROFILE2>(state);
debounceProfile2 = now;
}
if (std::get<ButtonProfile3>(lastState) != std::get<ButtonProfile3>(state) && now-debounceProfile3 > settings.boardcomputerHardware.dpadDebounce)
if (std::get<DPAD_5WIRESW_PROFILE3>(lastState) != std::get<DPAD_5WIRESW_PROFILE3>(state) && now-debounceProfile3 > settings.boardcomputerHardware.dpadDebounce)
{
if (std::get<ButtonProfile3>(state))
if (std::get<DPAD_5WIRESW_PROFILE3>(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<ButtonProfile3>(lastState) = std::get<ButtonProfile3>(state);
std::get<DPAD_5WIRESW_PROFILE3>(lastState) = std::get<DPAD_5WIRESW_PROFILE3>(state);
debounceProfile3 = now;
}
}

View File

@ -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<DPad5WireDebugDisplay>();
return;
#endif
if (gas > 200.f || brems > 200.f)
switchScreen<CalibrateDisplay>(true);
else

View File

@ -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<decltype(displays.bmsDisplay)>() { return displays.bmsDisplay; }
#endif
template<> decltype(displays.calibrateDisplay) &getRefByType<decltype(displays.calibrateDisplay)>() { return displays.calibrateDisplay; }
#if defined(FEATURE_DPAD_5WIRESW) && defined(DPAD_5WIRESW_DEBUG)
template<> decltype(displays.dPad5WireDebugDisplay) &getRefByType<decltype(displays.dPad5WireDebugDisplay)>() { return displays.dPad5WireDebugDisplay; }
#endif
template<> decltype(displays.gameOfLifeDisplay) &getRefByType<decltype(displays.gameOfLifeDisplay)>() { return displays.gameOfLifeDisplay; }
#ifdef FEATURE_GAMETRAK
template<> decltype(displays.gametrakCalibrateDisplay) &getRefByType<decltype(displays.gametrakCalibrateDisplay)>() { return displays.gametrakCalibrateDisplay; }