summaryrefslogtreecommitdiff
path: root/src/input/include
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-04-24 16:06:10 +1000
committerjacqueline <me@jacqueline.id.au>2024-04-24 16:06:10 +1000
commit920345b940bb3993c389d9e9be1a75a8041d431d (patch)
tree562e53906a14c31ba8a21b3c2ae64c652a16acb4 /src/input/include
parent531475e3511e9c722677d3a351b51d4a579876df (diff)
downloadtangara-fw-920345b940bb3993c389d9e9be1a75a8041d431d.tar.gz
Support getting a tree of controls + hooks via lua
Diffstat (limited to 'src/input/include')
-rw-r--r--src/input/include/input_device.hpp10
-rw-r--r--src/input/include/input_hook.hpp34
-rw-r--r--src/input/include/input_hook_actions.hpp19
-rw-r--r--src/input/include/input_nav_buttons.hpp3
-rw-r--r--src/input/include/input_touch_dpad.hpp3
-rw-r--r--src/input/include/input_touch_wheel.hpp3
-rw-r--r--src/input/include/input_volume_buttons.hpp3
-rw-r--r--src/input/include/lvgl_input_driver.hpp2
8 files changed, 54 insertions, 23 deletions
diff --git a/src/input/include/input_device.hpp b/src/input/include/input_device.hpp
index 5fc3e066..59456351 100644
--- a/src/input/include/input_device.hpp
+++ b/src/input/include/input_device.hpp
@@ -11,6 +11,7 @@
#include <vector>
#include "hal/lv_hal_indev.h"
+#include "input_hook.hpp"
#include "property.hpp"
namespace input {
@@ -27,13 +28,8 @@ class IInputDevice {
virtual auto read(lv_indev_data_t* data) -> void = 0;
- // TODO: Add hooks and configuration (or are hooks just one kind of
- // configuration?)
-
- virtual auto settings()
- -> std::vector<std::pair<std::string, lua::Property>> {
- return {};
- }
+ virtual auto name() -> std::string = 0;
+ virtual auto hooks() -> std::vector<TriggerHooks> { return {}; }
};
} // namespace input
diff --git a/src/input/include/input_hook.hpp b/src/input/include/input_hook.hpp
index 96b9b5cd..81eb80d9 100644
--- a/src/input/include/input_hook.hpp
+++ b/src/input/include/input_hook.hpp
@@ -8,35 +8,53 @@
#include <functional>
#include <optional>
+#include <string>
#include "hal/lv_hal_indev.h"
+#include "lua.hpp"
+
#include "input_trigger.hpp"
namespace input {
-using HookCb = std::optional<std::function<void(lv_indev_data_t*)>>;
+struct HookCallback {
+ std::string name;
+ std::function<void(lv_indev_data_t*)> fn;
+};
class Hook {
public:
- Hook(HookCb);
+ Hook(std::string name, std::optional<HookCallback> cb);
auto invoke(lv_indev_data_t*) -> void;
- auto override(HookCb) -> void;
+ auto override(std::optional<HookCallback>) -> void;
+
+ auto name() const -> const std::string& { return name_; }
+ auto callback() -> std::optional<HookCallback>;
private:
- HookCb default_;
- HookCb override_;
+ std::string name_;
+ std::optional<HookCallback> default_;
+ std::optional<HookCallback> override_;
};
class TriggerHooks {
public:
- TriggerHooks(HookCb cb) : TriggerHooks(cb, cb, cb) {}
- TriggerHooks(HookCb, HookCb, HookCb);
+ TriggerHooks(std::string name, std::optional<HookCallback> cb)
+ : TriggerHooks(name, cb, cb, cb) {}
+ TriggerHooks(std::string name,
+ std::optional<HookCallback> click,
+ std::optional<HookCallback> long_press,
+ std::optional<HookCallback> repeat);
auto update(bool, lv_indev_data_t*) -> void;
- auto override(Trigger::State, HookCb) -> void;
+ auto override(Trigger::State, std::optional<HookCallback>) -> void;
+
+ auto name() const -> const std::string&;
+ auto pushHooks(lua_State*) -> void;
private:
+ std::string name_;
Trigger trigger_;
Hook click_;
diff --git a/src/input/include/input_hook_actions.hpp b/src/input/include/input_hook_actions.hpp
index a05a14e8..105bd10d 100644
--- a/src/input/include/input_hook_actions.hpp
+++ b/src/input/include/input_hook_actions.hpp
@@ -7,22 +7,25 @@
#pragma once
#include "hal/lv_hal_indev.h"
+#include "input_hook.hpp"
namespace input {
namespace actions {
-auto select(lv_indev_data_t*) -> void;
+auto select() -> HookCallback;
-auto scrollUp(lv_indev_data_t*) -> void;
-auto scrollDown(lv_indev_data_t*) -> void;
+auto scrollUp() -> HookCallback;
+auto scrollDown() -> HookCallback;
-auto scrollToTop(lv_indev_data_t*) -> void;
-auto scrollToBottom(lv_indev_data_t*) -> void;
+auto scrollToTop() -> HookCallback;
+auto scrollToBottom() -> HookCallback;
-auto goBack(lv_indev_data_t*) -> void;
+auto goBack() -> HookCallback;
-auto volumeUp(lv_indev_data_t*) -> void;
-auto volumeDown(lv_indev_data_t*) -> void;
+auto volumeUp() -> HookCallback;
+auto volumeDown() -> HookCallback;
+
+auto allActions() -> std::vector<HookCallback>;
} // namespace actions
} // namespace input
diff --git a/src/input/include/input_nav_buttons.hpp b/src/input/include/input_nav_buttons.hpp
index 60566ebc..4e4952c9 100644
--- a/src/input/include/input_nav_buttons.hpp
+++ b/src/input/include/input_nav_buttons.hpp
@@ -25,6 +25,9 @@ class NavButtons : public IInputDevice {
auto read(lv_indev_data_t* data) -> void override;
+ auto name() -> std::string override;
+ auto hooks() -> std::vector<TriggerHooks> override;
+
private:
drivers::IGpios& gpios_;
diff --git a/src/input/include/input_touch_dpad.hpp b/src/input/include/input_touch_dpad.hpp
index f80400dc..691e3243 100644
--- a/src/input/include/input_touch_dpad.hpp
+++ b/src/input/include/input_touch_dpad.hpp
@@ -24,6 +24,9 @@ class TouchDPad : public IInputDevice {
auto read(lv_indev_data_t* data) -> void override;
+ auto name() -> std::string override;
+ auto hooks() -> std::vector<TriggerHooks> override;
+
private:
drivers::TouchWheel& wheel_;
diff --git a/src/input/include/input_touch_wheel.hpp b/src/input/include/input_touch_wheel.hpp
index 88ebee40..1f116da9 100644
--- a/src/input/include/input_touch_wheel.hpp
+++ b/src/input/include/input_touch_wheel.hpp
@@ -27,6 +27,9 @@ class TouchWheel : public IInputDevice {
auto read(lv_indev_data_t* data) -> void override;
+ auto name() -> std::string override;
+ auto hooks() -> std::vector<TriggerHooks> override;
+
auto sensitivity() -> lua::Property&;
private:
diff --git a/src/input/include/input_volume_buttons.hpp b/src/input/include/input_volume_buttons.hpp
index 68962908..a684aa48 100644
--- a/src/input/include/input_volume_buttons.hpp
+++ b/src/input/include/input_volume_buttons.hpp
@@ -24,6 +24,9 @@ class VolumeButtons : public IInputDevice {
auto read(lv_indev_data_t* data) -> void override;
+ auto name() -> std::string override;
+ auto hooks() -> std::vector<TriggerHooks> override;
+
private:
drivers::IGpios& gpios_;
diff --git a/src/input/include/lvgl_input_driver.hpp b/src/input/include/lvgl_input_driver.hpp
index 257ccb28..9f43d27f 100644
--- a/src/input/include/lvgl_input_driver.hpp
+++ b/src/input/include/lvgl_input_driver.hpp
@@ -41,6 +41,8 @@ class LvglInputDriver {
auto registration() -> lv_indev_t* { return registration_; }
auto lock(bool l) -> void { is_locked_ = l; }
+ auto pushHooks(lua_State* L) -> int;
+
private:
drivers::NvsStorage& nvs_;
DeviceFactory& factory_;