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