]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Add Dip Switch as a core feature (#6140)
authorDrashna Jaelre <drashna@live.com>
Tue, 3 Sep 2019 15:34:31 +0000 (08:34 -0700)
committerGitHub <noreply@github.com>
Tue, 3 Sep 2019 15:34:31 +0000 (08:34 -0700)
* 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

20 files changed:
common_features.mk
docs/_summary.md
docs/feature_dip_switch.md [new file with mode: 0644]
docs/features.md
docs/zh-cn/_summary.md
keyboards/planck/keymaps/default/keymap.c
keyboards/planck/rev6/config.h
keyboards/planck/rev6/matrix.c [deleted file]
keyboards/planck/rev6/rev6.c
keyboards/planck/rev6/rules.mk
keyboards/preonic/keymaps/default/keymap.c
keyboards/preonic/rev3/config.h
keyboards/preonic/rev3/matrix.c [deleted file]
keyboards/preonic/rev3/rev3.c
keyboards/preonic/rev3/rules.mk
quantum/dip_switch.c [new file with mode: 0644]
quantum/dip_switch.h [new file with mode: 0644]
quantum/quantum.c
quantum/quantum.h
show_options.mk

index 3296424a11eb6d8eea6210b9983335a87a4ea5d2..3bc6f1c73bfe460e3f624aedd806cd65f90b8420 100644 (file)
@@ -358,3 +358,9 @@ ifeq ($(strip $(SPACE_CADET_ENABLE)), yes)
   SRC += $(QUANTUM_DIR)/process_keycode/process_space_cadet.c
   OPT_DEFS += -DSPACE_CADET_ENABLE
 endif
+
+
+ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
+  SRC += $(QUANTUM_DIR)/dip_switch.c
+  OPT_DEFS += -DDIP_SWITCH_ENABLE
+endif
index d7a49a96879f4ec073fdce7239a73658f01b9124..4e87d8f1f216e0fca0b352a57f52e18af6a07e5f 100644 (file)
@@ -63,6 +63,7 @@
   * [Combos](feature_combo.md)
   * [Command](feature_command.md)
   * [Debounce API](feature_debounce_type.md)
+  * [DIP Switch](feature_dip_switch.md)
   * [Dynamic Macros](feature_dynamic_macros.md)
   * [Encoders](feature_encoders.md)
   * [Grave Escape](feature_grave_esc.md)
diff --git a/docs/feature_dip_switch.md b/docs/feature_dip_switch.md
new file mode 100644 (file)
index 0000000..bce47fe
--- /dev/null
@@ -0,0 +1,90 @@
+# DIP Switches
+
+DIP switches are supported by adding this to your `rules.mk`:
+
+    DIP_SWITCH_ENABLE = yes
+
+and this to your `config.h`:
+
+```c
+#define DIP_SWITCH_PINS { B14, A15, A10, B9 }
+```
+
+## Callbacks
+
+The callback functions can be inserted into your `<keyboard>.c`:
+
+```c
+void dip_switch_update_kb(uint8_t index, bool active) { 
+    dip_switch_update_user(index, active); 
+}
+```
+
+
+or `keymap.c`:
+
+```c
+void dip_switch_update_user(uint8_t index, bool active) { 
+    switch (index) {
+        case 0:
+            if(active) { audio_on(); } else { audio_off(); }
+            break;
+        case 1:
+            if(active) { clicky_on(); } else { clicky_off(); }
+            break;
+        case 2:
+            if(active) { music_on(); } else { music_off(); }
+            break;
+        case 3:
+            if (active) {
+                #ifdef AUDIO_ENABLE
+                    PLAY_SONG(plover_song);
+                #endif
+                layer_on(_PLOVER);
+            } else {
+                #ifdef AUDIO_ENABLE
+                    PLAY_SONG(plover_gb_song);
+                #endif
+                layer_off(_PLOVER);
+            }
+            break;
+    }
+}
+```
+
+Additionally, we support bit mask functions which allow for more complex handling. 
+
+
+```c
+void dip_switch_update_mask_kb(uint32_t state) { 
+    dip_switch_update_mask_user(state); 
+}
+```
+
+
+or `keymap.c`:
+
+```c
+void dip_switch_update_mask_user(uint32_t state) { 
+    if (state & (1UL<<0) && state & (1UL<<1)) {
+        layer_on(_ADJUST); // C on esc
+    } else {
+        layer_off(_ADJUST);
+    }
+    if (state & (1UL<<0)) {
+        layer_on(_TEST_A); // A on ESC
+    } else {
+        layer_off(_TEST_A);
+    }
+    if (state & (1UL<<1)) {
+        layer_on(_TEST_B); // B on esc
+    } else {
+        layer_off(_TEST_B);
+    }
+}
+```
+
+
+## Hardware
+
+One side of the DIP switch should be wired directly to the pin on the MCU, and the other side to ground.  It should not matter which side is connected to which, as it should be functionally the same. 
index f230c7c233c58b7b91b29c02ba680f525278ec32..44299bf10dcbb9735e562783613fc1347cb31f2e 100644 (file)
@@ -12,6 +12,7 @@ QMK has a staggering number of features for building your keyboard. It can take
 * [Combos](feature_combo.md) - Custom actions for multiple key holds.
 * [Command](feature_command.md) - Runtime version of bootmagic (Formerly known as "Magic").
 * [Debounce API](feature_debounce_type.md) - Customization of debouncing algorithms, and the ability to add more/custom debouncing. 
+* [DIP Switch](feature_dip_switch.md) - Toggle switches for customizing board function.
 * [Dynamic Macros](feature_dynamic_macros.md) - Record and playback macros from the keyboard itself.
 * [Encoders](feature_encoders.md) - Rotary encoders! 
 * [Grave Escape](feature_grave_esc.md) - Lets you use a single key for Esc and Grave. 
index b0d9f1c068a984a4bc47bc94f2d8300a39101b58..98b1440d9f33c49e57e53c480de70e4de74a6637 100644 (file)
@@ -54,6 +54,7 @@
   * [热改键](feature_bootmagic.md)
   * [组合](feature_combo)
   * [命令](feature_command.md)
+  * [拨动开关](feature_dip_switch.md)
   * [动态宏指令](feature_dynamic_macros.md)
   * [编码器](feature_encoders.md)
   * [重音号Esc复合键](feature_grave_esc.md)
index 90197719878b77a8737d09a1f91dddca2597eab3..44bc7db7f24b76687a75fd846f896003ae444e8f 100644 (file)
@@ -289,7 +289,7 @@ void encoder_update(bool clockwise) {
   }
 }
 
-void dip_update(uint8_t index, bool active) {
+void dip_switch_update_user(uint8_t index, bool active) {
   switch (index) {
     case 0:
       if (active) {
index 3354c3f80f79c1254aa0b27ce40d7ea40aa0aa00..d8c9d86ae61ed9aa821293396d0e2ca493ab5079 100644 (file)
  *                  ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
  *
 */
-/* Note: These are not used for arm boards. They're here purely as documentation.
- * #define MATRIX_ROW_PINS { PB0, PB1, PB2, PA15, PA10 }
- * #define MATRIX_COL_PINS { PA2, PA3, PA6, PB14, PB15, PA8, PA9, PA7, PB3, PB4, PC14, PC15, PC13, PB5, PB6 }
- * #define UNUSED_PINS
- */
+/* Note: These are not used for arm boards. They're here purely as documentation. */
+#undef MATRIX_ROW_PINS
+#undef MATRIX_COL_PINS
+
+#define MATRIX_ROW_PINS { A10, A9, A8, B15, C13, C14, C15, A2 }
+#define MATRIX_COL_PINS { B11, B10, B2, B1, A7, B0 }
+
+#define UNUSED_PINS
 
 #define ENCODERS_PAD_A { B12 }
 #define ENCODERS_PAD_B { B13 }
 
+#define DIP_SWITCH_PINS { B14, A15, A0, B9 }
+
 #define MUSIC_MAP
 #undef AUDIO_VOICES
 #undef C6_AUDIO
diff --git a/keyboards/planck/rev6/matrix.c b/keyboards/planck/rev6/matrix.c
deleted file mode 100644 (file)
index 2df588c..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-#include <stdint.h>
-#include <stdbool.h>
-#include <string.h>
-#include "hal.h"
-#include "timer.h"
-#include "wait.h"
-#include "printf.h"
-#include "backlight.h"
-#include "matrix.h"
-#include "action.h"
-#include "keycode.h"
-#include <string.h>
-
-/*
- *     col: { B11, B10, B2, B1, A7, B0 }
- *     row: { A10, A9, A8, B15, C13, C14, C15, A2 }
- */
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-static matrix_row_t matrix_debouncing[MATRIX_COLS];
-static bool debouncing = false;
-static uint16_t debouncing_time = 0;
-
-static bool dip_switch[4] = {0, 0, 0, 0};
-
-__attribute__ ((weak))
-void matrix_init_user(void) {}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {}
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
-  matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
-  matrix_scan_user();
-}
-
-void matrix_init(void) {
-    printf("matrix init\n");
-    //debug_matrix = true;
-
-    // dip switch setup
-    palSetPadMode(GPIOB, 14, PAL_MODE_INPUT_PULLUP);
-    palSetPadMode(GPIOA, 15, PAL_MODE_INPUT_PULLUP);
-    palSetPadMode(GPIOA, 10, PAL_MODE_INPUT_PULLUP);
-    palSetPadMode(GPIOB, 9,  PAL_MODE_INPUT_PULLUP);
-
-    // actual matrix setup
-    palSetPadMode(GPIOB, 11, PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOB, 10, PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOB, 2,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOB, 1,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOA, 7,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOB, 0,  PAL_MODE_OUTPUT_PUSHPULL);
-
-    palSetPadMode(GPIOA, 10, PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOA, 9,  PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOA, 8,  PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOB, 15, PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOC, 13, PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOC, 14, PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOC, 15, PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOA, 2,  PAL_MODE_INPUT_PULLDOWN);
-
-
-    memset(matrix, 0, MATRIX_ROWS * sizeof(matrix_row_t));
-    memset(matrix_debouncing, 0, MATRIX_COLS * sizeof(matrix_row_t));
-
-
-    matrix_init_quantum();
-}
-
-__attribute__ ((weak))
-void dip_update(uint8_t index, bool active) { }
-
-bool last_dip_switch[4] = {0};
-
-uint8_t matrix_scan(void) {
-    // dip switch
-    dip_switch[0] = !palReadPad(GPIOB, 14);
-    dip_switch[1] = !palReadPad(GPIOA, 15);
-    dip_switch[2] = !palReadPad(GPIOA, 10);
-    dip_switch[3] = !palReadPad(GPIOB, 9);
-    for (uint8_t i = 0; i < 4; i++) {
-      if (last_dip_switch[i] ^ dip_switch[i])
-        dip_update(i, dip_switch[i]);
-    }
-    memcpy(last_dip_switch, dip_switch, sizeof(&dip_switch));
-
-    // actual matrix
-    for (int col = 0; col < MATRIX_COLS; col++) {
-        matrix_row_t data = 0;
-
-        // strobe col { B11, B10, B2, B1, A7, B0 }
-        switch (col) {
-            case 0: palSetPad(GPIOB, 11); break;
-            case 1: palSetPad(GPIOB, 10); break;
-            case 2: palSetPad(GPIOB, 2); break;
-            case 3: palSetPad(GPIOB, 1); break;
-            case 4: palSetPad(GPIOA, 7); break;
-            case 5: palSetPad(GPIOB, 0); break;
-        }
-
-        // need wait to settle pin state
-        wait_us(20);
-
-        // read row data { A10, A9, A8, B15, C13, C14, C15, A2 }
-        data = (
-            (palReadPad(GPIOA, 10) << 0 ) |
-            (palReadPad(GPIOA, 9)  << 1 ) |
-            (palReadPad(GPIOA, 8)  << 2 ) |
-            (palReadPad(GPIOB, 15) << 3 ) |
-            (palReadPad(GPIOC, 13) << 4 ) |
-            (palReadPad(GPIOC, 14) << 5 ) |
-            (palReadPad(GPIOC, 15) << 6 ) |
-            (palReadPad(GPIOA, 2)  << 7 )
-        );
-
-        // unstrobe  col { B11, B10, B2, B1, A7, B0 }
-        switch (col) {
-            case 0: palClearPad(GPIOB, 11); break;
-            case 1: palClearPad(GPIOB, 10); break;
-            case 2: palClearPad(GPIOB, 2); break;
-            case 3: palClearPad(GPIOB, 1); break;
-            case 4: palClearPad(GPIOA, 7); break;
-            case 5: palClearPad(GPIOB, 0); break;
-        }
-
-        if (matrix_debouncing[col] != data) {
-            matrix_debouncing[col] = data;
-            debouncing = true;
-            debouncing_time = timer_read();
-        }
-    }
-
-    if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) {
-        for (int row = 0; row < MATRIX_ROWS; row++) {
-            matrix[row] = 0;
-            for (int col = 0; col < MATRIX_COLS; col++) {
-                matrix[row] |= ((matrix_debouncing[col] & (1 << row) ? 1 : 0) << col);
-            }
-        }
-        debouncing = false;
-    }
-
-    matrix_scan_quantum();
-
-    return 1;
-}
-
-bool matrix_is_on(uint8_t row, uint8_t col) {
-    return (matrix[row] & (1<<col));
-}
-
-matrix_row_t matrix_get_row(uint8_t row) {
-    return matrix[row];
-}
-
-void matrix_print(void) {
-    printf("\nr/c 01234567\n");
-    for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
-        printf("%X0: ", row);
-        matrix_row_t data = matrix_get_row(row);
-        for (int col = 0; col < MATRIX_COLS; col++) {
-            if (data & (1<<col))
-                printf("1");
-            else
-                printf("0");
-        }
-        printf("\n");
-    }
-}
index 650e1a194d62e9a34d08767cf22727e20ab6df2e..8f4d168bf454d25b38bbc4b3ead413f7ef9c54ab 100644 (file)
@@ -22,3 +22,13 @@ void matrix_init_kb(void) {
 void matrix_scan_kb(void) {
        matrix_scan_user();
 }
+
+#ifdef DIP_SWITCH_ENABLE
+__attribute__((weak))
+void dip_update(uint8_t index, bool active) {}
+
+__attribute__((weak))
+void dip_switch_update_user(uint8_t index, bool active) {
+    dip_update(index, active);
+}
+#endif
index c582750025ca28dc9d47308606b5c9298c9c48c5..ea53c8f910958c822e1a564a29c947898a51c3f3 100644 (file)
@@ -1,5 +1,4 @@
 # project specific files
-SRC =  matrix.c
 LAYOUTS += ortho_4x12
 
 # Cortex version
@@ -31,9 +30,9 @@ API_SYSEX_ENABLE = no
 SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 #SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
 
-CUSTOM_MATRIX = yes # Custom matrix file
 # SERIAL_LINK_ENABLE = yes
 ENCODER_ENABLE = yes
+DIP_SWITCH_ENABLE = yes 
 
 LAYOUTS = ortho_4x12 planck_mit
 LAYOUTS_HAS_RGB = no
index d37882eabc6e6c5bb75373c91a44b8f52dfa0507..b45ed0835d959f143a32491e83c19907b18cb04e 100644 (file)
@@ -259,7 +259,7 @@ void encoder_update_user(uint8_t index, bool clockwise) {
   }
 }
 
-void dip_update(uint8_t index, bool active) {
+void dip_switch_update_user(uint8_t index, bool active) {
   switch (index) {
     case 0:
       if (active) {
index 2d299345535820d15b7044125e396078a041fef8..5eac2169e66056e12739fa250891548f09b92161 100644 (file)
 #define MATRIX_ROWS 10
 #define MATRIX_COLS 6
 
-/*
- * Keyboard Matrix Assignments
- *
- * Change this to how you wired your keyboard
- * COLS: AVR pins used for columns, left to right
- * ROWS: AVR pins used for rows, top to bottom
- * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
- *                  ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
- *
-*/
-/* Note: These are not used for arm boards. They're here purely as documentation.
- * #define MATRIX_ROW_PINS { PB0, PB1, PB2, PA15, PA10 }
- * #define MATRIX_COL_PINS { PA2, PA3, PA6, PB14, PB15, PA8, PA9, PA7, PB3, PB4, PC14, PC15, PC13, PB5, PB6 }
- * #define UNUSED_PINS
- */
+#undef MATRIX_ROW_PINS
+#undef MATRIX_COL_PINS
+#define MATRIX_ROW_PINS { A10, A9, A8, B15, C13, C14, C15, A2, A3, A6 }
+#define MATRIX_COL_PINS { B11, B10, B2, B1, A7, B0 }
+#define UNUSED_PINS
 
 #define ENCODERS_PAD_A { B12 }
 #define ENCODERS_PAD_B { B13 }
 
+#define DIP_SWITCH_PINS { B14, A15, A0, B9 }
+
 #define MUSIC_MAP
 #undef AUDIO_VOICES
 #undef C6_AUDIO
diff --git a/keyboards/preonic/rev3/matrix.c b/keyboards/preonic/rev3/matrix.c
deleted file mode 100644 (file)
index db7a4f2..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-#include <stdint.h>
-#include <stdbool.h>
-#include <string.h>
-#include "hal.h"
-#include "timer.h"
-#include "wait.h"
-#include "printf.h"
-#include "backlight.h"
-#include "matrix.h"
-#include "action.h"
-#include "keycode.h"
-#include <string.h>
-
-/*
- *     col: { B11, B10, B2, B1, A7, B0 }
- *     row: { A10, A9, A8, B15, C13, C14, C15, A2 }
- */
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-static matrix_col_t matrix_debouncing[MATRIX_COLS];
-static bool debouncing = false;
-static uint16_t debouncing_time = 0;
-
-static bool dip_switch[4] = {0, 0, 0, 0};
-
-__attribute__ ((weak))
-void matrix_init_user(void) {}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {}
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
-  matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
-  matrix_scan_user();
-}
-
-void matrix_init(void) {
-    printf("matrix init\n");
-    //debug_matrix = true;
-
-    // dip switch setup
-    palSetPadMode(GPIOB, 14, PAL_MODE_INPUT_PULLUP);
-    palSetPadMode(GPIOA, 15, PAL_MODE_INPUT_PULLUP);
-    palSetPadMode(GPIOA, 10, PAL_MODE_INPUT_PULLUP);
-    palSetPadMode(GPIOB, 9,  PAL_MODE_INPUT_PULLUP);
-
-    // actual matrix setup
-    palSetPadMode(GPIOB, 11, PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOB, 10, PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOB, 2,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOB, 1,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOA, 7,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOB, 0,  PAL_MODE_OUTPUT_PUSHPULL);
-
-    palSetPadMode(GPIOA, 10, PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOA, 9,  PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOA, 8,  PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOB, 15, PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOC, 13, PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOC, 14, PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOC, 15, PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOA, 2,  PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOA, 3,  PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOA, 6,  PAL_MODE_INPUT_PULLDOWN);
-
-
-    memset(matrix, 0, MATRIX_ROWS * sizeof(matrix_row_t));
-    memset(matrix_debouncing, 0, MATRIX_COLS * sizeof(matrix_col_t));
-
-
-    matrix_init_quantum();
-}
-
-__attribute__ ((weak))
-void dip_update(uint8_t index, bool active) { }
-
-__attribute__ ((weak))
-void encoder_update(bool clockwise) { }
-
-bool last_dip_switch[4] = {0};
-
-#ifndef ENCODER_RESOLUTION
-  #define ENCODER_RESOLUTION 4
-#endif
-
-uint8_t matrix_scan(void) {
-    // dip switch
-    dip_switch[0] = !palReadPad(GPIOB, 14);
-    dip_switch[1] = !palReadPad(GPIOA, 15);
-    dip_switch[2] = !palReadPad(GPIOA, 10);
-    dip_switch[3] = !palReadPad(GPIOB, 9);
-    for (uint8_t i = 0; i < 4; i++) {
-      if (last_dip_switch[i] ^ dip_switch[i])
-        dip_update(i, dip_switch[i]);
-    }
-    memcpy(last_dip_switch, dip_switch, sizeof(&dip_switch));
-
-    // actual matrix
-    for (int col = 0; col < MATRIX_COLS; col++) {
-        matrix_col_t data = 0;
-
-        // strobe col { B11, B10, B2, B1, A7, B0 }
-        switch (col) {
-            case 0: palSetPad(GPIOB, 11); break;
-            case 1: palSetPad(GPIOB, 10); break;
-            case 2: palSetPad(GPIOB, 2); break;
-            case 3: palSetPad(GPIOB, 1); break;
-            case 4: palSetPad(GPIOA, 7); break;
-            case 5: palSetPad(GPIOB, 0); break;
-        }
-
-        // need wait to settle pin state
-        wait_us(20);
-
-        // read row data { A10, A9, A8, B15, C13, C14, C15, A2 }
-        data = (
-            (palReadPad(GPIOA, 10) << 0 ) |
-            (palReadPad(GPIOA, 9)  << 1 ) |
-            (palReadPad(GPIOA, 8)  << 2 ) |
-            (palReadPad(GPIOB, 15) << 3 ) |
-            (palReadPad(GPIOC, 13) << 4 ) |
-            (palReadPad(GPIOC, 14) << 5 ) |
-            (palReadPad(GPIOC, 15) << 6 ) |
-            (palReadPad(GPIOA, 2)  << 7 ) |
-            (palReadPad(GPIOA, 3)  << 8 ) |
-            (palReadPad(GPIOA, 6)  << 9 )
-        );
-
-        // unstrobe  col { B11, B10, B2, B1, A7, B0 }
-        switch (col) {
-            case 0: palClearPad(GPIOB, 11); break;
-            case 1: palClearPad(GPIOB, 10); break;
-            case 2: palClearPad(GPIOB, 2); break;
-            case 3: palClearPad(GPIOB, 1); break;
-            case 4: palClearPad(GPIOA, 7); break;
-            case 5: palClearPad(GPIOB, 0); break;
-        }
-
-        if (matrix_debouncing[col] != data) {
-            matrix_debouncing[col] = data;
-            debouncing = true;
-            debouncing_time = timer_read();
-        }
-    }
-
-    if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) {
-        for (int row = 0; row < MATRIX_ROWS; row++) {
-            matrix[row] = 0;
-            for (int col = 0; col < MATRIX_COLS; col++) {
-                matrix[row] |= ((matrix_debouncing[col] & (1 << row) ? 1 : 0) << col);
-            }
-        }
-        debouncing = false;
-    }
-
-    matrix_scan_quantum();
-
-    return 1;
-}
-
-bool matrix_is_on(uint8_t row, uint8_t col) {
-    return (matrix[row] & (1<<col));
-}
-
-matrix_row_t matrix_get_row(uint8_t row) {
-    return matrix[row];
-}
-
-void matrix_print(void) {
-    printf("\nr/c 01234567\n");
-    for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
-        printf("%X0: ", row);
-        matrix_row_t data = matrix_get_row(row);
-        for (int col = 0; col < MATRIX_COLS; col++) {
-            if (data & (1<<col))
-                printf("1");
-            else
-                printf("0");
-        }
-        printf("\n");
-    }
-}
index b61beec5d36e721181e4abe38655cd2a017a5497..dc4ff66fc0766f378cf5b77e12843c928a500d05 100644 (file)
@@ -22,3 +22,13 @@ void matrix_init_kb(void) {
 void matrix_scan_kb(void) {
        matrix_scan_user();
 }
+
+#ifdef DIP_SWITCH_ENABLE
+ __attribute__((weak))
+void dip_update(uint8_t index, bool active) {}
+
+ __attribute__((weak))
+void dip_switch_update_user(uint8_t index, bool active) {
+    dip_update(index, active);
+}
+#endif
index 39e69872c9aa5295d1257ca47f6bd4f483e37e55..4aaa775e7516abbf7488c5f9f7e67c3a22b4590b 100644 (file)
@@ -1,11 +1,8 @@
-# project specific files
-SRC = matrix.c
-
 # Cortex version
 MCU  = STM32F303
 
 # Build Options
-#   change to "no" to disable the options, or define them in the Makefile in 
+#   change to "no" to disable the options, or define them in the Makefile in
 #   the appropriate keymap folder that will get included automatically
 #
 BOOTMAGIC_ENABLE = yes      # Virtual DIP switch configuration(+1000)
@@ -27,8 +24,8 @@ API_SYSEX_ENABLE = no
 SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 #SLEEP_LED_ENABLE = yes
 
-CUSTOM_MATRIX = yes # Custom matrix file
 # SERIAL_LINK_ENABLE = yes
 ENCODER_ENABLE = yes
+DIP_SWITCH_ENABLE = yes
 
 LAYOUTS = ortho_5x12
diff --git a/quantum/dip_switch.c b/quantum/dip_switch.c
new file mode 100644 (file)
index 0000000..3b5a8da
--- /dev/null
@@ -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 (file)
index 0000000..61ef1cc
--- /dev/null
@@ -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);
index 61e9003b720dd31399adbd147da29a3db9357dc2..85a03377f3cce5e3a5a7cfff9f9197ee809ecd94 100644 (file)
@@ -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))
index 066113590ef60a93aa1cd447339232a4087f804d..f5ac97379d33fba51b9133e4e8333b4ea04737e2 100644 (file)
@@ -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;
index 02e062a8d94aca53b10aa906110c042992588b99..63ab3b0d7b19821a72f347ff1eaecda0b75f7a64 100644 (file)
@@ -31,7 +31,8 @@ HARDWARE_OPTION_NAMES = \
   LED_BREATHING_TABLE \
   LED_TABLES \
   POINTING_DEVICE_ENABLE \
-  VISUALIZER_ENABLE
+  VISUALIZER_ENABLE \
+  DIP_SWITCH_ENABLE
 
 OTHER_OPTION_NAMES = \
   UNICODE_ENABLE \