summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/drivers/include/drivers/nvs.hpp1
-rw-r--r--src/drivers/nvs.cpp4
-rw-r--r--src/tangara/input/input_volume_buttons.cpp10
-rw-r--r--src/tangara/input/input_volume_buttons.hpp3
-rw-r--r--src/tangara/input/lvgl_input_driver.cpp2
-rw-r--r--src/tangara/lua/lua_controls.cpp17
-rw-r--r--src/tangara/ui/ui_fsm.cpp1
7 files changed, 32 insertions, 6 deletions
diff --git a/src/drivers/include/drivers/nvs.hpp b/src/drivers/include/drivers/nvs.hpp
index b6192ab5..18bc5de6 100644
--- a/src/drivers/include/drivers/nvs.hpp
+++ b/src/drivers/include/drivers/nvs.hpp
@@ -140,6 +140,7 @@ class NvsStorage {
enum class LockedInputModes : uint8_t {
kDisabled = 0,
+ kVolumeOnly = 1,
};
auto LockedInput() -> LockedInputModes;
diff --git a/src/drivers/nvs.cpp b/src/drivers/nvs.cpp
index a9f30042..f46049ad 100644
--- a/src/drivers/nvs.cpp
+++ b/src/drivers/nvs.cpp
@@ -574,9 +574,11 @@ auto NvsStorage::PrimaryInput(InputModes mode) -> void {
auto NvsStorage::LockedInput() -> LockedInputModes {
std::lock_guard<std::mutex> lock{mutex_};
- switch (input_mode_.get().value_or(static_cast<uint8_t>(LockedInputModes::kDisabled))) {
+ switch (locked_input_mode_.get().value_or(static_cast<uint8_t>(LockedInputModes::kDisabled))) {
case static_cast<uint8_t>(LockedInputModes::kDisabled):
return LockedInputModes::kDisabled;
+ case static_cast<uint8_t>(LockedInputModes::kVolumeOnly):
+ return LockedInputModes::kVolumeOnly;
default:
return LockedInputModes::kDisabled;
}
diff --git a/src/tangara/input/input_volume_buttons.cpp b/src/tangara/input/input_volume_buttons.cpp
index 6720afae..5c814ffa 100644
--- a/src/tangara/input/input_volume_buttons.cpp
+++ b/src/tangara/input/input_volume_buttons.cpp
@@ -15,13 +15,15 @@ VolumeButtons::VolumeButtons(drivers::IGpios& gpios)
: gpios_(gpios),
up_("upper", actions::volumeUp()),
down_("lower", actions::volumeDown()),
- locked_(false) {}
+ locked_() {}
auto VolumeButtons::read(lv_indev_data_t* data) -> void {
bool up = !gpios_.Get(drivers::IGpios::Pin::kKeyUp);
bool down = !gpios_.Get(drivers::IGpios::Pin::kKeyDown);
- if ((up && down) || locked_) {
+ bool input_disabled = locked_.has_value() && (locked_ != drivers::NvsStorage::LockedInputModes::kVolumeOnly);
+
+ if ((up && down) || input_disabled) {
up = false;
down = false;
}
@@ -40,11 +42,11 @@ auto VolumeButtons::triggers()
}
auto VolumeButtons::onLock(drivers::NvsStorage::LockedInputModes mode) -> void {
- locked_ = true;
+ locked_ = mode;
}
auto VolumeButtons::onUnlock() -> void {
- locked_ = false;
+ locked_ = {};
}
} // namespace input
diff --git a/src/tangara/input/input_volume_buttons.hpp b/src/tangara/input/input_volume_buttons.hpp
index 008252cd..35a44390 100644
--- a/src/tangara/input/input_volume_buttons.hpp
+++ b/src/tangara/input/input_volume_buttons.hpp
@@ -36,7 +36,8 @@ class VolumeButtons : public IInputDevice {
TriggerHooks up_;
TriggerHooks down_;
- bool locked_;
+ // When locked, this contains the active mode
+ std::optional<drivers::NvsStorage::LockedInputModes> locked_;
};
} // namespace input
diff --git a/src/tangara/input/lvgl_input_driver.cpp b/src/tangara/input/lvgl_input_driver.cpp
index 9177f92f..2859c6a8 100644
--- a/src/tangara/input/lvgl_input_driver.cpp
+++ b/src/tangara/input/lvgl_input_driver.cpp
@@ -74,6 +74,8 @@ auto intToLockedMode(int raw) -> std::optional<drivers::NvsStorage::LockedInputM
switch (raw) {
case 0:
return drivers::NvsStorage::LockedInputModes::kDisabled;
+ case 1:
+ return drivers::NvsStorage::LockedInputModes::kVolumeOnly;
default:
return {};
}
diff --git a/src/tangara/lua/lua_controls.cpp b/src/tangara/lua/lua_controls.cpp
index baf40891..87b7ca16 100644
--- a/src/tangara/lua/lua_controls.cpp
+++ b/src/tangara/lua/lua_controls.cpp
@@ -42,7 +42,24 @@ static auto controls_schemes(lua_State* L) -> int {
return 1;
}
+static auto locked_controls_schemes(lua_State* L) -> int {
+ lua_newtable(L);
+
+ lua_pushliteral(L, "Disabled");
+ lua_rawseti(
+ L, -2,
+ static_cast<int>(drivers::NvsStorage::LockedInputModes::kDisabled));
+
+ lua_pushliteral(L, "Volume Only");
+ lua_rawseti(
+ L, -2,
+ static_cast<int>(drivers::NvsStorage::LockedInputModes::kVolumeOnly));
+
+ return 1;
+}
+
static const struct luaL_Reg kControlsFuncs[] = {{"schemes", controls_schemes},
+ {"locked_schemes", locked_controls_schemes},
{NULL, NULL}};
static auto lua_controls(lua_State* state) -> int {
diff --git a/src/tangara/ui/ui_fsm.cpp b/src/tangara/ui/ui_fsm.cpp
index 4a54d974..1823f780 100644
--- a/src/tangara/ui/ui_fsm.cpp
+++ b/src/tangara/ui/ui_fsm.cpp
@@ -667,6 +667,7 @@ void Lua::entry() {
"controls",
{
{"scheme", &sInput->mode()},
+ {"locked_scheme", &sInput->lockedMode()},
{"lock_switch", &sLockSwitch},
{"hooks", [&](lua_State* L) { return sInput->pushHooks(L); }},
});