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.
custom
Tess Eisenberger 10 months ago committed by teisenbe
parent b98e67972b
commit e8eaf3df10
  1. 8
      src/drivers/include/drivers/nvs.hpp
  2. 17
      src/drivers/nvs.cpp
  3. 3
      src/tangara/input/input_device.hpp
  4. 2
      src/tangara/input/input_nav_buttons.cpp
  5. 2
      src/tangara/input/input_nav_buttons.hpp
  6. 2
      src/tangara/input/input_touch_dpad.cpp
  7. 2
      src/tangara/input/input_touch_dpad.hpp
  8. 2
      src/tangara/input/input_touch_wheel.cpp
  9. 2
      src/tangara/input/input_touch_wheel.hpp
  10. 2
      src/tangara/input/input_volume_buttons.cpp
  11. 2
      src/tangara/input/input_volume_buttons.hpp
  12. 29
      src/tangara/input/lvgl_input_driver.cpp
  13. 2
      src/tangara/input/lvgl_input_driver.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_;

@ -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);

@ -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 {}
};

@ -42,7 +42,7 @@ auto NavButtons::triggers()
return {up_, down_};
}
auto NavButtons::onLock() -> void {
auto NavButtons::onLock(drivers::NvsStorage::LockedInputModes mode) -> void {
locked_ = true;
}

@ -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:

@ -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;
}

@ -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:

@ -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;
}

@ -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&;

@ -39,7 +39,7 @@ auto VolumeButtons::triggers()
return {up_, down_};
}
auto VolumeButtons::onLock() -> void {
auto VolumeButtons::onLock(drivers::NvsStorage::LockedInputModes mode) -> void {
locked_ = true;
}

@ -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:

@ -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();
}

@ -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_;

Loading…
Cancel
Save