From 934b1484b240151f58b147ffb04994179dd6d616 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Wed, 15 Jan 2025 15:38:18 +1100 Subject: [PATCH] Add a hard reset input sequence to recover from broken device states - Unlock device - Hold both volume buttons - Lock device - Unlock device --- src/tangara/input/device_factory.cpp | 2 ++ src/tangara/input/input_hard_reset.cpp | 50 ++++++++++++++++++++++++++ src/tangara/input/input_hard_reset.hpp | 34 ++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 src/tangara/input/input_hard_reset.cpp create mode 100644 src/tangara/input/input_hard_reset.hpp diff --git a/src/tangara/input/device_factory.cpp b/src/tangara/input/device_factory.cpp index 09fd2fd2..22df4ebe 100644 --- a/src/tangara/input/device_factory.cpp +++ b/src/tangara/input/device_factory.cpp @@ -11,6 +11,7 @@ #include "input/feedback_haptics.hpp" #include "input/feedback_tts.hpp" #include "input/input_device.hpp" +#include "input/input_hard_reset.hpp" #include "input/input_nav_buttons.hpp" #include "input/input_touch_dpad.hpp" #include "input/input_touch_wheel.hpp" @@ -48,6 +49,7 @@ auto DeviceFactory::createInputs(drivers::NvsStorage::InputModes mode) } break; } + ret.push_back(std::make_shared(services_->gpios())); return ret; } diff --git a/src/tangara/input/input_hard_reset.cpp b/src/tangara/input/input_hard_reset.cpp new file mode 100644 index 00000000..7fcca3eb --- /dev/null +++ b/src/tangara/input/input_hard_reset.cpp @@ -0,0 +1,50 @@ +/* + * Copyright 2025 jacqueline + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#include "input/input_hard_reset.hpp" + +#include "drivers/gpios.hpp" +#include "esp_system.h" +#include "input/input_hook_actions.hpp" + +namespace input { + +HardReset::HardReset(drivers::IGpios& gpios) : gpios_(gpios) {} + +auto HardReset::read(lv_indev_data_t* data) -> void { + bool buttons_pressed = !gpios_.Get(drivers::IGpios::Pin::kKeyUp) && + !gpios_.Get(drivers::IGpios::Pin::kKeyDown); + if (!buttons_pressed) { + stage_ = 0; + return; + } + + bool locked = gpios_.IsLocked(); + + if (stage_ == 0 && !locked) { + stage_++; + return; + } + if (stage_ == 1 && locked) { + stage_++; + return; + } + if (stage_ == 2 && !locked) { + // Bye! + esp_restart(); + } +} + +auto HardReset::name() -> std::string { + return "hard_reset"; +} + +auto HardReset::triggers() + -> std::vector> { + return {}; +} + +} // namespace input diff --git a/src/tangara/input/input_hard_reset.hpp b/src/tangara/input/input_hard_reset.hpp new file mode 100644 index 00000000..00f218bf --- /dev/null +++ b/src/tangara/input/input_hard_reset.hpp @@ -0,0 +1,34 @@ +/* + * Copyright 2025 jacqueline + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#pragma once + +#include + +#include "indev/lv_indev.h" + +#include "drivers/gpios.hpp" +#include "input/input_device.hpp" +#include "input/input_hook.hpp" + +namespace input { + +class HardReset : public IInputDevice { + public: + HardReset(drivers::IGpios&); + + auto read(lv_indev_data_t* data) -> void override; + + auto name() -> std::string override; + auto triggers() -> std::vector> override; + + private: + drivers::IGpios& gpios_; + + int stage_; +}; + +} // namespace input