diff options
author | Bad Diode <bd@badd10de.dev> | 2024-01-08 15:32:13 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2024-01-08 15:32:13 +0100 |
commit | be37f274be067e92f9240112b7a047b8ef9e09b0 (patch) | |
tree | fb5a45cd6f605e607c5bd8e7e5a4127b95230976 /src/gba/gba.h | |
parent | 2eb3cfba2bdd569ffeaf94e6e29faac9a83b5b77 (diff) | |
download | stepper-be37f274be067e92f9240112b7a047b8ef9e09b0.tar.gz stepper-be37f274be067e92f9240112b7a047b8ef9e09b0.zip |
Add input retriggering with configurable rate and offset
Diffstat (limited to 'src/gba/gba.h')
-rw-r--r-- | src/gba/gba.h | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/gba/gba.h b/src/gba/gba.h index 8ba3de5..b5868f0 100644 --- a/src/gba/gba.h +++ b/src/gba/gba.h | |||
@@ -327,6 +327,117 @@ key_hold(u32 key) { | |||
327 | return key_curr & key_prev & key; | 327 | return key_curr & key_prev & key; |
328 | } | 328 | } |
329 | 329 | ||
330 | // Stores number of frames since a keay was pressed. | ||
331 | typedef struct Controller { | ||
332 | int key_up; | ||
333 | int key_down; | ||
334 | int key_left; | ||
335 | int key_right; | ||
336 | int key_select; | ||
337 | int key_start; | ||
338 | int key_b; | ||
339 | int key_a; | ||
340 | int key_l; | ||
341 | int key_r; | ||
342 | } Controller; | ||
343 | |||
344 | static Controller ctrl = {0}; | ||
345 | |||
346 | #define RETRIG_OFFSET 16 | ||
347 | #define RETRIG_FRAMES 3 | ||
348 | |||
349 | static inline | ||
350 | bool | ||
351 | _key_retrig(int key, int offset, int frames) { | ||
352 | if (key_tap(key)) { | ||
353 | return true; | ||
354 | } | ||
355 | switch (key) { | ||
356 | case KEY_L: { | ||
357 | if (key_hold(key)) { | ||
358 | if (ctrl.key_l < offset) { return false; } | ||
359 | if (ctrl.key_l % frames == 0) { return true; } | ||
360 | } | ||
361 | } break; | ||
362 | case KEY_R: { | ||
363 | if (key_hold(key)) { | ||
364 | if (ctrl.key_r < offset) { return false; } | ||
365 | if (ctrl.key_r % frames == 0) { return true; } | ||
366 | } | ||
367 | } break; | ||
368 | case KEY_A: { | ||
369 | if (key_hold(key)) { | ||
370 | if (ctrl.key_a < offset) { return false; } | ||
371 | if (ctrl.key_a % frames == 0) { return true; } | ||
372 | } | ||
373 | } break; | ||
374 | case KEY_B: { | ||
375 | if (key_hold(key)) { | ||
376 | if (ctrl.key_b < offset) { return false; } | ||
377 | if (ctrl.key_b % frames == 0) { return true; } | ||
378 | } | ||
379 | } break; | ||
380 | case KEY_SELECT: { | ||
381 | if (key_hold(key)) { | ||
382 | if (ctrl.key_select < offset) { return false; } | ||
383 | if (ctrl.key_select % frames == 0) { return true; } | ||
384 | } | ||
385 | } break; | ||
386 | case KEY_START: { | ||
387 | if (key_hold(key)) { | ||
388 | if (ctrl.key_start < offset) { return false; } | ||
389 | if (ctrl.key_start % frames == 0) { return true; } | ||
390 | } | ||
391 | } break; | ||
392 | case KEY_UP: { | ||
393 | if (key_hold(key)) { | ||
394 | if (ctrl.key_up < offset) { return false; } | ||
395 | if (ctrl.key_up % frames == 0) { return true; } | ||
396 | } | ||
397 | } break; | ||
398 | case KEY_DOWN: { | ||
399 | if (key_hold(key)) { | ||
400 | if (ctrl.key_down < offset) { return false; } | ||
401 | if (ctrl.key_down % frames == 0) { return true; } | ||
402 | } | ||
403 | } break; | ||
404 | case KEY_LEFT: { | ||
405 | if (key_hold(key)) { | ||
406 | if (ctrl.key_left < offset) { return false; } | ||
407 | if (ctrl.key_left % frames == 0) { return true; } | ||
408 | } | ||
409 | } break; | ||
410 | case KEY_RIGHT: { | ||
411 | if (key_hold(key)) { | ||
412 | if (ctrl.key_right < offset) { return false; } | ||
413 | if (ctrl.key_right % frames == 0) { return true; } | ||
414 | } | ||
415 | } break; | ||
416 | } | ||
417 | return false; | ||
418 | } | ||
419 | |||
420 | static inline | ||
421 | bool | ||
422 | key_retrig(int key) { | ||
423 | return _key_retrig(key, RETRIG_OFFSET, RETRIG_FRAMES); | ||
424 | } | ||
425 | |||
426 | static inline | ||
427 | void | ||
428 | update_controller(void) { | ||
429 | if (key_pressed(KEY_UP)) { ctrl.key_up++; } else if (key_released(KEY_UP)) { ctrl.key_up = 0; } | ||
430 | if (key_pressed(KEY_DOWN)) { ctrl.key_down++; } else if (key_released(KEY_DOWN)) { ctrl.key_down = 0; } | ||
431 | if (key_pressed(KEY_LEFT)) { ctrl.key_left++; } else if (key_released(KEY_LEFT)) { ctrl.key_left = 0; } | ||
432 | if (key_pressed(KEY_RIGHT)) { ctrl.key_right++; } else if (key_released(KEY_RIGHT)) { ctrl.key_right = 0; } | ||
433 | if (key_pressed(KEY_L)) { ctrl.key_l++; } else if (key_released(KEY_L)) { ctrl.key_l = 0; } | ||
434 | if (key_pressed(KEY_R)) { ctrl.key_r++; } else if (key_released(KEY_R)) { ctrl.key_r = 0; } | ||
435 | if (key_pressed(KEY_A)) { ctrl.key_a++; } else if (key_released(KEY_A)) { ctrl.key_a = 0; } | ||
436 | if (key_pressed(KEY_B)) { ctrl.key_b++; } else if (key_released(KEY_B)) { ctrl.key_b = 0; } | ||
437 | if (key_pressed(KEY_SELECT)) { ctrl.key_select++; } else if (key_released(KEY_SELECT)) { ctrl.key_select = 0; } | ||
438 | if (key_pressed(KEY_START)) { ctrl.key_start++; } else if (key_released(KEY_START)) { ctrl.key_start = 0; } | ||
439 | } | ||
440 | |||
330 | // | 441 | // |
331 | // Direct Memory Access (DMA) | 442 | // Direct Memory Access (DMA) |
332 | // | 443 | // |