Add optional support for changing volume while locked

This adds a new Controls setting for adjusting the behavior
when locked, and an option for allowing volume control.
custom
Tess Eisenberger 10 months ago committed by teisenbe
parent e8eaf3df10
commit 1d485c97b0
  1. 36
      lua/settings.lua
  2. 1
      src/drivers/include/drivers/nvs.hpp
  3. 4
      src/drivers/nvs.cpp
  4. 10
      src/tangara/input/input_volume_buttons.cpp
  5. 3
      src/tangara/input/input_volume_buttons.hpp
  6. 2
      src/tangara/input/lvgl_input_driver.cpp
  7. 17
      src/tangara/lua/lua_controls.cpp
  8. 1
      src/tangara/ui/ui_fsm.cpp

@ -380,20 +380,23 @@ settings.InputSettings = SettingsScreen:new {
create_ui = function(self) create_ui = function(self)
SettingsScreen.create_ui(self) SettingsScreen.create_ui(self)
theme.set_subject(self.content:Label { -- Use the control scheme enum lists to generate the relevant dropdowns
text = "Control scheme", local make_scheme_control = function(self, scheme_list, control_scheme)
}, "settings_title")
local schemes = controls.schemes()
local option_to_scheme = {} local option_to_scheme = {}
local scheme_to_option = {} local scheme_to_option = {}
local option_idx = 0 local option_idx = 0
local options = "" local options = ""
for i, v in pairs(schemes) do -- Sort the keys to order the dropdowns the same as the enums
option_to_scheme[option_idx] = i keys = {}
scheme_to_option[i] = option_idx for i in pairs(scheme_list) do table.insert(keys, i) end
table.sort(keys)
for i, k in pairs(keys) do
v = scheme_list[k]
option_to_scheme[option_idx] = k
scheme_to_option[k] = option_idx
if option_idx > 0 then if option_idx > 0 then
options = options .. "\n" options = options .. "\n"
end end
@ -407,7 +410,7 @@ settings.InputSettings = SettingsScreen:new {
} }
self.bindings = self.bindings + { self.bindings = self.bindings + {
controls.scheme:bind(function(s) control_scheme:bind(function(s)
local option = scheme_to_option[s] local option = scheme_to_option[s]
controls_chooser:set({ selected = option }) controls_chooser:set({ selected = option })
end) end)
@ -416,8 +419,19 @@ settings.InputSettings = SettingsScreen:new {
controls_chooser:onevent(lvgl.EVENT.VALUE_CHANGED, function() controls_chooser:onevent(lvgl.EVENT.VALUE_CHANGED, function()
local option = controls_chooser:get('selected') local option = controls_chooser:get('selected')
local scheme = option_to_scheme[option] local scheme = option_to_scheme[option]
controls.scheme:set(scheme) control_scheme:set(scheme)
end) end)
end
theme.set_subject(self.content:Label {
text = "Control scheme",
}, "settings_title")
make_scheme_control(self, controls.schemes(), controls.scheme)
theme.set_subject(self.content:Label {
text = "Control scheme when locked",
}, "settings_title")
make_scheme_control(self, controls.locked_schemes(), controls.locked_scheme)
theme.set_subject(self.content:Label { theme.set_subject(self.content:Label {
text = "Scroll Sensitivity", text = "Scroll Sensitivity",

@ -140,6 +140,7 @@ class NvsStorage {
enum class LockedInputModes : uint8_t { enum class LockedInputModes : uint8_t {
kDisabled = 0, kDisabled = 0,
kVolumeOnly = 1,
}; };
auto LockedInput() -> LockedInputModes; auto LockedInput() -> LockedInputModes;

@ -574,9 +574,11 @@ auto NvsStorage::PrimaryInput(InputModes mode) -> void {
auto NvsStorage::LockedInput() -> LockedInputModes { auto NvsStorage::LockedInput() -> LockedInputModes {
std::lock_guard<std::mutex> lock{mutex_}; 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): case static_cast<uint8_t>(LockedInputModes::kDisabled):
return LockedInputModes::kDisabled; return LockedInputModes::kDisabled;
case static_cast<uint8_t>(LockedInputModes::kVolumeOnly):
return LockedInputModes::kVolumeOnly;
default: default:
return LockedInputModes::kDisabled; return LockedInputModes::kDisabled;
} }

@ -15,13 +15,15 @@ VolumeButtons::VolumeButtons(drivers::IGpios& gpios)
: gpios_(gpios), : gpios_(gpios),
up_("upper", actions::volumeUp()), up_("upper", actions::volumeUp()),
down_("lower", actions::volumeDown()), down_("lower", actions::volumeDown()),
locked_(false) {} locked_() {}
auto VolumeButtons::read(lv_indev_data_t* data) -> void { auto VolumeButtons::read(lv_indev_data_t* data) -> void {
bool up = !gpios_.Get(drivers::IGpios::Pin::kKeyUp); bool up = !gpios_.Get(drivers::IGpios::Pin::kKeyUp);
bool down = !gpios_.Get(drivers::IGpios::Pin::kKeyDown); 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; up = false;
down = false; down = false;
} }
@ -40,11 +42,11 @@ auto VolumeButtons::triggers()
} }
auto VolumeButtons::onLock(drivers::NvsStorage::LockedInputModes mode) -> void { auto VolumeButtons::onLock(drivers::NvsStorage::LockedInputModes mode) -> void {
locked_ = true; locked_ = mode;
} }
auto VolumeButtons::onUnlock() -> void { auto VolumeButtons::onUnlock() -> void {
locked_ = false; locked_ = {};
} }
} // namespace input } // namespace input

@ -36,7 +36,8 @@ class VolumeButtons : public IInputDevice {
TriggerHooks up_; TriggerHooks up_;
TriggerHooks down_; TriggerHooks down_;
bool locked_; // When locked, this contains the active mode
std::optional<drivers::NvsStorage::LockedInputModes> locked_;
}; };
} // namespace input } // namespace input

@ -74,6 +74,8 @@ auto intToLockedMode(int raw) -> std::optional<drivers::NvsStorage::LockedInputM
switch (raw) { switch (raw) {
case 0: case 0:
return drivers::NvsStorage::LockedInputModes::kDisabled; return drivers::NvsStorage::LockedInputModes::kDisabled;
case 1:
return drivers::NvsStorage::LockedInputModes::kVolumeOnly;
default: default:
return {}; return {};
} }

@ -42,7 +42,24 @@ static auto controls_schemes(lua_State* L) -> int {
return 1; 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}, static const struct luaL_Reg kControlsFuncs[] = {{"schemes", controls_schemes},
{"locked_schemes", locked_controls_schemes},
{NULL, NULL}}; {NULL, NULL}};
static auto lua_controls(lua_State* state) -> int { static auto lua_controls(lua_State* state) -> int {

@ -667,6 +667,7 @@ void Lua::entry() {
"controls", "controls",
{ {
{"scheme", &sInput->mode()}, {"scheme", &sInput->mode()},
{"locked_scheme", &sInput->lockedMode()},
{"lock_switch", &sLockSwitch}, {"lock_switch", &sLockSwitch},
{"hooks", [&](lua_State* L) { return sInput->pushHooks(L); }}, {"hooks", [&](lua_State* L) { return sInput->pushHooks(L); }},
}); });

Loading…
Cancel
Save