summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2025-01-15 15:38:18 +1100
committerjacqueline <me@jacqueline.id.au>2025-01-15 15:38:18 +1100
commit934b1484b240151f58b147ffb04994179dd6d616 (patch)
treeb7462a2e675fc4f0c64957544d640ee3f1167f7d /src
parenta69b95187be4afce4eefa8f7b08ceca7b88b7724 (diff)
downloadtangara-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.cpp2
-rw-r--r--src/tangara/input/input_hard_reset.cpp50
-rw-r--r--src/tangara/input/input_hard_reset.hpp34
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