diff options
author | Drashna Jaelre <drashna@live.com> | 2019-09-03 08:34:31 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-03 08:34:31 -0700 |
commit | dab4967f1bebc9a70374ed3e1fe7906828b280c2 (patch) | |
tree | 3008882538fe229273fe9b8d5be662a951460f33 /quantum | |
parent | 9f46606dff2f52f31c6c36a63035cfb75824276a (diff) |
Add Dip Switch as a core feature (#6140)
* Add Dip Switches as a core feature
* Add documentation for Dip Switch feature
* Update Preonic Rev3 to use new feature and remove custom matrix
* Apply suggestions from code review
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Remove custom matrix line completely
Rather than just disabling it
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* DIP changes
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Use better check for DIP Switch configuration
* Add to show features
* Add bitmask callback for dip switch
* Fix OLKB Boards dip switch config
* Update docs to include bitmask example
* Fix comments/documentation
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Fix issues with docs and use example from @tuzonghua
* Fix wording
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Fix example to use proper formatting
Bad, BAAAAAAD drashna!!!
* Handle dip switch initialization better
Diffstat (limited to 'quantum')
-rw-r--r-- | quantum/dip_switch.c | 71 | ||||
-rw-r--r-- | quantum/dip_switch.h | 29 | ||||
-rw-r--r-- | quantum/quantum.c | 8 | ||||
-rw-r--r-- | quantum/quantum.h | 5 |
4 files changed, 113 insertions, 0 deletions
diff --git a/quantum/dip_switch.c b/quantum/dip_switch.c new file mode 100644 index 0000000000..3b5a8dadc9 --- /dev/null +++ b/quantum/dip_switch.c @@ -0,0 +1,71 @@ +/* + * Copyright 2018 Jack Humbert <jack.humb@gmail.com> + * Copyright 2019 Drashna Jaelre (Christopher Courtney) <drashna@live.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "dip_switch.h" + +// for memcpy +#include <string.h> + + +#if !defined(DIP_SWITCH_PINS) +# error "No DIP switch pads defined by DIP_SWITCH_PINS" +#endif + +#define NUMBER_OF_DIP_SWITCHES (sizeof(dip_switch_pad)/sizeof(pin_t)) +static pin_t dip_switch_pad[] = DIP_SWITCH_PINS; +static bool dip_switch_state[NUMBER_OF_DIP_SWITCHES] = { 0 }; +static bool last_dip_switch_state[NUMBER_OF_DIP_SWITCHES] = { 0 }; + + +__attribute__((weak)) +void dip_switch_update_user(uint8_t index, bool active) {} + +__attribute__((weak)) +void dip_switch_update_kb(uint8_t index, bool active) { dip_switch_update_user(index, active); } + +__attribute__((weak)) +void dip_switch_update_mask_user(uint32_t state) {} + +__attribute__((weak)) +void dip_switch_update_mask_kb(uint32_t state) { dip_switch_update_mask_user(state); } + +void dip_switch_init(void) { + for (uint8_t i = 0; i < NUMBER_OF_DIP_SWITCHES; i++) { + setPinInputHigh(dip_switch_pad[i]); + } + dip_switch_read(true); +} + + +void dip_switch_read(bool forced) { + bool has_dip_state_changed = false; + uint32_t dip_switch_mask = 0; + + for (uint8_t i = 0; i < NUMBER_OF_DIP_SWITCHES; i++) { + dip_switch_state[i] = !readPin(dip_switch_pad[i]); + dip_switch_mask |= dip_switch_state[i] << i; + if (last_dip_switch_state[i] ^ dip_switch_state[i] || forced) { + has_dip_state_changed = true; + dip_switch_update_kb(i, dip_switch_state[i]); + } + } + if (has_dip_state_changed) { + dip_switch_update_mask_kb(dip_switch_mask); + } + memcpy(last_dip_switch_state, dip_switch_state, sizeof(&dip_switch_state)); +} diff --git a/quantum/dip_switch.h b/quantum/dip_switch.h new file mode 100644 index 0000000000..61ef1cc19d --- /dev/null +++ b/quantum/dip_switch.h @@ -0,0 +1,29 @@ +/* + * Copyright 2018 Jack Humbert <jack.humb@gmail.com> + * Copyright 2018 Drashna Jaelre (Christopher Courtney) <drashna@live.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#include "quantum.h" + +void dip_switch_update_kb(uint8_t index, bool active); +void dip_switch_update_user(uint8_t index, bool active); +void dip_switch_update_mask_user(uint32_t state); +void dip_switch_update_mask_kb(uint32_t state); + +void dip_switch_init(void); +void dip_switch_read(bool forced); diff --git a/quantum/quantum.c b/quantum/quantum.c index 61e9003b72..85a03377f3 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -967,6 +967,10 @@ void matrix_init_quantum() { #ifdef OUTPUT_AUTO_ENABLE set_output(OUTPUT_AUTO); #endif +#ifdef DIP_SWITCH_ENABLE + dip_switch_init(); +#endif + matrix_init_kb(); } @@ -1003,6 +1007,10 @@ void matrix_scan_quantum() { haptic_task(); #endif +#ifdef DIP_SWITCH_ENABLE + dip_switch_read(false); +#endif + matrix_scan_kb(); } #if defined(BACKLIGHT_ENABLE) && (defined(BACKLIGHT_PIN) || defined(BACKLIGHT_PINS)) diff --git a/quantum/quantum.h b/quantum/quantum.h index 066113590e..f5ac97379d 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -145,6 +145,11 @@ extern layer_state_t layer_state; # include "oled_driver.h" #endif +#ifdef DIP_SWITCH_ENABLE + #include "dip_switch.h" +#endif + + // Function substitutions to ease GPIO manipulation #if defined(__AVR__) typedef uint8_t pin_t; |