diff options
| author | jacqueline <me@jacqueline.id.au> | 2025-01-15 15:38:18 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2025-01-15 15:38:18 +1100 |
| commit | 934b1484b240151f58b147ffb04994179dd6d616 (patch) | |
| tree | b7462a2e675fc4f0c64957544d640ee3f1167f7d /src | |
| parent | a69b95187be4afce4eefa8f7b08ceca7b88b7724 (diff) | |
| download | tangara-fw-934b1484b240151f58b147ffb04994179dd6d616.tar.gz | |
Add a hard reset input sequence to recover from broken device states
- Unlock device
- Hold both volume buttons
- Lock device
- Unlock device
Diffstat (limited to 'src')
| -rw-r--r-- | src/tangara/input/device_factory.cpp | 2 | ||||
| -rw-r--r-- | src/tangara/input/input_hard_reset.cpp | 50 | ||||
| -rw-r--r-- | src/tangara/input/input_hard_reset.hpp | 34 |
3 files changed, 86 insertions, 0 deletions
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<HardReset>(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 <me@jacqueline.id.au> + * + * 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<std::reference_wrapper<TriggerHooks>> { + 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 <me@jacqueline.id.au> + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#pragma once + +#include <cstdint> + +#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<std::reference_wrapper<TriggerHooks>> override; + + private: + drivers::IGpios& gpios_; + + int stage_; +}; + +} // namespace input |
