aboutsummaryrefslogtreecommitdiff
path: root/src/peripheral
diff options
context:
space:
mode:
Diffstat (limited to 'src/peripheral')
-rw-r--r--src/peripheral/CMakeLists.txt3
-rw-r--r--src/peripheral/inc/peripheral.h64
-rw-r--r--src/peripheral/src/peripheral.c41
3 files changed, 108 insertions, 0 deletions
diff --git a/src/peripheral/CMakeLists.txt b/src/peripheral/CMakeLists.txt
new file mode 100644
index 0000000..9666a5c
--- /dev/null
+++ b/src/peripheral/CMakeLists.txt
@@ -0,0 +1,3 @@
+add_library(peripheral "src/peripheral.c")
+target_include_directories(peripheral PUBLIC "inc")
+target_link_libraries(peripheral PUBLIC pad mouse keyboard util)
diff --git a/src/peripheral/inc/peripheral.h b/src/peripheral/inc/peripheral.h
new file mode 100644
index 0000000..c405c3c
--- /dev/null
+++ b/src/peripheral/inc/peripheral.h
@@ -0,0 +1,64 @@
+#ifndef PERIPHERAL_H
+#define PERIPHERAL_H
+
+#include <pad.h>
+#include <keyboard.h>
+#include <mouse.h>
+#include <util.h>
+#include <stddef.h>
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+enum peripheral_type
+{
+ PERIPHERAL_TYPE_PAD,
+ PERIPHERAL_TYPE_TOUCH,
+ PERIPHERAL_TYPE_KEYBOARD_MOUSE
+};
+
+union peripheral
+{
+ struct peripheral_common
+ {
+ enum peripheral_type type;
+ } common;
+
+ struct peripheral_pad
+ {
+ struct peripheral_common common;
+ struct pad pad;
+ } pad;
+
+ struct peripheral_kbm
+ {
+ struct peripheral_common common;
+ struct mouse mouse;
+ struct keyboard keyboard;
+ bool long_press;
+ unsigned int lp_t;
+ } kbm;
+};
+
+struct peripheral_cfg
+{
+ enum peripheral_type type;
+ int padn;
+};
+
+UTIL_STATIC_ASSERT(!offsetof(struct peripheral_pad, common),
+ "unexpected offsetof for struct peripheral_pad");
+UTIL_STATIC_ASSERT(!offsetof(struct peripheral_kbm, common),
+ "unexpected offsetof for struct peripheral_kbm");
+
+void peripheral_init(const struct peripheral_cfg *cfg, union peripheral *p);
+void peripheral_update(union peripheral *p);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PERIPHERAL_H */
diff --git a/src/peripheral/src/peripheral.c b/src/peripheral/src/peripheral.c
new file mode 100644
index 0000000..a1f61be
--- /dev/null
+++ b/src/peripheral/src/peripheral.c
@@ -0,0 +1,41 @@
+#include <peripheral.h>
+#include <keyboard.h>
+#include <mouse.h>
+#include <pad.h>
+
+void peripheral_update(union peripheral *const p)
+{
+ switch (p->common.type)
+ {
+ case PERIPHERAL_TYPE_TOUCH:
+ /* Fall through. */
+ case PERIPHERAL_TYPE_KEYBOARD_MOUSE:
+ mouse_update(&p->kbm.mouse);
+ keyboard_update(&p->kbm.keyboard);
+ break;
+
+ case PERIPHERAL_TYPE_PAD:
+ pad_update(&p->pad.pad);
+ break;
+ }
+}
+
+void peripheral_init(const struct peripheral_cfg *const cfg,
+ union peripheral *const p)
+{
+ *p = (const union peripheral){0};
+
+ switch (p->common.type = cfg->type)
+ {
+ case PERIPHERAL_TYPE_TOUCH:
+ /* Fall through. */
+ case PERIPHERAL_TYPE_KEYBOARD_MOUSE:
+ mouse_init(&p->kbm.mouse);
+ keyboard_init(&p->kbm.keyboard);
+ break;
+
+ case PERIPHERAL_TYPE_PAD:
+ pad_init(cfg->padn, &p->pad.pad);
+ break;
+ }
+}