Handle lock state in each input device, instead of in the lvgl driver

custom
jacqueline 3 months ago
parent dfb4ea5458
commit a69b95187b
  1. 23
      src/tangara/input/input_nav_buttons.cpp
  2. 5
      src/tangara/input/input_nav_buttons.hpp
  3. 18
      src/tangara/input/input_touch_dpad.cpp
  4. 7
      src/tangara/input/input_touch_dpad.hpp
  5. 7
      src/tangara/input/input_touch_wheel.cpp
  6. 1
      src/tangara/input/input_touch_wheel.hpp
  7. 23
      src/tangara/input/input_volume_buttons.cpp
  8. 5
      src/tangara/input/input_volume_buttons.hpp
  9. 12
      src/tangara/input/lvgl_input_driver.cpp

@ -17,11 +17,20 @@ namespace input {
NavButtons::NavButtons(drivers::IGpios& gpios)
: gpios_(gpios),
up_("upper", {}, actions::scrollUp(), actions::select(), {}),
down_("lower", {}, actions::scrollDown(), actions::select(), {}) {}
down_("lower", {}, actions::scrollDown(), actions::select(), {}),
locked_(false) {}
auto NavButtons::read(lv_indev_data_t* data) -> void {
up_.update(!gpios_.Get(drivers::IGpios::Pin::kKeyUp), data);
down_.update(!gpios_.Get(drivers::IGpios::Pin::kKeyDown), data);
bool up = !gpios_.Get(drivers::IGpios::Pin::kKeyUp);
bool down = !gpios_.Get(drivers::IGpios::Pin::kKeyDown);
if ((up && down) || locked_) {
up = false;
down = false;
}
up_.update(up, data);
down_.update(down, data);
}
auto NavButtons::name() -> std::string {
@ -33,4 +42,12 @@ auto NavButtons::triggers()
return {up_, down_};
}
auto NavButtons::onLock() -> void {
locked_ = true;
}
auto NavButtons::onUnlock() -> void {
locked_ = false;
}
} // namespace input

@ -28,11 +28,16 @@ class NavButtons : public IInputDevice {
auto name() -> std::string override;
auto triggers() -> std::vector<std::reference_wrapper<TriggerHooks>> override;
auto onLock() -> void override;
auto onUnlock() -> void override;
private:
drivers::IGpios& gpios_;
TriggerHooks up_;
TriggerHooks down_;
bool locked_;
};
} // namespace input

@ -25,9 +25,14 @@ TouchDPad::TouchDPad(drivers::TouchWheel& wheel)
up_("up", actions::scrollUp(), {}, {}, actions::scrollUp()),
right_("right", actions::select(), {}, {}, {}),
down_("down", actions::scrollDown(), {}, {}, actions::scrollDown()),
left_("left", actions::goBack(), {}, {}, {}) {}
left_("left", actions::goBack(), {}, {}, {}),
locked_(false) {}
auto TouchDPad::read(lv_indev_data_t* data) -> void {
if (locked_) {
return;
}
wheel_.Update();
auto wheel_data = wheel_.GetTouchWheelData();
@ -60,4 +65,15 @@ auto TouchDPad::triggers()
return {centre_, up_, right_, down_, left_};
}
auto TouchDPad::onLock() -> void {
wheel_.LowPowerMode(true);
locked_ = true;
}
auto TouchDPad::onUnlock() -> void {
wheel_.LowPowerMode(false);
wheel_.Recalibrate();
locked_ = false;
}
} // namespace input

@ -11,10 +11,10 @@
#include "indev/lv_indev.h"
#include "drivers/haptics.hpp"
#include "drivers/touchwheel.hpp"
#include "input/input_device.hpp"
#include "input/input_hook.hpp"
#include "input/input_trigger.hpp"
#include "drivers/touchwheel.hpp"
namespace input {
@ -27,6 +27,9 @@ class TouchDPad : public IInputDevice {
auto name() -> std::string override;
auto triggers() -> std::vector<std::reference_wrapper<TriggerHooks>> override;
auto onLock() -> void override;
auto onUnlock() -> void override;
private:
drivers::TouchWheel& wheel_;
@ -35,6 +38,8 @@ class TouchDPad : public IInputDevice {
TriggerHooks right_;
TriggerHooks down_;
TriggerHooks left_;
bool locked_;
};
} // namespace input

@ -48,12 +48,17 @@ TouchWheel::TouchWheel(drivers::NvsStorage& nvs, drivers::TouchWheel& wheel)
actions::scrollToBottom(),
actions::scrollToBottom()),
left_("left", {}, {}, actions::goBack(), {}),
locked_(false),
is_scrolling_(false),
threshold_(calculateThreshold(nvs.ScrollSensitivity())),
is_first_read_(true),
last_angle_(0) {}
auto TouchWheel::read(lv_indev_data_t* data) -> void {
if (locked_) {
return;
}
wheel_.Update();
auto wheel_data = wheel_.GetTouchWheelData();
int8_t ticks = calculateTicks(wheel_data);
@ -110,11 +115,13 @@ auto TouchWheel::triggers()
auto TouchWheel::onLock() -> void {
wheel_.LowPowerMode(true);
locked_ = true;
}
auto TouchWheel::onUnlock() -> void {
wheel_.LowPowerMode(false);
wheel_.Recalibrate();
locked_ = false;
}
auto TouchWheel::sensitivity() -> lua::Property& {

@ -50,6 +50,7 @@ class TouchWheel : public IInputDevice {
TriggerHooks down_;
TriggerHooks left_;
bool locked_;
bool is_scrolling_;
uint8_t threshold_;
bool is_first_read_;

@ -14,11 +14,20 @@ namespace input {
VolumeButtons::VolumeButtons(drivers::IGpios& gpios)
: gpios_(gpios),
up_("upper", actions::volumeUp()),
down_("lower", actions::volumeDown()) {}
down_("lower", actions::volumeDown()),
locked_(false) {}
auto VolumeButtons::read(lv_indev_data_t* data) -> void {
up_.update(!gpios_.Get(drivers::IGpios::Pin::kKeyUp), data);
down_.update(!gpios_.Get(drivers::IGpios::Pin::kKeyDown), data);
bool up = !gpios_.Get(drivers::IGpios::Pin::kKeyUp);
bool down = !gpios_.Get(drivers::IGpios::Pin::kKeyDown);
if ((up && down) || locked_) {
up = false;
down = false;
}
up_.update(up, data);
down_.update(down, data);
}
auto VolumeButtons::name() -> std::string {
@ -30,4 +39,12 @@ auto VolumeButtons::triggers()
return {up_, down_};
}
auto VolumeButtons::onLock() -> void {
locked_ = true;
}
auto VolumeButtons::onUnlock() -> void {
locked_ = false;
}
} // namespace input

@ -27,11 +27,16 @@ class VolumeButtons : public IInputDevice {
auto name() -> std::string override;
auto triggers() -> std::vector<std::reference_wrapper<TriggerHooks>> override;
auto onLock() -> void override;
auto onUnlock() -> void override;
private:
drivers::IGpios& gpios_;
TriggerHooks up_;
TriggerHooks down_;
bool locked_;
};
} // namespace input

@ -114,11 +114,6 @@ auto LvglInputDriver::setGroup(lv_group_t* g) -> void {
}
auto LvglInputDriver::read(lv_indev_data_t* data) -> void {
// TODO: we should pass lock state on to the individual devices, since they
// may wish to either ignore the lock state, or power down until unlock.
if (is_locked_) {
return;
}
for (auto&& device : inputs_) {
device->read(data);
}
@ -218,10 +213,15 @@ auto LvglInputDriver::pushHooks(lua_State* L) -> int {
lua_newtable(L);
for (auto& dev : inputs_) {
auto triggers = dev->triggers();
if (triggers.empty()) {
continue;
}
lua_pushlstring(L, dev->name().data(), dev->name().size());
lua_newtable(L);
for (auto& trigger : dev->triggers()) {
for (auto& trigger : triggers) {
lua_pushlstring(L, trigger.get().name().data(),
trigger.get().name().size());
LuaTrigger** lua_obj = reinterpret_cast<LuaTrigger**>(

Loading…
Cancel
Save