aboutsummaryrefslogtreecommitdiff
path: root/src/peripheral
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2022-06-12 22:34:23 +0200
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2022-06-12 23:18:57 +0200
commit0f9e2d89589f05847fb7dc808da1594f0961b5b4 (patch)
treef80da866fdf50aae44009ccd1c858d2013b0a3d0 /src/peripheral
parent5794dbf40364ae442a22b6ac6c4732edd0e61f84 (diff)
downloadrts-0f9e2d89589f05847fb7dc808da1594f0961b5b4.tar.gz
Split peripheral-related logic into its own component
This has several advantages: - `camera` no longer needs to define public functions for each peripheral type. - Peripheral-related is now no longer tighly coupled to human_player, so peripheral logic can be reused elsewhere e.g.: on menus. - Makes camera_update_touch consistent compared to equivalent functions, since now `pan` has now been moved to `camera` (as it should be).
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;
+ }
+}