diff options
Diffstat (limited to 'quantum/dip_switch.c')
| -rw-r--r-- | quantum/dip_switch.c | 57 | 
1 files changed, 40 insertions, 17 deletions
| diff --git a/quantum/dip_switch.c b/quantum/dip_switch.c index 6e254578d1..e901f3e0c4 100644 --- a/quantum/dip_switch.c +++ b/quantum/dip_switch.c @@ -19,8 +19,6 @@  #include <string.h> // for memcpy  #include "dip_switch.h" -#include "gpio.h" -#include "util.h"  #ifdef SPLIT_KEYBOARD  #    include "split_common/split_util.h" @@ -35,24 +33,17 @@  #endif  #ifdef DIP_SWITCH_PINS -#    define NUMBER_OF_DIP_SWITCHES (ARRAY_SIZE(dip_switch_pad))  static pin_t dip_switch_pad[] = DIP_SWITCH_PINS;  #endif  #ifdef DIP_SWITCH_MATRIX_GRID -typedef struct matrix_index_t { -    uint8_t row; -    uint8_t col; -} matrix_index_t; - -#    define NUMBER_OF_DIP_SWITCHES (ARRAY_SIZE(dip_switch_pad)) -static matrix_index_t dip_switch_pad[] = DIP_SWITCH_MATRIX_GRID; -extern bool           peek_matrix(uint8_t row_index, uint8_t col_index, bool read_raw); -static uint16_t       scan_count; +static matrix_intersection_t dip_switch_pad[] = DIP_SWITCH_MATRIX_GRID; +extern bool                  peek_matrix(uint8_t row_index, uint8_t col_index, bool read_raw); +static uint16_t              scan_count;  #endif /* DIP_SWITCH_MATRIX_GRID */ -static bool dip_switch_state[NUMBER_OF_DIP_SWITCHES]      = {0}; -static bool last_dip_switch_state[NUMBER_OF_DIP_SWITCHES] = {0}; +static bool dip_switch_state[NUM_DIP_SWITCHES]      = {0}; +static bool last_dip_switch_state[NUM_DIP_SWITCHES] = {0};  __attribute__((weak)) bool dip_switch_update_user(uint8_t index, bool active) {      return true; @@ -70,17 +61,39 @@ __attribute__((weak)) bool dip_switch_update_mask_kb(uint32_t state) {      return dip_switch_update_mask_user(state);  } +#ifdef DIP_SWITCH_MAP_ENABLE +#    include "keymap_introspection.h" +#    include "action.h" + +#    ifndef DIP_SWITCH_MAP_KEY_DELAY +#        define DIP_SWITCH_MAP_KEY_DELAY TAP_CODE_DELAY +#    endif + +static void dip_switch_exec_mapping(uint8_t index, bool on) { +    // The delays below cater for Windows and its wonderful requirements. +    action_exec(on ? MAKE_DIPSWITCH_ON_EVENT(index, true) : MAKE_DIPSWITCH_OFF_EVENT(index, true)); +#    if DIP_SWITCH_MAP_KEY_DELAY > 0 +    wait_ms(DIP_SWITCH_MAP_KEY_DELAY); +#    endif // DIP_SWITCH_MAP_KEY_DELAY > 0 + +    action_exec(on ? MAKE_DIPSWITCH_ON_EVENT(index, false) : MAKE_DIPSWITCH_OFF_EVENT(index, false)); +#    if DIP_SWITCH_MAP_KEY_DELAY > 0 +    wait_ms(DIP_SWITCH_MAP_KEY_DELAY); +#    endif // DIP_SWITCH_MAP_KEY_DELAY > 0 +} +#endif // DIP_SWITCH_MAP_ENABLE +  void dip_switch_init(void) {  #ifdef DIP_SWITCH_PINS  #    if defined(SPLIT_KEYBOARD) && defined(DIP_SWITCH_PINS_RIGHT)      if (!isLeftHand) {          const pin_t dip_switch_pad_right[] = DIP_SWITCH_PINS_RIGHT; -        for (uint8_t i = 0; i < NUMBER_OF_DIP_SWITCHES; i++) { +        for (uint8_t i = 0; i < NUM_DIP_SWITCHES; i++) {              dip_switch_pad[i] = dip_switch_pad_right[i];          }      }  #    endif -    for (uint8_t i = 0; i < NUMBER_OF_DIP_SWITCHES; i++) { +    for (uint8_t i = 0; i < NUM_DIP_SWITCHES; i++) {          setPinInputHigh(dip_switch_pad[i]);      }      dip_switch_read(true); @@ -108,7 +121,7 @@ void dip_switch_read(bool forced) {      }  #endif -    for (uint8_t i = 0; i < NUMBER_OF_DIP_SWITCHES; i++) { +    for (uint8_t i = 0; i < NUM_DIP_SWITCHES; i++) {  #ifdef DIP_SWITCH_PINS          dip_switch_state[i] = !readPin(dip_switch_pad[i]);  #endif @@ -118,11 +131,21 @@ void dip_switch_read(bool forced) {          dip_switch_mask |= dip_switch_state[i] << i;          if (last_dip_switch_state[i] != dip_switch_state[i] || forced) {              has_dip_state_changed = true; +#ifndef DIP_SWITCH_MAP_ENABLE              dip_switch_update_kb(i, dip_switch_state[i]); +#else +            dip_switch_exec_mapping(i, dip_switch_state[i]); +#endif          }      }      if (has_dip_state_changed) { +#ifndef DIP_SWITCH_MAP_ENABLE          dip_switch_update_mask_kb(dip_switch_mask); +#endif          memcpy(last_dip_switch_state, dip_switch_state, sizeof(dip_switch_state));      }  } + +void dip_switch_task(void) { +    dip_switch_read(false); +} | 
