summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTess Eisenberger <github@teisen.be>2025-02-01 15:59:08 -0800
committerteisenbe <teisenbe@noreply.codeberg.org>2025-02-02 04:48:42 +0000
commite8eaf3df10a896cb28e91cfc416b19303926a00a (patch)
tree15d20a1108d230285ae37a260f6920ac6c6cb8bf /src
parentb98e67972bca390961ecd2240ab3d3553ea0bf86 (diff)
downloadtangara-fw-e8eaf3df10a896cb28e91cfc416b19303926a00a.tar.gz
Add a new setting for input controls when locked
This is just the plumbing of the new setting. The input methods will come in subsequent patches.
Diffstat (limited to 'src')
-rw-r--r--src/drivers/include/drivers/nvs.hpp8
-rw-r--r--src/drivers/nvs.cpp17
-rw-r--r--src/tangara/input/input_device.hpp3
-rw-r--r--src/tangara/input/input_nav_buttons.cpp2
-rw-r--r--src/tangara/input/input_nav_buttons.hpp2
-rw-r--r--src/tangara/input/input_touch_dpad.cpp2
-rw-r--r--src/tangara/input/input_touch_dpad.hpp2
-rw-r--r--src/tangara/input/input_touch_wheel.cpp2
-rw-r--r--src/tangara/input/input_touch_wheel.hpp2
-rw-r--r--src/tangara/input/input_volume_buttons.cpp2
-rw-r--r--src/tangara/input/input_volume_buttons.hpp2
-rw-r--r--src/tangara/input/lvgl_input_driver.cpp29
-rw-r--r--src/tangara/input/lvgl_input_driver.hpp2
13 files changed, 65 insertions, 10 deletions
diff --git a/src/drivers/include/drivers/nvs.hpp b/src/drivers/include/drivers/nvs.hpp
index 9725bb0f..b6192ab5 100644
--- a/src/drivers/include/drivers/nvs.hpp
+++ b/src/drivers/include/drivers/nvs.hpp
@@ -138,6 +138,13 @@ class NvsStorage {
auto PrimaryInput() -> InputModes;
auto PrimaryInput(InputModes) -> void;
+ enum class LockedInputModes : uint8_t {
+ kDisabled = 0,
+ };
+
+ auto LockedInput() -> LockedInputModes;
+ auto LockedInput(LockedInputModes) -> void;
+
auto QueueRepeatMode() -> uint8_t;
auto QueueRepeatMode(uint8_t) -> void;
@@ -167,6 +174,7 @@ class NvsStorage {
Setting<uint16_t> amp_cur_vol_;
Setting<int8_t> amp_left_bias_;
Setting<uint8_t> input_mode_;
+ Setting<uint8_t> locked_input_mode_;
Setting<uint8_t> output_mode_;
Setting<std::string> theme_;
diff --git a/src/drivers/nvs.cpp b/src/drivers/nvs.cpp
index 6f0d874e..a9f30042 100644
--- a/src/drivers/nvs.cpp
+++ b/src/drivers/nvs.cpp
@@ -34,6 +34,7 @@ static constexpr char kKeyAmpMaxVolume[] = "hp_vol_max";
static constexpr char kKeyAmpCurrentVolume[] = "hp_vol";
static constexpr char kKeyAmpLeftBias[] = "hp_bias";
static constexpr char kKeyPrimaryInput[] = "in_pri";
+static constexpr char kKeyLockedInput[] = "in_locked";
static constexpr char kKeyScrollSensitivity[] = "scroll";
static constexpr char kKeyLockPolarity[] = "lockpol";
static constexpr char kKeyDisplayCols[] = "dispcols";
@@ -272,6 +273,7 @@ NvsStorage::NvsStorage(nvs_handle_t handle)
amp_cur_vol_(kKeyAmpCurrentVolume),
amp_left_bias_(kKeyAmpLeftBias),
input_mode_(kKeyPrimaryInput),
+ locked_input_mode_(kKeyLockedInput),
output_mode_(kKeyOutput),
theme_{kKeyInterfaceTheme},
bt_preferred_(kKeyBluetoothPreferred),
@@ -570,6 +572,21 @@ auto NvsStorage::PrimaryInput(InputModes mode) -> void {
input_mode_.set(static_cast<uint8_t>(mode));
}
+auto NvsStorage::LockedInput() -> LockedInputModes {
+ std::lock_guard<std::mutex> lock{mutex_};
+ switch (input_mode_.get().value_or(static_cast<uint8_t>(LockedInputModes::kDisabled))) {
+ case static_cast<uint8_t>(LockedInputModes::kDisabled):
+ return LockedInputModes::kDisabled;
+ default:
+ return LockedInputModes::kDisabled;
+ }
+}
+
+auto NvsStorage::LockedInput(LockedInputModes mode) -> void {
+ std::lock_guard<std::mutex> lock{mutex_};
+ locked_input_mode_.set(static_cast<uint8_t>(mode));
+}
+
auto NvsStorage::QueueRepeatMode() -> uint8_t {
std::lock_guard<std::mutex> lock{mutex_};
return queue_repeat_mode_.get().value_or(0);
diff --git a/src/tangara/input/input_device.hpp b/src/tangara/input/input_device.hpp
index 7edded3e..424c0da3 100644
--- a/src/tangara/input/input_device.hpp
+++ b/src/tangara/input/input_device.hpp
@@ -10,6 +10,7 @@
#include <string>
#include <vector>
+#include "drivers/nvs.hpp"
#include "indev/lv_indev.h"
#include "input/input_hook.hpp"
#include "lua/property.hpp"
@@ -34,7 +35,7 @@ class IInputDevice {
}
/* Called by the LVGL driver when controls are being locked. */
- virtual auto onLock() -> void {}
+ virtual auto onLock(drivers::NvsStorage::LockedInputModes) -> void {}
/* Called by the LVGL driver when controls are being unlocked. */
virtual auto onUnlock() -> void {}
};
diff --git a/src/tangara/input/input_nav_buttons.cpp b/src/tangara/input/input_nav_buttons.cpp
index 54bef7a6..a5e10013 100644
--- a/src/tangara/input/input_nav_buttons.cpp
+++ b/src/tangara/input/input_nav_buttons.cpp
@@ -42,7 +42,7 @@ auto NavButtons::triggers()
return {up_, down_};
}
-auto NavButtons::onLock() -> void {
+auto NavButtons::onLock(drivers::NvsStorage::LockedInputModes mode) -> void {
locked_ = true;
}
diff --git a/src/tangara/input/input_nav_buttons.hpp b/src/tangara/input/input_nav_buttons.hpp
index 95d56d54..c9575fe0 100644
--- a/src/tangara/input/input_nav_buttons.hpp
+++ b/src/tangara/input/input_nav_buttons.hpp
@@ -28,7 +28,7 @@ class NavButtons : public IInputDevice {
auto name() -> std::string override;
auto triggers() -> std::vector<std::reference_wrapper<TriggerHooks>> override;
- auto onLock() -> void override;
+ auto onLock(drivers::NvsStorage::LockedInputModes) -> void override;
auto onUnlock() -> void override;
private:
diff --git a/src/tangara/input/input_touch_dpad.cpp b/src/tangara/input/input_touch_dpad.cpp
index 8ed2bdd7..25c2315b 100644
--- a/src/tangara/input/input_touch_dpad.cpp
+++ b/src/tangara/input/input_touch_dpad.cpp
@@ -65,7 +65,7 @@ auto TouchDPad::triggers()
return {centre_, up_, right_, down_, left_};
}
-auto TouchDPad::onLock() -> void {
+auto TouchDPad::onLock(drivers::NvsStorage::LockedInputModes mode) -> void {
wheel_.LowPowerMode(true);
locked_ = true;
}
diff --git a/src/tangara/input/input_touch_dpad.hpp b/src/tangara/input/input_touch_dpad.hpp
index d787bace..086f556e 100644
--- a/src/tangara/input/input_touch_dpad.hpp
+++ b/src/tangara/input/input_touch_dpad.hpp
@@ -27,7 +27,7 @@ class TouchDPad : public IInputDevice {
auto name() -> std::string override;
auto triggers() -> std::vector<std::reference_wrapper<TriggerHooks>> override;
- auto onLock() -> void override;
+ auto onLock(drivers::NvsStorage::LockedInputModes) -> void override;
auto onUnlock() -> void override;
private:
diff --git a/src/tangara/input/input_touch_wheel.cpp b/src/tangara/input/input_touch_wheel.cpp
index 19ac5211..ea6d1b56 100644
--- a/src/tangara/input/input_touch_wheel.cpp
+++ b/src/tangara/input/input_touch_wheel.cpp
@@ -113,7 +113,7 @@ auto TouchWheel::triggers()
return {centre_, up_, right_, down_, left_};
}
-auto TouchWheel::onLock() -> void {
+auto TouchWheel::onLock(drivers::NvsStorage::LockedInputModes mode) -> void {
wheel_.LowPowerMode(true);
locked_ = true;
}
diff --git a/src/tangara/input/input_touch_wheel.hpp b/src/tangara/input/input_touch_wheel.hpp
index 982f89f4..e8391914 100644
--- a/src/tangara/input/input_touch_wheel.hpp
+++ b/src/tangara/input/input_touch_wheel.hpp
@@ -30,7 +30,7 @@ class TouchWheel : public IInputDevice {
auto name() -> std::string override;
auto triggers() -> std::vector<std::reference_wrapper<TriggerHooks>> override;
- auto onLock() -> void override;
+ auto onLock(drivers::NvsStorage::LockedInputModes) -> void override;
auto onUnlock() -> void override;
auto sensitivity() -> lua::Property&;
diff --git a/src/tangara/input/input_volume_buttons.cpp b/src/tangara/input/input_volume_buttons.cpp
index 7ffdfcdc..6720afae 100644
--- a/src/tangara/input/input_volume_buttons.cpp
+++ b/src/tangara/input/input_volume_buttons.cpp
@@ -39,7 +39,7 @@ auto VolumeButtons::triggers()
return {up_, down_};
}
-auto VolumeButtons::onLock() -> void {
+auto VolumeButtons::onLock(drivers::NvsStorage::LockedInputModes mode) -> void {
locked_ = true;
}
diff --git a/src/tangara/input/input_volume_buttons.hpp b/src/tangara/input/input_volume_buttons.hpp
index ffb3156b..008252cd 100644
--- a/src/tangara/input/input_volume_buttons.hpp
+++ b/src/tangara/input/input_volume_buttons.hpp
@@ -27,7 +27,7 @@ class VolumeButtons : public IInputDevice {
auto name() -> std::string override;
auto triggers() -> std::vector<std::reference_wrapper<TriggerHooks>> override;
- auto onLock() -> void override;
+ auto onLock(drivers::NvsStorage::LockedInputModes) -> void override;
auto onUnlock() -> void override;
private:
diff --git a/src/tangara/input/lvgl_input_driver.cpp b/src/tangara/input/lvgl_input_driver.cpp
index c008b007..9177f92f 100644
--- a/src/tangara/input/lvgl_input_driver.cpp
+++ b/src/tangara/input/lvgl_input_driver.cpp
@@ -53,6 +53,8 @@ static void focus_cb(lv_group_t* group) {
instance->feedback(LV_EVENT_FOCUSED);
}
+namespace {
+
auto intToMode(int raw) -> std::optional<drivers::NvsStorage::InputModes> {
switch (raw) {
case 0:
@@ -68,6 +70,17 @@ auto intToMode(int raw) -> std::optional<drivers::NvsStorage::InputModes> {
}
}
+auto intToLockedMode(int raw) -> std::optional<drivers::NvsStorage::LockedInputModes> {
+ switch (raw) {
+ case 0:
+ return drivers::NvsStorage::LockedInputModes::kDisabled;
+ default:
+ return {};
+ }
+}
+
+} // namespace {}
+
LvglInputDriver::LvglInputDriver(drivers::NvsStorage& nvs,
DeviceFactory& factory)
: nvs_(nvs),
@@ -85,6 +98,18 @@ LvglInputDriver::LvglInputDriver(drivers::NvsStorage& nvs,
inputs_ = factory.createInputs(*mode);
return true;
}),
+ locked_mode_(static_cast<int>(nvs.LockedInput()),
+ [&](const lua::LuaValue& val) {
+ if (!std::holds_alternative<int>(val)) {
+ return false;
+ }
+ auto mode = intToLockedMode(std::get<int>(val));
+ if (!mode) {
+ return false;
+ }
+ nvs.LockedInput(*mode);
+ return true;
+ }),
inputs_(factory.createInputs(nvs.PrimaryInput())),
feedbacks_(factory.createFeedbacks()),
is_locked_(false) {
@@ -130,9 +155,11 @@ auto LvglInputDriver::feedback(uint8_t event) -> void {
auto LvglInputDriver::lock(bool l) -> void {
is_locked_ = l;
+ auto locked_input_mode = nvs_.LockedInput();
+
for (auto&& device : inputs_) {
if (l) {
- device->onLock();
+ device->onLock(locked_input_mode);
} else {
device->onUnlock();
}
diff --git a/src/tangara/input/lvgl_input_driver.hpp b/src/tangara/input/lvgl_input_driver.hpp
index 9b62c24d..ce950621 100644
--- a/src/tangara/input/lvgl_input_driver.hpp
+++ b/src/tangara/input/lvgl_input_driver.hpp
@@ -36,6 +36,7 @@ class LvglInputDriver {
LvglInputDriver(drivers::NvsStorage& nvs, DeviceFactory&);
auto mode() -> lua::Property& { return mode_; }
+ auto lockedMode() -> lua::Property& { return locked_mode_; }
auto setGroup(lv_group_t*) -> void;
auto read(lv_indev_data_t* data) -> void;
@@ -49,6 +50,7 @@ class LvglInputDriver {
DeviceFactory& factory_;
lua::Property mode_;
+ lua::Property locked_mode_;
lv_indev_t* device_;
std::vector<std::shared_ptr<IInputDevice>> inputs_;