#pragma once #include struct count_flop_t { int8_t count; uint8_t flop; uint8_t das; uint8_t repeat; }; struct input_t { count_flop_t right; count_flop_t left; count_flop_t down; count_flop_t up; count_flop_t start; count_flop_t a; count_flop_t b; count_flop_t c; count_flop_t r; count_flop_t x; count_flop_t y; count_flop_t z; count_flop_t l; }; void digital_callback(uint8_t fsm_state, uint8_t data); extern input_t input; constexpr int input_arr = 1; constexpr int input_das = 1; constexpr int input_debounce = 2; static constexpr inline int32_t input_flopped(count_flop_t& button) { if (button.count == input_debounce && button.flop == 0) { button.flop = 1; return 1; } else if (button.flop == 1 && button.das == input_das && button.repeat == 0) { button.repeat = 1; button.das = 0; return 2; } else if (button.repeat == 1 && (button.das == input_arr)) { button.das = 0; return 2; } else { return 0; } } struct event { static inline bool cursor_left() { return input_flopped(input.left ) >= 1; } static inline bool cursor_right() { return input_flopped(input.right) >= 1; } static inline bool cursor_up() { return input_flopped(input.up ) >= 1; } static inline bool cursor_down() { return input_flopped(input.down ) >= 1; } static inline bool button_a() { return input_flopped(input.a ) == 1; } };