aboutsummaryrefslogtreecommitdiffstats
path: root/src/input.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-08-30 16:13:48 +0200
committerBad Diode <bd@badd10de.dev>2023-08-30 16:13:48 +0200
commite8fdb17d27a33988fb79c792d69ff15c16a0e59c (patch)
tree40d65b7c96b5951878d798c87495808e2d8bb908 /src/input.c
parentac0fb608825c032e58bb533e30a77b1911b9bae9 (diff)
downloaduxngba-e8fdb17d27a33988fb79c792d69ff15c16a0e59c.tar.gz
uxngba-e8fdb17d27a33988fb79c792d69ff15c16a0e59c.zip
Add back input handling function
Diffstat (limited to 'src/input.c')
-rw-r--r--src/input.c205
1 files changed, 205 insertions, 0 deletions
diff --git a/src/input.c b/src/input.c
new file mode 100644
index 0000000..c257271
--- /dev/null
+++ b/src/input.c
@@ -0,0 +1,205 @@
1typedef enum {
2 CONTROL_CONTROLLER,
3 CONTROL_MOUSE,
4 CONTROL_KEYBOARD,
5} ControlMethod;
6
7const ControlMethod ctrl_methods[] = {
8 CONTROL_MOUSE,
9 CONTROL_CONTROLLER,
10};
11static ControlMethod ctrl_idx = 0;
12
13#define MOUSE_DELTA 1
14typedef struct Mouse {
15 int x;
16 int y;
17} Mouse;
18
19static Mouse mouse = {SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2};
20
21void
22handle_input() {
23 poll_keys();
24 if (key_tap(KEY_SELECT)) {
25 // Reset control variables on method switch.
26 switch (ctrl_methods[ctrl_idx]) {
27 case CONTROL_CONTROLLER: {
28 u8 *d = &device_data[0x80];
29 d[2] = 0;
30 uxn_eval_asm(PEEK2(d));
31 d[3] = 0;
32 } break;
33 case CONTROL_MOUSE: {
34 u8 *d = &device_data[0x90];
35 d[6] = 0;
36 d[7] = 0;
37 POKE2(d + 0x2, -10);
38 POKE2(d + 0x4, -10);
39 uxn_eval_asm(PEEK2(d));
40 } break;
41 case CONTROL_KEYBOARD: {
42 toggle_keyboard();
43 } break;
44 }
45
46 // Update ctrl_idx.
47 ctrl_idx = (ctrl_idx + 1 > (int)LEN(ctrl_methods) - 1) ? 0 : ctrl_idx + 1;
48
49 // Initialize controller variables here.
50 if (ctrl_methods[ctrl_idx] == CONTROL_KEYBOARD) {
51 toggle_keyboard();
52 }
53 }
54
55 if (ctrl_methods[ctrl_idx] == CONTROL_CONTROLLER) {
56 u8 *d = &device_data[0x80];
57 // TODO: We don't need ifs if we use KEY_INPUTS directly and maybe just
58 // swap some things if needed.
59 u8 *flag = &d[2];
60 if (key_tap(KEY_A)) {
61 *flag |= 0x01;
62 } else {
63 *flag &= ~0x01;
64 }
65 if (key_tap(KEY_B)) {
66 *flag |= 0x02;
67 } else {
68 *flag &= ~0x02;
69 }
70 if (key_tap(KEY_L)) {
71 *flag |= 0x04;
72 } else {
73 *flag &= ~0x04;
74 }
75 if (key_tap(KEY_R)) {
76 *flag |= 0x08;
77 } else {
78 *flag &= ~0x08;
79 }
80 if (key_tap(KEY_UP)) {
81 *flag |= 0x10;
82 } else {
83 *flag &= ~0x10;
84 }
85 if (key_tap(KEY_DOWN)) {
86 *flag |= 0x20;
87 } else {
88 *flag &= ~0x20;
89 }
90 if (key_tap(KEY_LEFT)) {
91 *flag |= 0x40;
92 } else {
93 *flag &= ~0x40;
94 }
95 if (key_tap(KEY_RIGHT)) {
96 *flag |= 0x80;
97 } else {
98 *flag &= ~0x80;
99 }
100
101 if (key_prev != key_curr) {
102 uxn_eval_asm(PEEK2(d));
103 }
104 d[3] = 0;
105 } else if (ctrl_methods[ctrl_idx] == CONTROL_MOUSE) {
106 u8 *d = &device_data[0x90];
107 // Detect "mouse key press".
108 u8 flag = d[6];
109 bool event = false;
110 if (key_tap(KEY_B)) {
111 event = true;
112 flag |= 0x01;
113 } else if (key_released(KEY_B)) {
114 event = true;
115 flag &= ~0x01;
116 }
117 if (key_tap(KEY_A)) {
118 event = true;
119 flag |= 0x10;
120 } else if (key_released(KEY_A)) {
121 event = true;
122 flag &= ~0x10;
123 }
124
125 // Handle chording.
126 d[6] = flag;
127 if(flag == 0x10 && (d[6] & 0x01)) {
128 d[7] = 0x01;
129 }
130 if(flag == 0x01 && (d[6] & 0x10)) {
131 d[7] = 0x10;
132 }
133
134 // Detect mouse movement.
135 if (key_pressed(KEY_UP)) {
136 event = true;
137 mouse.y = CLAMP(mouse.y - MOUSE_DELTA, 0, SCREEN_HEIGHT - 8);
138 } else if (key_pressed(KEY_DOWN)) {
139 event = true;
140 mouse.y = CLAMP(mouse.y + MOUSE_DELTA, 0, SCREEN_HEIGHT - 8);
141 }
142 if (key_pressed(KEY_LEFT)) {
143 event = true;
144 mouse.x = CLAMP(mouse.x - MOUSE_DELTA, 0, SCREEN_WIDTH - 8);
145 } else if (key_pressed(KEY_RIGHT)) {
146 event = true;
147 mouse.x = CLAMP(mouse.x + MOUSE_DELTA, 0, SCREEN_WIDTH - 8);
148 }
149
150 // Eval mouse.
151 POKE2(d + 0x2, mouse.x);
152 POKE2(d + 0x4, mouse.y);
153 if (event) {
154 uxn_eval_asm(PEEK2(d));
155 }
156 } else if (ctrl_methods[ctrl_idx] == CONTROL_KEYBOARD) {
157 u8 *d = &device_data[0x80];
158 if (key_tap(KEY_LEFT)) {
159 update_cursor(cursor_position - 1);
160 } else if (key_tap(KEY_RIGHT)) {
161 update_cursor(cursor_position + 1);
162 }
163 if (key_tap(KEY_UP) && cursor_position >= KEYBOARD_ROW_SIZE) {
164 update_cursor(cursor_position - KEYBOARD_ROW_SIZE);
165 } else if (key_tap(KEY_DOWN)
166 && cursor_position < LEN(keyboard) - KEYBOARD_ROW_SIZE) {
167 update_cursor(cursor_position + KEYBOARD_ROW_SIZE);
168 }
169 if (key_tap(KEY_B)) {
170 u8 symbol = keyboard[cursor_position].symbol;
171 switch (symbol) {
172 case 0x7f: {
173 // Backspace.
174 d[3] = 0x08;
175 } break;
176 case 0x14: {
177 // New line.
178 d[3] = 0x0d;
179 } break;
180 case 0x18: {
181 // Arrow up.
182 d[2] = 0x10;
183 } break;
184 case 0x19: {
185 // Arrow down.
186 d[2] = 0x20;
187 } break;
188 case 0x1b: {
189 // Arrow left.
190 d[2] = 0x40;
191 } break;
192 case 0x1a: {
193 // Arrow right.
194 d[2] = 0x80;
195 } break;
196 default: {
197 d[3] = symbol;
198 } break;
199 }
200 uxn_eval_asm(PEEK2(d));
201 d[3] = 0;
202 }
203 }
204}
205