diff options
Diffstat (limited to 'quantum')
-rw-r--r-- | quantum/color.h | 54 | ||||
-rw-r--r-- | quantum/command.c | 2 | ||||
-rw-r--r-- | quantum/crc.c | 59 | ||||
-rw-r--r-- | quantum/crc.h (renamed from quantum/rgb.h) | 45 | ||||
-rw-r--r-- | quantum/debounce.h | 2 | ||||
-rw-r--r-- | quantum/debounce/asym_eager_defer_pk.c | 171 | ||||
-rw-r--r-- | quantum/debounce/none.c | 31 | ||||
-rw-r--r-- | quantum/debounce/sym_defer_g.c | 26 | ||||
-rw-r--r-- | quantum/debounce/sym_defer_pk.c | 67 | ||||
-rw-r--r-- | quantum/debounce/sym_eager_pk.c | 72 | ||||
-rw-r--r-- | quantum/debounce/sym_eager_pr.c | 76 | ||||
-rw-r--r-- | quantum/debounce/tests/asym_eager_defer_pk_tests.cpp | 374 | ||||
-rw-r--r-- | quantum/debounce/tests/debounce_test_common.cpp | 229 | ||||
-rw-r--r-- | quantum/debounce/tests/debounce_test_common.h | 83 | ||||
-rw-r--r-- | quantum/debounce/tests/rules.mk | 44 | ||||
-rw-r--r-- | quantum/debounce/tests/sym_defer_g_tests.cpp | 223 | ||||
-rw-r--r-- | quantum/debounce/tests/sym_defer_pk_tests.cpp | 225 | ||||
-rw-r--r-- | quantum/debounce/tests/sym_eager_pk_tests.cpp | 237 | ||||
-rw-r--r-- | quantum/debounce/tests/sym_eager_pr_tests.cpp | 280 | ||||
-rw-r--r-- | quantum/debounce/tests/testlist.mk | 6 | ||||
-rw-r--r-- | quantum/dip_switch.c | 8 | ||||
-rw-r--r-- | quantum/dip_switch.h | 8 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_belgian.h | 13 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_bepo.h | 167 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_br_abnt2.h | 20 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_canadian_multilingual.h | 179 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_colemak.h | 32 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_fr_ch.h | 79 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_french.h | 11 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_french_osx.h | 12 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_german.h | 13 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_german_ch.h | 18 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_german_osx.h | 80 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_hungarian.h | 19 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_italian.h | 19 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_italian_osx_ansi.h | 18 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_italian_osx_iso.h | 18 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_jp.h | 9 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_neo2.h | 52 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_norwegian.h | 23 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_slovenian.h | 8 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_spanish.h | 9 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_swedish.h | 23 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_uk.h | 75 | ||||
-rw-r--r-- | quantum/keymap_extras/keymap_workman.h | 29 | ||||
-rw-r--r-- | quantum/led_matrix/animations/alpha_mods_anim.h (renamed from quantum/led_matrix_animations/alpha_mods_anim.h) | 2 | ||||
-rw-r--r-- | quantum/led_matrix/animations/band_anim.h (renamed from quantum/led_matrix_animations/band_anim.h) | 2 | ||||
-rw-r--r-- | quantum/led_matrix/animations/band_pinwheel_anim.h (renamed from quantum/led_matrix_animations/band_pinwheel_anim.h) | 2 | ||||
-rw-r--r-- | quantum/led_matrix/animations/band_spiral_anim.h (renamed from quantum/led_matrix_animations/band_spiral_anim.h) | 2 | ||||
-rw-r--r-- | quantum/led_matrix/animations/breathing_anim.h (renamed from quantum/led_matrix_animations/breathing_anim.h) | 2 | ||||
-rw-r--r-- | quantum/led_matrix/animations/cycle_left_right_anim.h (renamed from quantum/led_matrix_animations/cycle_left_right_anim.h) | 2 | ||||
-rw-r--r-- | quantum/led_matrix/animations/cycle_out_in_anim.h (renamed from quantum/led_matrix_animations/cycle_out_in_anim.h) | 2 | ||||
-rw-r--r-- | quantum/led_matrix/animations/cycle_up_down_anim.h (renamed from quantum/led_matrix_animations/cycle_up_down_anim.h) | 2 | ||||
-rw-r--r-- | quantum/led_matrix/animations/dual_beacon_anim.h (renamed from quantum/led_matrix_animations/dual_beacon_anim.h) | 2 | ||||
-rw-r--r-- | quantum/led_matrix/animations/led_matrix_effects.inc | 18 | ||||
-rw-r--r-- | quantum/led_matrix/animations/runners/effect_runner_dx_dy.h (renamed from quantum/led_matrix_runners/effect_runner_dx_dy.h) | 0 | ||||
-rw-r--r-- | quantum/led_matrix/animations/runners/effect_runner_dx_dy_dist.h (renamed from quantum/led_matrix_runners/effect_runner_dx_dy_dist.h) | 0 | ||||
-rw-r--r-- | quantum/led_matrix/animations/runners/effect_runner_i.h (renamed from quantum/led_matrix_runners/effect_runner_i.h) | 0 | ||||
-rw-r--r-- | quantum/led_matrix/animations/runners/effect_runner_reactive.h (renamed from quantum/led_matrix_runners/effect_runner_reactive.h) | 0 | ||||
-rw-r--r-- | quantum/led_matrix/animations/runners/effect_runner_reactive_splash.h (renamed from quantum/led_matrix_runners/effect_runner_reactive_splash.h) | 0 | ||||
-rw-r--r-- | quantum/led_matrix/animations/runners/effect_runner_sin_cos_i.h (renamed from quantum/led_matrix_runners/effect_runner_sin_cos_i.h) | 0 | ||||
-rw-r--r-- | quantum/led_matrix/animations/runners/led_matrix_runners.inc | 6 | ||||
-rw-r--r-- | quantum/led_matrix/animations/solid_anim.h (renamed from quantum/led_matrix_animations/solid_anim.h) | 0 | ||||
-rw-r--r-- | quantum/led_matrix/animations/solid_reactive_cross.h (renamed from quantum/led_matrix_animations/solid_reactive_cross.h) | 4 | ||||
-rw-r--r-- | quantum/led_matrix/animations/solid_reactive_nexus.h (renamed from quantum/led_matrix_animations/solid_reactive_nexus.h) | 4 | ||||
-rw-r--r-- | quantum/led_matrix/animations/solid_reactive_simple_anim.h (renamed from quantum/led_matrix_animations/solid_reactive_simple_anim.h) | 4 | ||||
-rw-r--r-- | quantum/led_matrix/animations/solid_reactive_wide.h (renamed from quantum/led_matrix_animations/solid_reactive_wide.h) | 4 | ||||
-rw-r--r-- | quantum/led_matrix/animations/solid_splash_anim.h (renamed from quantum/led_matrix_animations/solid_splash_anim.h) | 4 | ||||
-rw-r--r-- | quantum/led_matrix/animations/wave_left_right_anim.h (renamed from quantum/led_matrix_animations/wave_left_right_anim.h) | 2 | ||||
-rw-r--r-- | quantum/led_matrix/animations/wave_up_down_anim.h (renamed from quantum/led_matrix_animations/wave_up_down_anim.h) | 2 | ||||
-rw-r--r-- | quantum/led_matrix/led_matrix.c (renamed from quantum/led_matrix.c) | 46 | ||||
-rw-r--r-- | quantum/led_matrix/led_matrix.h (renamed from quantum/led_matrix.h) | 2 | ||||
-rw-r--r-- | quantum/led_matrix/led_matrix_drivers.c (renamed from quantum/led_matrix_drivers.c) | 0 | ||||
-rw-r--r-- | quantum/led_matrix/led_matrix_types.h (renamed from quantum/led_matrix_types.h) | 0 | ||||
-rw-r--r-- | quantum/led_matrix_animations/led_matrix_effects.inc | 18 | ||||
-rw-r--r-- | quantum/matrix.c | 274 | ||||
-rw-r--r-- | quantum/mcu_selection.mk | 72 | ||||
-rw-r--r-- | quantum/mousekey.c | 2 | ||||
-rw-r--r-- | quantum/mousekey.h | 11 | ||||
-rw-r--r-- | quantum/process_keycode/process_rgb.c | 1 | ||||
-rw-r--r-- | quantum/quantum.c | 8 | ||||
-rw-r--r-- | quantum/quantum.h | 4 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/alpha_mods_anim.h (renamed from quantum/rgb_matrix_animations/alpha_mods_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/breathing_anim.h (renamed from quantum/rgb_matrix_animations/breathing_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/colorband_pinwheel_sat_anim.h (renamed from quantum/rgb_matrix_animations/colorband_pinwheel_sat_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/colorband_pinwheel_val_anim.h (renamed from quantum/rgb_matrix_animations/colorband_pinwheel_val_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/colorband_sat_anim.h (renamed from quantum/rgb_matrix_animations/colorband_sat_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/colorband_spiral_sat_anim.h (renamed from quantum/rgb_matrix_animations/colorband_spiral_sat_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/colorband_spiral_val_anim.h (renamed from quantum/rgb_matrix_animations/colorband_spiral_val_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/colorband_val_anim.h (renamed from quantum/rgb_matrix_animations/colorband_val_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/cycle_all_anim.h (renamed from quantum/rgb_matrix_animations/cycle_all_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/cycle_left_right_anim.h (renamed from quantum/rgb_matrix_animations/cycle_left_right_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/cycle_out_in_anim.h (renamed from quantum/rgb_matrix_animations/cycle_out_in_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/cycle_out_in_dual_anim.h (renamed from quantum/rgb_matrix_animations/cycle_out_in_dual_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/cycle_pinwheel_anim.h (renamed from quantum/rgb_matrix_animations/cycle_pinwheel_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/cycle_spiral_anim.h (renamed from quantum/rgb_matrix_animations/cycle_spiral_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/cycle_up_down_anim.h (renamed from quantum/rgb_matrix_animations/cycle_up_down_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/digital_rain_anim.h (renamed from quantum/rgb_matrix_animations/digital_rain_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/dual_beacon_anim.h (renamed from quantum/rgb_matrix_animations/dual_beacon_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/gradient_left_right_anim.h (renamed from quantum/rgb_matrix_animations/gradient_left_right_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/gradient_up_down_anim.h (renamed from quantum/rgb_matrix_animations/gradient_up_down_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/hue_breathing_anim.h (renamed from quantum/rgb_matrix_animations/hue_breathing_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/hue_pendulum_anim.h (renamed from quantum/rgb_matrix_animations/hue_pendulum_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/hue_wave_anim.h (renamed from quantum/rgb_matrix_animations/hue_wave_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/jellybean_raindrops_anim.h (renamed from quantum/rgb_matrix_animations/jellybean_raindrops_anim.h) | 2 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/rainbow_beacon_anim.h (renamed from quantum/rgb_matrix_animations/rainbow_beacon_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/rainbow_moving_chevron_anim.h (renamed from quantum/rgb_matrix_animations/rainbow_moving_chevron_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/rainbow_pinwheels_anim.h (renamed from quantum/rgb_matrix_animations/rainbow_pinwheels_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/raindrops_anim.h (renamed from quantum/rgb_matrix_animations/raindrops_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/rgb_matrix_effects.inc | 37 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/runners/effect_runner_dx_dy.h (renamed from quantum/rgb_matrix_runners/effect_runner_dx_dy.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/runners/effect_runner_dx_dy_dist.h (renamed from quantum/rgb_matrix_runners/effect_runner_dx_dy_dist.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/runners/effect_runner_i.h (renamed from quantum/rgb_matrix_runners/effect_runner_i.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/runners/effect_runner_reactive.h (renamed from quantum/rgb_matrix_runners/effect_runner_reactive.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/runners/effect_runner_reactive_splash.h (renamed from quantum/rgb_matrix_runners/effect_runner_reactive_splash.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/runners/effect_runner_sin_cos_i.h (renamed from quantum/rgb_matrix_runners/effect_runner_sin_cos_i.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/runners/rgb_matrix_runners.inc | 6 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/solid_color_anim.h (renamed from quantum/rgb_matrix_animations/solid_color_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/solid_reactive_anim.h (renamed from quantum/rgb_matrix_animations/solid_reactive_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/solid_reactive_cross.h (renamed from quantum/rgb_matrix_animations/solid_reactive_cross.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/solid_reactive_nexus.h (renamed from quantum/rgb_matrix_animations/solid_reactive_nexus.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/solid_reactive_simple_anim.h (renamed from quantum/rgb_matrix_animations/solid_reactive_simple_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/solid_reactive_wide.h (renamed from quantum/rgb_matrix_animations/solid_reactive_wide.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/solid_splash_anim.h (renamed from quantum/rgb_matrix_animations/solid_splash_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/splash_anim.h (renamed from quantum/rgb_matrix_animations/splash_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/animations/typing_heatmap_anim.h (renamed from quantum/rgb_matrix_animations/typing_heatmap_anim.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix/rgb_matrix.c (renamed from quantum/rgb_matrix.c) | 46 | ||||
-rw-r--r-- | quantum/rgb_matrix/rgb_matrix.h (renamed from quantum/rgb_matrix.h) | 4 | ||||
-rw-r--r-- | quantum/rgb_matrix/rgb_matrix_drivers.c (renamed from quantum/rgb_matrix_drivers.c) | 16 | ||||
-rw-r--r-- | quantum/rgb_matrix/rgb_matrix_types.h (renamed from quantum/rgb_matrix_types.h) | 0 | ||||
-rw-r--r-- | quantum/rgb_matrix_animations/rgb_matrix_effects.inc | 37 | ||||
-rw-r--r-- | quantum/rgblight/rgblight.c (renamed from quantum/rgblight.c) | 2 | ||||
-rw-r--r-- | quantum/rgblight/rgblight.h (renamed from quantum/rgblight.h) | 0 | ||||
-rw-r--r-- | quantum/rgblight/rgblight_breathe_table.h (renamed from quantum/rgblight_breathe_table.h) | 0 | ||||
-rw-r--r-- | quantum/rgblight/rgblight_list.h (renamed from quantum/rgblight_list.h) | 46 | ||||
-rw-r--r-- | quantum/rgblight/rgblight_modes.h (renamed from quantum/rgblight_modes.h) | 0 | ||||
-rw-r--r-- | quantum/rgblight/rgblight_post_config.h (renamed from quantum/rgblight_post_config.h) | 0 | ||||
-rw-r--r-- | quantum/serial_link/system/serial_link.c | 22 | ||||
-rw-r--r-- | quantum/split_common/matrix.c | 309 | ||||
-rw-r--r-- | quantum/split_common/post_config.h | 9 | ||||
-rw-r--r-- | quantum/split_common/split_util.c | 4 | ||||
-rw-r--r-- | quantum/split_common/transaction_id_define.h | 94 | ||||
-rw-r--r-- | quantum/split_common/transactions.c | 655 | ||||
-rw-r--r-- | quantum/split_common/transactions.h | 54 | ||||
-rw-r--r-- | quantum/split_common/transport.c | 484 | ||||
-rw-r--r-- | quantum/split_common/transport.h | 165 |
146 files changed, 3688 insertions, 2056 deletions
diff --git a/quantum/color.h b/quantum/color.h index 4783f6839..e2cfc4692 100644 --- a/quantum/color.h +++ b/quantum/color.h | |||
@@ -19,6 +19,60 @@ | |||
19 | #include <stdint.h> | 19 | #include <stdint.h> |
20 | #include <stdbool.h> | 20 | #include <stdbool.h> |
21 | 21 | ||
22 | // clang-format off | ||
23 | |||
24 | /* | ||
25 | * RGB Colors | ||
26 | */ | ||
27 | #define RGB_AZURE 0x99, 0xF5, 0xFF | ||
28 | #define RGB_BLACK 0x00, 0x00, 0x00 | ||
29 | #define RGB_BLUE 0x00, 0x00, 0xFF | ||
30 | #define RGB_CHARTREUSE 0x80, 0xFF, 0x00 | ||
31 | #define RGB_CORAL 0xFF, 0x7C, 0x4D | ||
32 | #define RGB_CYAN 0x00, 0xFF, 0xFF | ||
33 | #define RGB_GOLD 0xFF, 0xD9, 0x00 | ||
34 | #define RGB_GOLDENROD 0xD9, 0xA5, 0x21 | ||
35 | #define RGB_GREEN 0x00, 0xFF, 0x00 | ||
36 | #define RGB_MAGENTA 0xFF, 0x00, 0xFF | ||
37 | #define RGB_ORANGE 0xFF, 0x80, 0x00 | ||
38 | #define RGB_PINK 0xFF, 0x80, 0xBF | ||
39 | #define RGB_PURPLE 0x7A, 0x00, 0xFF | ||
40 | #define RGB_RED 0xFF, 0x00, 0x00 | ||
41 | #define RGB_SPRINGGREEN 0x00, 0xFF, 0x80 | ||
42 | #define RGB_TEAL 0x00, 0x80, 0x80 | ||
43 | #define RGB_TURQUOISE 0x47, 0x6E, 0x6A | ||
44 | #define RGB_WHITE 0xFF, 0xFF, 0xFF | ||
45 | #define RGB_YELLOW 0xFF, 0xFF, 0x00 | ||
46 | #define RGB_OFF RGB_BLACK | ||
47 | |||
48 | /* | ||
49 | * HSV Colors | ||
50 | * | ||
51 | * All values (including hue) are scaled to 0-255 | ||
52 | */ | ||
53 | #define HSV_AZURE 132, 102, 255 | ||
54 | #define HSV_BLACK 0, 0, 0 | ||
55 | #define HSV_BLUE 170, 255, 255 | ||
56 | #define HSV_CHARTREUSE 64, 255, 255 | ||
57 | #define HSV_CORAL 11, 176, 255 | ||
58 | #define HSV_CYAN 128, 255, 255 | ||
59 | #define HSV_GOLD 36, 255, 255 | ||
60 | #define HSV_GOLDENROD 30, 218, 218 | ||
61 | #define HSV_GREEN 85, 255, 255 | ||
62 | #define HSV_MAGENTA 213, 255, 255 | ||
63 | #define HSV_ORANGE 28, 255, 255 | ||
64 | #define HSV_PINK 234, 128, 255 | ||
65 | #define HSV_PURPLE 191, 255, 255 | ||
66 | #define HSV_RED 0, 255, 255 | ||
67 | #define HSV_SPRINGGREEN 106, 255, 255 | ||
68 | #define HSV_TEAL 128, 255, 128 | ||
69 | #define HSV_TURQUOISE 123, 90, 112 | ||
70 | #define HSV_WHITE 0, 0, 255 | ||
71 | #define HSV_YELLOW 43, 255, 255 | ||
72 | #define HSV_OFF HSV_BLACK | ||
73 | |||
74 | // clang-format on | ||
75 | |||
22 | #if defined(__GNUC__) | 76 | #if defined(__GNUC__) |
23 | # define PACKED __attribute__((__packed__)) | 77 | # define PACKED __attribute__((__packed__)) |
24 | #else | 78 | #else |
diff --git a/quantum/command.c b/quantum/command.c index 34c4b36b1..3a7dc0f8c 100644 --- a/quantum/command.c +++ b/quantum/command.c | |||
@@ -781,6 +781,6 @@ uint8_t numkey2num(uint8_t code) { | |||
781 | 781 | ||
782 | static void switch_default_layer(uint8_t layer) { | 782 | static void switch_default_layer(uint8_t layer) { |
783 | xprintf("L%d\n", layer); | 783 | xprintf("L%d\n", layer); |
784 | default_layer_set(1UL << layer); | 784 | default_layer_set((layer_state_t)1 << layer); |
785 | clear_keyboard(); | 785 | clear_keyboard(); |
786 | } | 786 | } |
diff --git a/quantum/crc.c b/quantum/crc.c new file mode 100644 index 000000000..0d8b9d601 --- /dev/null +++ b/quantum/crc.c | |||
@@ -0,0 +1,59 @@ | |||
1 | /* Copyright 2021 QMK | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include "crc.h" | ||
18 | |||
19 | __attribute__((weak)) void crc_init(void){ | ||
20 | /* Software implementation nothing todo here. */ | ||
21 | }; | ||
22 | |||
23 | #if defined(CRC8_USE_TABLE) | ||
24 | /** | ||
25 | * Static table used for the table_driven implementation. | ||
26 | */ | ||
27 | static const crc_t crc_table[256] = {0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, 0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d, 0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65, 0x48, 0x4f, 0x46, 0x41, 0x54, 0x53, 0x5a, 0x5d, 0xe0, 0xe7, 0xee, 0xe9, 0xfc, 0xfb, 0xf2, 0xf5, 0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd, 0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85, 0xa8, 0xaf, 0xa6, 0xa1, 0xb4, 0xb3, 0xba, 0xbd, 0xc7, 0xc0, 0xc9, 0xce, 0xdb, 0xdc, 0xd5, 0xd2, 0xff, 0xf8, 0xf1, 0xf6, 0xe3, 0xe4, 0xed, 0xea, 0xb7, 0xb0, 0xb9, 0xbe, 0xab, 0xac, 0xa5, 0xa2, 0x8f, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9d, 0x9a, 0x27, 0x20, 0x29, 0x2e, 0x3b, 0x3c, 0x35, 0x32, 0x1f, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0d, 0x0a, 0x57, 0x50, 0x59, 0x5e, 0x4b, 0x4c, 0x45, 0x42, 0x6f, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7d, 0x7a, | ||
28 | 0x89, 0x8e, 0x87, 0x80, 0x95, 0x92, 0x9b, 0x9c, 0xb1, 0xb6, 0xbf, 0xb8, 0xad, 0xaa, 0xa3, 0xa4, 0xf9, 0xfe, 0xf7, 0xf0, 0xe5, 0xe2, 0xeb, 0xec, 0xc1, 0xc6, 0xcf, 0xc8, 0xdd, 0xda, 0xd3, 0xd4, 0x69, 0x6e, 0x67, 0x60, 0x75, 0x72, 0x7b, 0x7c, 0x51, 0x56, 0x5f, 0x58, 0x4d, 0x4a, 0x43, 0x44, 0x19, 0x1e, 0x17, 0x10, 0x05, 0x02, 0x0b, 0x0c, 0x21, 0x26, 0x2f, 0x28, 0x3d, 0x3a, 0x33, 0x34, 0x4e, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5c, 0x5b, 0x76, 0x71, 0x78, 0x7f, 0x6a, 0x6d, 0x64, 0x63, 0x3e, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2c, 0x2b, 0x06, 0x01, 0x08, 0x0f, 0x1a, 0x1d, 0x14, 0x13, 0xae, 0xa9, 0xa0, 0xa7, 0xb2, 0xb5, 0xbc, 0xbb, 0x96, 0x91, 0x98, 0x9f, 0x8a, 0x8d, 0x84, 0x83, 0xde, 0xd9, 0xd0, 0xd7, 0xc2, 0xc5, 0xcc, 0xcb, 0xe6, 0xe1, 0xe8, 0xef, 0xfa, 0xfd, 0xf4, 0xf3}; | ||
29 | |||
30 | __attribute__((weak)) uint8_t crc8(const void *data, size_t data_len) { | ||
31 | const uint8_t *d = (const uint8_t *)data; | ||
32 | crc_t crc = 0xff; | ||
33 | size_t tbl_idx; | ||
34 | |||
35 | while (data_len--) { | ||
36 | tbl_idx = crc ^ *d; | ||
37 | crc = crc_table[tbl_idx] & 0xff; | ||
38 | d++; | ||
39 | } | ||
40 | return crc & 0xff; | ||
41 | } | ||
42 | #else | ||
43 | __attribute__((weak)) uint8_t crc8(const void *data, size_t data_len) { | ||
44 | const uint8_t *d = (const uint8_t *)data; | ||
45 | crc_t crc = 0xff; | ||
46 | size_t i, j; | ||
47 | |||
48 | for (i = 0; i < data_len; i++) { | ||
49 | crc ^= d[i]; | ||
50 | for (j = 0; j < 8; j++) { | ||
51 | if ((crc & 0x80) != 0) | ||
52 | crc = (crc_t)((crc << 1) ^ 0x31); | ||
53 | else | ||
54 | crc <<= 1; | ||
55 | } | ||
56 | } | ||
57 | return crc; | ||
58 | } | ||
59 | #endif \ No newline at end of file | ||
diff --git a/quantum/rgb.h b/quantum/crc.h index 2602fc0b2..c17f5888e 100644 --- a/quantum/rgb.h +++ b/quantum/crc.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* Copyright 2017 Jack Humbert | 1 | /* Copyright 2021 QMK |
2 | * | 2 | * |
3 | * This program is free software: you can redistribute it and/or modify | 3 | * This program is free software: you can redistribute it and/or modify |
4 | * it under the terms of the GNU General Public License as published by | 4 | * it under the terms of the GNU General Public License as published by |
@@ -16,24 +16,29 @@ | |||
16 | 16 | ||
17 | #pragma once | 17 | #pragma once |
18 | 18 | ||
19 | __attribute__((weak)) void rgblight_toggle(void){}; | 19 | #include "quantum.h" |
20 | 20 | ||
21 | __attribute__((weak)) void rgblight_step(void){}; | 21 | /** |
22 | 22 | * The type of the CRC values. | |
23 | __attribute__((weak)) void rgblight_step_reverse(void){}; | 23 | * |
24 | 24 | * This type must be big enough to contain at least 8 bits. | |
25 | __attribute__((weak)) void rgblight_increase_hue(void){}; | 25 | */ |
26 | 26 | #if defined(CRC8_OPTIMIZE_SPEED) | |
27 | __attribute__((weak)) void rgblight_decrease_hue(void){}; | 27 | typedef uint_fast8_t crc_t; |
28 | 28 | #else | |
29 | __attribute__((weak)) void rgblight_increase_sat(void){}; | 29 | typedef uint_least8_t crc_t; |
30 | 30 | #endif | |
31 | __attribute__((weak)) void rgblight_decrease_sat(void){}; | 31 | |
32 | 32 | /** | |
33 | __attribute__((weak)) void rgblight_increase_val(void){}; | 33 | * Initialize crc subsystem. |
34 | 34 | */ | |
35 | __attribute__((weak)) void rgblight_decrease_val(void){}; | 35 | __attribute__((weak)) void crc_init(void); |
36 | |||
37 | __attribute__((weak)) void rgblight_increase_speed(void){}; | ||
38 | 36 | ||
39 | __attribute__((weak)) void rgblight_decrease_speed(void){}; | 37 | /** |
38 | * Generate CRC8 value from given data. | ||
39 | * | ||
40 | * \param[in] data Pointer to a buffer of \a data_len bytes. | ||
41 | * \param[in] data_len Number of bytes in the \a data buffer. | ||
42 | * \return The calculated crc value. | ||
43 | */ | ||
44 | __attribute__((weak)) uint8_t crc8(const void *data, size_t data_len); \ No newline at end of file | ||
diff --git a/quantum/debounce.h b/quantum/debounce.h index 9ca05c682..504386828 100644 --- a/quantum/debounce.h +++ b/quantum/debounce.h | |||
@@ -9,3 +9,5 @@ void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool | |||
9 | bool debounce_active(void); | 9 | bool debounce_active(void); |
10 | 10 | ||
11 | void debounce_init(uint8_t num_rows); | 11 | void debounce_init(uint8_t num_rows); |
12 | |||
13 | void debounce_free(void); | ||
diff --git a/quantum/debounce/asym_eager_defer_pk.c b/quantum/debounce/asym_eager_defer_pk.c new file mode 100644 index 000000000..24380dc5e --- /dev/null +++ b/quantum/debounce/asym_eager_defer_pk.c | |||
@@ -0,0 +1,171 @@ | |||
1 | /* | ||
2 | * Copyright 2017 Alex Ong <the.onga@gmail.com> | ||
3 | * Copyright 2020 Andrei Purdea <andrei@purdea.ro> | ||
4 | * Copyright 2021 Simon Arlott | ||
5 | * | ||
6 | * This program is free software: you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation, either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
18 | */ | ||
19 | |||
20 | /* | ||
21 | Basic symmetric per-key algorithm. Uses an 8-bit counter per key. | ||
22 | When no state changes have occured for DEBOUNCE milliseconds, we push the state. | ||
23 | */ | ||
24 | |||
25 | #include "matrix.h" | ||
26 | #include "timer.h" | ||
27 | #include "quantum.h" | ||
28 | #include <stdlib.h> | ||
29 | |||
30 | #ifdef PROTOCOL_CHIBIOS | ||
31 | # if CH_CFG_USE_MEMCORE == FALSE | ||
32 | # error ChibiOS is configured without a memory allocator. Your keyboard may have set `#define CH_CFG_USE_MEMCORE FALSE`, which is incompatible with this debounce algorithm. | ||
33 | # endif | ||
34 | #endif | ||
35 | |||
36 | #ifndef DEBOUNCE | ||
37 | # define DEBOUNCE 5 | ||
38 | #endif | ||
39 | |||
40 | // Maximum debounce: 127ms | ||
41 | #if DEBOUNCE > 127 | ||
42 | # undef DEBOUNCE | ||
43 | # define DEBOUNCE 127 | ||
44 | #endif | ||
45 | |||
46 | #define ROW_SHIFTER ((matrix_row_t)1) | ||
47 | |||
48 | typedef struct { | ||
49 | bool pressed : 1; | ||
50 | uint8_t time : 7; | ||
51 | } debounce_counter_t; | ||
52 | |||
53 | #if DEBOUNCE > 0 | ||
54 | static debounce_counter_t *debounce_counters; | ||
55 | static fast_timer_t last_time; | ||
56 | static bool counters_need_update; | ||
57 | static bool matrix_need_update; | ||
58 | |||
59 | #define DEBOUNCE_ELAPSED 0 | ||
60 | |||
61 | static void update_debounce_counters_and_transfer_if_expired(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t elapsed_time); | ||
62 | static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows); | ||
63 | |||
64 | // we use num_rows rather than MATRIX_ROWS to support split keyboards | ||
65 | void debounce_init(uint8_t num_rows) { | ||
66 | debounce_counters = malloc(num_rows * MATRIX_COLS * sizeof(debounce_counter_t)); | ||
67 | int i = 0; | ||
68 | for (uint8_t r = 0; r < num_rows; r++) { | ||
69 | for (uint8_t c = 0; c < MATRIX_COLS; c++) { | ||
70 | debounce_counters[i++].time = DEBOUNCE_ELAPSED; | ||
71 | } | ||
72 | } | ||
73 | } | ||
74 | |||
75 | void debounce_free(void) { | ||
76 | free(debounce_counters); | ||
77 | debounce_counters = NULL; | ||
78 | } | ||
79 | |||
80 | void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) { | ||
81 | bool updated_last = false; | ||
82 | |||
83 | if (counters_need_update) { | ||
84 | fast_timer_t now = timer_read_fast(); | ||
85 | fast_timer_t elapsed_time = TIMER_DIFF_FAST(now, last_time); | ||
86 | |||
87 | last_time = now; | ||
88 | updated_last = true; | ||
89 | if (elapsed_time > UINT8_MAX) { | ||
90 | elapsed_time = UINT8_MAX; | ||
91 | } | ||
92 | |||
93 | if (elapsed_time > 0) { | ||
94 | update_debounce_counters_and_transfer_if_expired(raw, cooked, num_rows, elapsed_time); | ||
95 | } | ||
96 | } | ||
97 | |||
98 | if (changed || matrix_need_update) { | ||
99 | if (!updated_last) { | ||
100 | last_time = timer_read_fast(); | ||
101 | } | ||
102 | |||
103 | transfer_matrix_values(raw, cooked, num_rows); | ||
104 | } | ||
105 | } | ||
106 | |||
107 | static void update_debounce_counters_and_transfer_if_expired(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t elapsed_time) { | ||
108 | debounce_counter_t *debounce_pointer = debounce_counters; | ||
109 | |||
110 | counters_need_update = false; | ||
111 | matrix_need_update = false; | ||
112 | |||
113 | for (uint8_t row = 0; row < num_rows; row++) { | ||
114 | for (uint8_t col = 0; col < MATRIX_COLS; col++) { | ||
115 | matrix_row_t col_mask = (ROW_SHIFTER << col); | ||
116 | |||
117 | if (debounce_pointer->time != DEBOUNCE_ELAPSED) { | ||
118 | if (debounce_pointer->time <= elapsed_time) { | ||
119 | debounce_pointer->time = DEBOUNCE_ELAPSED; | ||
120 | |||
121 | if (debounce_pointer->pressed) { | ||
122 | // key-down: eager | ||
123 | matrix_need_update = true; | ||
124 | } else { | ||
125 | // key-up: defer | ||
126 | cooked[row] = (cooked[row] & ~col_mask) | (raw[row] & col_mask); | ||
127 | } | ||
128 | } else { | ||
129 | debounce_pointer->time -= elapsed_time; | ||
130 | counters_need_update = true; | ||
131 | } | ||
132 | } | ||
133 | debounce_pointer++; | ||
134 | } | ||
135 | } | ||
136 | } | ||
137 | |||
138 | static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows) { | ||
139 | debounce_counter_t *debounce_pointer = debounce_counters; | ||
140 | |||
141 | for (uint8_t row = 0; row < num_rows; row++) { | ||
142 | matrix_row_t delta = raw[row] ^ cooked[row]; | ||
143 | for (uint8_t col = 0; col < MATRIX_COLS; col++) { | ||
144 | matrix_row_t col_mask = (ROW_SHIFTER << col); | ||
145 | |||
146 | if (delta & col_mask) { | ||
147 | if (debounce_pointer->time == DEBOUNCE_ELAPSED) { | ||
148 | debounce_pointer->pressed = (raw[row] & col_mask); | ||
149 | debounce_pointer->time = DEBOUNCE; | ||
150 | counters_need_update = true; | ||
151 | |||
152 | if (debounce_pointer->pressed) { | ||
153 | // key-down: eager | ||
154 | cooked[row] ^= col_mask; | ||
155 | } | ||
156 | } | ||
157 | } else if (debounce_pointer->time != DEBOUNCE_ELAPSED) { | ||
158 | if (!debounce_pointer->pressed) { | ||
159 | // key-up: defer | ||
160 | debounce_pointer->time = DEBOUNCE_ELAPSED; | ||
161 | } | ||
162 | } | ||
163 | debounce_pointer++; | ||
164 | } | ||
165 | } | ||
166 | } | ||
167 | |||
168 | bool debounce_active(void) { return true; } | ||
169 | #else | ||
170 | # include "none.c" | ||
171 | #endif | ||
diff --git a/quantum/debounce/none.c b/quantum/debounce/none.c new file mode 100644 index 000000000..b03892bc5 --- /dev/null +++ b/quantum/debounce/none.c | |||
@@ -0,0 +1,31 @@ | |||
1 | /* Copyright 2021 Simon Arlott | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include "matrix.h" | ||
18 | #include "quantum.h" | ||
19 | #include <stdlib.h> | ||
20 | |||
21 | void debounce_init(uint8_t num_rows) {} | ||
22 | |||
23 | void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) { | ||
24 | for (int i = 0; i < num_rows; i++) { | ||
25 | cooked[i] = raw[i]; | ||
26 | } | ||
27 | } | ||
28 | |||
29 | bool debounce_active(void) { return false; } | ||
30 | |||
31 | void debounce_free(void) {} | ||
diff --git a/quantum/debounce/sym_defer_g.c b/quantum/debounce/sym_defer_g.c index 3ed9055d2..fbefd55ed 100644 --- a/quantum/debounce/sym_defer_g.c +++ b/quantum/debounce/sym_defer_g.c | |||
@@ -1,5 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | Copyright 2017 Alex Ong<the.onga@gmail.com> | 2 | Copyright 2017 Alex Ong<the.onga@gmail.com> |
3 | Copyright 2021 Simon Arlott | ||
3 | This program is free software: you can redistribute it and/or modify | 4 | This program is free software: you can redistribute it and/or modify |
4 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
5 | the Free Software Foundation, either version 2 of the License, or | 6 | the Free Software Foundation, either version 2 of the License, or |
@@ -23,30 +24,29 @@ When no state changes have occured for DEBOUNCE milliseconds, we push the state. | |||
23 | # define DEBOUNCE 5 | 24 | # define DEBOUNCE 5 |
24 | #endif | 25 | #endif |
25 | 26 | ||
26 | void debounce_init(uint8_t num_rows) {} | 27 | #if DEBOUNCE > 0 |
27 | static bool debouncing = false; | 28 | static bool debouncing = false; |
29 | static fast_timer_t debouncing_time; | ||
28 | 30 | ||
29 | #if DEBOUNCE > 0 | 31 | void debounce_init(uint8_t num_rows) {} |
30 | static uint16_t debouncing_time; | 32 | |
31 | void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) { | 33 | void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) { |
32 | if (changed) { | 34 | if (changed) { |
33 | debouncing = true; | 35 | debouncing = true; |
34 | debouncing_time = timer_read(); | 36 | debouncing_time = timer_read_fast(); |
35 | } | 37 | } |
36 | 38 | ||
37 | if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) { | 39 | if (debouncing && timer_elapsed_fast(debouncing_time) >= DEBOUNCE) { |
38 | for (int i = 0; i < num_rows; i++) { | 40 | for (int i = 0; i < num_rows; i++) { |
39 | cooked[i] = raw[i]; | 41 | cooked[i] = raw[i]; |
40 | } | 42 | } |
41 | debouncing = false; | 43 | debouncing = false; |
42 | } | 44 | } |
43 | } | 45 | } |
44 | #else // no debouncing. | ||
45 | void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) { | ||
46 | for (int i = 0; i < num_rows; i++) { | ||
47 | cooked[i] = raw[i]; | ||
48 | } | ||
49 | } | ||
50 | #endif | ||
51 | 46 | ||
52 | bool debounce_active(void) { return debouncing; } | 47 | bool debounce_active(void) { return debouncing; } |
48 | |||
49 | void debounce_free(void) {} | ||
50 | #else // no debouncing. | ||
51 | # include "none.c" | ||
52 | #endif | ||
diff --git a/quantum/debounce/sym_defer_pk.c b/quantum/debounce/sym_defer_pk.c index 60513f98e..626a9be84 100644 --- a/quantum/debounce/sym_defer_pk.c +++ b/quantum/debounce/sym_defer_pk.c | |||
@@ -1,6 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | Copyright 2017 Alex Ong<the.onga@gmail.com> | 2 | Copyright 2017 Alex Ong<the.onga@gmail.com> |
3 | Copyright 2020 Andrei Purdea<andrei@purdea.ro> | 3 | Copyright 2020 Andrei Purdea<andrei@purdea.ro> |
4 | Copyright 2021 Simon Arlott | ||
4 | This program is free software: you can redistribute it and/or modify | 5 | This program is free software: you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
6 | the Free Software Foundation, either version 2 of the License, or | 7 | the Free Software Foundation, either version 2 of the License, or |
@@ -33,28 +34,25 @@ When no state changes have occured for DEBOUNCE milliseconds, we push the state. | |||
33 | # define DEBOUNCE 5 | 34 | # define DEBOUNCE 5 |
34 | #endif | 35 | #endif |
35 | 36 | ||
37 | // Maximum debounce: 255ms | ||
38 | #if DEBOUNCE > UINT8_MAX | ||
39 | # undef DEBOUNCE | ||
40 | # define DEBOUNCE UINT8_MAX | ||
41 | #endif | ||
42 | |||
36 | #define ROW_SHIFTER ((matrix_row_t)1) | 43 | #define ROW_SHIFTER ((matrix_row_t)1) |
37 | 44 | ||
38 | #define debounce_counter_t uint8_t | 45 | typedef uint8_t debounce_counter_t; |
39 | 46 | ||
47 | #if DEBOUNCE > 0 | ||
40 | static debounce_counter_t *debounce_counters; | 48 | static debounce_counter_t *debounce_counters; |
49 | static fast_timer_t last_time; | ||
41 | static bool counters_need_update; | 50 | static bool counters_need_update; |
42 | 51 | ||
43 | #define DEBOUNCE_ELAPSED 251 | 52 | #define DEBOUNCE_ELAPSED 0 |
44 | #define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1) | ||
45 | |||
46 | static uint8_t wrapping_timer_read(void) { | ||
47 | static uint16_t time = 0; | ||
48 | static uint8_t last_result = 0; | ||
49 | uint16_t new_time = timer_read(); | ||
50 | uint16_t diff = new_time - time; | ||
51 | time = new_time; | ||
52 | last_result = (last_result + diff) % (MAX_DEBOUNCE + 1); | ||
53 | return last_result; | ||
54 | } | ||
55 | 53 | ||
56 | void update_debounce_counters_and_transfer_if_expired(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time); | 54 | static void update_debounce_counters_and_transfer_if_expired(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t elapsed_time); |
57 | void start_debounce_counters(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time); | 55 | static void start_debounce_counters(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows); |
58 | 56 | ||
59 | // we use num_rows rather than MATRIX_ROWS to support split keyboards | 57 | // we use num_rows rather than MATRIX_ROWS to support split keyboards |
60 | void debounce_init(uint8_t num_rows) { | 58 | void debounce_init(uint8_t num_rows) { |
@@ -67,27 +65,49 @@ void debounce_init(uint8_t num_rows) { | |||
67 | } | 65 | } |
68 | } | 66 | } |
69 | 67 | ||
68 | void debounce_free(void) { | ||
69 | free(debounce_counters); | ||
70 | debounce_counters = NULL; | ||
71 | } | ||
72 | |||
70 | void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) { | 73 | void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) { |
71 | uint8_t current_time = wrapping_timer_read(); | 74 | bool updated_last = false; |
75 | |||
72 | if (counters_need_update) { | 76 | if (counters_need_update) { |
73 | update_debounce_counters_and_transfer_if_expired(raw, cooked, num_rows, current_time); | 77 | fast_timer_t now = timer_read_fast(); |
78 | fast_timer_t elapsed_time = TIMER_DIFF_FAST(now, last_time); | ||
79 | |||
80 | last_time = now; | ||
81 | updated_last = true; | ||
82 | if (elapsed_time > UINT8_MAX) { | ||
83 | elapsed_time = UINT8_MAX; | ||
84 | } | ||
85 | |||
86 | if (elapsed_time > 0) { | ||
87 | update_debounce_counters_and_transfer_if_expired(raw, cooked, num_rows, elapsed_time); | ||
88 | } | ||
74 | } | 89 | } |
75 | 90 | ||
76 | if (changed) { | 91 | if (changed) { |
77 | start_debounce_counters(raw, cooked, num_rows, current_time); | 92 | if (!updated_last) { |
93 | last_time = timer_read_fast(); | ||
94 | } | ||
95 | |||
96 | start_debounce_counters(raw, cooked, num_rows); | ||
78 | } | 97 | } |
79 | } | 98 | } |
80 | 99 | ||
81 | void update_debounce_counters_and_transfer_if_expired(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time) { | 100 | static void update_debounce_counters_and_transfer_if_expired(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t elapsed_time) { |
82 | counters_need_update = false; | 101 | counters_need_update = false; |
83 | debounce_counter_t *debounce_pointer = debounce_counters; | 102 | debounce_counter_t *debounce_pointer = debounce_counters; |
84 | for (uint8_t row = 0; row < num_rows; row++) { | 103 | for (uint8_t row = 0; row < num_rows; row++) { |
85 | for (uint8_t col = 0; col < MATRIX_COLS; col++) { | 104 | for (uint8_t col = 0; col < MATRIX_COLS; col++) { |
86 | if (*debounce_pointer != DEBOUNCE_ELAPSED) { | 105 | if (*debounce_pointer != DEBOUNCE_ELAPSED) { |
87 | if (TIMER_DIFF(current_time, *debounce_pointer, MAX_DEBOUNCE) >= DEBOUNCE) { | 106 | if (*debounce_pointer <= elapsed_time) { |
88 | *debounce_pointer = DEBOUNCE_ELAPSED; | 107 | *debounce_pointer = DEBOUNCE_ELAPSED; |
89 | cooked[row] = (cooked[row] & ~(ROW_SHIFTER << col)) | (raw[row] & (ROW_SHIFTER << col)); | 108 | cooked[row] = (cooked[row] & ~(ROW_SHIFTER << col)) | (raw[row] & (ROW_SHIFTER << col)); |
90 | } else { | 109 | } else { |
110 | *debounce_pointer -= elapsed_time; | ||
91 | counters_need_update = true; | 111 | counters_need_update = true; |
92 | } | 112 | } |
93 | } | 113 | } |
@@ -96,14 +116,14 @@ void update_debounce_counters_and_transfer_if_expired(matrix_row_t raw[], matrix | |||
96 | } | 116 | } |
97 | } | 117 | } |
98 | 118 | ||
99 | void start_debounce_counters(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time) { | 119 | static void start_debounce_counters(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows) { |
100 | debounce_counter_t *debounce_pointer = debounce_counters; | 120 | debounce_counter_t *debounce_pointer = debounce_counters; |
101 | for (uint8_t row = 0; row < num_rows; row++) { | 121 | for (uint8_t row = 0; row < num_rows; row++) { |
102 | matrix_row_t delta = raw[row] ^ cooked[row]; | 122 | matrix_row_t delta = raw[row] ^ cooked[row]; |
103 | for (uint8_t col = 0; col < MATRIX_COLS; col++) { | 123 | for (uint8_t col = 0; col < MATRIX_COLS; col++) { |
104 | if (delta & (ROW_SHIFTER << col)) { | 124 | if (delta & (ROW_SHIFTER << col)) { |
105 | if (*debounce_pointer == DEBOUNCE_ELAPSED) { | 125 | if (*debounce_pointer == DEBOUNCE_ELAPSED) { |
106 | *debounce_pointer = current_time; | 126 | *debounce_pointer = DEBOUNCE; |
107 | counters_need_update = true; | 127 | counters_need_update = true; |
108 | } | 128 | } |
109 | } else { | 129 | } else { |
@@ -115,3 +135,6 @@ void start_debounce_counters(matrix_row_t raw[], matrix_row_t cooked[], uint8_t | |||
115 | } | 135 | } |
116 | 136 | ||
117 | bool debounce_active(void) { return true; } | 137 | bool debounce_active(void) { return true; } |
138 | #else | ||
139 | # include "none.c" | ||
140 | #endif | ||
diff --git a/quantum/debounce/sym_eager_pk.c b/quantum/debounce/sym_eager_pk.c index e66cf92d7..15a3242e6 100644 --- a/quantum/debounce/sym_eager_pk.c +++ b/quantum/debounce/sym_eager_pk.c | |||
@@ -1,5 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | Copyright 2017 Alex Ong<the.onga@gmail.com> | 2 | Copyright 2017 Alex Ong<the.onga@gmail.com> |
3 | Copyright 2021 Simon Arlott | ||
3 | This program is free software: you can redistribute it and/or modify | 4 | This program is free software: you can redistribute it and/or modify |
4 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
5 | the Free Software Foundation, either version 2 of the License, or | 6 | the Free Software Foundation, either version 2 of the License, or |
@@ -33,29 +34,26 @@ No further inputs are accepted until DEBOUNCE milliseconds have occurred. | |||
33 | # define DEBOUNCE 5 | 34 | # define DEBOUNCE 5 |
34 | #endif | 35 | #endif |
35 | 36 | ||
37 | // Maximum debounce: 255ms | ||
38 | #if DEBOUNCE > UINT8_MAX | ||
39 | # undef DEBOUNCE | ||
40 | # define DEBOUNCE UINT8_MAX | ||
41 | #endif | ||
42 | |||
36 | #define ROW_SHIFTER ((matrix_row_t)1) | 43 | #define ROW_SHIFTER ((matrix_row_t)1) |
37 | 44 | ||
38 | #define debounce_counter_t uint8_t | 45 | typedef uint8_t debounce_counter_t; |
39 | 46 | ||
47 | #if DEBOUNCE > 0 | ||
40 | static debounce_counter_t *debounce_counters; | 48 | static debounce_counter_t *debounce_counters; |
49 | static fast_timer_t last_time; | ||
41 | static bool counters_need_update; | 50 | static bool counters_need_update; |
42 | static bool matrix_need_update; | 51 | static bool matrix_need_update; |
43 | 52 | ||
44 | #define DEBOUNCE_ELAPSED 251 | 53 | #define DEBOUNCE_ELAPSED 0 |
45 | #define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1) | ||
46 | |||
47 | static uint8_t wrapping_timer_read(void) { | ||
48 | static uint16_t time = 0; | ||
49 | static uint8_t last_result = 0; | ||
50 | uint16_t new_time = timer_read(); | ||
51 | uint16_t diff = new_time - time; | ||
52 | time = new_time; | ||
53 | last_result = (last_result + diff) % (MAX_DEBOUNCE + 1); | ||
54 | return last_result; | ||
55 | } | ||
56 | 54 | ||
57 | void update_debounce_counters(uint8_t num_rows, uint8_t current_time); | 55 | static void update_debounce_counters(uint8_t num_rows, uint8_t elapsed_time); |
58 | void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time); | 56 | static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows); |
59 | 57 | ||
60 | // we use num_rows rather than MATRIX_ROWS to support split keyboards | 58 | // we use num_rows rather than MATRIX_ROWS to support split keyboards |
61 | void debounce_init(uint8_t num_rows) { | 59 | void debounce_init(uint8_t num_rows) { |
@@ -68,27 +66,51 @@ void debounce_init(uint8_t num_rows) { | |||
68 | } | 66 | } |
69 | } | 67 | } |
70 | 68 | ||
69 | void debounce_free(void) { | ||
70 | free(debounce_counters); | ||
71 | debounce_counters = NULL; | ||
72 | } | ||
73 | |||
71 | void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) { | 74 | void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) { |
72 | uint8_t current_time = wrapping_timer_read(); | 75 | bool updated_last = false; |
76 | |||
73 | if (counters_need_update) { | 77 | if (counters_need_update) { |
74 | update_debounce_counters(num_rows, current_time); | 78 | fast_timer_t now = timer_read_fast(); |
79 | fast_timer_t elapsed_time = TIMER_DIFF_FAST(now, last_time); | ||
80 | |||
81 | last_time = now; | ||
82 | updated_last = true; | ||
83 | if (elapsed_time > UINT8_MAX) { | ||
84 | elapsed_time = UINT8_MAX; | ||
85 | } | ||
86 | |||
87 | if (elapsed_time > 0) { | ||
88 | update_debounce_counters(num_rows, elapsed_time); | ||
89 | } | ||
75 | } | 90 | } |
76 | 91 | ||
77 | if (changed || matrix_need_update) { | 92 | if (changed || matrix_need_update) { |
78 | transfer_matrix_values(raw, cooked, num_rows, current_time); | 93 | if (!updated_last) { |
94 | last_time = timer_read_fast(); | ||
95 | } | ||
96 | |||
97 | transfer_matrix_values(raw, cooked, num_rows); | ||
79 | } | 98 | } |
80 | } | 99 | } |
81 | 100 | ||
82 | // If the current time is > debounce counter, set the counter to enable input. | 101 | // If the current time is > debounce counter, set the counter to enable input. |
83 | void update_debounce_counters(uint8_t num_rows, uint8_t current_time) { | 102 | static void update_debounce_counters(uint8_t num_rows, uint8_t elapsed_time) { |
84 | counters_need_update = false; | 103 | counters_need_update = false; |
104 | matrix_need_update = false; | ||
85 | debounce_counter_t *debounce_pointer = debounce_counters; | 105 | debounce_counter_t *debounce_pointer = debounce_counters; |
86 | for (uint8_t row = 0; row < num_rows; row++) { | 106 | for (uint8_t row = 0; row < num_rows; row++) { |
87 | for (uint8_t col = 0; col < MATRIX_COLS; col++) { | 107 | for (uint8_t col = 0; col < MATRIX_COLS; col++) { |
88 | if (*debounce_pointer != DEBOUNCE_ELAPSED) { | 108 | if (*debounce_pointer != DEBOUNCE_ELAPSED) { |
89 | if (TIMER_DIFF(current_time, *debounce_pointer, MAX_DEBOUNCE) >= DEBOUNCE) { | 109 | if (*debounce_pointer <= elapsed_time) { |
90 | *debounce_pointer = DEBOUNCE_ELAPSED; | 110 | *debounce_pointer = DEBOUNCE_ELAPSED; |
111 | matrix_need_update = true; | ||
91 | } else { | 112 | } else { |
113 | *debounce_pointer -= elapsed_time; | ||
92 | counters_need_update = true; | 114 | counters_need_update = true; |
93 | } | 115 | } |
94 | } | 116 | } |
@@ -98,8 +120,7 @@ void update_debounce_counters(uint8_t num_rows, uint8_t current_time) { | |||
98 | } | 120 | } |
99 | 121 | ||
100 | // upload from raw_matrix to final matrix; | 122 | // upload from raw_matrix to final matrix; |
101 | void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time) { | 123 | static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows) { |
102 | matrix_need_update = false; | ||
103 | debounce_counter_t *debounce_pointer = debounce_counters; | 124 | debounce_counter_t *debounce_pointer = debounce_counters; |
104 | for (uint8_t row = 0; row < num_rows; row++) { | 125 | for (uint8_t row = 0; row < num_rows; row++) { |
105 | matrix_row_t delta = raw[row] ^ cooked[row]; | 126 | matrix_row_t delta = raw[row] ^ cooked[row]; |
@@ -108,11 +129,9 @@ void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t n | |||
108 | matrix_row_t col_mask = (ROW_SHIFTER << col); | 129 | matrix_row_t col_mask = (ROW_SHIFTER << col); |
109 | if (delta & col_mask) { | 130 | if (delta & col_mask) { |
110 | if (*debounce_pointer == DEBOUNCE_ELAPSED) { | 131 | if (*debounce_pointer == DEBOUNCE_ELAPSED) { |
111 | *debounce_pointer = current_time; | 132 | *debounce_pointer = DEBOUNCE; |
112 | counters_need_update = true; | 133 | counters_need_update = true; |
113 | existing_row ^= col_mask; // flip the bit. | 134 | existing_row ^= col_mask; // flip the bit. |
114 | } else { | ||
115 | matrix_need_update = true; | ||
116 | } | 135 | } |
117 | } | 136 | } |
118 | debounce_pointer++; | 137 | debounce_pointer++; |
@@ -122,3 +141,6 @@ void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t n | |||
122 | } | 141 | } |
123 | 142 | ||
124 | bool debounce_active(void) { return true; } | 143 | bool debounce_active(void) { return true; } |
144 | #else | ||
145 | # include "none.c" | ||
146 | #endif | ||
diff --git a/quantum/debounce/sym_eager_pr.c b/quantum/debounce/sym_eager_pr.c index 20ccb46f1..2ad592c5a 100644 --- a/quantum/debounce/sym_eager_pr.c +++ b/quantum/debounce/sym_eager_pr.c | |||
@@ -1,5 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | Copyright 2019 Alex Ong<the.onga@gmail.com> | 2 | Copyright 2019 Alex Ong<the.onga@gmail.com> |
3 | Copyright 2021 Simon Arlott | ||
3 | This program is free software: you can redistribute it and/or modify | 4 | This program is free software: you can redistribute it and/or modify |
4 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
5 | the Free Software Foundation, either version 2 of the License, or | 6 | the Free Software Foundation, either version 2 of the License, or |
@@ -33,27 +34,25 @@ No further inputs are accepted until DEBOUNCE milliseconds have occurred. | |||
33 | # define DEBOUNCE 5 | 34 | # define DEBOUNCE 5 |
34 | #endif | 35 | #endif |
35 | 36 | ||
36 | #define debounce_counter_t uint8_t | 37 | // Maximum debounce: 255ms |
38 | #if DEBOUNCE > UINT8_MAX | ||
39 | # undef DEBOUNCE | ||
40 | # define DEBOUNCE UINT8_MAX | ||
41 | #endif | ||
42 | |||
43 | typedef uint8_t debounce_counter_t; | ||
44 | |||
45 | #if DEBOUNCE > 0 | ||
37 | static bool matrix_need_update; | 46 | static bool matrix_need_update; |
38 | 47 | ||
39 | static debounce_counter_t *debounce_counters; | 48 | static debounce_counter_t *debounce_counters; |
49 | static fast_timer_t last_time; | ||
40 | static bool counters_need_update; | 50 | static bool counters_need_update; |
41 | 51 | ||
42 | #define DEBOUNCE_ELAPSED 251 | 52 | #define DEBOUNCE_ELAPSED 0 |
43 | #define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1) | ||
44 | |||
45 | static uint8_t wrapping_timer_read(void) { | ||
46 | static uint16_t time = 0; | ||
47 | static uint8_t last_result = 0; | ||
48 | uint16_t new_time = timer_read(); | ||
49 | uint16_t diff = new_time - time; | ||
50 | time = new_time; | ||
51 | last_result = (last_result + diff) % (MAX_DEBOUNCE + 1); | ||
52 | return last_result; | ||
53 | } | ||
54 | 53 | ||
55 | void update_debounce_counters(uint8_t num_rows, uint8_t current_time); | 54 | static void update_debounce_counters(uint8_t num_rows, uint8_t elapsed_time); |
56 | void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time); | 55 | static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows); |
57 | 56 | ||
58 | // we use num_rows rather than MATRIX_ROWS to support split keyboards | 57 | // we use num_rows rather than MATRIX_ROWS to support split keyboards |
59 | void debounce_init(uint8_t num_rows) { | 58 | void debounce_init(uint8_t num_rows) { |
@@ -63,27 +62,50 @@ void debounce_init(uint8_t num_rows) { | |||
63 | } | 62 | } |
64 | } | 63 | } |
65 | 64 | ||
65 | void debounce_free(void) { | ||
66 | free(debounce_counters); | ||
67 | debounce_counters = NULL; | ||
68 | } | ||
69 | |||
66 | void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) { | 70 | void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) { |
67 | uint8_t current_time = wrapping_timer_read(); | 71 | bool updated_last = false; |
68 | bool needed_update = counters_need_update; | 72 | |
69 | if (counters_need_update) { | 73 | if (counters_need_update) { |
70 | update_debounce_counters(num_rows, current_time); | 74 | fast_timer_t now = timer_read_fast(); |
75 | fast_timer_t elapsed_time = TIMER_DIFF_FAST(now, last_time); | ||
76 | |||
77 | last_time = now; | ||
78 | updated_last = true; | ||
79 | if (elapsed_time > UINT8_MAX) { | ||
80 | elapsed_time = UINT8_MAX; | ||
81 | } | ||
82 | |||
83 | if (elapsed_time > 0) { | ||
84 | update_debounce_counters(num_rows, elapsed_time); | ||
85 | } | ||
71 | } | 86 | } |
72 | 87 | ||
73 | if (changed || (needed_update && !counters_need_update) || matrix_need_update) { | 88 | if (changed || matrix_need_update) { |
74 | transfer_matrix_values(raw, cooked, num_rows, current_time); | 89 | if (!updated_last) { |
90 | last_time = timer_read_fast(); | ||
91 | } | ||
92 | |||
93 | transfer_matrix_values(raw, cooked, num_rows); | ||
75 | } | 94 | } |
76 | } | 95 | } |
77 | 96 | ||
78 | // If the current time is > debounce counter, set the counter to enable input. | 97 | // If the current time is > debounce counter, set the counter to enable input. |
79 | void update_debounce_counters(uint8_t num_rows, uint8_t current_time) { | 98 | static void update_debounce_counters(uint8_t num_rows, uint8_t elapsed_time) { |
80 | counters_need_update = false; | 99 | counters_need_update = false; |
100 | matrix_need_update = false; | ||
81 | debounce_counter_t *debounce_pointer = debounce_counters; | 101 | debounce_counter_t *debounce_pointer = debounce_counters; |
82 | for (uint8_t row = 0; row < num_rows; row++) { | 102 | for (uint8_t row = 0; row < num_rows; row++) { |
83 | if (*debounce_pointer != DEBOUNCE_ELAPSED) { | 103 | if (*debounce_pointer != DEBOUNCE_ELAPSED) { |
84 | if (TIMER_DIFF(current_time, *debounce_pointer, MAX_DEBOUNCE) >= DEBOUNCE) { | 104 | if (*debounce_pointer <= elapsed_time) { |
85 | *debounce_pointer = DEBOUNCE_ELAPSED; | 105 | *debounce_pointer = DEBOUNCE_ELAPSED; |
106 | matrix_need_update = true; | ||
86 | } else { | 107 | } else { |
108 | *debounce_pointer -= elapsed_time; | ||
87 | counters_need_update = true; | 109 | counters_need_update = true; |
88 | } | 110 | } |
89 | } | 111 | } |
@@ -92,8 +114,7 @@ void update_debounce_counters(uint8_t num_rows, uint8_t current_time) { | |||
92 | } | 114 | } |
93 | 115 | ||
94 | // upload from raw_matrix to final matrix; | 116 | // upload from raw_matrix to final matrix; |
95 | void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time) { | 117 | static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows) { |
96 | matrix_need_update = false; | ||
97 | debounce_counter_t *debounce_pointer = debounce_counters; | 118 | debounce_counter_t *debounce_pointer = debounce_counters; |
98 | for (uint8_t row = 0; row < num_rows; row++) { | 119 | for (uint8_t row = 0; row < num_rows; row++) { |
99 | matrix_row_t existing_row = cooked[row]; | 120 | matrix_row_t existing_row = cooked[row]; |
@@ -102,11 +123,9 @@ void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t n | |||
102 | // determine new value basd on debounce pointer + raw value | 123 | // determine new value basd on debounce pointer + raw value |
103 | if (existing_row != raw_row) { | 124 | if (existing_row != raw_row) { |
104 | if (*debounce_pointer == DEBOUNCE_ELAPSED) { | 125 | if (*debounce_pointer == DEBOUNCE_ELAPSED) { |
105 | *debounce_pointer = current_time; | 126 | *debounce_pointer = DEBOUNCE; |
106 | cooked[row] = raw_row; | 127 | cooked[row] = raw_row; |
107 | counters_need_update = true; | 128 | counters_need_update = true; |
108 | } else { | ||
109 | matrix_need_update = true; | ||
110 | } | 129 | } |
111 | } | 130 | } |
112 | debounce_pointer++; | 131 | debounce_pointer++; |
@@ -114,3 +133,6 @@ void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t n | |||
114 | } | 133 | } |
115 | 134 | ||
116 | bool debounce_active(void) { return true; } | 135 | bool debounce_active(void) { return true; } |
136 | #else | ||
137 | # include "none.c" | ||
138 | #endif | ||
diff --git a/quantum/debounce/tests/asym_eager_defer_pk_tests.cpp b/quantum/debounce/tests/asym_eager_defer_pk_tests.cpp new file mode 100644 index 000000000..fe374c3df --- /dev/null +++ b/quantum/debounce/tests/asym_eager_defer_pk_tests.cpp | |||
@@ -0,0 +1,374 @@ | |||
1 | /* Copyright 2021 Simon Arlott | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include "gtest/gtest.h" | ||
18 | |||
19 | #include "debounce_test_common.h" | ||
20 | |||
21 | TEST_F(DebounceTest, OneKeyShort1) { | ||
22 | addEvents({ /* Time, Inputs, Outputs */ | ||
23 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
24 | /* Release key after 1ms delay */ | ||
25 | {1, {{0, 1, UP}}, {}}, | ||
26 | |||
27 | /* | ||
28 | * Until the eager timer on DOWN is observed to finish, the defer timer | ||
29 | * on UP can't start. There's no workaround for this because it's not | ||
30 | * possible to debounce an event that isn't being tracked. | ||
31 | * | ||
32 | * sym_defer_pk has the same problem but the test has to track that the | ||
33 | * key changed state so the DOWN timer is always allowed to finish | ||
34 | * before starting the UP timer. | ||
35 | */ | ||
36 | {5, {}, {}}, | ||
37 | |||
38 | {10, {}, {{0, 1, UP}}}, /* 5ms+5ms after DOWN at time 0 */ | ||
39 | /* Press key again after 1ms delay */ | ||
40 | {11, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
41 | }); | ||
42 | runEvents(); | ||
43 | } | ||
44 | |||
45 | TEST_F(DebounceTest, OneKeyShort2) { | ||
46 | addEvents({ /* Time, Inputs, Outputs */ | ||
47 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
48 | /* Release key after 2ms delay */ | ||
49 | {2, {{0, 1, UP}}, {}}, | ||
50 | |||
51 | {5, {}, {}}, /* See OneKeyShort1 */ | ||
52 | |||
53 | {10, {}, {{0, 1, UP}}}, /* 5ms+5ms after DOWN at time 0 */ | ||
54 | /* Press key again after 1ms delay */ | ||
55 | {11, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
56 | }); | ||
57 | runEvents(); | ||
58 | } | ||
59 | |||
60 | TEST_F(DebounceTest, OneKeyShort3) { | ||
61 | addEvents({ /* Time, Inputs, Outputs */ | ||
62 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
63 | /* Release key after 3ms delay */ | ||
64 | {3, {{0, 1, UP}}, {}}, | ||
65 | |||
66 | {5, {}, {}}, /* See OneKeyShort1 */ | ||
67 | |||
68 | {10, {}, {{0, 1, UP}}}, /* 5ms+5ms after DOWN at time 0 */ | ||
69 | /* Press key again after 1ms delay */ | ||
70 | {11, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
71 | }); | ||
72 | runEvents(); | ||
73 | } | ||
74 | |||
75 | TEST_F(DebounceTest, OneKeyShort4) { | ||
76 | addEvents({ /* Time, Inputs, Outputs */ | ||
77 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
78 | /* Release key after 4ms delay */ | ||
79 | {4, {{0, 1, UP}}, {}}, | ||
80 | |||
81 | {5, {}, {}}, /* See OneKeyShort1 */ | ||
82 | |||
83 | {10, {}, {{0, 1, UP}}}, /* 5ms+5ms after DOWN at time 0 */ | ||
84 | /* Press key again after 1ms delay */ | ||
85 | {11, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
86 | }); | ||
87 | runEvents(); | ||
88 | } | ||
89 | |||
90 | TEST_F(DebounceTest, OneKeyShort5) { | ||
91 | addEvents({ /* Time, Inputs, Outputs */ | ||
92 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
93 | |||
94 | /* Release key after 5ms delay */ | ||
95 | {5, {{0, 1, UP}}, {}}, | ||
96 | |||
97 | {10, {}, {{0, 1, UP}}}, /* 5ms+5ms after DOWN at time 0 */ | ||
98 | /* Press key again after 1ms delay */ | ||
99 | {11, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
100 | }); | ||
101 | runEvents(); | ||
102 | } | ||
103 | |||
104 | TEST_F(DebounceTest, OneKeyShort6) { | ||
105 | addEvents({ /* Time, Inputs, Outputs */ | ||
106 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
107 | |||
108 | /* Release key after 6ms delay */ | ||
109 | {6, {{0, 1, UP}}, {}}, | ||
110 | |||
111 | {11, {}, {{0, 1, UP}}}, /* 5ms after UP at time 6 */ | ||
112 | /* Press key again after 1ms delay */ | ||
113 | {12, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
114 | }); | ||
115 | runEvents(); | ||
116 | } | ||
117 | |||
118 | TEST_F(DebounceTest, OneKeyShort7) { | ||
119 | addEvents({ /* Time, Inputs, Outputs */ | ||
120 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
121 | |||
122 | /* Release key after 7ms delay */ | ||
123 | {7, {{0, 1, UP}}, {}}, | ||
124 | |||
125 | {12, {}, {{0, 1, UP}}}, /* 5ms after UP at time 7 */ | ||
126 | /* Press key again after 1ms delay */ | ||
127 | {13, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
128 | }); | ||
129 | runEvents(); | ||
130 | } | ||
131 | |||
132 | TEST_F(DebounceTest, OneKeyShort8) { | ||
133 | addEvents({ /* Time, Inputs, Outputs */ | ||
134 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
135 | /* Release key after 1ms delay */ | ||
136 | {1, {{0, 1, UP}}, {}}, | ||
137 | |||
138 | {5, {}, {}}, /* See OneKeyShort1 */ | ||
139 | |||
140 | {10, {}, {{0, 1, UP}}}, /* 5ms after UP at time 7 */ | ||
141 | /* Press key again after 0ms delay (scan 2) */ | ||
142 | {10, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
143 | }); | ||
144 | runEvents(); | ||
145 | } | ||
146 | |||
147 | TEST_F(DebounceTest, OneKeyShort9) { | ||
148 | addEvents({ /* Time, Inputs, Outputs */ | ||
149 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
150 | /* Release key after 1ms delay */ | ||
151 | {1, {{0, 1, UP}}, {}}, | ||
152 | |||
153 | {5, {}, {}}, /* See OneKeyShort1 */ | ||
154 | |||
155 | /* Press key again after 0ms delay (same scan) before debounce finishes */ | ||
156 | {10, {{0, 1, DOWN}}, {}}, | ||
157 | }); | ||
158 | runEvents(); | ||
159 | } | ||
160 | |||
161 | TEST_F(DebounceTest, OneKeyBouncing1) { | ||
162 | addEvents({ /* Time, Inputs, Outputs */ | ||
163 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
164 | {1, {{0, 1, UP}}, {}}, | ||
165 | {2, {{0, 1, DOWN}}, {}}, | ||
166 | {3, {{0, 1, UP}}, {}}, | ||
167 | {4, {{0, 1, DOWN}}, {}}, | ||
168 | {5, {{0, 1, UP}}, {}}, | ||
169 | {6, {{0, 1, DOWN}}, {}}, | ||
170 | {7, {{0, 1, UP}}, {}}, | ||
171 | {8, {{0, 1, DOWN}}, {}}, | ||
172 | {9, {{0, 1, UP}}, {}}, | ||
173 | {10, {{0, 1, DOWN}}, {}}, | ||
174 | {11, {{0, 1, UP}}, {}}, | ||
175 | {12, {{0, 1, DOWN}}, {}}, | ||
176 | {13, {{0, 1, UP}}, {}}, | ||
177 | {14, {{0, 1, DOWN}}, {}}, | ||
178 | {15, {{0, 1, UP}}, {}}, | ||
179 | |||
180 | {20, {}, {{0, 1, UP}}}, | ||
181 | /* Press key again after 1ms delay */ | ||
182 | {21, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
183 | }); | ||
184 | runEvents(); | ||
185 | } | ||
186 | |||
187 | TEST_F(DebounceTest, OneKeyBouncing2) { | ||
188 | addEvents({ /* Time, Inputs, Outputs */ | ||
189 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
190 | /* Change twice in the same time period */ | ||
191 | {1, {{0, 1, UP}}, {}}, | ||
192 | {1, {{0, 1, DOWN}}, {}}, | ||
193 | /* Change three times in the same time period */ | ||
194 | {2, {{0, 1, UP}}, {}}, | ||
195 | {2, {{0, 1, DOWN}}, {}}, | ||
196 | {2, {{0, 1, UP}}, {}}, | ||
197 | /* Change twice in the same time period */ | ||
198 | {6, {{0, 1, DOWN}}, {}}, | ||
199 | {6, {{0, 1, UP}}, {}}, | ||
200 | /* Change three times in the same time period */ | ||
201 | {7, {{0, 1, DOWN}}, {}}, | ||
202 | {7, {{0, 1, UP}}, {}}, | ||
203 | {7, {{0, 1, DOWN}}, {}}, | ||
204 | /* Change twice in the same time period */ | ||
205 | {8, {{0, 1, UP}}, {}}, | ||
206 | {8, {{0, 1, DOWN}}, {}}, | ||
207 | /* Change three times in the same time period */ | ||
208 | {9, {{0, 1, UP}}, {}}, | ||
209 | {9, {{0, 1, DOWN}}, {}}, | ||
210 | {9, {{0, 1, UP}}, {}}, | ||
211 | |||
212 | {14, {}, {{0, 1, UP}}}, | ||
213 | /* Press key again after 1ms delay */ | ||
214 | {15, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
215 | }); | ||
216 | runEvents(); | ||
217 | } | ||
218 | |||
219 | TEST_F(DebounceTest, OneKeyLong) { | ||
220 | addEvents({ /* Time, Inputs, Outputs */ | ||
221 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
222 | |||
223 | {25, {{0, 1, UP}}, {}}, | ||
224 | |||
225 | {30, {}, {{0, 1, UP}}}, | ||
226 | |||
227 | {50, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
228 | |||
229 | {75, {{0, 1, UP}}, {}}, | ||
230 | |||
231 | {80, {}, {{0, 1, UP}}}, | ||
232 | |||
233 | {100, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
234 | }); | ||
235 | runEvents(); | ||
236 | } | ||
237 | |||
238 | TEST_F(DebounceTest, TwoKeysShort) { | ||
239 | addEvents({ /* Time, Inputs, Outputs */ | ||
240 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
241 | {1, {{0, 2, DOWN}}, {{0, 2, DOWN}}}, | ||
242 | /* Release key after 2ms delay */ | ||
243 | {2, {{0, 1, UP}}, {}}, | ||
244 | {3, {{0, 2, UP}}, {}}, | ||
245 | |||
246 | {5, {}, {}}, /* See OneKeyShort1 */ | ||
247 | {6, {}, {}}, /* See OneKeyShort1 */ | ||
248 | |||
249 | {10, {}, {{0, 1, UP}}}, /* 5ms+5ms after DOWN at time 0 */ | ||
250 | /* Press key again after 1ms delay */ | ||
251 | {11, {{0, 1, DOWN}}, {{0, 1, DOWN}, {0, 2, UP}}}, /* 5ms+5ms after DOWN at time 0 */ | ||
252 | {12, {{0, 2, DOWN}}, {{0, 2, DOWN}}}, /* 5ms+5ms after DOWN at time 0 */ | ||
253 | }); | ||
254 | runEvents(); | ||
255 | } | ||
256 | |||
257 | |||
258 | TEST_F(DebounceTest, OneKeyDelayedScan1) { | ||
259 | addEvents({ /* Time, Inputs, Outputs */ | ||
260 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
261 | |||
262 | /* Processing is very late, immediately release key */ | ||
263 | {300, {{0, 1, UP}}, {}}, | ||
264 | |||
265 | {305, {}, {{0, 1, UP}}}, | ||
266 | }); | ||
267 | time_jumps_ = true; | ||
268 | runEvents(); | ||
269 | } | ||
270 | |||
271 | TEST_F(DebounceTest, OneKeyDelayedScan2) { | ||
272 | addEvents({ /* Time, Inputs, Outputs */ | ||
273 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
274 | |||
275 | /* Processing is very late, immediately release key */ | ||
276 | {300, {{0, 1, UP}}, {}}, | ||
277 | |||
278 | /* Processing is very late again */ | ||
279 | {600, {}, {{0, 1, UP}}}, | ||
280 | }); | ||
281 | time_jumps_ = true; | ||
282 | runEvents(); | ||
283 | } | ||
284 | |||
285 | TEST_F(DebounceTest, OneKeyDelayedScan3) { | ||
286 | addEvents({ /* Time, Inputs, Outputs */ | ||
287 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
288 | |||
289 | /* Processing is very late */ | ||
290 | {300, {}, {}}, | ||
291 | /* Release key after 1ms */ | ||
292 | {301, {{0, 1, UP}}, {}}, | ||
293 | |||
294 | {306, {}, {{0, 1, UP}}}, | ||
295 | }); | ||
296 | time_jumps_ = true; | ||
297 | runEvents(); | ||
298 | } | ||
299 | |||
300 | TEST_F(DebounceTest, OneKeyDelayedScan4) { | ||
301 | addEvents({ /* Time, Inputs, Outputs */ | ||
302 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
303 | |||
304 | /* Processing is very late */ | ||
305 | {300, {}, {}}, | ||
306 | /* Release key after 1ms */ | ||
307 | {301, {{0, 1, UP}}, {}}, | ||
308 | |||
309 | /* Processing is very late again */ | ||
310 | {600, {}, {{0, 1, UP}}}, | ||
311 | }); | ||
312 | time_jumps_ = true; | ||
313 | runEvents(); | ||
314 | } | ||
315 | |||
316 | TEST_F(DebounceTest, OneKeyDelayedScan5) { | ||
317 | addEvents({ /* Time, Inputs, Outputs */ | ||
318 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
319 | |||
320 | {5, {{0, 1, UP}}, {}}, | ||
321 | |||
322 | /* Processing is very late */ | ||
323 | {300, {}, {{0, 1, UP}}}, | ||
324 | /* Immediately press key again */ | ||
325 | {300, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
326 | }); | ||
327 | time_jumps_ = true; | ||
328 | runEvents(); | ||
329 | } | ||
330 | |||
331 | TEST_F(DebounceTest, OneKeyDelayedScan6) { | ||
332 | addEvents({ /* Time, Inputs, Outputs */ | ||
333 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
334 | |||
335 | {5, {{0, 1, UP}}, {}}, | ||
336 | |||
337 | /* Processing is very late */ | ||
338 | {300, {}, {{0, 1, UP}}}, | ||
339 | |||
340 | /* Press key again after 1ms */ | ||
341 | {301, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
342 | }); | ||
343 | time_jumps_ = true; | ||
344 | runEvents(); | ||
345 | } | ||
346 | |||
347 | TEST_F(DebounceTest, OneKeyDelayedScan7) { | ||
348 | addEvents({ /* Time, Inputs, Outputs */ | ||
349 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
350 | |||
351 | {5, {{0, 1, UP}}, {}}, | ||
352 | |||
353 | /* Press key again before debounce expires */ | ||
354 | {300, {{0, 1, DOWN}}, {}}, | ||
355 | }); | ||
356 | time_jumps_ = true; | ||
357 | runEvents(); | ||
358 | } | ||
359 | |||
360 | TEST_F(DebounceTest, OneKeyDelayedScan8) { | ||
361 | addEvents({ /* Time, Inputs, Outputs */ | ||
362 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
363 | |||
364 | /* Processing is a bit late */ | ||
365 | {50, {}, {}}, | ||
366 | /* Release key after 1ms */ | ||
367 | {51, {{0, 1, UP}}, {}}, | ||
368 | |||
369 | /* Processing is a bit late again */ | ||
370 | {100, {}, {{0, 1, UP}}}, | ||
371 | }); | ||
372 | time_jumps_ = true; | ||
373 | runEvents(); | ||
374 | } | ||
diff --git a/quantum/debounce/tests/debounce_test_common.cpp b/quantum/debounce/tests/debounce_test_common.cpp new file mode 100644 index 000000000..1c5e7c9f4 --- /dev/null +++ b/quantum/debounce/tests/debounce_test_common.cpp | |||
@@ -0,0 +1,229 @@ | |||
1 | /* Copyright 2021 Simon Arlott | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include "gtest/gtest.h" | ||
18 | |||
19 | #include "debounce_test_common.h" | ||
20 | |||
21 | #include <algorithm> | ||
22 | #include <iomanip> | ||
23 | #include <sstream> | ||
24 | |||
25 | extern "C" { | ||
26 | #include "quantum.h" | ||
27 | #include "timer.h" | ||
28 | #include "debounce.h" | ||
29 | |||
30 | void set_time(uint32_t t); | ||
31 | void advance_time(uint32_t ms); | ||
32 | } | ||
33 | |||
34 | void DebounceTest::addEvents(std::initializer_list<DebounceTestEvent> events) { | ||
35 | events_.insert(events_.end(), events.begin(), events.end()); | ||
36 | } | ||
37 | |||
38 | void DebounceTest::runEvents() { | ||
39 | /* Run the test multiple times, from 1kHz to 10kHz scan rate */ | ||
40 | for (extra_iterations_ = 0; extra_iterations_ < 10; extra_iterations_++) { | ||
41 | if (time_jumps_) { | ||
42 | /* Don't advance time smoothly, jump to the next event (some tests require this) */ | ||
43 | auto_advance_time_ = false; | ||
44 | runEventsInternal(); | ||
45 | } else { | ||
46 | /* Run the test with both smooth and irregular time; it must produce the same result */ | ||
47 | auto_advance_time_ = true; | ||
48 | runEventsInternal(); | ||
49 | auto_advance_time_ = false; | ||
50 | runEventsInternal(); | ||
51 | } | ||
52 | } | ||
53 | } | ||
54 | |||
55 | void DebounceTest::runEventsInternal() { | ||
56 | fast_timer_t previous = 0; | ||
57 | bool first = true; | ||
58 | |||
59 | /* Initialise keyboard with start time (offset to avoid testing at 0) and all keys UP */ | ||
60 | debounce_init(MATRIX_ROWS); | ||
61 | set_time(time_offset_); | ||
62 | std::fill(std::begin(input_matrix_), std::end(input_matrix_), 0); | ||
63 | std::fill(std::begin(output_matrix_), std::end(output_matrix_), 0); | ||
64 | |||
65 | for (auto &event : events_) { | ||
66 | if (!auto_advance_time_) { | ||
67 | /* Jump to the next event */ | ||
68 | set_time(time_offset_ + event.time_); | ||
69 | } else if (!first && event.time_ == previous + 1) { | ||
70 | /* This event immediately follows the previous one, don't make extra debounce() calls */ | ||
71 | advance_time(1); | ||
72 | } else { | ||
73 | /* Fast forward to the time for this event, calling debounce() with no changes */ | ||
74 | ASSERT_LT((time_offset_ + event.time_) - timer_read_fast(), 60000) << "Test tries to advance more than 1 minute of time"; | ||
75 | |||
76 | while (timer_read_fast() != time_offset_ + event.time_) { | ||
77 | runDebounce(false); | ||
78 | checkCookedMatrix(false, "debounce() modified cooked matrix"); | ||
79 | advance_time(1); | ||
80 | } | ||
81 | } | ||
82 | |||
83 | first = false; | ||
84 | previous = event.time_; | ||
85 | |||
86 | /* Prepare input matrix */ | ||
87 | for (auto &input : event.inputs_) { | ||
88 | matrixUpdate(input_matrix_, "input", input); | ||
89 | } | ||
90 | |||
91 | /* Call debounce */ | ||
92 | runDebounce(!event.inputs_.empty()); | ||
93 | |||
94 | /* Prepare output matrix */ | ||
95 | for (auto &output : event.outputs_) { | ||
96 | matrixUpdate(output_matrix_, "output", output); | ||
97 | } | ||
98 | |||
99 | /* Check output matrix has expected change events */ | ||
100 | for (auto &output : event.outputs_) { | ||
101 | EXPECT_EQ(!!(cooked_matrix_[output.row_] & (1U << output.col_)), directionValue(output.direction_)) | ||
102 | << "Missing event at " << strTime() | ||
103 | << " expected key " << output.row_ << "," << output.col_ << " " << directionLabel(output.direction_) | ||
104 | << "\ninput_matrix: changed=" << !event.inputs_.empty() << "\n" << strMatrix(input_matrix_) | ||
105 | << "\nexpected_matrix:\n" << strMatrix(output_matrix_) | ||
106 | << "\nactual_matrix:\n" << strMatrix(cooked_matrix_); | ||
107 | } | ||
108 | |||
109 | /* Check output matrix has no other changes */ | ||
110 | checkCookedMatrix(!event.inputs_.empty(), "debounce() cooked matrix does not match expected output matrix"); | ||
111 | |||
112 | /* Perform some extra iterations of the matrix scan with no changes */ | ||
113 | for (int i = 0; i < extra_iterations_; i++) { | ||
114 | runDebounce(false); | ||
115 | checkCookedMatrix(false, "debounce() modified cooked matrix"); | ||
116 | } | ||
117 | } | ||
118 | |||
119 | /* Check that no further changes happen for 1 minute */ | ||
120 | for (int i = 0; i < 60000; i++) { | ||
121 | runDebounce(false); | ||
122 | checkCookedMatrix(false, "debounce() modified cooked matrix"); | ||
123 | advance_time(1); | ||
124 | } | ||
125 | |||
126 | debounce_free(); | ||
127 | } | ||
128 | |||
129 | void DebounceTest::runDebounce(bool changed) { | ||
130 | std::copy(std::begin(input_matrix_), std::end(input_matrix_), std::begin(raw_matrix_)); | ||
131 | std::copy(std::begin(output_matrix_), std::end(output_matrix_), std::begin(cooked_matrix_)); | ||
132 | |||
133 | debounce(raw_matrix_, cooked_matrix_, MATRIX_ROWS, changed); | ||
134 | |||
135 | if (!std::equal(std::begin(input_matrix_), std::end(input_matrix_), std::begin(raw_matrix_))) { | ||
136 | FAIL() << "Fatal error: debounce() modified raw matrix at " << strTime() | ||
137 | << "\ninput_matrix: changed=" << changed << "\n" << strMatrix(input_matrix_) | ||
138 | << "\nraw_matrix:\n" << strMatrix(raw_matrix_); | ||
139 | } | ||
140 | } | ||
141 | |||
142 | void DebounceTest::checkCookedMatrix(bool changed, const std::string &error_message) { | ||
143 | if (!std::equal(std::begin(output_matrix_), std::end(output_matrix_), std::begin(cooked_matrix_))) { | ||
144 | FAIL() << "Unexpected event: " << error_message << " at " << strTime() | ||
145 | << "\ninput_matrix: changed=" << changed << "\n" << strMatrix(input_matrix_) | ||
146 | << "\nexpected_matrix:\n" << strMatrix(output_matrix_) | ||
147 | << "\nactual_matrix:\n" << strMatrix(cooked_matrix_); | ||
148 | } | ||
149 | } | ||
150 | |||
151 | std::string DebounceTest::strTime() { | ||
152 | std::stringstream text; | ||
153 | |||
154 | text << "time " << (timer_read_fast() - time_offset_) | ||
155 | << " (extra_iterations=" << extra_iterations_ | ||
156 | << ", auto_advance_time=" << auto_advance_time_ << ")"; | ||
157 | |||
158 | return text.str(); | ||
159 | } | ||
160 | |||
161 | std::string DebounceTest::strMatrix(matrix_row_t matrix[]) { | ||
162 | std::stringstream text; | ||
163 | |||
164 | text << "\t" << std::setw(3) << ""; | ||
165 | for (int col = 0; col < MATRIX_COLS; col++) { | ||
166 | text << " " << std::setw(2) << col; | ||
167 | } | ||
168 | text << "\n"; | ||
169 | |||
170 | for (int row = 0; row < MATRIX_ROWS; row++) { | ||
171 | text << "\t" << std::setw(2) << row << ":"; | ||
172 | for (int col = 0; col < MATRIX_COLS; col++) { | ||
173 | text << ((matrix[row] & (1U << col)) ? " XX" : " __"); | ||
174 | } | ||
175 | |||
176 | text << "\n"; | ||
177 | } | ||
178 | |||
179 | return text.str(); | ||
180 | } | ||
181 | |||
182 | bool DebounceTest::directionValue(Direction direction) { | ||
183 | switch (direction) { | ||
184 | case DOWN: | ||
185 | return true; | ||
186 | |||
187 | case UP: | ||
188 | return false; | ||
189 | } | ||
190 | } | ||
191 | |||
192 | std::string DebounceTest::directionLabel(Direction direction) { | ||
193 | switch (direction) { | ||
194 | case DOWN: | ||
195 | return "DOWN"; | ||
196 | |||
197 | case UP: | ||
198 | return "UP"; | ||
199 | } | ||
200 | } | ||
201 | |||
202 | /* Modify a matrix and verify that events always specify a change */ | ||
203 | void DebounceTest::matrixUpdate(matrix_row_t matrix[], const std::string &name, const MatrixTestEvent &event) { | ||
204 | ASSERT_NE(!!(matrix[event.row_] & (1U << event.col_)), directionValue(event.direction_)) | ||
205 | << "Test " << name << " at " << strTime() | ||
206 | << " sets key " << event.row_ << "," << event.col_ << " " << directionLabel(event.direction_) | ||
207 | << " but it is already " << directionLabel(event.direction_) | ||
208 | << "\n" << name << "_matrix:\n" << strMatrix(matrix); | ||
209 | |||
210 | switch (event.direction_) { | ||
211 | case DOWN: | ||
212 | matrix[event.row_] |= (1U << event.col_); | ||
213 | break; | ||
214 | |||
215 | case UP: | ||
216 | matrix[event.row_] &= ~(1U << event.col_); | ||
217 | break; | ||
218 | } | ||
219 | } | ||
220 | |||
221 | DebounceTestEvent::DebounceTestEvent(fast_timer_t time, | ||
222 | std::initializer_list<MatrixTestEvent> inputs, | ||
223 | std::initializer_list<MatrixTestEvent> outputs) | ||
224 | : time_(time), inputs_(inputs), outputs_(outputs) { | ||
225 | } | ||
226 | |||
227 | MatrixTestEvent::MatrixTestEvent(int row, int col, Direction direction) | ||
228 | : row_(row), col_(col), direction_(direction) { | ||
229 | } | ||
diff --git a/quantum/debounce/tests/debounce_test_common.h b/quantum/debounce/tests/debounce_test_common.h new file mode 100644 index 000000000..d87e31059 --- /dev/null +++ b/quantum/debounce/tests/debounce_test_common.h | |||
@@ -0,0 +1,83 @@ | |||
1 | /* Copyright 2021 Simon Arlott | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include "gtest/gtest.h" | ||
18 | |||
19 | #include <initializer_list> | ||
20 | #include <list> | ||
21 | #include <string> | ||
22 | |||
23 | extern "C" { | ||
24 | #include "quantum.h" | ||
25 | #include "timer.h" | ||
26 | } | ||
27 | |||
28 | enum Direction { | ||
29 | DOWN, | ||
30 | UP, | ||
31 | }; | ||
32 | |||
33 | class MatrixTestEvent { | ||
34 | public: | ||
35 | MatrixTestEvent(int row, int col, Direction direction); | ||
36 | |||
37 | const int row_; | ||
38 | const int col_; | ||
39 | const Direction direction_; | ||
40 | }; | ||
41 | |||
42 | class DebounceTestEvent { | ||
43 | public: | ||
44 | // 0, {{0, 1, DOWN}}, {{0, 1, DOWN}}) | ||
45 | DebounceTestEvent(fast_timer_t time, | ||
46 | std::initializer_list<MatrixTestEvent> inputs, | ||
47 | std::initializer_list<MatrixTestEvent> outputs); | ||
48 | |||
49 | const fast_timer_t time_; | ||
50 | const std::list<MatrixTestEvent> inputs_; | ||
51 | const std::list<MatrixTestEvent> outputs_; | ||
52 | }; | ||
53 | |||
54 | class DebounceTest : public ::testing::Test { | ||
55 | protected: | ||
56 | void addEvents(std::initializer_list<DebounceTestEvent> events); | ||
57 | void runEvents(); | ||
58 | |||
59 | fast_timer_t time_offset_ = 7777; | ||
60 | bool time_jumps_ = false; | ||
61 | |||
62 | private: | ||
63 | static bool directionValue(Direction direction); | ||
64 | static std::string directionLabel(Direction direction); | ||
65 | |||
66 | void runEventsInternal(); | ||
67 | void runDebounce(bool changed); | ||
68 | void checkCookedMatrix(bool changed, const std::string &error_message); | ||
69 | void matrixUpdate(matrix_row_t matrix[], const std::string &name, const MatrixTestEvent &event); | ||
70 | |||
71 | std::string strTime(); | ||
72 | std::string strMatrix(matrix_row_t matrix[]); | ||
73 | |||
74 | std::list<DebounceTestEvent> events_; | ||
75 | |||
76 | matrix_row_t input_matrix_[MATRIX_ROWS]; | ||
77 | matrix_row_t raw_matrix_[MATRIX_ROWS]; | ||
78 | matrix_row_t cooked_matrix_[MATRIX_ROWS]; | ||
79 | matrix_row_t output_matrix_[MATRIX_ROWS]; | ||
80 | |||
81 | int extra_iterations_; | ||
82 | bool auto_advance_time_; | ||
83 | }; | ||
diff --git a/quantum/debounce/tests/rules.mk b/quantum/debounce/tests/rules.mk new file mode 100644 index 000000000..66928d7eb --- /dev/null +++ b/quantum/debounce/tests/rules.mk | |||
@@ -0,0 +1,44 @@ | |||
1 | # Copyright 2021 Simon Arlott | ||
2 | # | ||
3 | # This program is free software: you can redistribute it and/or modify | ||
4 | # it under the terms of the GNU General Public License as published by | ||
5 | # the Free Software Foundation, either version 2 of the License, or | ||
6 | # (at your option) any later version. | ||
7 | # | ||
8 | # This program is distributed in the hope that it will be useful, | ||
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | # GNU General Public License for more details. | ||
12 | # | ||
13 | # You should have received a copy of the GNU General Public License | ||
14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | |||
16 | DEBOUNCE_COMMON_DEFS := -DMATRIX_ROWS=4 -DMATRIX_COLS=10 -DDEBOUNCE=5 | ||
17 | |||
18 | DEBOUNCE_COMMON_SRC := $(QUANTUM_PATH)/debounce/tests/debounce_test_common.cpp \ | ||
19 | $(TMK_PATH)/common/test/timer.c | ||
20 | |||
21 | debounce_sym_defer_g_DEFS := $(DEBOUNCE_COMMON_DEFS) | ||
22 | debounce_sym_defer_g_SRC := $(DEBOUNCE_COMMON_SRC) \ | ||
23 | $(QUANTUM_PATH)/debounce/sym_defer_g.c \ | ||
24 | $(QUANTUM_PATH)/debounce/tests/sym_defer_g_tests.cpp | ||
25 | |||
26 | debounce_sym_defer_pk_DEFS := $(DEBOUNCE_COMMON_DEFS) | ||
27 | debounce_sym_defer_pk_SRC := $(DEBOUNCE_COMMON_SRC) \ | ||
28 | $(QUANTUM_PATH)/debounce/sym_defer_pk.c \ | ||
29 | $(QUANTUM_PATH)/debounce/tests/sym_defer_pk_tests.cpp | ||
30 | |||
31 | debounce_sym_eager_pk_DEFS := $(DEBOUNCE_COMMON_DEFS) | ||
32 | debounce_sym_eager_pk_SRC := $(DEBOUNCE_COMMON_SRC) \ | ||
33 | $(QUANTUM_PATH)/debounce/sym_eager_pk.c \ | ||
34 | $(QUANTUM_PATH)/debounce/tests/sym_eager_pk_tests.cpp | ||
35 | |||
36 | debounce_sym_eager_pr_DEFS := $(DEBOUNCE_COMMON_DEFS) | ||
37 | debounce_sym_eager_pr_SRC := $(DEBOUNCE_COMMON_SRC) \ | ||
38 | $(QUANTUM_PATH)/debounce/sym_eager_pr.c \ | ||
39 | $(QUANTUM_PATH)/debounce/tests/sym_eager_pr_tests.cpp | ||
40 | |||
41 | debounce_asym_eager_defer_pk_DEFS := $(DEBOUNCE_COMMON_DEFS) | ||
42 | debounce_asym_eager_defer_pk_SRC := $(DEBOUNCE_COMMON_SRC) \ | ||
43 | $(QUANTUM_PATH)/debounce/asym_eager_defer_pk.c \ | ||
44 | $(QUANTUM_PATH)/debounce/tests/asym_eager_defer_pk_tests.cpp | ||
diff --git a/quantum/debounce/tests/sym_defer_g_tests.cpp b/quantum/debounce/tests/sym_defer_g_tests.cpp new file mode 100644 index 000000000..a56aecd8f --- /dev/null +++ b/quantum/debounce/tests/sym_defer_g_tests.cpp | |||
@@ -0,0 +1,223 @@ | |||
1 | /* Copyright 2021 Simon Arlott | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include "gtest/gtest.h" | ||
18 | |||
19 | #include "debounce_test_common.h" | ||
20 | |||
21 | TEST_F(DebounceTest, OneKeyShort1) { | ||
22 | addEvents({ /* Time, Inputs, Outputs */ | ||
23 | {0, {{0, 1, DOWN}}, {}}, | ||
24 | |||
25 | {5, {}, {{0, 1, DOWN}}}, | ||
26 | /* 0ms delay (fast scan rate) */ | ||
27 | {5, {{0, 1, UP}}, {}}, | ||
28 | |||
29 | {10, {}, {{0, 1, UP}}}, | ||
30 | }); | ||
31 | runEvents(); | ||
32 | } | ||
33 | |||
34 | TEST_F(DebounceTest, OneKeyShort2) { | ||
35 | addEvents({ /* Time, Inputs, Outputs */ | ||
36 | {0, {{0, 1, DOWN}}, {}}, | ||
37 | |||
38 | {5, {}, {{0, 1, DOWN}}}, | ||
39 | /* 1ms delay */ | ||
40 | {6, {{0, 1, UP}}, {}}, | ||
41 | |||
42 | {11, {}, {{0, 1, UP}}}, | ||
43 | }); | ||
44 | runEvents(); | ||
45 | } | ||
46 | |||
47 | TEST_F(DebounceTest, OneKeyShort3) { | ||
48 | addEvents({ /* Time, Inputs, Outputs */ | ||
49 | {0, {{0, 1, DOWN}}, {}}, | ||
50 | |||
51 | {5, {}, {{0, 1, DOWN}}}, | ||
52 | /* 2ms delay */ | ||
53 | {7, {{0, 1, UP}}, {}}, | ||
54 | |||
55 | {12, {}, {{0, 1, UP}}}, | ||
56 | }); | ||
57 | runEvents(); | ||
58 | } | ||
59 | |||
60 | TEST_F(DebounceTest, OneKeyTooQuick1) { | ||
61 | addEvents({ /* Time, Inputs, Outputs */ | ||
62 | {0, {{0, 1, DOWN}}, {}}, | ||
63 | /* Release key exactly on the debounce time */ | ||
64 | {5, {{0, 1, UP}}, {}}, | ||
65 | }); | ||
66 | runEvents(); | ||
67 | } | ||
68 | |||
69 | TEST_F(DebounceTest, OneKeyTooQuick2) { | ||
70 | addEvents({ /* Time, Inputs, Outputs */ | ||
71 | {0, {{0, 1, DOWN}}, {}}, | ||
72 | |||
73 | {5, {}, {{0, 1, DOWN}}}, | ||
74 | {6, {{0, 1, UP}}, {}}, | ||
75 | |||
76 | /* Press key exactly on the debounce time */ | ||
77 | {11, {{0, 1, DOWN}}, {}}, | ||
78 | }); | ||
79 | runEvents(); | ||
80 | } | ||
81 | |||
82 | TEST_F(DebounceTest, OneKeyBouncing1) { | ||
83 | addEvents({ /* Time, Inputs, Outputs */ | ||
84 | {0, {{0, 1, DOWN}}, {}}, | ||
85 | {1, {{0, 1, UP}}, {}}, | ||
86 | {2, {{0, 1, DOWN}}, {}}, | ||
87 | {3, {{0, 1, UP}}, {}}, | ||
88 | {4, {{0, 1, DOWN}}, {}}, | ||
89 | {5, {{0, 1, UP}}, {}}, | ||
90 | {6, {{0, 1, DOWN}}, {}}, | ||
91 | {11, {}, {{0, 1, DOWN}}}, /* 5ms after DOWN at time 7 */ | ||
92 | }); | ||
93 | runEvents(); | ||
94 | } | ||
95 | |||
96 | TEST_F(DebounceTest, OneKeyBouncing2) { | ||
97 | addEvents({ /* Time, Inputs, Outputs */ | ||
98 | {0, {{0, 1, DOWN}}, {}}, | ||
99 | {5, {}, {{0, 1, DOWN}}}, | ||
100 | {6, {{0, 1, UP}}, {}}, | ||
101 | {7, {{0, 1, DOWN}}, {}}, | ||
102 | {8, {{0, 1, UP}}, {}}, | ||
103 | {9, {{0, 1, DOWN}}, {}}, | ||
104 | {10, {{0, 1, UP}}, {}}, | ||
105 | {15, {}, {{0, 1, UP}}}, /* 5ms after UP at time 10 */ | ||
106 | }); | ||
107 | runEvents(); | ||
108 | } | ||
109 | |||
110 | TEST_F(DebounceTest, OneKeyLong) { | ||
111 | addEvents({ /* Time, Inputs, Outputs */ | ||
112 | {0, {{0, 1, DOWN}}, {}}, | ||
113 | |||
114 | {5, {}, {{0, 1, DOWN}}}, | ||
115 | |||
116 | {25, {{0, 1, UP}}, {}}, | ||
117 | |||
118 | {30, {}, {{0, 1, UP}}}, | ||
119 | |||
120 | {50, {{0, 1, DOWN}}, {}}, | ||
121 | |||
122 | {55, {}, {{0, 1, DOWN}}}, | ||
123 | }); | ||
124 | runEvents(); | ||
125 | } | ||
126 | |||
127 | TEST_F(DebounceTest, TwoKeysShort) { | ||
128 | addEvents({ /* Time, Inputs, Outputs */ | ||
129 | {0, {{0, 1, DOWN}}, {}}, | ||
130 | {1, {{0, 2, DOWN}}, {}}, | ||
131 | |||
132 | {6, {}, {{0, 1, DOWN}, {0, 2, DOWN}}}, | ||
133 | |||
134 | {7, {{0, 1, UP}}, {}}, | ||
135 | {8, {{0, 2, UP}}, {}}, | ||
136 | |||
137 | {13, {}, {{0, 1, UP}, {0, 2, UP}}}, | ||
138 | }); | ||
139 | runEvents(); | ||
140 | } | ||
141 | |||
142 | TEST_F(DebounceTest, TwoKeysSimultaneous1) { | ||
143 | addEvents({ /* Time, Inputs, Outputs */ | ||
144 | {0, {{0, 1, DOWN}, {0, 2, DOWN}}, {}}, | ||
145 | |||
146 | {5, {}, {{0, 1, DOWN}, {0, 2, DOWN}}}, | ||
147 | {6, {{0, 1, UP}, {0, 2, UP}}, {}}, | ||
148 | |||
149 | {11, {}, {{0, 1, UP}, {0, 2, UP}}}, | ||
150 | }); | ||
151 | runEvents(); | ||
152 | } | ||
153 | |||
154 | TEST_F(DebounceTest, TwoKeysSimultaneous2) { | ||
155 | addEvents({ /* Time, Inputs, Outputs */ | ||
156 | {0, {{0, 1, DOWN}}, {}}, | ||
157 | {1, {{0, 2, DOWN}}, {}}, | ||
158 | |||
159 | {5, {}, {}}, | ||
160 | {6, {}, {{0, 1, DOWN}, {0, 2, DOWN}}}, | ||
161 | {7, {{0, 1, UP}}, {}}, | ||
162 | {8, {{0, 2, UP}}, {}}, | ||
163 | |||
164 | {13, {}, {{0, 1, UP}, {0, 2, UP}}}, | ||
165 | }); | ||
166 | runEvents(); | ||
167 | } | ||
168 | |||
169 | TEST_F(DebounceTest, OneKeyDelayedScan1) { | ||
170 | addEvents({ /* Time, Inputs, Outputs */ | ||
171 | {0, {{0, 1, DOWN}}, {}}, | ||
172 | |||
173 | /* Processing is very late */ | ||
174 | {300, {}, {{0, 1, DOWN}}}, | ||
175 | /* Immediately release key */ | ||
176 | {300, {{0, 1, UP}}, {}}, | ||
177 | |||
178 | {305, {}, {{0, 1, UP}}}, | ||
179 | }); | ||
180 | time_jumps_ = true; | ||
181 | runEvents(); | ||
182 | } | ||
183 | |||
184 | TEST_F(DebounceTest, OneKeyDelayedScan2) { | ||
185 | addEvents({ /* Time, Inputs, Outputs */ | ||
186 | {0, {{0, 1, DOWN}}, {}}, | ||
187 | |||
188 | /* Processing is very late */ | ||
189 | {300, {}, {{0, 1, DOWN}}}, | ||
190 | /* Release key after 1ms */ | ||
191 | {301, {{0, 1, UP}}, {}}, | ||
192 | |||
193 | {306, {}, {{0, 1, UP}}}, | ||
194 | }); | ||
195 | time_jumps_ = true; | ||
196 | runEvents(); | ||
197 | } | ||
198 | |||
199 | TEST_F(DebounceTest, OneKeyDelayedScan3) { | ||
200 | addEvents({ /* Time, Inputs, Outputs */ | ||
201 | {0, {{0, 1, DOWN}}, {}}, | ||
202 | |||
203 | /* Release key before debounce expires */ | ||
204 | {300, {{0, 1, UP}}, {}}, | ||
205 | }); | ||
206 | time_jumps_ = true; | ||
207 | runEvents(); | ||
208 | } | ||
209 | |||
210 | TEST_F(DebounceTest, OneKeyDelayedScan4) { | ||
211 | addEvents({ /* Time, Inputs, Outputs */ | ||
212 | {0, {{0, 1, DOWN}}, {}}, | ||
213 | |||
214 | /* Processing is a bit late */ | ||
215 | {50, {}, {{0, 1, DOWN}}}, | ||
216 | /* Release key after 1ms */ | ||
217 | {51, {{0, 1, UP}}, {}}, | ||
218 | |||
219 | {56, {}, {{0, 1, UP}}}, | ||
220 | }); | ||
221 | time_jumps_ = true; | ||
222 | runEvents(); | ||
223 | } | ||
diff --git a/quantum/debounce/tests/sym_defer_pk_tests.cpp b/quantum/debounce/tests/sym_defer_pk_tests.cpp new file mode 100644 index 000000000..1f3061e59 --- /dev/null +++ b/quantum/debounce/tests/sym_defer_pk_tests.cpp | |||
@@ -0,0 +1,225 @@ | |||
1 | /* Copyright 2021 Simon Arlott | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include "gtest/gtest.h" | ||
18 | |||
19 | #include "debounce_test_common.h" | ||
20 | |||
21 | TEST_F(DebounceTest, OneKeyShort1) { | ||
22 | addEvents({ /* Time, Inputs, Outputs */ | ||
23 | {0, {{0, 1, DOWN}}, {}}, | ||
24 | |||
25 | {5, {}, {{0, 1, DOWN}}}, | ||
26 | /* 0ms delay (fast scan rate) */ | ||
27 | {5, {{0, 1, UP}}, {}}, | ||
28 | |||
29 | {10, {}, {{0, 1, UP}}}, | ||
30 | }); | ||
31 | runEvents(); | ||
32 | } | ||
33 | |||
34 | TEST_F(DebounceTest, OneKeyShort2) { | ||
35 | addEvents({ /* Time, Inputs, Outputs */ | ||
36 | {0, {{0, 1, DOWN}}, {}}, | ||
37 | |||
38 | {5, {}, {{0, 1, DOWN}}}, | ||
39 | /* 1ms delay */ | ||
40 | {6, {{0, 1, UP}}, {}}, | ||
41 | |||
42 | {11, {}, {{0, 1, UP}}}, | ||
43 | }); | ||
44 | runEvents(); | ||
45 | } | ||
46 | |||
47 | TEST_F(DebounceTest, OneKeyShort3) { | ||
48 | addEvents({ /* Time, Inputs, Outputs */ | ||
49 | {0, {{0, 1, DOWN}}, {}}, | ||
50 | |||
51 | {5, {}, {{0, 1, DOWN}}}, | ||
52 | /* 2ms delay */ | ||
53 | {7, {{0, 1, UP}}, {}}, | ||
54 | |||
55 | {12, {}, {{0, 1, UP}}}, | ||
56 | }); | ||
57 | runEvents(); | ||
58 | } | ||
59 | |||
60 | TEST_F(DebounceTest, OneKeyTooQuick1) { | ||
61 | addEvents({ /* Time, Inputs, Outputs */ | ||
62 | {0, {{0, 1, DOWN}}, {}}, | ||
63 | /* Release key exactly on the debounce time */ | ||
64 | {5, {{0, 1, UP}}, {}}, | ||
65 | }); | ||
66 | runEvents(); | ||
67 | } | ||
68 | |||
69 | TEST_F(DebounceTest, OneKeyTooQuick2) { | ||
70 | addEvents({ /* Time, Inputs, Outputs */ | ||
71 | {0, {{0, 1, DOWN}}, {}}, | ||
72 | |||
73 | {5, {}, {{0, 1, DOWN}}}, | ||
74 | {6, {{0, 1, UP}}, {}}, | ||
75 | |||
76 | /* Press key exactly on the debounce time */ | ||
77 | {11, {{0, 1, DOWN}}, {}}, | ||
78 | }); | ||
79 | runEvents(); | ||
80 | } | ||
81 | |||
82 | TEST_F(DebounceTest, OneKeyBouncing1) { | ||
83 | addEvents({ /* Time, Inputs, Outputs */ | ||
84 | {0, {{0, 1, DOWN}}, {}}, | ||
85 | {1, {{0, 1, UP}}, {}}, | ||
86 | {2, {{0, 1, DOWN}}, {}}, | ||
87 | {3, {{0, 1, UP}}, {}}, | ||
88 | {4, {{0, 1, DOWN}}, {}}, | ||
89 | {5, {{0, 1, UP}}, {}}, | ||
90 | {6, {{0, 1, DOWN}}, {}}, | ||
91 | {11, {}, {{0, 1, DOWN}}}, /* 5ms after DOWN at time 7 */ | ||
92 | }); | ||
93 | runEvents(); | ||
94 | } | ||
95 | |||
96 | TEST_F(DebounceTest, OneKeyBouncing2) { | ||
97 | addEvents({ /* Time, Inputs, Outputs */ | ||
98 | {0, {{0, 1, DOWN}}, {}}, | ||
99 | {5, {}, {{0, 1, DOWN}}}, | ||
100 | {6, {{0, 1, UP}}, {}}, | ||
101 | {7, {{0, 1, DOWN}}, {}}, | ||
102 | {8, {{0, 1, UP}}, {}}, | ||
103 | {9, {{0, 1, DOWN}}, {}}, | ||
104 | {10, {{0, 1, UP}}, {}}, | ||
105 | {15, {}, {{0, 1, UP}}}, /* 5ms after UP at time 10 */ | ||
106 | }); | ||
107 | runEvents(); | ||
108 | } | ||
109 | |||
110 | TEST_F(DebounceTest, OneKeyLong) { | ||
111 | addEvents({ /* Time, Inputs, Outputs */ | ||
112 | {0, {{0, 1, DOWN}}, {}}, | ||
113 | |||
114 | {5, {}, {{0, 1, DOWN}}}, | ||
115 | |||
116 | {25, {{0, 1, UP}}, {}}, | ||
117 | |||
118 | {30, {}, {{0, 1, UP}}}, | ||
119 | |||
120 | {50, {{0, 1, DOWN}}, {}}, | ||
121 | |||
122 | {55, {}, {{0, 1, DOWN}}}, | ||
123 | }); | ||
124 | runEvents(); | ||
125 | } | ||
126 | |||
127 | TEST_F(DebounceTest, TwoKeysShort) { | ||
128 | addEvents({ /* Time, Inputs, Outputs */ | ||
129 | {0, {{0, 1, DOWN}}, {}}, | ||
130 | {1, {{0, 2, DOWN}}, {}}, | ||
131 | |||
132 | {5, {}, {{0, 1, DOWN}}}, | ||
133 | {6, {}, {{0, 2, DOWN}}}, | ||
134 | |||
135 | {7, {{0, 1, UP}}, {}}, | ||
136 | {8, {{0, 2, UP}}, {}}, | ||
137 | |||
138 | {12, {}, {{0, 1, UP}}}, | ||
139 | {13, {}, {{0, 2, UP}}}, | ||
140 | }); | ||
141 | runEvents(); | ||
142 | } | ||
143 | |||
144 | TEST_F(DebounceTest, TwoKeysSimultaneous1) { | ||
145 | addEvents({ /* Time, Inputs, Outputs */ | ||
146 | {0, {{0, 1, DOWN}, {0, 2, DOWN}}, {}}, | ||
147 | |||
148 | {5, {}, {{0, 1, DOWN}, {0, 2, DOWN}}}, | ||
149 | {6, {{0, 1, UP}, {0, 2, UP}}, {}}, | ||
150 | |||
151 | {11, {}, {{0, 1, UP}, {0, 2, UP}}}, | ||
152 | }); | ||
153 | runEvents(); | ||
154 | } | ||
155 | |||
156 | TEST_F(DebounceTest, TwoKeysSimultaneous2) { | ||
157 | addEvents({ /* Time, Inputs, Outputs */ | ||
158 | {0, {{0, 1, DOWN}}, {}}, | ||
159 | {1, {{0, 2, DOWN}}, {}}, | ||
160 | |||
161 | {5, {}, {{0, 1, DOWN}}}, | ||
162 | {6, {{0, 1, UP}}, {{0, 2, DOWN}}}, | ||
163 | {7, {{0, 2, UP}}, {}}, | ||
164 | |||
165 | {11, {}, {{0, 1, UP}}}, | ||
166 | {12, {}, {{0, 2, UP}}}, | ||
167 | }); | ||
168 | runEvents(); | ||
169 | } | ||
170 | |||
171 | TEST_F(DebounceTest, OneKeyDelayedScan1) { | ||
172 | addEvents({ /* Time, Inputs, Outputs */ | ||
173 | {0, {{0, 1, DOWN}}, {}}, | ||
174 | |||
175 | /* Processing is very late */ | ||
176 | {300, {}, {{0, 1, DOWN}}}, | ||
177 | /* Immediately release key */ | ||
178 | {300, {{0, 1, UP}}, {}}, | ||
179 | |||
180 | {305, {}, {{0, 1, UP}}}, | ||
181 | }); | ||
182 | time_jumps_ = true; | ||
183 | runEvents(); | ||
184 | } | ||
185 | |||
186 | TEST_F(DebounceTest, OneKeyDelayedScan2) { | ||
187 | addEvents({ /* Time, Inputs, Outputs */ | ||
188 | {0, {{0, 1, DOWN}}, {}}, | ||
189 | |||
190 | /* Processing is very late */ | ||
191 | {300, {}, {{0, 1, DOWN}}}, | ||
192 | /* Release key after 1ms */ | ||
193 | {301, {{0, 1, UP}}, {}}, | ||
194 | |||
195 | {306, {}, {{0, 1, UP}}}, | ||
196 | }); | ||
197 | time_jumps_ = true; | ||
198 | runEvents(); | ||
199 | } | ||
200 | |||
201 | TEST_F(DebounceTest, OneKeyDelayedScan3) { | ||
202 | addEvents({ /* Time, Inputs, Outputs */ | ||
203 | {0, {{0, 1, DOWN}}, {}}, | ||
204 | |||
205 | /* Release key before debounce expires */ | ||
206 | {300, {{0, 1, UP}}, {}}, | ||
207 | }); | ||
208 | time_jumps_ = true; | ||
209 | runEvents(); | ||
210 | } | ||
211 | |||
212 | TEST_F(DebounceTest, OneKeyDelayedScan4) { | ||
213 | addEvents({ /* Time, Inputs, Outputs */ | ||
214 | {0, {{0, 1, DOWN}}, {}}, | ||
215 | |||
216 | /* Processing is a bit late */ | ||
217 | {50, {}, {{0, 1, DOWN}}}, | ||
218 | /* Release key after 1ms */ | ||
219 | {51, {{0, 1, UP}}, {}}, | ||
220 | |||
221 | {56, {}, {{0, 1, UP}}}, | ||
222 | }); | ||
223 | time_jumps_ = true; | ||
224 | runEvents(); | ||
225 | } | ||
diff --git a/quantum/debounce/tests/sym_eager_pk_tests.cpp b/quantum/debounce/tests/sym_eager_pk_tests.cpp new file mode 100644 index 000000000..e0fc205e3 --- /dev/null +++ b/quantum/debounce/tests/sym_eager_pk_tests.cpp | |||
@@ -0,0 +1,237 @@ | |||
1 | /* Copyright 2021 Simon Arlott | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include "gtest/gtest.h" | ||
18 | |||
19 | #include "debounce_test_common.h" | ||
20 | |||
21 | TEST_F(DebounceTest, OneKeyShort1) { | ||
22 | addEvents({ /* Time, Inputs, Outputs */ | ||
23 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
24 | {1, {{0, 1, UP}}, {}}, | ||
25 | |||
26 | {5, {}, {{0, 1, UP}}}, | ||
27 | /* Press key again after 1ms delay (debounce has not yet finished) */ | ||
28 | {6, {{0, 1, DOWN}}, {}}, | ||
29 | {10, {}, {{0, 1, DOWN}}}, /* 5ms after UP at time 5 */ | ||
30 | }); | ||
31 | runEvents(); | ||
32 | } | ||
33 | |||
34 | TEST_F(DebounceTest, OneKeyShort2) { | ||
35 | addEvents({ /* Time, Inputs, Outputs */ | ||
36 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
37 | {1, {{0, 1, UP}}, {}}, | ||
38 | |||
39 | {5, {}, {{0, 1, UP}}}, | ||
40 | /* Press key again after 2ms delay (debounce has not yet finished) */ | ||
41 | {7, {{0, 1, DOWN}}, {}}, | ||
42 | {10, {}, {{0, 1, DOWN}}}, /* 5ms after UP at time 5 */ | ||
43 | }); | ||
44 | runEvents(); | ||
45 | } | ||
46 | |||
47 | TEST_F(DebounceTest, OneKeyShort3) { | ||
48 | addEvents({ /* Time, Inputs, Outputs */ | ||
49 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
50 | {1, {{0, 1, UP}}, {}}, | ||
51 | |||
52 | {5, {}, {{0, 1, UP}}}, | ||
53 | /* Press key again after 3ms delay (debounce has not yet finished) */ | ||
54 | {8, {{0, 1, DOWN}}, {}}, | ||
55 | {10, {}, {{0, 1, DOWN}}}, /* 5ms after UP at time 5 */ | ||
56 | }); | ||
57 | runEvents(); | ||
58 | } | ||
59 | |||
60 | TEST_F(DebounceTest, OneKeyShort4) { | ||
61 | addEvents({ /* Time, Inputs, Outputs */ | ||
62 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
63 | {1, {{0, 1, UP}}, {}}, | ||
64 | |||
65 | {5, {}, {{0, 1, UP}}}, | ||
66 | /* Press key again after 4ms delay (debounce has not yet finished) */ | ||
67 | {9, {{0, 1, DOWN}}, {}}, | ||
68 | {10, {}, {{0, 1, DOWN}}}, /* 5ms after UP at time 5 */ | ||
69 | }); | ||
70 | runEvents(); | ||
71 | } | ||
72 | |||
73 | TEST_F(DebounceTest, OneKeyShort5) { | ||
74 | addEvents({ /* Time, Inputs, Outputs */ | ||
75 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
76 | {1, {{0, 1, UP}}, {}}, | ||
77 | |||
78 | {5, {}, {{0, 1, UP}}}, | ||
79 | /* Press key again after 5ms delay (debounce has finished) */ | ||
80 | {10, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
81 | }); | ||
82 | runEvents(); | ||
83 | } | ||
84 | |||
85 | TEST_F(DebounceTest, OneKeyShort6) { | ||
86 | addEvents({ /* Time, Inputs, Outputs */ | ||
87 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
88 | {1, {{0, 1, UP}}, {}}, | ||
89 | |||
90 | {5, {}, {{0, 1, UP}}}, | ||
91 | /* Press key after after 6ms delay (debounce has finished) */ | ||
92 | {11, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
93 | }); | ||
94 | runEvents(); | ||
95 | } | ||
96 | |||
97 | TEST_F(DebounceTest, OneKeyBouncing1) { | ||
98 | addEvents({ /* Time, Inputs, Outputs */ | ||
99 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
100 | {1, {{0, 1, UP}}, {}}, | ||
101 | {2, {{0, 1, DOWN}}, {}}, | ||
102 | {3, {{0, 1, UP}}, {}}, | ||
103 | {4, {{0, 1, DOWN}}, {}}, | ||
104 | {5, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
105 | /* Press key again after 1ms delay (debounce has not yet finished) */ | ||
106 | {6, {{0, 1, DOWN}}, {}}, | ||
107 | {10, {}, {{0, 1, DOWN}}}, /* 5ms after UP at time 5 */ | ||
108 | }); | ||
109 | runEvents(); | ||
110 | } | ||
111 | |||
112 | TEST_F(DebounceTest, OneKeyBouncing2) { | ||
113 | addEvents({ /* Time, Inputs, Outputs */ | ||
114 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
115 | /* Change twice in the same time period */ | ||
116 | {1, {{0, 1, UP}}, {}}, | ||
117 | {1, {{0, 1, DOWN}}, {}}, | ||
118 | /* Change three times in the same time period */ | ||
119 | {2, {{0, 1, UP}}, {}}, | ||
120 | {2, {{0, 1, DOWN}}, {}}, | ||
121 | {2, {{0, 1, UP}}, {}}, | ||
122 | /* Change three times in the same time period */ | ||
123 | {3, {{0, 1, DOWN}}, {}}, | ||
124 | {3, {{0, 1, UP}}, {}}, | ||
125 | {3, {{0, 1, DOWN}}, {}}, | ||
126 | /* Change twice in the same time period */ | ||
127 | {4, {{0, 1, UP}}, {}}, | ||
128 | {4, {{0, 1, DOWN}}, {}}, | ||
129 | {5, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
130 | /* Press key again after 1ms delay (debounce has not yet finished) */ | ||
131 | {6, {{0, 1, DOWN}}, {}}, | ||
132 | {10, {}, {{0, 1, DOWN}}}, /* 5ms after UP at time 5 */ | ||
133 | }); | ||
134 | runEvents(); | ||
135 | } | ||
136 | |||
137 | TEST_F(DebounceTest, OneKeyLong) { | ||
138 | addEvents({ /* Time, Inputs, Outputs */ | ||
139 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
140 | |||
141 | {25, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
142 | |||
143 | {50, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
144 | }); | ||
145 | runEvents(); | ||
146 | } | ||
147 | |||
148 | TEST_F(DebounceTest, TwoKeysShort) { | ||
149 | addEvents({ /* Time, Inputs, Outputs */ | ||
150 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
151 | {1, {{0, 1, UP}}, {}}, | ||
152 | {2, {{0, 2, DOWN}}, {{0, 2, DOWN}}}, | ||
153 | {3, {{0, 2, UP}}, {}}, | ||
154 | |||
155 | {5, {}, {{0, 1, UP}}}, | ||
156 | /* Press key again after 1ms delay (debounce has not yet finished) */ | ||
157 | {6, {{0, 1, DOWN}}, {}}, | ||
158 | {7, {}, {{0, 2, UP}}}, | ||
159 | |||
160 | /* Press key again after 1ms delay (debounce has not yet finished) */ | ||
161 | {9, {{0, 2, DOWN}}, {}}, | ||
162 | {10, {}, {{0, 1, DOWN}}}, /* 5ms after UP at time 5 */ | ||
163 | |||
164 | {12, {}, {{0, 2, DOWN}}}, /* 5ms after UP at time 7 */ | ||
165 | }); | ||
166 | runEvents(); | ||
167 | } | ||
168 | |||
169 | TEST_F(DebounceTest, OneKeyDelayedScan1) { | ||
170 | addEvents({ /* Time, Inputs, Outputs */ | ||
171 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
172 | |||
173 | /* Processing is very late but the change will now be accepted */ | ||
174 | {300, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
175 | }); | ||
176 | time_jumps_ = true; | ||
177 | runEvents(); | ||
178 | } | ||
179 | |||
180 | TEST_F(DebounceTest, OneKeyDelayedScan2) { | ||
181 | addEvents({ /* Time, Inputs, Outputs */ | ||
182 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
183 | |||
184 | /* Processing is very late but the change will now be accepted even with a 1 scan delay */ | ||
185 | {300, {}, {}}, | ||
186 | {300, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
187 | }); | ||
188 | time_jumps_ = true; | ||
189 | runEvents(); | ||
190 | } | ||
191 | |||
192 | TEST_F(DebounceTest, OneKeyDelayedScan3) { | ||
193 | addEvents({ /* Time, Inputs, Outputs */ | ||
194 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
195 | |||
196 | /* Processing is very late but the change will now be accepted even with a 1ms delay */ | ||
197 | {300, {}, {}}, | ||
198 | {301, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
199 | }); | ||
200 | time_jumps_ = true; | ||
201 | runEvents(); | ||
202 | } | ||
203 | |||
204 | TEST_F(DebounceTest, OneKeyDelayedScan4) { | ||
205 | addEvents({ /* Time, Inputs, Outputs */ | ||
206 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
207 | |||
208 | /* Processing is a bit late but the change will now be accepted */ | ||
209 | {50, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
210 | }); | ||
211 | time_jumps_ = true; | ||
212 | runEvents(); | ||
213 | } | ||
214 | |||
215 | TEST_F(DebounceTest, OneKeyDelayedScan5) { | ||
216 | addEvents({ /* Time, Inputs, Outputs */ | ||
217 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
218 | |||
219 | /* Processing is very late but the change will now be accepted even with a 1 scan delay */ | ||
220 | {50, {}, {}}, | ||
221 | {50, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
222 | }); | ||
223 | time_jumps_ = true; | ||
224 | runEvents(); | ||
225 | } | ||
226 | |||
227 | TEST_F(DebounceTest, OneKeyDelayedScan6) { | ||
228 | addEvents({ /* Time, Inputs, Outputs */ | ||
229 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
230 | |||
231 | /* Processing is very late but the change will now be accepted even with a 1ms delay */ | ||
232 | {50, {}, {}}, | ||
233 | {51, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
234 | }); | ||
235 | time_jumps_ = true; | ||
236 | runEvents(); | ||
237 | } | ||
diff --git a/quantum/debounce/tests/sym_eager_pr_tests.cpp b/quantum/debounce/tests/sym_eager_pr_tests.cpp new file mode 100644 index 000000000..2c4bca127 --- /dev/null +++ b/quantum/debounce/tests/sym_eager_pr_tests.cpp | |||
@@ -0,0 +1,280 @@ | |||
1 | /* Copyright 2021 Simon Arlott | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include "gtest/gtest.h" | ||
18 | |||
19 | #include "debounce_test_common.h" | ||
20 | |||
21 | TEST_F(DebounceTest, OneKeyShort1) { | ||
22 | addEvents({ /* Time, Inputs, Outputs */ | ||
23 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
24 | {1, {{0, 1, UP}}, {}}, | ||
25 | |||
26 | {5, {}, {{0, 1, UP}}}, | ||
27 | /* Press key again after 1ms delay (debounce has not yet finished) */ | ||
28 | {6, {{0, 1, DOWN}}, {}}, | ||
29 | {10, {}, {{0, 1, DOWN}}}, /* 5ms after UP at time 5 */ | ||
30 | }); | ||
31 | runEvents(); | ||
32 | } | ||
33 | |||
34 | TEST_F(DebounceTest, OneKeyShort2) { | ||
35 | addEvents({ /* Time, Inputs, Outputs */ | ||
36 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
37 | {1, {{0, 1, UP}}, {}}, | ||
38 | |||
39 | {5, {}, {{0, 1, UP}}}, | ||
40 | /* Press key again after 2ms delay (debounce has not yet finished) */ | ||
41 | {7, {{0, 1, DOWN}}, {}}, | ||
42 | {10, {}, {{0, 1, DOWN}}}, /* 5ms after UP at time 5 */ | ||
43 | }); | ||
44 | runEvents(); | ||
45 | } | ||
46 | |||
47 | TEST_F(DebounceTest, OneKeyShort3) { | ||
48 | addEvents({ /* Time, Inputs, Outputs */ | ||
49 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
50 | {1, {{0, 1, UP}}, {}}, | ||
51 | |||
52 | {5, {}, {{0, 1, UP}}}, | ||
53 | /* Press key again after 3ms delay (debounce has not yet finished) */ | ||
54 | {8, {{0, 1, DOWN}}, {}}, | ||
55 | {10, {}, {{0, 1, DOWN}}}, /* 5ms after UP at time 5 */ | ||
56 | }); | ||
57 | runEvents(); | ||
58 | } | ||
59 | |||
60 | TEST_F(DebounceTest, OneKeyShort4) { | ||
61 | addEvents({ /* Time, Inputs, Outputs */ | ||
62 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
63 | {1, {{0, 1, UP}}, {}}, | ||
64 | |||
65 | {5, {}, {{0, 1, UP}}}, | ||
66 | /* Press key again after 4ms delay (debounce has not yet finished) */ | ||
67 | {9, {{0, 1, DOWN}}, {}}, | ||
68 | {10, {}, {{0, 1, DOWN}}}, /* 5ms after UP at time 5 */ | ||
69 | }); | ||
70 | runEvents(); | ||
71 | } | ||
72 | |||
73 | TEST_F(DebounceTest, OneKeyShort5) { | ||
74 | addEvents({ /* Time, Inputs, Outputs */ | ||
75 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
76 | {1, {{0, 1, UP}}, {}}, | ||
77 | |||
78 | {5, {}, {{0, 1, UP}}}, | ||
79 | /* Press key again after 5ms delay (debounce has finished) */ | ||
80 | {10, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
81 | }); | ||
82 | runEvents(); | ||
83 | } | ||
84 | |||
85 | TEST_F(DebounceTest, OneKeyShort6) { | ||
86 | addEvents({ /* Time, Inputs, Outputs */ | ||
87 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
88 | {1, {{0, 1, UP}}, {}}, | ||
89 | |||
90 | {5, {}, {{0, 1, UP}}}, | ||
91 | /* Press key after after 6ms delay (debounce has finished) */ | ||
92 | {11, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
93 | }); | ||
94 | runEvents(); | ||
95 | } | ||
96 | |||
97 | TEST_F(DebounceTest, OneKeyBouncing1) { | ||
98 | addEvents({ /* Time, Inputs, Outputs */ | ||
99 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
100 | {1, {{0, 1, UP}}, {}}, | ||
101 | {2, {{0, 1, DOWN}}, {}}, | ||
102 | {3, {{0, 1, UP}}, {}}, | ||
103 | {4, {{0, 1, DOWN}}, {}}, | ||
104 | {5, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
105 | /* Press key again after 1ms delay (debounce has not yet finished) */ | ||
106 | {6, {{0, 1, DOWN}}, {}}, | ||
107 | {10, {}, {{0, 1, DOWN}}}, /* 5ms after UP at time 5 */ | ||
108 | }); | ||
109 | runEvents(); | ||
110 | } | ||
111 | |||
112 | TEST_F(DebounceTest, OneKeyBouncing2) { | ||
113 | addEvents({ /* Time, Inputs, Outputs */ | ||
114 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
115 | /* Change twice in the same time period */ | ||
116 | {1, {{0, 1, UP}}, {}}, | ||
117 | {1, {{0, 1, DOWN}}, {}}, | ||
118 | /* Change three times in the same time period */ | ||
119 | {2, {{0, 1, UP}}, {}}, | ||
120 | {2, {{0, 1, DOWN}}, {}}, | ||
121 | {2, {{0, 1, UP}}, {}}, | ||
122 | /* Change three times in the same time period */ | ||
123 | {3, {{0, 1, DOWN}}, {}}, | ||
124 | {3, {{0, 1, UP}}, {}}, | ||
125 | {3, {{0, 1, DOWN}}, {}}, | ||
126 | /* Change twice in the same time period */ | ||
127 | {4, {{0, 1, UP}}, {}}, | ||
128 | {4, {{0, 1, DOWN}}, {}}, | ||
129 | {5, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
130 | /* Press key again after 1ms delay (debounce has not yet finished) */ | ||
131 | {6, {{0, 1, DOWN}}, {}}, | ||
132 | {10, {}, {{0, 1, DOWN}}}, /* 5ms after UP at time 5 */ | ||
133 | }); | ||
134 | runEvents(); | ||
135 | } | ||
136 | |||
137 | TEST_F(DebounceTest, OneKeyLong) { | ||
138 | addEvents({ /* Time, Inputs, Outputs */ | ||
139 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
140 | |||
141 | {25, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
142 | |||
143 | {50, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
144 | }); | ||
145 | runEvents(); | ||
146 | } | ||
147 | |||
148 | TEST_F(DebounceTest, TwoRowsShort) { | ||
149 | addEvents({ /* Time, Inputs, Outputs */ | ||
150 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
151 | {1, {{0, 1, UP}}, {}}, | ||
152 | {2, {{2, 0, DOWN}}, {{2, 0, DOWN}}}, | ||
153 | {3, {{2, 0, UP}}, {}}, | ||
154 | |||
155 | {5, {}, {{0, 1, UP}}}, | ||
156 | /* Press key again after 1ms delay (debounce has not yet finished) */ | ||
157 | {6, {{0, 1, DOWN}}, {}}, | ||
158 | {7, {}, {{2, 0, UP}}}, | ||
159 | |||
160 | /* Press key again after 1ms delay (debounce has not yet finished) */ | ||
161 | {9, {{2, 0, DOWN}}, {}}, | ||
162 | {10, {}, {{0, 1, DOWN}}}, /* 5ms after UP at time 5 */ | ||
163 | |||
164 | {12, {}, {{2, 0, DOWN}}}, /* 5ms after UP at time 7 */ | ||
165 | }); | ||
166 | runEvents(); | ||
167 | } | ||
168 | |||
169 | TEST_F(DebounceTest, TwoKeysOverlap) { | ||
170 | addEvents({ /* Time, Inputs, Outputs */ | ||
171 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
172 | {1, {{0, 1, UP}}, {}}, | ||
173 | /* Press a second key during the first debounce */ | ||
174 | {2, {{0, 2, DOWN}}, {}}, | ||
175 | |||
176 | /* Key registers as soon as debounce finishes, 5ms after time 0 */ | ||
177 | {5, {}, {{0, 1, UP}, {0, 2, DOWN}}}, | ||
178 | {6, {{0, 1, DOWN}}, {}}, | ||
179 | |||
180 | /* Key registers as soon as debounce finishes, 5ms after time 5 */ | ||
181 | {10, {}, {{0, 1, DOWN}}}, | ||
182 | /* Release both keys */ | ||
183 | {11, {{0, 1, UP}}, {}}, | ||
184 | {12, {{0, 2, UP}}, {}}, | ||
185 | |||
186 | /* Keys register as soon as debounce finishes, 5ms after time 10 */ | ||
187 | {15, {}, {{0, 1, UP}, {0, 2, UP}}}, | ||
188 | }); | ||
189 | runEvents(); | ||
190 | } | ||
191 | |||
192 | TEST_F(DebounceTest, TwoKeysSimultaneous1) { | ||
193 | addEvents({ /* Time, Inputs, Outputs */ | ||
194 | {0, {{0, 1, DOWN}, {0, 2, DOWN}}, {{0, 1, DOWN}, {0, 2, DOWN}}}, | ||
195 | {20, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
196 | {21, {{0, 2, UP}}, {}}, | ||
197 | |||
198 | /* Key registers as soon as debounce finishes, 5ms after time 20 */ | ||
199 | {25, {}, {{0, 2, UP}}}, | ||
200 | }); | ||
201 | runEvents(); | ||
202 | } | ||
203 | |||
204 | TEST_F(DebounceTest, TwoKeysSimultaneous2) { | ||
205 | addEvents({ /* Time, Inputs, Outputs */ | ||
206 | {0, {{0, 1, DOWN}, {0, 2, DOWN}}, {{0, 1, DOWN}, {0, 2, DOWN}}}, | ||
207 | {20, {{0, 1, UP}, {0, 2, UP}}, {{0, 1, UP}, {0, 2, UP}}}, | ||
208 | }); | ||
209 | runEvents(); | ||
210 | } | ||
211 | |||
212 | TEST_F(DebounceTest, OneKeyDelayedScan1) { | ||
213 | addEvents({ /* Time, Inputs, Outputs */ | ||
214 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
215 | |||
216 | /* Processing is very late but the change will now be accepted */ | ||
217 | {300, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
218 | }); | ||
219 | time_jumps_ = true; | ||
220 | runEvents(); | ||
221 | } | ||
222 | |||
223 | TEST_F(DebounceTest, OneKeyDelayedScan2) { | ||
224 | addEvents({ /* Time, Inputs, Outputs */ | ||
225 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
226 | |||
227 | /* Processing is very late but the change will now be accepted even with a 1 scan delay */ | ||
228 | {300, {}, {}}, | ||
229 | {300, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
230 | }); | ||
231 | time_jumps_ = true; | ||
232 | runEvents(); | ||
233 | } | ||
234 | |||
235 | TEST_F(DebounceTest, OneKeyDelayedScan3) { | ||
236 | addEvents({ /* Time, Inputs, Outputs */ | ||
237 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
238 | |||
239 | /* Processing is very late but the change will now be accepted even with a 1ms delay */ | ||
240 | {300, {}, {}}, | ||
241 | {301, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
242 | }); | ||
243 | time_jumps_ = true; | ||
244 | runEvents(); | ||
245 | } | ||
246 | |||
247 | TEST_F(DebounceTest, OneKeyDelayedScan4) { | ||
248 | addEvents({ /* Time, Inputs, Outputs */ | ||
249 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
250 | |||
251 | /* Processing is a bit late but the change will now be accepted */ | ||
252 | {50, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
253 | }); | ||
254 | time_jumps_ = true; | ||
255 | runEvents(); | ||
256 | } | ||
257 | |||
258 | TEST_F(DebounceTest, OneKeyDelayedScan5) { | ||
259 | addEvents({ /* Time, Inputs, Outputs */ | ||
260 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
261 | |||
262 | /* Processing is very late but the change will now be accepted even with a 1 scan delay */ | ||
263 | {50, {}, {}}, | ||
264 | {50, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
265 | }); | ||
266 | time_jumps_ = true; | ||
267 | runEvents(); | ||
268 | } | ||
269 | |||
270 | TEST_F(DebounceTest, OneKeyDelayedScan6) { | ||
271 | addEvents({ /* Time, Inputs, Outputs */ | ||
272 | {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}}, | ||
273 | |||
274 | /* Processing is very late but the change will now be accepted even with a 1ms delay */ | ||
275 | {50, {}, {}}, | ||
276 | {51, {{0, 1, UP}}, {{0, 1, UP}}}, | ||
277 | }); | ||
278 | time_jumps_ = true; | ||
279 | runEvents(); | ||
280 | } | ||
diff --git a/quantum/debounce/tests/testlist.mk b/quantum/debounce/tests/testlist.mk new file mode 100644 index 000000000..c54c45aa6 --- /dev/null +++ b/quantum/debounce/tests/testlist.mk | |||
@@ -0,0 +1,6 @@ | |||
1 | TEST_LIST += \ | ||
2 | debounce_sym_defer_g \ | ||
3 | debounce_sym_defer_pk \ | ||
4 | debounce_sym_eager_pk \ | ||
5 | debounce_sym_eager_pr \ | ||
6 | debounce_asym_eager_defer_pk | ||
diff --git a/quantum/dip_switch.c b/quantum/dip_switch.c index cda69bd0e..72789ca8e 100644 --- a/quantum/dip_switch.c +++ b/quantum/dip_switch.c | |||
@@ -49,13 +49,13 @@ static uint16_t scan_count; | |||
49 | static bool dip_switch_state[NUMBER_OF_DIP_SWITCHES] = {0}; | 49 | static bool dip_switch_state[NUMBER_OF_DIP_SWITCHES] = {0}; |
50 | static bool last_dip_switch_state[NUMBER_OF_DIP_SWITCHES] = {0}; | 50 | static bool last_dip_switch_state[NUMBER_OF_DIP_SWITCHES] = {0}; |
51 | 51 | ||
52 | __attribute__((weak)) void dip_switch_update_user(uint8_t index, bool active) {} | 52 | __attribute__((weak)) bool dip_switch_update_user(uint8_t index, bool active) { return true; } |
53 | 53 | ||
54 | __attribute__((weak)) void dip_switch_update_kb(uint8_t index, bool active) { dip_switch_update_user(index, active); } | 54 | __attribute__((weak)) bool dip_switch_update_kb(uint8_t index, bool active) { return dip_switch_update_user(index, active); } |
55 | 55 | ||
56 | __attribute__((weak)) void dip_switch_update_mask_user(uint32_t state) {} | 56 | __attribute__((weak)) bool dip_switch_update_mask_user(uint32_t state) { return true; } |
57 | 57 | ||
58 | __attribute__((weak)) void dip_switch_update_mask_kb(uint32_t state) { dip_switch_update_mask_user(state); } | 58 | __attribute__((weak)) bool dip_switch_update_mask_kb(uint32_t state) { return dip_switch_update_mask_user(state); } |
59 | 59 | ||
60 | void dip_switch_init(void) { | 60 | void dip_switch_init(void) { |
61 | #ifdef DIP_SWITCH_PINS | 61 | #ifdef DIP_SWITCH_PINS |
diff --git a/quantum/dip_switch.h b/quantum/dip_switch.h index 61ef1cc19..058a10f41 100644 --- a/quantum/dip_switch.h +++ b/quantum/dip_switch.h | |||
@@ -20,10 +20,10 @@ | |||
20 | 20 | ||
21 | #include "quantum.h" | 21 | #include "quantum.h" |
22 | 22 | ||
23 | void dip_switch_update_kb(uint8_t index, bool active); | 23 | bool dip_switch_update_kb(uint8_t index, bool active); |
24 | void dip_switch_update_user(uint8_t index, bool active); | 24 | bool dip_switch_update_user(uint8_t index, bool active); |
25 | void dip_switch_update_mask_user(uint32_t state); | 25 | bool dip_switch_update_mask_user(uint32_t state); |
26 | void dip_switch_update_mask_kb(uint32_t state); | 26 | bool dip_switch_update_mask_kb(uint32_t state); |
27 | 27 | ||
28 | void dip_switch_init(void); | 28 | void dip_switch_init(void); |
29 | void dip_switch_read(bool forced); | 29 | void dip_switch_read(bool forced); |
diff --git a/quantum/keymap_extras/keymap_belgian.h b/quantum/keymap_extras/keymap_belgian.h index 6aaadf978..207905b29 100644 --- a/quantum/keymap_extras/keymap_belgian.h +++ b/quantum/keymap_extras/keymap_belgian.h | |||
@@ -156,16 +156,3 @@ | |||
156 | // Row 4 | 156 | // Row 4 |
157 | #define BE_BSLS ALGR(BE_LABK) // (backslash) | 157 | #define BE_BSLS ALGR(BE_LABK) // (backslash) |
158 | #define BE_TILD ALGR(BE_EQL) // ~ | 158 | #define BE_TILD ALGR(BE_EQL) // ~ |
159 | |||
160 | // DEPRECATED | ||
161 | #define BE_AMP BE_AMPR | ||
162 | #define BE_APOS BE_QUOT | ||
163 | #define BE_PARA BE_SECT | ||
164 | #define BE_MU BE_MICR | ||
165 | #define BE_LESS BE_LABK | ||
166 | #define BE_OVRR BE_DEG | ||
167 | #define BE_UMLT BE_DIAE | ||
168 | #define BE_GRTR BE_RABK | ||
169 | #define BE_LSBR BE_LBRC | ||
170 | #define BE_RSBR BE_RBRC | ||
171 | #define BE_TILT BE_TILD | ||
diff --git a/quantum/keymap_extras/keymap_bepo.h b/quantum/keymap_extras/keymap_bepo.h index b6244898a..72d5b81f3 100644 --- a/quantum/keymap_extras/keymap_bepo.h +++ b/quantum/keymap_extras/keymap_bepo.h | |||
@@ -181,7 +181,7 @@ | |||
181 | #define BP_RCBR ALGR(BP_X) // } | 181 | #define BP_RCBR ALGR(BP_X) // } |
182 | #define BP_ELLP ALGR(BP_DOT) // … | 182 | #define BP_ELLP ALGR(BP_DOT) // … |
183 | #define BP_TILD ALGR(BP_K) // ~ | 183 | #define BP_TILD ALGR(BP_K) // ~ |
184 | #define BP_IQUE ALGR(BP_QEST) // ¿ | 184 | #define BP_IQUE ALGR(BP_QUES) // ¿ |
185 | #define BP_RNGA ALGR(BP_Q) // ° (dead) | 185 | #define BP_RNGA ALGR(BP_Q) // ° (dead) |
186 | #define BP_DGRK ALGR(BP_G) // µ (dead Greek key) | 186 | #define BP_DGRK ALGR(BP_G) // µ (dead Greek key) |
187 | #define BP_DAGG ALGR(BP_H) // † | 187 | #define BP_DAGG ALGR(BP_H) // † |
@@ -238,168 +238,3 @@ | |||
238 | #define BP_FORD S(ALGR(BP_F)) // ª | 238 | #define BP_FORD S(ALGR(BP_F)) // ª |
239 | // Row 5 | 239 | // Row 5 |
240 | #define BP_NNBS S(ALGR(BP_)) // (narrow non-breaking space) | 240 | #define BP_NNBS S(ALGR(BP_)) // (narrow non-breaking space) |
241 | |||
242 | // DEPRECATED | ||
243 | #define BP_DOLLAR BP_DLR | ||
244 | #define BP_DOUBLE_QUOTE BP_DQUO | ||
245 | #define BP_DQOT BP_DQUO | ||
246 | #define BP_LEFT_GUILLEMET BP_LDAQ | ||
247 | #define BP_LGIL BP_LDAQ | ||
248 | #define BP_RIGHT_GUILLEMET BP_RDAQ | ||
249 | #define BP_RGIL BP_RDAQ | ||
250 | #define BP_LEFT_PAREN BP_LPRN | ||
251 | #define BP_RIGHT_PAREN BP_RPRN | ||
252 | #define BP_MINUS BP_MINS | ||
253 | #define BP_SLASH BP_SLSH | ||
254 | #define BP_ASTERISK BP_ASTR | ||
255 | #define BP_EQUAL BP_EQL | ||
256 | #define BP_PERCENT BP_PERC | ||
257 | #define BP_E_ACUTE BP_EACU | ||
258 | #define BP_ECUT BP_EACU | ||
259 | #define BP_E_GRAVE BP_EGRV | ||
260 | #define BP_DEAD_CIRCUMFLEX BP_DCIR | ||
261 | #define BP_DCRC BP_DCIR | ||
262 | #define BP_COMMA BP_COMM | ||
263 | #define BP_C_CEDILLA BP_CCED | ||
264 | #define BP_E_CIRCUMFLEX BP_ECIR | ||
265 | #define BP_ECRC BP_ECIR | ||
266 | #define BP_A_GRAVE BP_AGRV | ||
267 | #define BP_APOSTROPHE BP_QUOT | ||
268 | #define BP_APOS BP_QUOT | ||
269 | #define BP_DEGREE BP_DEG | ||
270 | #define BP_DEGR BP_DEG | ||
271 | #define BP_GRAVE BP_GRV | ||
272 | #define BP_EXCLAIM BP_EXLM | ||
273 | #define BP_SCOLON BP_SCLN | ||
274 | #define BP_COLON BP_COLN | ||
275 | #define BP_QUESTION BP_QUES | ||
276 | #define BP_QEST BP_QUES | ||
277 | #define BP_NON_BREAKING_SPACE BP_NBSP | ||
278 | #define BP_EN_DASH BP_NDSH | ||
279 | #define BP_EM_DASH BP_MDSH | ||
280 | #define BP_LESS BP_LABK | ||
281 | #define BP_GREATER BP_RABK | ||
282 | #define BP_GRTR BP_RABK | ||
283 | #define BP_LBRACKET BP_LBRC | ||
284 | #define BP_RBRACKET BP_RBRC | ||
285 | #define BP_CIRCUMFLEX CIRC | ||
286 | #define BP_PLUS_MINUS BP_PLMN | ||
287 | #define BP_PSMS BP_PLMN | ||
288 | #define BP_MATH_MINUS BP_MMNS | ||
289 | #define BP_OBELUS BP_DIV | ||
290 | #define BP_OBEL BP_DIV | ||
291 | #define BP_DIVISION_SIGN BP_DIV | ||
292 | #define BP_DVSN BP_DIV | ||
293 | #define BP_TIMES BP_MUL | ||
294 | #define BP_TIMS BP_MUL | ||
295 | #define BP_DIFFERENT BP_NEQL | ||
296 | #define BP_DIFF BP_NEQL | ||
297 | #define BP_PERMILLE BP_PERM | ||
298 | #define BP_PMIL BP_PERM | ||
299 | #define BP_DEAD_ACUTE BP_ACUT | ||
300 | #define BP_DACT BP_ACUT | ||
301 | #define BP_AMPERSAND BP_AMPR | ||
302 | #define BP_OE_LIGATURE BP_OE | ||
303 | #define BP_DEAD_GRAVE BP_DGRV | ||
304 | #define BP_INVERTED_EXCLAIM BP_IEXL | ||
305 | #define BP_IXLM BP_IEXL | ||
306 | #define BP_DEAD_CARON BP_CARN | ||
307 | #define BP_DCAR BP_CARN | ||
308 | #define BP_DEAD_SLASH BP_DSLS | ||
309 | #define BP_DSLH BP_DSLS | ||
310 | #define BP_IJ_LIGATURE BP_IJ | ||
311 | #define BP_SCHWA BP_SCHW | ||
312 | #define BP_SCWA BP_SCHW | ||
313 | #define BP_DEAD_BREVE BP_BREV | ||
314 | #define BP_DBRV BP_BREV | ||
315 | #define BP_AE_LIGATURE BP_AE | ||
316 | #define BP_U_GRAVE BP_UGRV | ||
317 | #define BP_DEAD_TREMA BP_DIAE | ||
318 | #define BP_DTRM BP_DIAE | ||
319 | #define BP_TYPOGRAPHICAL_APOSTROPHE BP_COMM | ||
320 | #define BP_TAPO BP_COMM | ||
321 | #define BP_COPYRIGHT BP_COPY | ||
322 | #define BP_CPRT BP_COPY | ||
323 | #define BP_THORN BP_THRN | ||
324 | #define BP_SHARP_S BP_SS | ||
325 | #define BP_SRPS BP_SS | ||
326 | #define BP_REGISTERED_TRADEMARK BP_REGD | ||
327 | #define BP_RTM BP_REGD | ||
328 | #define BP_DEAD_TILDE BP_DTIL | ||
329 | #define BP_DTLD BP_DTIL | ||
330 | #define BP_DEAD_MACRON BP_MACR | ||
331 | #define BP_DMCR BP_MACR | ||
332 | #define BP_DEAD_CEDILLA BP_CEDL | ||
333 | #define BP_DCED BP_CEDL | ||
334 | #define BP_NONUS_SLASH BP_SLSH | ||
335 | #define BP_NUSL BP_SLSH | ||
336 | #define BP_BACKSLASH BP_BSLS | ||
337 | #define BP_LEFT_CURLY_BRACE BP_LCBR | ||
338 | #define BP_RIGHT_CURLY_BRACE BP_RCBR | ||
339 | #define BP_ELLIPSIS BP_ELLP | ||
340 | #define BP_ELPS BP_ELLP | ||
341 | #define BP_TILDE BP_TILD | ||
342 | #define BP_INVERTED_QUESTION BP_IQUE | ||
343 | #define BP_IQST BP_IQUE | ||
344 | #define BP_DEAD_RING BP_RNGA | ||
345 | #define BP_DRNG BP_RNGA | ||
346 | #define BP_DEAD_GREEK BP_DGRK | ||
347 | #define BP_DAGGER BP_DAGG | ||
348 | #define BP_DAGR BP_DAGG | ||
349 | #define BP_DEAD_OGONEK BP_OGON | ||
350 | #define BP_DOGO BP_OGON | ||
351 | #define BP_UNDERSCORE BP_UNDS | ||
352 | #define BP_PARAGRAPH BP_PARA | ||
353 | #define BP_PARG BP_PARA | ||
354 | #define BP_LOW_DOUBLE_QUOTE BP_DLQU | ||
355 | #define BP_LWQT BP_DLQU | ||
356 | #define BP_LEFT_DOUBLE_QUOTE BP_RDQU | ||
357 | #define BP_RIGHT_DOUBLE_QUOTE BP_RDQU | ||
358 | #define BP_LESS_OR_EQUAL BP_LEQL | ||
359 | #define BP_GREATER_OR_EQUAL BP_GEQL | ||
360 | #define BP_NEGATION BP_NOT | ||
361 | #define BP_NEGT BP_NOT | ||
362 | #define BP_ONE_QUARTER BP_QRTR | ||
363 | #define BP_1QRT BP_QRTR | ||
364 | #define BP_ONE_HALF BP_HALF | ||
365 | #define BP_1HLF BP_HALF | ||
366 | #define BP_THREE_QUARTERS TQTR | ||
367 | #define BP_3QRT BP_TQTR | ||
368 | #define BP_MINUTES BP_PRIM | ||
369 | #define BP_MNUT BP_PRIM | ||
370 | #define BP_SECONDS BP_DPRM | ||
371 | #define BP_SCND BP_DPRM | ||
372 | #define BP_BROKEN_PIPE BP_BRKP | ||
373 | #define BP_BPIP BP_BRKP | ||
374 | #define BP_DEAD_DOUBLE_ACUTE BP_DACU | ||
375 | #define BP_DDCT BP_DACU | ||
376 | #define BP_SECTION BP_SECT | ||
377 | #define BP_GRAVE_BIS BP_GRV | ||
378 | #define BP_GRVB BP_GRV | ||
379 | #define BP_DEAD_DOT_ABOVE BP_DOTA | ||
380 | #define BP_DDTA BP_DOTA | ||
381 | #define BP_DEAD_CURRENCY BP_CURR | ||
382 | #define BP_DCUR BP_CURR | ||
383 | #define BP_DEAD_HORN BP_HORN | ||
384 | #define BP_DHRN BP_HORN | ||
385 | #define BP_LONG_S BP_LNGS | ||
386 | #define BP_TRADEMARK BP_TM | ||
387 | #define BP_ORDINAL_INDICATOR_O MORD | ||
388 | #define BP_ORDO BP_MORD | ||
389 | #define BP_DEAD_COMMA BP_DCMM | ||
390 | #define BP_DCOM BP_DCMM | ||
391 | #define BP_LEFT_QUOTE BP_LSQU | ||
392 | #define BP_LQOT BP_LSQU | ||
393 | #define BP_RIGHT_QUOTE BP_RSQU | ||
394 | #define BP_RQOT BP_RSQU | ||
395 | #define BP_INTERPUNCT BP_MDDT | ||
396 | #define BP_IPCT BP_MDDT | ||
397 | #define BP_DEAD_HOOK_ABOVE BP_HOKA | ||
398 | #define BP_DHKA BP_HOKA | ||
399 | #define BP_DEAD_UNDERDOT BP_DOTB | ||
400 | #define BP_DUDT BP_DOTB | ||
401 | #define BP_DOUBLE_DAGGER BP_DDAG | ||
402 | #define BP_DDGR BP_DDAG | ||
403 | #define BP_ORDINAL_INDICATOR_A BP_FORD | ||
404 | #define BP_ORDA BP_FORD | ||
405 | #define BP_NARROW_NON_BREAKING_SPACE BP_NNBS | ||
diff --git a/quantum/keymap_extras/keymap_br_abnt2.h b/quantum/keymap_extras/keymap_br_abnt2.h index 310950d49..e91718013 100644 --- a/quantum/keymap_extras/keymap_br_abnt2.h +++ b/quantum/keymap_extras/keymap_br_abnt2.h | |||
@@ -158,23 +158,3 @@ | |||
158 | #define BR_MORD ALGR(BR_RBRC) // º | 158 | #define BR_MORD ALGR(BR_RBRC) // º |
159 | // Row 4 | 159 | // Row 4 |
160 | #define BR_CRUZ ALGR(BR_C) // ₢ | 160 | #define BR_CRUZ ALGR(BR_C) // ₢ |
161 | |||
162 | // DEPRECATED | ||
163 | #define BR_CCDL BR_CCED | ||
164 | #define BR_DQT BR_DQUO | ||
165 | #define BR_TRMA BR_DIAE | ||
166 | #define BR_GRAV BR_GRV | ||
167 | #define BR_KPDT BR_PDOT | ||
168 | #define BR_KPCM BR_PCMM | ||
169 | #define BR_1UP BR_SUP1 | ||
170 | #define BR_2UP BR_SUP2 | ||
171 | #define BR_3UP BR_SUP3 | ||
172 | #define BR_ASLS BR_SLSH | ||
173 | #define BR_AQST BR_QUES | ||
174 | |||
175 | // Not present on Windows 10? | ||
176 | #define BR_NDTD ALGR(BR_TILD) // ~ | ||
177 | #define BR_NDAC ALGR(BR_ACUT) // ´ | ||
178 | #define BR_NDGV ALGR(BR_QUOT) // ` | ||
179 | #define BR_NDCR ALGR(BR_CIRC) // ^ | ||
180 | #define BR_NDTR ALGR(BR_DIAE) // ¨ | ||
diff --git a/quantum/keymap_extras/keymap_canadian_multilingual.h b/quantum/keymap_extras/keymap_canadian_multilingual.h index d72ea3979..e328cf65e 100644 --- a/quantum/keymap_extras/keymap_canadian_multilingual.h +++ b/quantum/keymap_extras/keymap_canadian_multilingual.h | |||
@@ -252,182 +252,3 @@ | |||
252 | #define CA_MORD RCTL(S(CA_M)) // º | 252 | #define CA_MORD RCTL(S(CA_M)) // º |
253 | #define CA_MUL RCTL(S(CA_COMM)) // × | 253 | #define CA_MUL RCTL(S(CA_COMM)) // × |
254 | #define CA_DIV RCTL(S(CA_DOT)) // ÷ | 254 | #define CA_DIV RCTL(S(CA_DOT)) // ÷ |
255 | |||
256 | // DEPRECATED | ||
257 | #define GR2A(kc) RCTL(kc) | ||
258 | #define CSA_SLASH CA_SLSH | ||
259 | #define CSA_SLSH CA_SLSH | ||
260 | #define CSA_DEAD_CIRCUMFLEX CA_CIRC | ||
261 | #define CSA_DCRC CA_CIRC | ||
262 | #define CSA_C_CEDILLA CA_CCED | ||
263 | #define CSA_CCED CA_CCED | ||
264 | #define CSA_E_GRAVE CA_EGRV | ||
265 | #define CSA_EGRV CA_EGRV | ||
266 | #define CSA_A_GRAVE CA_AGRV | ||
267 | #define CSA_AGRV CA_AGRV | ||
268 | #define CSA_U_GRAVE CA_UGRV | ||
269 | #define CSA_UGRV CA_UGRV | ||
270 | #define CSA_E_ACUTE CA_EACU | ||
271 | #define CSA_ECUT CA_EACU | ||
272 | #define CSA_BACKSLASH CA_BSLS | ||
273 | #define CSA_BSLS CA_BSLS | ||
274 | #define CSA_QUESTION CA_QUES | ||
275 | #define CSA_QEST CA_QUES | ||
276 | #define CSA_DEAD_TREMA CA_DIAE | ||
277 | #define CSA_DTRM CA_DIAE | ||
278 | #define CSA_APOSTROPHE CA_QUOT | ||
279 | #define CSA_APOS CA_QUOT | ||
280 | #define CSA_DOUBLE_QUOTE CA_DQUO | ||
281 | #define CSA_DQOT CA_DQUO | ||
282 | #define CSA_PIPE CA_PIPE | ||
283 | #define CSA_CURRENCY CA_CURR | ||
284 | #define CSA_CURR CA_CURR | ||
285 | #define CSA_LEFT_CURLY_BRACE CA_LCBR | ||
286 | #define CSA_LCBR CA_LCBR | ||
287 | #define CSA_RIGHT_CURLY_BRACE CA_RCBR | ||
288 | #define CSA_RCBR CA_RCBR | ||
289 | #define CSA_LBRACKET CA_LBRC | ||
290 | #define CSA_LBRC CA_LBRC | ||
291 | #define CSA_RBRACKET CA_RBRC | ||
292 | #define CSA_RBRC CA_RBRC | ||
293 | #define CSA_NEGATION CA_NOT | ||
294 | #define CSA_NEGT CA_NOT | ||
295 | #define CSA_EURO CA_EURO | ||
296 | #define CSA_DEAD_GRAVE CA_GRV | ||
297 | #define CSA_DGRV CA_GRV | ||
298 | #define CSA_DEAD_TILDE CA_DTIL | ||
299 | #define CSA_DTLD CA_DTIL | ||
300 | #define CSA_DEGREE CA_DEG | ||
301 | #define CSA_DEGR CA_DEG | ||
302 | #define CSA_LEFT_GUILLEMET CA_LDAQ | ||
303 | #define CSA_LGIL CA_LDAQ | ||
304 | #define CSA_RIGHT_GUILLEMET CA_RDAQ | ||
305 | #define CSA_RGIL CA_RDAQ | ||
306 | #define CSA_LESS CA_LABK | ||
307 | #define CSA_GREATER CA_RABK | ||
308 | #define CSA_GRTR CA_RABK | ||
309 | #define CSA_NON_BREAKING_SPACE ALGR(KC_SPC) | ||
310 | #define CSA_NBSP ALGR(KC_SPC) | ||
311 | #define CSA_SUPERSCRIPT_ONE CA_SUP1 | ||
312 | #define CSA_SUP1 CA_SUP1 | ||
313 | #define CSA_SUPERSCRIPT_TWO CA_SUP2 | ||
314 | #define CSA_SUP2 CA_SUP2 | ||
315 | #define CSA_SUPERSCRIPT_THREE CA_SUP3 | ||
316 | #define CSA_SUP3 CA_SUP3 | ||
317 | #define CSA_ONE_QUARTER CA_QRTR | ||
318 | #define CSA_1QRT CA_QRTR | ||
319 | #define CSA_ONE_HALF CA_HALF | ||
320 | #define CSA_1HLF CA_HALF | ||
321 | #define CSA_THREE_QUARTERS CA_TQTR | ||
322 | #define CSA_3QRT CA_TQTR | ||
323 | #define CSA_DEAD_CEDILLA CA_CEDL | ||
324 | #define CSA_DCED CA_CEDL | ||
325 | #define CSA_OMEGA CA_OMEG | ||
326 | #define CSA_OMEG CA_OMEG | ||
327 | #define CSA_L_STROKE CA_LSTR | ||
328 | #define CSA_LSTK CA_LSTR | ||
329 | #define CSA_OE_LIGATURE CA_OE | ||
330 | #define CSA_OE CA_OE | ||
331 | #define CSA_PARAGRAPH CA_PARA | ||
332 | #define CSA_PARG CA_PARA | ||
333 | #define CSA_T_STROKE CA_TSTR | ||
334 | #define CSA_LEFT_ARROW CA_LARR | ||
335 | #define CSA_LARW CA_LARR | ||
336 | #define CSA_DOWN_ARROW CA_DARR | ||
337 | #define CSA_DARW CA_DARR | ||
338 | #define CSA_RIGHT_ARROW CA_RARR | ||
339 | #define CSA_RARW CA_RARR | ||
340 | #define CSA_O_STROKE CA_OSTR | ||
341 | #define CSA_OSTK CA_OSTR | ||
342 | #define CSA_THORN CA_THRN | ||
343 | #define CSA_THRN CA_THRN | ||
344 | #define CSA_TILDE CA_TILD | ||
345 | #define CSA_TILD CA_TILD | ||
346 | #define CSA_AE_LIGATURE CA_AE | ||
347 | #define CSA_AE CA_AE | ||
348 | #define CSA_SHARP_S CA_SS | ||
349 | #define CSA_SRPS CA_SS | ||
350 | #define CSA_ETH CA_ETH | ||
351 | #define CSA_ENG CA_ENG | ||
352 | #define CSA_H_SRTOKE CA_HSTR | ||
353 | #define CSA_HSTK CA_HSTR | ||
354 | #define CSA_IJ_LIGATURE CA_IJ | ||
355 | #define CSA_IJ CA_IJ | ||
356 | #define CSA_KRA CA_KRA | ||
357 | #define CSA_L_FLOWN_DOT CA_LMDT | ||
358 | #define CSA_LFLD CA_LMDT | ||
359 | #define CSA_DEAD_ACUTE CA_ACUT | ||
360 | #define CSA_DACT CA_ACUT | ||
361 | #define CSA_CENT CA_CENT | ||
362 | #define CSA_LEFT_DOUBLE_QUOTE CA_LDQU | ||
363 | #define CSA_LDQT CA_LDQU | ||
364 | #define CSA_RIGHT_DOUBLE_QUOTE CA_RDQU | ||
365 | #define CSA_RDQT CA_RDQU | ||
366 | #define CSA_N_APOSTROPHE CA_APSN | ||
367 | #define CSA_NAPO CA_APSN | ||
368 | #define CSA_MU CA_MICR | ||
369 | #define CSA_HORIZONTAL_BAR CA_HRZB | ||
370 | #define CSA_HZBR CA_HRZB | ||
371 | #define CSA_DEAD_DOT_ABOVE CA_DOTA | ||
372 | #define CSA_DDTA CA_DOTA | ||
373 | #define CSA_SOFT_HYPHEN CA_SHYP | ||
374 | #define CSA_SHYP CA_SHYP | ||
375 | #define CSA_INVERTED_EXCLAIM CA_IEXL | ||
376 | #define CSA_IXLM CA_IEXL | ||
377 | #define CSA_POUND CA_PND | ||
378 | #define CSA_GBP CA_PND | ||
379 | #define CSA_EURO_BIS CA_EURO | ||
380 | #define CSA_EURB CA_EURO | ||
381 | #define CSA_THREE_EIGHTHS CA_TEIG | ||
382 | #define CSA_3ON8 CA_TEIG | ||
383 | #define CSA_FIVE_EIGHTHS CA_FEIG | ||
384 | #define CSA_5ON8 CA_FEIG | ||
385 | #define CSA_SEVEN_EIGHTHS CA_SEIG | ||
386 | #define CSA_7ON8 CA_SEIG | ||
387 | #define CSA_TRADEMARK CA_TM | ||
388 | #define CSA_TM CA_TM | ||
389 | #define CSA_PLUS_MINUS CA_PLMN | ||
390 | #define CSA_PSMS CA_PLMN | ||
391 | #define CSA_INVERTED_QUESTION CA_IQUE | ||
392 | #define CSA_IQST CA_IQUE | ||
393 | #define CSA_DEAD_OGONEK CA_OGON | ||
394 | #define CSA_DOGO CA_OGON | ||
395 | #define CSA_REGISTERED_TRADEMARK CA_REGD | ||
396 | #define CSA_RTM CA_REGD | ||
397 | #define CSA_YEN CA_YEN | ||
398 | #define CSA_YUAN CA_YEN | ||
399 | #define CSA_UP_ARROW CA_UARR | ||
400 | #define CSA_DOTLESS_I CA_DLSI | ||
401 | #define CSA_DLSI CA_DLSI | ||
402 | #define CSA_DEAD_RING CA_RNGA | ||
403 | #define CSA_DRNG CA_RNGA | ||
404 | #define CSA_DEAD_MACRON CA_MACR | ||
405 | #define CSA_DMCR CA_MACR | ||
406 | #define CSA_SECTION CA_SECT | ||
407 | #define CSA_SECT CA_SECT | ||
408 | #define CSA_ORDINAL_INDICATOR_A CA_FORD | ||
409 | #define CSA_ORDA CA_FORD | ||
410 | #define CSA_DEAD_DOUBLE_ACUTE CA_DACU | ||
411 | #define CSA_DDCT CA_DACU | ||
412 | #define CSA_DEAD_CARON CA_CARN | ||
413 | #define CSA_DCAR CA_CARN | ||
414 | #define CSA_DEAD_BREVE CA_BREV | ||
415 | #define CSA_DBRV CA_BREV | ||
416 | #define CSA_BROKEN_PIPE CA_BRKP | ||
417 | #define CSA_BPIP CA_BRKP | ||
418 | #define CSA_COPYRIGHT CA_COPY | ||
419 | #define CSA_CPRT CA_COPY | ||
420 | #define CSA_LEFT_QUOTE CA_LSQU | ||
421 | #define CSA_LQOT CA_LSQU | ||
422 | #define CSA_RIGHT_QUOTE CA_RSQU | ||
423 | #define CSA_RQOT CA_RSQU | ||
424 | #define CSA_EIGHTH_NOTE CA_ENOT | ||
425 | #define CSA_8NOT CA_ENOT | ||
426 | #define CSA_ORDINAL_INDICATOR_O CA_MORD | ||
427 | #define CSA_ORDO CA_MORD | ||
428 | #define CSA_TIMES CA_MUL | ||
429 | #define CSA_TIMS CA_MUL | ||
430 | #define CSA_OBELUS CA_DIV | ||
431 | #define CSA_OBEL CA_DIV | ||
432 | #define CSA_DIVISION_SIGN CA_DIV | ||
433 | #define CSA_DVSN CA_DIV | ||
diff --git a/quantum/keymap_extras/keymap_colemak.h b/quantum/keymap_extras/keymap_colemak.h index a97be9ad5..6658cc130 100644 --- a/quantum/keymap_extras/keymap_colemak.h +++ b/quantum/keymap_extras/keymap_colemak.h | |||
@@ -123,35 +123,3 @@ | |||
123 | #define CM_LABK S(CM_COMM) // < | 123 | #define CM_LABK S(CM_COMM) // < |
124 | #define CM_RABK S(CM_DOT) // > | 124 | #define CM_RABK S(CM_DOT) // > |
125 | #define CM_QUES S(CM_SLSH) // / | 125 | #define CM_QUES S(CM_SLSH) // / |
126 | |||
127 | // DEPRECATED | ||
128 | #define KC_CM_Q CM_Q | ||
129 | #define KC_CM_W CM_W | ||
130 | #define KC_CM_F CM_F | ||
131 | #define KC_CM_P CM_P | ||
132 | #define KC_CM_G CM_G | ||
133 | #define KC_CM_J CM_J | ||
134 | #define KC_CM_L CM_L | ||
135 | #define KC_CM_U CM_U | ||
136 | #define KC_CM_Y CM_Y | ||
137 | #define KC_CM_SCLN CM_SCLN | ||
138 | #define KC_CM_A CM_A | ||
139 | #define KC_CM_R CM_R | ||
140 | #define KC_CM_S CM_S | ||
141 | #define KC_CM_T CM_T | ||
142 | #define KC_CM_D CM_D | ||
143 | #define KC_CM_H CM_H | ||
144 | #define KC_CM_N CM_N | ||
145 | #define KC_CM_E CM_E | ||
146 | #define KC_CM_I CM_I | ||
147 | #define KC_CM_O CM_O | ||
148 | #define KC_CM_Z CM_Z | ||
149 | #define KC_CM_X CM_X | ||
150 | #define KC_CM_C CM_C | ||
151 | #define KC_CM_V CM_V | ||
152 | #define KC_CM_B CM_B | ||
153 | #define KC_CM_K CM_K | ||
154 | #define KC_CM_M CM_M | ||
155 | #define KC_CM_COMM CM_COMM | ||
156 | #define KC_CM_DOT CM_DOT | ||
157 | #define KC_CM_SLSH CM_SLSH | ||
diff --git a/quantum/keymap_extras/keymap_fr_ch.h b/quantum/keymap_extras/keymap_fr_ch.h index fea44324b..b1f2455a6 100644 --- a/quantum/keymap_extras/keymap_fr_ch.h +++ b/quantum/keymap_extras/keymap_fr_ch.h | |||
@@ -162,82 +162,3 @@ | |||
162 | #define CH_RCBR ALGR(CH_DLR) // } | 162 | #define CH_RCBR ALGR(CH_DLR) // } |
163 | // Row 4 | 163 | // Row 4 |
164 | #define CH_BSLS ALGR(CH_LABK) // (backslash) | 164 | #define CH_BSLS ALGR(CH_LABK) // (backslash) |
165 | |||
166 | // DEPRECATED | ||
167 | #define FR_CH_Z CH_Z | ||
168 | #define FR_CH_Y CH_Y | ||
169 | #define FR_CH_A CH_A | ||
170 | #define FR_CH_B CH_B | ||
171 | #define FR_CH_C CH_C | ||
172 | #define FR_CH_D CH_D | ||
173 | #define FR_CH_E CH_E | ||
174 | #define FR_CH_F CH_F | ||
175 | #define FR_CH_G CH_G | ||
176 | #define FR_CH_H CH_H | ||
177 | #define FR_CH_I CH_I | ||
178 | #define FR_CH_J CH_J | ||
179 | #define FR_CH_K CH_K | ||
180 | #define FR_CH_L CH_L | ||
181 | #define FR_CH_M CH_M | ||
182 | #define FR_CH_N CH_N | ||
183 | #define FR_CH_O CH_O | ||
184 | #define FR_CH_P CH_P | ||
185 | #define FR_CH_Q CH_Q | ||
186 | #define FR_CH_R CH_R | ||
187 | #define FR_CH_S CH_S | ||
188 | #define FR_CH_T CH_T | ||
189 | #define FR_CH_U CH_U | ||
190 | #define FR_CH_V CH_V | ||
191 | #define FR_CH_W CH_W | ||
192 | #define FR_CH_X CH_X | ||
193 | #define FR_CH_0 CH_0 | ||
194 | #define FR_CH_1 CH_1 | ||
195 | #define FR_CH_2 CH_2 | ||
196 | #define FR_CH_3 CH_3 | ||
197 | #define FR_CH_4 CH_4 | ||
198 | #define FR_CH_5 CH_5 | ||
199 | #define FR_CH_6 CH_6 | ||
200 | #define FR_CH_7 CH_7 | ||
201 | #define FR_CH_8 CH_8 | ||
202 | #define FR_CH_9 CH_9 | ||
203 | #define FR_CH_DOT CH_DOT | ||
204 | #define FR_CH_COMM CH_COMM | ||
205 | #define FR_CH_QUOT CH_QUOT | ||
206 | #define FR_CH_AE CH_AGRV | ||
207 | #define FR_CH_UE CH_EGRV | ||
208 | #define FR_CH_OE CH_EACU | ||
209 | #define FR_CH_CIRC CH_CIRC | ||
210 | #define FR_CH_LESS CH_LABK | ||
211 | #define FR_CH_MINS CH_MINS | ||
212 | #define FR_CH_DLR CH_DLR | ||
213 | #define FR_CH_PARA CH_SECT | ||
214 | #define FR_CH_DIAE CH_DIAE | ||
215 | #define FR_CH_RING CH_DEG | ||
216 | #define FR_CH_EXLM CH_EXLM | ||
217 | #define FR_CH_PLUS CH_PLUS | ||
218 | #define FR_CH_DQOT CH_DQUO | ||
219 | #define FR_CH_ASTR CH_ASTR | ||
220 | #define FR_CH_PERC CH_PERC | ||
221 | #define FR_CH_AMPR CH_AMPR | ||
222 | #define FR_CH_SLSH CH_SLSH | ||
223 | #define FR_CH_LPRN CH_LPRN | ||
224 | #define FR_CH_RPRN CH_RPRN | ||
225 | #define FR_CH_EQL CH_EQL | ||
226 | #define FR_CH_QST CH_QUES | ||
227 | #define FR_CH_MORE CH_RABK | ||
228 | #define FR_CH_COLN CH_COLN | ||
229 | #define FR_CH_SCLN CH_SCLN | ||
230 | #define FR_CH_UNDS CH_UNDS | ||
231 | #define FR_CH_CCED CH_CCED | ||
232 | #define FR_CH_GRV CH_GRV | ||
233 | #define FR_CH_LCBR CH_LCBR | ||
234 | #define FR_CH_LBRC CH_LBRC | ||
235 | #define FR_CH_RBRC CH_RBRC | ||
236 | #define FR_CH_RCBR CH_RCBR | ||
237 | #define FR_CH_BSLS CH_BSLS | ||
238 | #define FR_CH_AT CH_AT | ||
239 | #define FR_CH_EURO CH_EURO | ||
240 | #define FR_CH_TILD CH_TILD | ||
241 | #define FR_CH_PIPE CH_PIPE | ||
242 | #define FR_CH_HASH CH_HASH | ||
243 | #define FR_CH_ACUT CH_ACUT | ||
diff --git a/quantum/keymap_extras/keymap_french.h b/quantum/keymap_extras/keymap_french.h index c62f2c403..0be53f0a9 100644 --- a/quantum/keymap_extras/keymap_french.h +++ b/quantum/keymap_extras/keymap_french.h | |||
@@ -152,14 +152,3 @@ | |||
152 | // Row 2 | 152 | // Row 2 |
153 | #define FR_EURO ALGR(KC_E) // € | 153 | #define FR_EURO ALGR(KC_E) // € |
154 | #define FR_CURR ALGR(FR_DLR) // ¤ | 154 | #define FR_CURR ALGR(FR_DLR) // ¤ |
155 | |||
156 | // DEPRECATED | ||
157 | #define FR_AMP FR_AMPR | ||
158 | #define FR_APOS FR_QUOT | ||
159 | #define FR_LESS FR_LABK | ||
160 | #define FR_OVRR FR_DEG | ||
161 | #define FR_UMLT FR_DIAE | ||
162 | #define FR_MU FR_MICR | ||
163 | #define FR_GRTR FR_RABK | ||
164 | #define FR_CCIRC FR_CIRC | ||
165 | #define FR_BULT FR_CURR | ||
diff --git a/quantum/keymap_extras/keymap_french_osx.h b/quantum/keymap_extras/keymap_french_osx.h index 76eb22191..590a57e55 100644 --- a/quantum/keymap_extras/keymap_french_osx.h +++ b/quantum/keymap_extras/keymap_french_osx.h | |||
@@ -246,15 +246,3 @@ | |||
246 | #define FR_IQUE S(A(FR_COMM)) // ¿ | 246 | #define FR_IQUE S(A(FR_COMM)) // ¿ |
247 | #define FR_BSLS S(A(FR_COLN)) // (backslash) | 247 | #define FR_BSLS S(A(FR_COLN)) // (backslash) |
248 | #define FR_PLMN S(A(FR_EQL)) // ± | 248 | #define FR_PLMN S(A(FR_EQL)) // ± |
249 | |||
250 | // DEPRECATED | ||
251 | #define FR_AMP FR_AMPR | ||
252 | #define FR_EACU FR_LEAC | ||
253 | #define FR_APOS FR_QUOT | ||
254 | #define FR_EGRV FR_LEGR | ||
255 | #define FR_CCED FR_LCCE | ||
256 | #define FR_AGRV FR_LAGR | ||
257 | #define FR_UGRV FR_LUGR | ||
258 | #define FR_LESS FR_LABK | ||
259 | #define FR_UMLT FR_DIAE | ||
260 | #define FR_GRTR FR_RABK | ||
diff --git a/quantum/keymap_extras/keymap_german.h b/quantum/keymap_extras/keymap_german.h index 924bde6d3..085995b0c 100644 --- a/quantum/keymap_extras/keymap_german.h +++ b/quantum/keymap_extras/keymap_german.h | |||
@@ -151,16 +151,3 @@ | |||
151 | // Row 4 | 151 | // Row 4 |
152 | #define DE_PIPE ALGR(DE_LABK) // | | 152 | #define DE_PIPE ALGR(DE_LABK) // | |
153 | #define DE_MICR ALGR(DE_M) // µ | 153 | #define DE_MICR ALGR(DE_M) // µ |
154 | |||
155 | // DEPRECATED | ||
156 | #define DE_UE DE_UDIA | ||
157 | #define DE_OE DE_ODIA | ||
158 | #define DE_AE DE_ADIA | ||
159 | #define DE_LESS DE_LABK | ||
160 | #define DE_RING DE_DEG | ||
161 | #define DE_DQOT DE_DQUO | ||
162 | #define DE_PARA DE_SECT | ||
163 | #define DE_QST DE_QUES | ||
164 | #define DE_MORE DE_RABK | ||
165 | #define DE_SQ2 DE_SUP2 | ||
166 | #define DE_SQ3 DE_SUP3 | ||
diff --git a/quantum/keymap_extras/keymap_german_ch.h b/quantum/keymap_extras/keymap_german_ch.h index fee37eabb..672383687 100644 --- a/quantum/keymap_extras/keymap_german_ch.h +++ b/quantum/keymap_extras/keymap_german_ch.h | |||
@@ -162,21 +162,3 @@ | |||
162 | #define CH_RCBR ALGR(CH_DLR) // } | 162 | #define CH_RCBR ALGR(CH_DLR) // } |
163 | // Row 4 | 163 | // Row 4 |
164 | #define CH_BSLS ALGR(CH_LABK) // (backslash) | 164 | #define CH_BSLS ALGR(CH_LABK) // (backslash) |
165 | |||
166 | // DEPRECATED | ||
167 | #define CH_AE CH_ADIA | ||
168 | #define CH_UE CH_UDIA | ||
169 | #define CH_OE CH_ODIA | ||
170 | #define CH_PARA CH_SECT | ||
171 | #define CH_CARR CH_CIRC | ||
172 | #define CH_DIER CH_DIAE | ||
173 | #define CH_LESS CH_LABK | ||
174 | #define CH_RING CH_DEG | ||
175 | #define CH_DQOT CH_DQUO | ||
176 | #define CH_PAST CH_ASTR | ||
177 | #define CH_CELA CH_CCED | ||
178 | #define CH_QST CH_QUES | ||
179 | #define CH_POND CH_PND | ||
180 | #define CH_MORE CH_RABK | ||
181 | #define CH_BRBR CH_BRKP | ||
182 | #define CH_NOTL CH_NOT | ||
diff --git a/quantum/keymap_extras/keymap_german_osx.h b/quantum/keymap_extras/keymap_german_osx.h index be109a721..82404fa5f 100644 --- a/quantum/keymap_extras/keymap_german_osx.h +++ b/quantum/keymap_extras/keymap_german_osx.h | |||
@@ -241,83 +241,3 @@ | |||
241 | #define DE_OGON S(A(DE_COMM)) // ˛ | 241 | #define DE_OGON S(A(DE_COMM)) // ˛ |
242 | #define DE_DIV S(A(DE_DOT)) // ÷ | 242 | #define DE_DIV S(A(DE_DOT)) // ÷ |
243 | #define DE_MDSH S(A(DE_MINS)) // — | 243 | #define DE_MDSH S(A(DE_MINS)) // — |
244 | |||
245 | // DEPRECATED | ||
246 | #define DE_OSX_CIRC DE_CIRC | ||
247 | #define DE_OSX_1 DE_1 | ||
248 | #define DE_OSX_2 DE_2 | ||
249 | #define DE_OSX_3 DE_3 | ||
250 | #define DE_OSX_4 DE_4 | ||
251 | #define DE_OSX_5 DE_5 | ||
252 | #define DE_OSX_6 DE_6 | ||
253 | #define DE_OSX_7 DE_7 | ||
254 | #define DE_OSX_8 DE_8 | ||
255 | #define DE_OSX_9 DE_9 | ||
256 | #define DE_OSX_0 DE_0 | ||
257 | #define DE_OSX_SS DE_SS | ||
258 | #define DE_OSX_ACUT DE_ACUT | ||
259 | #define DE_OSX_Q DE_Q | ||
260 | #define DE_OSX_W DE_W | ||
261 | #define DE_OSX_E DE_E | ||
262 | #define DE_OSX_R DE_R | ||
263 | #define DE_OSX_T DE_T | ||
264 | #define DE_OSX_Z DE_Z | ||
265 | #define DE_OSX_U DE_U | ||
266 | #define DE_OSX_I DE_I | ||
267 | #define DE_OSX_O DE_O | ||
268 | #define DE_OSX_P DE_P | ||
269 | #define DE_OSX_UE DE_UDIA | ||
270 | #define DE_OSX_PLUS DE_PLUS | ||
271 | #define DE_OSX_A DE_A | ||
272 | #define DE_OSX_S DE_S | ||
273 | #define DE_OSX_D DE_D | ||
274 | #define DE_OSX_F DE_F | ||
275 | #define DE_OSX_G DE_G | ||
276 | #define DE_OSX_H DE_H | ||
277 | #define DE_OSX_J DE_J | ||
278 | #define DE_OSX_K DE_K | ||
279 | #define DE_OSX_L DE_L | ||
280 | #define DE_OSX_OE DE_ODIA | ||
281 | #define DE_OSX_AE DE_ADIA | ||
282 | #define DE_OSX_HASH DE_HASH | ||
283 | #define DE_OSX_LESS DE_LABK | ||
284 | #define DE_OSX_Y DE_Y | ||
285 | #define DE_OSX_X DE_X | ||
286 | #define DE_OSX_C DE_C | ||
287 | #define DE_OSX_V DE_V | ||
288 | #define DE_OSX_B DE_B | ||
289 | #define DE_OSX_N DE_N | ||
290 | #define DE_OSX_M DE_M | ||
291 | #define DE_OSX_COMM DE_COMM | ||
292 | #define DE_OSX_DOT DE_DOT | ||
293 | #define DE_OSX_MINS DE_MINS | ||
294 | |||
295 | #define DE_OSX_RING DE_DEG | ||
296 | #define DE_OSX_EXLM DE_EXLM | ||
297 | #define DE_OSX_DQOT DE_DQUO | ||
298 | #define DE_OSX_PARA DE_SECT | ||
299 | #define DE_OSX_DLR DE_DLR | ||
300 | #define DE_OSX_PERC DE_PERC | ||
301 | #define DE_OSX_AMPR DE_AMPR | ||
302 | #define DE_OSX_SLSH DE_SLSH | ||
303 | #define DE_OSX_LPRN DE_LPRN | ||
304 | #define DE_OSX_RPRN DE_RPRN | ||
305 | #define DE_OSX_EQL DE_EQL | ||
306 | #define DE_OSX_QST DE_QUES | ||
307 | #define DE_OSX_GRV DE_GRV | ||
308 | #define DE_OSX_ASTR DE_ASTR | ||
309 | #define DE_OSX_QUOT DE_QUOT | ||
310 | #define DE_OSX_MORE DE_RABK | ||
311 | #define DE_OSX_COLN DE_COLN | ||
312 | #define DE_OSX_SCLN DE_SCLN | ||
313 | #define DE_OSX_UNDS DE_UNDS | ||
314 | |||
315 | #define DE_OSX_LBRC DE_LBRC | ||
316 | #define DE_OSX_RBRC DE_RBRC | ||
317 | #define DE_OSX_PIPE DE_PIPE | ||
318 | #define DE_OSX_LCBR DE_LCBR | ||
319 | #define DE_OSX_RCBR DE_RCBR | ||
320 | #define DE_OSX_AT DE_AT | ||
321 | #define DE_OSX_EURO DE_EURO | ||
322 | #define DE_OSX_TILD DE_TILD | ||
323 | #define DE_OSX_BSLS DE_BSLS | ||
diff --git a/quantum/keymap_extras/keymap_hungarian.h b/quantum/keymap_extras/keymap_hungarian.h index 1b282a461..a4e4b1a52 100644 --- a/quantum/keymap_extras/keymap_hungarian.h +++ b/quantum/keymap_extras/keymap_hungarian.h | |||
@@ -169,22 +169,3 @@ | |||
169 | #define HU_RCBR ALGR(HU_N) // } | 169 | #define HU_RCBR ALGR(HU_N) // } |
170 | #define HU_SCLN ALGR(HU_COMM) // ; | 170 | #define HU_SCLN ALGR(HU_COMM) // ; |
171 | #define HU_ASTR ALGR(HU_MINS) // * | 171 | #define HU_ASTR ALGR(HU_MINS) // * |
172 | |||
173 | // DEPRECATED | ||
174 | #define HU_OE HU_ODIA | ||
175 | #define HU_UE HU_UDIA | ||
176 | #define HU_OO HU_OACU | ||
177 | #define HU_OEE HU_ODAC | ||
178 | #define HU_UU HU_UACU | ||
179 | #define HU_EE HU_EACU | ||
180 | #define HU_AA HU_AACU | ||
181 | #define HU_UEE HU_UDAC | ||
182 | #define HU_II HU_IACU | ||
183 | #define HU_PARA HU_SECT | ||
184 | #define HU_DQOT HU_DQUO | ||
185 | #define HU_QST HU_QUES | ||
186 | #define HU_BRV HU_BREV | ||
187 | #define HU_RING HU_RNGA | ||
188 | #define HU_CRSS HU_MUL | ||
189 | #define HU_LESS HU_LABK | ||
190 | #define HU_MORE HU_RABK | ||
diff --git a/quantum/keymap_extras/keymap_italian.h b/quantum/keymap_extras/keymap_italian.h index 5d19e56d3..be495f85b 100644 --- a/quantum/keymap_extras/keymap_italian.h +++ b/quantum/keymap_extras/keymap_italian.h | |||
@@ -163,22 +163,3 @@ | |||
163 | // Row 2 | 163 | // Row 2 |
164 | #define IT_LCBR S(ALGR(IT_EGRV)) // { | 164 | #define IT_LCBR S(ALGR(IT_EGRV)) // { |
165 | #define IT_RCBR S(ALGR(IT_PLUS)) // } | 165 | #define IT_RCBR S(ALGR(IT_PLUS)) // } |
166 | |||
167 | // DEPRECATED | ||
168 | #define IT_BKSL IT_BSLS | ||
169 | #define IT_APOS IT_QUOT | ||
170 | #define IT_IACC IT_IGRV | ||
171 | #define IT_EACC IT_EGRV | ||
172 | #define IT_OACC IT_OGRV | ||
173 | #define IT_AACC IT_AGRV | ||
174 | #define IT_UACC IT_UGRV | ||
175 | #define IT_LESS IT_LABK | ||
176 | #define IT_DQOT IT_DQUO | ||
177 | #define IT_STRL IT_PND | ||
178 | #define IT_QST IT_QUES | ||
179 | #define IT_CRC IT_CIRC | ||
180 | #define IT_MORE IT_RABK | ||
181 | #define IT_SHRP IT_HASH | ||
182 | |||
183 | #define IT_X_PLUS X_RBRACKET | ||
184 | #define IT_ACUT | ||
diff --git a/quantum/keymap_extras/keymap_italian_osx_ansi.h b/quantum/keymap_extras/keymap_italian_osx_ansi.h index 488a6561e..c2b8e3cad 100644 --- a/quantum/keymap_extras/keymap_italian_osx_ansi.h +++ b/quantum/keymap_extras/keymap_italian_osx_ansi.h | |||
@@ -248,21 +248,3 @@ | |||
248 | #define IT_CUAC S(A(IT_M)) // Ú | 248 | #define IT_CUAC S(A(IT_M)) // Ú |
249 | #define IT_MDDT S(A(IT_DOT)) // · | 249 | #define IT_MDDT S(A(IT_DOT)) // · |
250 | #define IT_MDSH S(A(IT_MINS)) // — | 250 | #define IT_MDSH S(A(IT_MINS)) // — |
251 | |||
252 | // DEPRECATED | ||
253 | #define IT_LESS IT_LABK | ||
254 | #define IT_APOS IT_QUOT | ||
255 | #define IT_IACC IT_IGRV | ||
256 | #define IT_EACC IT_EGRV | ||
257 | #define IT_UACC IT_UGRV | ||
258 | #define IT_OACC IT_OGRV | ||
259 | #define IT_AACC IT_AGRV | ||
260 | #define IT_MORE IT_RABK | ||
261 | #define IT_DQOT IT_DQUO | ||
262 | #define IT_STRL IT_PND | ||
263 | #define IT_QST IT_QUES | ||
264 | #define IT_CRC IT_CIRC | ||
265 | #define IT_DEGR IT_DEG | ||
266 | #define IT_TILDE IT_TILD | ||
267 | #define IT_GRAVE IT_GRV | ||
268 | #define IT_SHRP IT_HASH | ||
diff --git a/quantum/keymap_extras/keymap_italian_osx_iso.h b/quantum/keymap_extras/keymap_italian_osx_iso.h index e4fb03acf..61f76ddba 100644 --- a/quantum/keymap_extras/keymap_italian_osx_iso.h +++ b/quantum/keymap_extras/keymap_italian_osx_iso.h | |||
@@ -249,21 +249,3 @@ | |||
249 | #define IT_CUAC S(A(IT_M)) // Ú | 249 | #define IT_CUAC S(A(IT_M)) // Ú |
250 | #define IT_MDDT S(A(IT_DOT)) // · | 250 | #define IT_MDDT S(A(IT_DOT)) // · |
251 | #define IT_MDSH S(A(IT_MINS)) // — | 251 | #define IT_MDSH S(A(IT_MINS)) // — |
252 | |||
253 | // DEPRECATED | ||
254 | #define IT_APOS IT_QUOT | ||
255 | #define IT_IACC IT_IGRV | ||
256 | #define IT_EACC IT_EGRV | ||
257 | #define IT_OACC IT_OGRV | ||
258 | #define IT_AACC IT_AGRV | ||
259 | #define IT_UACC IT_UGRV | ||
260 | #define IT_LESS IT_LABK | ||
261 | #define IT_DQOT IT_DQUO | ||
262 | #define IT_STRL IT_PND | ||
263 | #define IT_QST IT_QUES | ||
264 | #define IT_CRC IT_CIRC | ||
265 | #define IT_DEGR IT_DEG | ||
266 | #define IT_MORE IT_RABK | ||
267 | #define IT_TILDE IT_TILD | ||
268 | #define IT_GRAVE IT_GRV | ||
269 | #define IT_SHRP IT_HASH | ||
diff --git a/quantum/keymap_extras/keymap_jp.h b/quantum/keymap_extras/keymap_jp.h index cd3c08f9f..d10feb585 100644 --- a/quantum/keymap_extras/keymap_jp.h +++ b/quantum/keymap_extras/keymap_jp.h | |||
@@ -137,12 +137,3 @@ | |||
137 | #define JP_RABK S(JP_DOT) // > | 137 | #define JP_RABK S(JP_DOT) // > |
138 | #define JP_QUES S(JP_SLSH) // ? | 138 | #define JP_QUES S(JP_SLSH) // ? |
139 | #define JP_UNDS S(JP_BSLS) // _ | 139 | #define JP_UNDS S(JP_BSLS) // _ |
140 | |||
141 | // DEPRECATED | ||
142 | #define JP_ZHTG JP_ZKHK | ||
143 | #define JP_DQT JP_DQUO | ||
144 | #define JP_LT JP_LABK | ||
145 | #define JP_GT JP_RABK | ||
146 | |||
147 | #define JP_MEISU KC_LANG2 // Eisū (英数) on macOS | ||
148 | #define JP_MKANA KC_LANG1 // Kana (かな) on macOS | ||
diff --git a/quantum/keymap_extras/keymap_neo2.h b/quantum/keymap_extras/keymap_neo2.h index 8d5323c6a..f9fc00d79 100644 --- a/quantum/keymap_extras/keymap_neo2.h +++ b/quantum/keymap_extras/keymap_neo2.h | |||
@@ -88,55 +88,3 @@ | |||
88 | #define NE_J KC_SLSH // J | 88 | #define NE_J KC_SLSH // J |
89 | // Row 5 | 89 | // Row 5 |
90 | #define NE_L4R KC_ALGR // (layer 4) | 90 | #define NE_L4R KC_ALGR // (layer 4) |
91 | |||
92 | // DEPRECATED | ||
93 | #define NEO_A NE_A | ||
94 | #define NEO_B NE_B | ||
95 | #define NEO_C NE_C | ||
96 | #define NEO_D NE_D | ||
97 | #define NEO_E NE_E | ||
98 | #define NEO_F NE_F | ||
99 | #define NEO_G NE_G | ||
100 | #define NEO_H NE_H | ||
101 | #define NEO_I NE_I | ||
102 | #define NEO_J NE_J | ||
103 | #define NEO_K NE_K | ||
104 | #define NEO_L NE_L | ||
105 | #define NEO_M NE_M | ||
106 | #define NEO_N NE_N | ||
107 | #define NEO_O NE_O | ||
108 | #define NEO_P NE_P | ||
109 | #define NEO_Q NE_Q | ||
110 | #define NEO_R NE_R | ||
111 | #define NEO_S NE_S | ||
112 | #define NEO_T NE_T | ||
113 | #define NEO_U NE_U | ||
114 | #define NEO_V NE_V | ||
115 | #define NEO_W NE_W | ||
116 | #define NEO_X NE_X | ||
117 | #define NEO_Y NE_Y | ||
118 | #define NEO_Z NE_Z | ||
119 | #define NEO_AE NE_ADIA | ||
120 | #define NEO_OE NE_ODIA | ||
121 | #define NEO_UE NE_UDIA | ||
122 | #define NEO_SS NE_SS | ||
123 | #define NEO_DOT NE_DOT | ||
124 | #define NEO_COMM NE_COMM | ||
125 | #define NEO_1 NE_1 | ||
126 | #define NEO_2 NE_2 | ||
127 | #define NEO_3 NE_3 | ||
128 | #define NEO_4 NE_4 | ||
129 | #define NEO_5 NE_5 | ||
130 | #define NEO_6 NE_6 | ||
131 | #define NEO_7 NE_7 | ||
132 | #define NEO_8 NE_8 | ||
133 | #define NEO_9 NE_9 | ||
134 | #define NEO_0 NE_0 | ||
135 | #define NEO_MINS NE_MINS | ||
136 | #define NEO_ACUT NE_ACUT | ||
137 | #define NEO_GRV NE_GRV | ||
138 | #define NEO_CIRC NE_CIRC | ||
139 | #define NEO_L1_L NE_L3L | ||
140 | #define NEO_L1_R NE_L3R | ||
141 | #define NEO_L2_L NE_L4L | ||
142 | #define NEO_L2_R NE_L4R | ||
diff --git a/quantum/keymap_extras/keymap_norwegian.h b/quantum/keymap_extras/keymap_norwegian.h index 74c0c1ae2..b2499f4fd 100644 --- a/quantum/keymap_extras/keymap_norwegian.h +++ b/quantum/keymap_extras/keymap_norwegian.h | |||
@@ -150,26 +150,3 @@ | |||
150 | #define NO_TILD ALGR(NO_DIAE) // ~ (dead) | 150 | #define NO_TILD ALGR(NO_DIAE) // ~ (dead) |
151 | // Row 4 | 151 | // Row 4 |
152 | #define NO_MICR ALGR(NO_M) // µ | 152 | #define NO_MICR ALGR(NO_M) // µ |
153 | |||
154 | // DEPRECATED | ||
155 | #define NO_AM NO_ARNG | ||
156 | #define NO_AA NO_ARNG | ||
157 | #define NO_OSLH NO_OSTR | ||
158 | #define NO_APOS NO_QUOT | ||
159 | #define NO_LESS NO_LABK | ||
160 | #define NO_QUO2 NO_DQUO | ||
161 | #define NO_BULT NO_CURR | ||
162 | #define NO_GRTR NO_RABK | ||
163 | #define NO_MU NO_MICR | ||
164 | // Norwegian macOS symbols | ||
165 | #define NO_ACUT_MAC NO_BSLS // ´ | ||
166 | #define NO_APOS_MAC NO_LABK // ' | ||
167 | #define NO_AT_MAC NO_QUOT // @ | ||
168 | #define NO_BSLS_MAC S(ALGR(NO_7)) // (backslash) | ||
169 | #define NO_DLR_MAC S(NO_4) // $ | ||
170 | #define NO_GRV_MAC ALGR(NO_BSLS) // ` | ||
171 | #define NO_GRTR_MAC S(NO_PIPE) // > | ||
172 | #define NO_LCBR_MAC S(ALGR(NO_8)) // { | ||
173 | #define NO_LESS_MAC NO_PIPE // < | ||
174 | #define NO_PIPE_MAC ALGR(NO_7) // | | ||
175 | #define NO_RCBR_MAC S(ALGR(NO_9)) // } | ||
diff --git a/quantum/keymap_extras/keymap_slovenian.h b/quantum/keymap_extras/keymap_slovenian.h index 06be62cf3..827fa06c2 100644 --- a/quantum/keymap_extras/keymap_slovenian.h +++ b/quantum/keymap_extras/keymap_slovenian.h | |||
@@ -161,11 +161,3 @@ | |||
161 | #define SI_LCBR ALGR(SI_B) // { | 161 | #define SI_LCBR ALGR(SI_B) // { |
162 | #define SI_RCBR ALGR(SI_N) // } | 162 | #define SI_RCBR ALGR(SI_N) // } |
163 | #define SI_SECT ALGR(SI_M) // § | 163 | #define SI_SECT ALGR(SI_M) // § |
164 | |||
165 | // DEPRECATED | ||
166 | #define SI_QOT SI_QUOT | ||
167 | #define SI_SV SI_SCAR | ||
168 | #define SI_CV SI_CCAR | ||
169 | #define SI_ZV SI_ZCAR | ||
170 | #define SI_DQOT SI_DQUO | ||
171 | #define SI_QST SI_QUES | ||
diff --git a/quantum/keymap_extras/keymap_spanish.h b/quantum/keymap_extras/keymap_spanish.h index 4e888c513..8432c56e9 100644 --- a/quantum/keymap_extras/keymap_spanish.h +++ b/quantum/keymap_extras/keymap_spanish.h | |||
@@ -151,12 +151,3 @@ | |||
151 | // Row 3 | 151 | // Row 3 |
152 | #define ES_LCBR ALGR(ES_ACUT) // { | 152 | #define ES_LCBR ALGR(ES_ACUT) // { |
153 | #define ES_RCBR ALGR(ES_CCED) // } | 153 | #define ES_RCBR ALGR(ES_CCED) // } |
154 | |||
155 | // DEPRECATED | ||
156 | #define ES_OVRR ES_MORD | ||
157 | #define ES_APOS ES_QUOT | ||
158 | #define ES_LESS ES_LABK | ||
159 | #define ES_ASML ES_FORD | ||
160 | #define ES_OVDT ES_BULT | ||
161 | #define ES_UMLT ES_DIAE | ||
162 | #define ES_GRTR ES_RABK | ||
diff --git a/quantum/keymap_extras/keymap_swedish.h b/quantum/keymap_extras/keymap_swedish.h index aef8d003d..cadb66d3b 100644 --- a/quantum/keymap_extras/keymap_swedish.h +++ b/quantum/keymap_extras/keymap_swedish.h | |||
@@ -154,26 +154,3 @@ | |||
154 | 154 | ||
155 | // DEPRECATED | 155 | // DEPRECATED |
156 | #include "keymap_nordic.h" | 156 | #include "keymap_nordic.h" |
157 | |||
158 | #define SE_OSLH SE_ODIA | ||
159 | #define SE_APOS SE_QUOT | ||
160 | #define SE_LESS SE_LABK | ||
161 | #define SE_QUO2 SE_DQUO | ||
162 | #define SE_BULT SE_CURR | ||
163 | #define SE_GRTR SE_RABK | ||
164 | #define SE_AA SE_ARNG | ||
165 | #define SE_AE SE_ADIA | ||
166 | #define SE_AM SE_ARNG | ||
167 | #define SE_MU SE_MICR | ||
168 | // Swedish macOS symbols (not vetted) | ||
169 | #define SE_ACUT_MAC SE_ACUT | ||
170 | #define SE_APOS_MAC SE_LABK | ||
171 | #define SE_AT_MAC SE_ADIA | ||
172 | #define SE_BSLS_MAC S(SE_LCBR) | ||
173 | #define SE_DLR_MAC SE_CURR | ||
174 | #define SE_GRV_MAC SE_BSLS | ||
175 | #define SE_GRTR_MAC SE_HALF | ||
176 | #define SE_LCBR_MAC S(SE_LBRC) | ||
177 | #define SE_LESS_MAC SE_SECT | ||
178 | #define SE_PIPE_MAC SE_LCBR | ||
179 | #define SE_RCBR_MAC S(SE_RBRC) | ||
diff --git a/quantum/keymap_extras/keymap_uk.h b/quantum/keymap_extras/keymap_uk.h index 1eba0ed2f..03fe8149f 100644 --- a/quantum/keymap_extras/keymap_uk.h +++ b/quantum/keymap_extras/keymap_uk.h | |||
@@ -149,78 +149,3 @@ | |||
149 | #define UK_OACU ALGR(KC_O) // Ó | 149 | #define UK_OACU ALGR(KC_O) // Ó |
150 | // Row 3 | 150 | // Row 3 |
151 | #define UK_AACU ALGR(KC_A) // Á | 151 | #define UK_AACU ALGR(KC_A) // Á |
152 | |||
153 | // DEPRECATED | ||
154 | #define UK_ESC KC_ESC | ||
155 | #define UK_F1 KC_F1 | ||
156 | #define UK_F2 KC_F2 | ||
157 | #define UK_F3 KC_F3 | ||
158 | #define UK_F4 KC_F4 | ||
159 | #define UK_F5 KC_F5 | ||
160 | #define UK_F6 KC_F6 | ||
161 | #define UK_F7 KC_F7 | ||
162 | #define UK_F8 KC_F8 | ||
163 | #define UK_F9 KC_F9 | ||
164 | #define UK_F10 KC_F10 | ||
165 | #define UK_F11 KC_F11 | ||
166 | #define UK_F12 KC_F12 | ||
167 | #define UK_PSCR KC_PSCR | ||
168 | #define UK_SLCK KC_SLCK | ||
169 | #define UK_PAUS KC_PAUS | ||
170 | #define UK_BSPC KC_BSPC | ||
171 | #define UK_TAB KC_TAB | ||
172 | #define UK_ENT KC_ENT | ||
173 | #define UK_LSFT KC_LSFT | ||
174 | #define UK_RSFT KC_RSFT | ||
175 | #define UK_LCTL KC_LCTL | ||
176 | #define UK_LGUI KC_LGUI | ||
177 | #define UK_LALT KC_LALT | ||
178 | #define UK_SPC KC_SPC | ||
179 | #define UK_RALT KC_RALT | ||
180 | #define UK_RGUI KC_RGUI | ||
181 | #define UK_RCTL KC_RCTL | ||
182 | #define UK_INS KC_INS | ||
183 | #define UK_DEL KC_DEL | ||
184 | #define UK_HOME KC_HOME | ||
185 | #define UK_END KC_END | ||
186 | #define UK_PGUP KC_PGUP | ||
187 | #define UK_PGDN KC_PGDN | ||
188 | #define UK_UP KC_UP | ||
189 | #define UK_LEFT KC_LEFT | ||
190 | #define UK_DOWN KC_DOWN | ||
191 | #define UK_RGHT KC_RGHT | ||
192 | #define UK_PSLS KC_PSLS | ||
193 | #define UK_PAST KC_PAST | ||
194 | #define UK_PMNS KC_PMNS | ||
195 | #define UK_PPLS KC_PPLS | ||
196 | #define UK_PENT KC_PENT | ||
197 | #define UK_P1 KC_P1 | ||
198 | #define UK_P2 KC_P2 | ||
199 | #define UK_P3 KC_P3 | ||
200 | #define UK_P4 KC_P4 | ||
201 | #define UK_P5 KC_P5 | ||
202 | #define UK_P6 KC_P6 | ||
203 | #define UK_P7 KC_P7 | ||
204 | #define UK_P8 KC_P8 | ||
205 | #define UK_P9 KC_P9 | ||
206 | #define UK_P0 KC_P0 | ||
207 | #define UK_PDOT KC_PDOT | ||
208 | #define UK_PEQL KC_PEQL | ||
209 | #define UK_PCMM KC_PCMM | ||
210 | #define UK_F13 KC_F13 | ||
211 | #define UK_F14 KC_F14 | ||
212 | #define UK_F15 KC_F15 | ||
213 | #define UK_F16 KC_F16 | ||
214 | #define UK_F17 KC_F17 | ||
215 | #define UK_F18 KC_F18 | ||
216 | #define UK_F19 KC_F19 | ||
217 | #define UK_F20 KC_F20 | ||
218 | #define UK_F21 KC_F21 | ||
219 | #define UK_F22 KC_F22 | ||
220 | #define UK_F23 KC_F23 | ||
221 | #define UK_F24 KC_F24 | ||
222 | #define UK_EACT UK_EACU | ||
223 | #define UK_UACT UK_UACU | ||
224 | #define UK_IACT UK_IACU | ||
225 | #define UK_OACT UK_OACU | ||
226 | #define UK_AACT UK_OACU | ||
diff --git a/quantum/keymap_extras/keymap_workman.h b/quantum/keymap_extras/keymap_workman.h index 4c7530aa0..6367d6835 100644 --- a/quantum/keymap_extras/keymap_workman.h +++ b/quantum/keymap_extras/keymap_workman.h | |||
@@ -123,32 +123,3 @@ | |||
123 | #define WK_LABK S(WK_COMM) // < | 123 | #define WK_LABK S(WK_COMM) // < |
124 | #define WK_RABK S(WK_DOT) // > | 124 | #define WK_RABK S(WK_DOT) // > |
125 | #define WK_QUES S(WK_SLSH) // ? | 125 | #define WK_QUES S(WK_SLSH) // ? |
126 | |||
127 | // DEPRECATED | ||
128 | #define KC_WK_Q WK_Q | ||
129 | #define KC_WK_D WK_D | ||
130 | #define KC_WK_R WK_R | ||
131 | #define KC_WK_W WK_W | ||
132 | #define KC_WK_B WK_B | ||
133 | #define KC_WK_J WK_J | ||
134 | #define KC_WK_F WK_F | ||
135 | #define KC_WK_U WK_U | ||
136 | #define KC_WK_P WK_P | ||
137 | #define KC_WK_SCLN WK_SCLN | ||
138 | #define KC_WK_A WK_A | ||
139 | #define KC_WK_S WK_S | ||
140 | #define KC_WK_H WK_H | ||
141 | #define KC_WK_T WK_T | ||
142 | #define KC_WK_G WK_G | ||
143 | #define KC_WK_Y WK_Y | ||
144 | #define KC_WK_N WK_N | ||
145 | #define KC_WK_E WK_E | ||
146 | #define KC_WK_O WK_O | ||
147 | #define KC_WK_I WK_I | ||
148 | #define KC_WK_Z WK_Z | ||
149 | #define KC_WK_X WK_X | ||
150 | #define KC_WK_M WK_M | ||
151 | #define KC_WK_C WK_C | ||
152 | #define KC_WK_V WK_V | ||
153 | #define KC_WK_K WK_K | ||
154 | #define KC_WK_L WK_L | ||
diff --git a/quantum/led_matrix_animations/alpha_mods_anim.h b/quantum/led_matrix/animations/alpha_mods_anim.h index 6f69f6892..a4638fde6 100644 --- a/quantum/led_matrix_animations/alpha_mods_anim.h +++ b/quantum/led_matrix/animations/alpha_mods_anim.h | |||
@@ -21,4 +21,4 @@ bool ALPHAS_MODS(effect_params_t* params) { | |||
21 | } | 21 | } |
22 | 22 | ||
23 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS | 23 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS |
24 | #endif // DISABLE_LED_MATRIX_ALPHAS_MODS | 24 | #endif // DISABLE_LED_MATRIX_ALPHAS_MODS |
diff --git a/quantum/led_matrix_animations/band_anim.h b/quantum/led_matrix/animations/band_anim.h index 523dba1b7..f9cb85dc4 100644 --- a/quantum/led_matrix_animations/band_anim.h +++ b/quantum/led_matrix/animations/band_anim.h | |||
@@ -10,4 +10,4 @@ static uint8_t BAND_math(uint8_t val, uint8_t i, uint8_t time) { | |||
10 | bool BAND(effect_params_t* params) { return effect_runner_i(params, &BAND_math); } | 10 | bool BAND(effect_params_t* params) { return effect_runner_i(params, &BAND_math); } |
11 | 11 | ||
12 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS | 12 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS |
13 | #endif // DISABLE_LED_MATRIX_BAND | 13 | #endif // DISABLE_LED_MATRIX_BAND |
diff --git a/quantum/led_matrix_animations/band_pinwheel_anim.h b/quantum/led_matrix/animations/band_pinwheel_anim.h index fb3b835ca..d3144bffb 100644 --- a/quantum/led_matrix_animations/band_pinwheel_anim.h +++ b/quantum/led_matrix/animations/band_pinwheel_anim.h | |||
@@ -7,4 +7,4 @@ static uint8_t BAND_PINWHEEL_math(uint8_t val, int16_t dx, int16_t dy, uint8_t t | |||
7 | bool BAND_PINWHEEL(effect_params_t* params) { return effect_runner_dx_dy(params, &BAND_PINWHEEL_math); } | 7 | bool BAND_PINWHEEL(effect_params_t* params) { return effect_runner_dx_dy(params, &BAND_PINWHEEL_math); } |
8 | 8 | ||
9 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS | 9 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS |
10 | #endif // DISABLE_LED_MATRIX_BAND_PINWHEEL | 10 | #endif // DISABLE_LED_MATRIX_BAND_PINWHEEL |
diff --git a/quantum/led_matrix_animations/band_spiral_anim.h b/quantum/led_matrix/animations/band_spiral_anim.h index fca22aad9..defbe6967 100644 --- a/quantum/led_matrix_animations/band_spiral_anim.h +++ b/quantum/led_matrix/animations/band_spiral_anim.h | |||
@@ -7,4 +7,4 @@ static uint8_t BAND_SPIRAL_math(uint8_t val, int16_t dx, int16_t dy, uint8_t dis | |||
7 | bool BAND_SPIRAL(effect_params_t* params) { return effect_runner_dx_dy_dist(params, &BAND_SPIRAL_math); } | 7 | bool BAND_SPIRAL(effect_params_t* params) { return effect_runner_dx_dy_dist(params, &BAND_SPIRAL_math); } |
8 | 8 | ||
9 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS | 9 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS |
10 | #endif // DISABLE_LED_MATRIX_BAND_SPIRAL | 10 | #endif // DISABLE_LED_MATRIX_BAND_SPIRAL |
diff --git a/quantum/led_matrix_animations/breathing_anim.h b/quantum/led_matrix/animations/breathing_anim.h index 00310e3f6..4f49f5069 100644 --- a/quantum/led_matrix_animations/breathing_anim.h +++ b/quantum/led_matrix/animations/breathing_anim.h | |||
@@ -16,4 +16,4 @@ bool BREATHING(effect_params_t* params) { | |||
16 | } | 16 | } |
17 | 17 | ||
18 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS | 18 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS |
19 | #endif // DISABLE_LED_MATRIX_BREATHING | 19 | #endif // DISABLE_LED_MATRIX_BREATHING |
diff --git a/quantum/led_matrix_animations/cycle_left_right_anim.h b/quantum/led_matrix/animations/cycle_left_right_anim.h index 51e81d57c..c426d02fd 100644 --- a/quantum/led_matrix_animations/cycle_left_right_anim.h +++ b/quantum/led_matrix/animations/cycle_left_right_anim.h | |||
@@ -7,4 +7,4 @@ static uint8_t CYCLE_LEFT_RIGHT_math(uint8_t val, uint8_t i, uint8_t time) { ret | |||
7 | bool CYCLE_LEFT_RIGHT(effect_params_t* params) { return effect_runner_i(params, &CYCLE_LEFT_RIGHT_math); } | 7 | bool CYCLE_LEFT_RIGHT(effect_params_t* params) { return effect_runner_i(params, &CYCLE_LEFT_RIGHT_math); } |
8 | 8 | ||
9 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS | 9 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS |
10 | #endif // DISABLE_LED_MATRIX_CYCLE_LEFT_RIGHT | 10 | #endif // DISABLE_LED_MATRIX_CYCLE_LEFT_RIGHT |
diff --git a/quantum/led_matrix_animations/cycle_out_in_anim.h b/quantum/led_matrix/animations/cycle_out_in_anim.h index f62061552..55527556f 100644 --- a/quantum/led_matrix_animations/cycle_out_in_anim.h +++ b/quantum/led_matrix/animations/cycle_out_in_anim.h | |||
@@ -7,4 +7,4 @@ static uint8_t CYCLE_OUT_IN_math(uint8_t val, int16_t dx, int16_t dy, uint8_t di | |||
7 | bool CYCLE_OUT_IN(effect_params_t* params) { return effect_runner_dx_dy_dist(params, &CYCLE_OUT_IN_math); } | 7 | bool CYCLE_OUT_IN(effect_params_t* params) { return effect_runner_dx_dy_dist(params, &CYCLE_OUT_IN_math); } |
8 | 8 | ||
9 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS | 9 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS |
10 | #endif // DISABLE_LED_MATRIX_CYCLE_OUT_IN | 10 | #endif // DISABLE_LED_MATRIX_CYCLE_OUT_IN |
diff --git a/quantum/led_matrix_animations/cycle_up_down_anim.h b/quantum/led_matrix/animations/cycle_up_down_anim.h index bd1d12567..d97de0d1e 100644 --- a/quantum/led_matrix_animations/cycle_up_down_anim.h +++ b/quantum/led_matrix/animations/cycle_up_down_anim.h | |||
@@ -7,4 +7,4 @@ static uint8_t CYCLE_UP_DOWN_math(uint8_t val, uint8_t i, uint8_t time) { return | |||
7 | bool CYCLE_UP_DOWN(effect_params_t* params) { return effect_runner_i(params, &CYCLE_UP_DOWN_math); } | 7 | bool CYCLE_UP_DOWN(effect_params_t* params) { return effect_runner_i(params, &CYCLE_UP_DOWN_math); } |
8 | 8 | ||
9 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS | 9 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS |
10 | #endif // DISABLE_LED_MATRIX_CYCLE_UP_DOWN | 10 | #endif // DISABLE_LED_MATRIX_CYCLE_UP_DOWN |
diff --git a/quantum/led_matrix_animations/dual_beacon_anim.h b/quantum/led_matrix/animations/dual_beacon_anim.h index 9b8a7877c..e1bc5ae46 100644 --- a/quantum/led_matrix_animations/dual_beacon_anim.h +++ b/quantum/led_matrix/animations/dual_beacon_anim.h | |||
@@ -7,4 +7,4 @@ static uint8_t DUAL_BEACON_math(uint8_t val, int8_t sin, int8_t cos, uint8_t i, | |||
7 | bool DUAL_BEACON(effect_params_t* params) { return effect_runner_sin_cos_i(params, &DUAL_BEACON_math); } | 7 | bool DUAL_BEACON(effect_params_t* params) { return effect_runner_sin_cos_i(params, &DUAL_BEACON_math); } |
8 | 8 | ||
9 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS | 9 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS |
10 | #endif // DISABLE_LED_MATRIX_DUAL_BEACON | 10 | #endif // DISABLE_LED_MATRIX_DUAL_BEACON |
diff --git a/quantum/led_matrix/animations/led_matrix_effects.inc b/quantum/led_matrix/animations/led_matrix_effects.inc new file mode 100644 index 000000000..ad1f46b24 --- /dev/null +++ b/quantum/led_matrix/animations/led_matrix_effects.inc | |||
@@ -0,0 +1,18 @@ | |||
1 | // Add your new core led matrix effect here, order determines enum order | ||
2 | #include "solid_anim.h" | ||
3 | #include "alpha_mods_anim.h" | ||
4 | #include "breathing_anim.h" | ||
5 | #include "band_anim.h" | ||
6 | #include "band_pinwheel_anim.h" | ||
7 | #include "band_spiral_anim.h" | ||
8 | #include "cycle_left_right_anim.h" | ||
9 | #include "cycle_up_down_anim.h" | ||
10 | #include "cycle_out_in_anim.h" | ||
11 | #include "dual_beacon_anim.h" | ||
12 | #include "solid_reactive_simple_anim.h" | ||
13 | #include "solid_reactive_wide.h" | ||
14 | #include "solid_reactive_cross.h" | ||
15 | #include "solid_reactive_nexus.h" | ||
16 | #include "solid_splash_anim.h" | ||
17 | #include "wave_left_right_anim.h" | ||
18 | #include "wave_up_down_anim.h" | ||
diff --git a/quantum/led_matrix_runners/effect_runner_dx_dy.h b/quantum/led_matrix/animations/runners/effect_runner_dx_dy.h index ef97631b9..ef97631b9 100644 --- a/quantum/led_matrix_runners/effect_runner_dx_dy.h +++ b/quantum/led_matrix/animations/runners/effect_runner_dx_dy.h | |||
diff --git a/quantum/led_matrix_runners/effect_runner_dx_dy_dist.h b/quantum/led_matrix/animations/runners/effect_runner_dx_dy_dist.h index 5ef5938be..5ef5938be 100644 --- a/quantum/led_matrix_runners/effect_runner_dx_dy_dist.h +++ b/quantum/led_matrix/animations/runners/effect_runner_dx_dy_dist.h | |||
diff --git a/quantum/led_matrix_runners/effect_runner_i.h b/quantum/led_matrix/animations/runners/effect_runner_i.h index b3015759b..b3015759b 100644 --- a/quantum/led_matrix_runners/effect_runner_i.h +++ b/quantum/led_matrix/animations/runners/effect_runner_i.h | |||
diff --git a/quantum/led_matrix_runners/effect_runner_reactive.h b/quantum/led_matrix/animations/runners/effect_runner_reactive.h index 4369ea8c4..4369ea8c4 100644 --- a/quantum/led_matrix_runners/effect_runner_reactive.h +++ b/quantum/led_matrix/animations/runners/effect_runner_reactive.h | |||
diff --git a/quantum/led_matrix_runners/effect_runner_reactive_splash.h b/quantum/led_matrix/animations/runners/effect_runner_reactive_splash.h index d6eb9731e..d6eb9731e 100644 --- a/quantum/led_matrix_runners/effect_runner_reactive_splash.h +++ b/quantum/led_matrix/animations/runners/effect_runner_reactive_splash.h | |||
diff --git a/quantum/led_matrix_runners/effect_runner_sin_cos_i.h b/quantum/led_matrix/animations/runners/effect_runner_sin_cos_i.h index 4a5219abd..4a5219abd 100644 --- a/quantum/led_matrix_runners/effect_runner_sin_cos_i.h +++ b/quantum/led_matrix/animations/runners/effect_runner_sin_cos_i.h | |||
diff --git a/quantum/led_matrix/animations/runners/led_matrix_runners.inc b/quantum/led_matrix/animations/runners/led_matrix_runners.inc new file mode 100644 index 000000000..c09022bb0 --- /dev/null +++ b/quantum/led_matrix/animations/runners/led_matrix_runners.inc | |||
@@ -0,0 +1,6 @@ | |||
1 | #include "effect_runner_dx_dy_dist.h" | ||
2 | #include "effect_runner_dx_dy.h" | ||
3 | #include "effect_runner_i.h" | ||
4 | #include "effect_runner_sin_cos_i.h" | ||
5 | #include "effect_runner_reactive.h" | ||
6 | #include "effect_runner_reactive_splash.h" | ||
diff --git a/quantum/led_matrix_animations/solid_anim.h b/quantum/led_matrix/animations/solid_anim.h index 4c9e43c58..4c9e43c58 100644 --- a/quantum/led_matrix_animations/solid_anim.h +++ b/quantum/led_matrix/animations/solid_anim.h | |||
diff --git a/quantum/led_matrix_animations/solid_reactive_cross.h b/quantum/led_matrix/animations/solid_reactive_cross.h index f402d99b3..94425c959 100644 --- a/quantum/led_matrix_animations/solid_reactive_cross.h +++ b/quantum/led_matrix/animations/solid_reactive_cross.h | |||
@@ -31,5 +31,5 @@ bool SOLID_REACTIVE_MULTICROSS(effect_params_t* params) { return effect_runner_r | |||
31 | # endif | 31 | # endif |
32 | 32 | ||
33 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS | 33 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS |
34 | # endif // !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_CROSS) || !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTICROSS) | 34 | # endif // !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_CROSS) || !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTICROSS) |
35 | #endif // LED_MATRIX_KEYREACTIVE_ENABLED | 35 | #endif // LED_MATRIX_KEYREACTIVE_ENABLED |
diff --git a/quantum/led_matrix_animations/solid_reactive_nexus.h b/quantum/led_matrix/animations/solid_reactive_nexus.h index 4d0d25226..504b1104f 100644 --- a/quantum/led_matrix_animations/solid_reactive_nexus.h +++ b/quantum/led_matrix/animations/solid_reactive_nexus.h | |||
@@ -28,5 +28,5 @@ bool SOLID_REACTIVE_MULTINEXUS(effect_params_t* params) { return effect_runner_r | |||
28 | # endif | 28 | # endif |
29 | 29 | ||
30 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS | 30 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS |
31 | # endif // !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_NEXUS) || !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTINEXUS) | 31 | # endif // !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_NEXUS) || !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTINEXUS) |
32 | #endif // LED_MATRIX_KEYREACTIVE_ENABLED | 32 | #endif // LED_MATRIX_KEYREACTIVE_ENABLED |
diff --git a/quantum/led_matrix_animations/solid_reactive_simple_anim.h b/quantum/led_matrix/animations/solid_reactive_simple_anim.h index 30e2527f6..4752a8416 100644 --- a/quantum/led_matrix_animations/solid_reactive_simple_anim.h +++ b/quantum/led_matrix/animations/solid_reactive_simple_anim.h | |||
@@ -8,5 +8,5 @@ static uint8_t SOLID_REACTIVE_SIMPLE_math(uint8_t val, uint16_t offset) { return | |||
8 | bool SOLID_REACTIVE_SIMPLE(effect_params_t* params) { return effect_runner_reactive(params, &SOLID_REACTIVE_SIMPLE_math); } | 8 | bool SOLID_REACTIVE_SIMPLE(effect_params_t* params) { return effect_runner_reactive(params, &SOLID_REACTIVE_SIMPLE_math); } |
9 | 9 | ||
10 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS | 10 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS |
11 | # endif // DISABLE_LED_MATRIX_SOLID_REACTIVE_SIMPLE | 11 | # endif // DISABLE_LED_MATRIX_SOLID_REACTIVE_SIMPLE |
12 | #endif // LED_MATRIX_KEYREACTIVE_ENABLED | 12 | #endif // LED_MATRIX_KEYREACTIVE_ENABLED |
diff --git a/quantum/led_matrix_animations/solid_reactive_wide.h b/quantum/led_matrix/animations/solid_reactive_wide.h index 34a230c25..922e32fe5 100644 --- a/quantum/led_matrix_animations/solid_reactive_wide.h +++ b/quantum/led_matrix/animations/solid_reactive_wide.h | |||
@@ -26,5 +26,5 @@ bool SOLID_REACTIVE_MULTIWIDE(effect_params_t* params) { return effect_runner_re | |||
26 | # endif | 26 | # endif |
27 | 27 | ||
28 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS | 28 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS |
29 | # endif // !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_WIDE) || !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTIWIDE) | 29 | # endif // !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_WIDE) || !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTIWIDE) |
30 | #endif // LED_MATRIX_KEYREACTIVE_ENABLED | 30 | #endif // LED_MATRIX_KEYREACTIVE_ENABLED |
diff --git a/quantum/led_matrix_animations/solid_splash_anim.h b/quantum/led_matrix/animations/solid_splash_anim.h index 4f6ba3d34..d95889b81 100644 --- a/quantum/led_matrix_animations/solid_splash_anim.h +++ b/quantum/led_matrix/animations/solid_splash_anim.h | |||
@@ -26,5 +26,5 @@ bool SOLID_MULTISPLASH(effect_params_t* params) { return effect_runner_reactive_ | |||
26 | # endif | 26 | # endif |
27 | 27 | ||
28 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS | 28 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS |
29 | # endif // !defined(DISABLE_LED_MATRIX_SPLASH) && !defined(DISABLE_LED_MATRIX_MULTISPLASH) | 29 | # endif // !defined(DISABLE_LED_MATRIX_SPLASH) && !defined(DISABLE_LED_MATRIX_MULTISPLASH) |
30 | #endif // LED_MATRIX_KEYREACTIVE_ENABLED | 30 | #endif // LED_MATRIX_KEYREACTIVE_ENABLED |
diff --git a/quantum/led_matrix_animations/wave_left_right_anim.h b/quantum/led_matrix/animations/wave_left_right_anim.h index 736f22ddc..8579f1b45 100644 --- a/quantum/led_matrix_animations/wave_left_right_anim.h +++ b/quantum/led_matrix/animations/wave_left_right_anim.h | |||
@@ -7,4 +7,4 @@ static uint8_t WAVE_LEFT_RIGHT_math(uint8_t val, uint8_t i, uint8_t time) { retu | |||
7 | bool WAVE_LEFT_RIGHT(effect_params_t* params) { return effect_runner_i(params, &WAVE_LEFT_RIGHT_math); } | 7 | bool WAVE_LEFT_RIGHT(effect_params_t* params) { return effect_runner_i(params, &WAVE_LEFT_RIGHT_math); } |
8 | 8 | ||
9 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS | 9 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS |
10 | #endif // DISABLE_LED_MATRIX_WAVE_LEFT_RIGHT | 10 | #endif // DISABLE_LED_MATRIX_WAVE_LEFT_RIGHT |
diff --git a/quantum/led_matrix_animations/wave_up_down_anim.h b/quantum/led_matrix/animations/wave_up_down_anim.h index 3cab0597d..635c60841 100644 --- a/quantum/led_matrix_animations/wave_up_down_anim.h +++ b/quantum/led_matrix/animations/wave_up_down_anim.h | |||
@@ -7,4 +7,4 @@ static uint8_t WAVE_UP_DOWN_math(uint8_t val, uint8_t i, uint8_t time) { return | |||
7 | bool WAVE_UP_DOWN(effect_params_t* params) { return effect_runner_i(params, &WAVE_UP_DOWN_math); } | 7 | bool WAVE_UP_DOWN(effect_params_t* params) { return effect_runner_i(params, &WAVE_UP_DOWN_math); } |
8 | 8 | ||
9 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS | 9 | # endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS |
10 | #endif // DISABLE_LED_MATRIX_WAVE_UP_DOWN | 10 | #endif // DISABLE_LED_MATRIX_WAVE_UP_DOWN |
diff --git a/quantum/led_matrix.c b/quantum/led_matrix/led_matrix.c index 7e0fdf896..32788866c 100644 --- a/quantum/led_matrix.c +++ b/quantum/led_matrix/led_matrix.c | |||
@@ -33,20 +33,23 @@ const led_point_t k_led_matrix_center = {112, 32}; | |||
33 | const led_point_t k_led_matrix_center = LED_MATRIX_CENTER; | 33 | const led_point_t k_led_matrix_center = LED_MATRIX_CENTER; |
34 | #endif | 34 | #endif |
35 | 35 | ||
36 | // clang-format off | ||
37 | #ifndef LED_MATRIX_IMMEDIATE_EEPROM | ||
38 | # define led_eeconfig_update(v) led_update_eeprom |= v | ||
39 | #else | ||
40 | # define led_eeconfig_update(v) if (v) eeconfig_update_led_matrix() | ||
41 | #endif | ||
42 | // clang-format on | ||
43 | |||
36 | // Generic effect runners | 44 | // Generic effect runners |
37 | #include "led_matrix_runners/effect_runner_dx_dy_dist.h" | 45 | #include "led_matrix_runners.inc" |
38 | #include "led_matrix_runners/effect_runner_dx_dy.h" | ||
39 | #include "led_matrix_runners/effect_runner_i.h" | ||
40 | #include "led_matrix_runners/effect_runner_sin_cos_i.h" | ||
41 | #include "led_matrix_runners/effect_runner_reactive.h" | ||
42 | #include "led_matrix_runners/effect_runner_reactive_splash.h" | ||
43 | 46 | ||
44 | // ------------------------------------------ | 47 | // ------------------------------------------ |
45 | // -----Begin led effect includes macros----- | 48 | // -----Begin led effect includes macros----- |
46 | #define LED_MATRIX_EFFECT(name) | 49 | #define LED_MATRIX_EFFECT(name) |
47 | #define LED_MATRIX_CUSTOM_EFFECT_IMPLS | 50 | #define LED_MATRIX_CUSTOM_EFFECT_IMPLS |
48 | 51 | ||
49 | #include "led_matrix_animations/led_matrix_effects.inc" | 52 | #include "led_matrix_effects.inc" |
50 | #ifdef LED_MATRIX_CUSTOM_KB | 53 | #ifdef LED_MATRIX_CUSTOM_KB |
51 | # include "led_matrix_kb.inc" | 54 | # include "led_matrix_kb.inc" |
52 | #endif | 55 | #endif |
@@ -67,10 +70,6 @@ const led_point_t k_led_matrix_center = LED_MATRIX_CENTER; | |||
67 | # define LED_DISABLE_TIMEOUT 0 | 70 | # define LED_DISABLE_TIMEOUT 0 |
68 | #endif | 71 | #endif |
69 | 72 | ||
70 | #if LED_DISABLE_WHEN_USB_SUSPENDED != 1 | ||
71 | # undef LED_DISABLE_WHEN_USB_SUSPENDED | ||
72 | #endif | ||
73 | |||
74 | #if !defined(LED_MATRIX_MAXIMUM_BRIGHTNESS) || LED_MATRIX_MAXIMUM_BRIGHTNESS > UINT8_MAX | 73 | #if !defined(LED_MATRIX_MAXIMUM_BRIGHTNESS) || LED_MATRIX_MAXIMUM_BRIGHTNESS > UINT8_MAX |
75 | # undef LED_MATRIX_MAXIMUM_BRIGHTNESS | 74 | # undef LED_MATRIX_MAXIMUM_BRIGHTNESS |
76 | # define LED_MATRIX_MAXIMUM_BRIGHTNESS UINT8_MAX | 75 | # define LED_MATRIX_MAXIMUM_BRIGHTNESS UINT8_MAX |
@@ -108,6 +107,7 @@ last_hit_t g_last_hit_tracker; | |||
108 | 107 | ||
109 | // internals | 108 | // internals |
110 | static bool suspend_state = false; | 109 | static bool suspend_state = false; |
110 | static bool led_update_eeprom = false; | ||
111 | static uint8_t led_last_enable = UINT8_MAX; | 111 | static uint8_t led_last_enable = UINT8_MAX; |
112 | static uint8_t led_last_effect = UINT8_MAX; | 112 | static uint8_t led_last_effect = UINT8_MAX; |
113 | static effect_params_t led_effect_params = {0, LED_FLAG_ALL, false}; | 113 | static effect_params_t led_effect_params = {0, LED_FLAG_ALL, false}; |
@@ -280,6 +280,8 @@ static void led_task_timers(void) { | |||
280 | 280 | ||
281 | static void led_task_sync(void) { | 281 | static void led_task_sync(void) { |
282 | // next task | 282 | // next task |
283 | if (led_update_eeprom) eeconfig_update_led_matrix(); | ||
284 | led_update_eeprom = false; | ||
283 | if (sync_timer_elapsed32(g_led_timer) >= LED_MATRIX_LED_FLUSH_LIMIT) led_task_state = STARTING; | 285 | if (sync_timer_elapsed32(g_led_timer) >= LED_MATRIX_LED_FLUSH_LIMIT) led_task_state = STARTING; |
284 | } | 286 | } |
285 | 287 | ||
@@ -318,7 +320,7 @@ static void led_task_render(uint8_t effect) { | |||
318 | case LED_MATRIX_##name: \ | 320 | case LED_MATRIX_##name: \ |
319 | rendering = name(&led_effect_params); \ | 321 | rendering = name(&led_effect_params); \ |
320 | break; | 322 | break; |
321 | #include "led_matrix_animations/led_matrix_effects.inc" | 323 | #include "led_matrix_effects.inc" |
322 | #undef LED_MATRIX_EFFECT | 324 | #undef LED_MATRIX_EFFECT |
323 | 325 | ||
324 | #if defined(LED_MATRIX_CUSTOM_KB) || defined(LED_MATRIX_CUSTOM_USER) | 326 | #if defined(LED_MATRIX_CUSTOM_KB) || defined(LED_MATRIX_CUSTOM_USER) |
@@ -469,9 +471,7 @@ bool led_matrix_get_suspend_state(void) { return suspend_state; } | |||
469 | void led_matrix_toggle_eeprom_helper(bool write_to_eeprom) { | 471 | void led_matrix_toggle_eeprom_helper(bool write_to_eeprom) { |
470 | led_matrix_eeconfig.enable ^= 1; | 472 | led_matrix_eeconfig.enable ^= 1; |
471 | led_task_state = STARTING; | 473 | led_task_state = STARTING; |
472 | if (write_to_eeprom) { | 474 | led_eeconfig_update(write_to_eeprom); |
473 | eeconfig_update_led_matrix(); | ||
474 | } | ||
475 | dprintf("led matrix toggle [%s]: led_matrix_eeconfig.enable = %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", led_matrix_eeconfig.enable); | 475 | dprintf("led matrix toggle [%s]: led_matrix_eeconfig.enable = %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", led_matrix_eeconfig.enable); |
476 | } | 476 | } |
477 | void led_matrix_toggle_noeeprom(void) { led_matrix_toggle_eeprom_helper(false); } | 477 | void led_matrix_toggle_noeeprom(void) { led_matrix_toggle_eeprom_helper(false); } |
@@ -479,7 +479,7 @@ void led_matrix_toggle(void) { led_matrix_toggle_eeprom_helper(true); } | |||
479 | 479 | ||
480 | void led_matrix_enable(void) { | 480 | void led_matrix_enable(void) { |
481 | led_matrix_enable_noeeprom(); | 481 | led_matrix_enable_noeeprom(); |
482 | eeconfig_update_led_matrix(); | 482 | led_eeconfig_update(true); |
483 | } | 483 | } |
484 | 484 | ||
485 | void led_matrix_enable_noeeprom(void) { | 485 | void led_matrix_enable_noeeprom(void) { |
@@ -489,7 +489,7 @@ void led_matrix_enable_noeeprom(void) { | |||
489 | 489 | ||
490 | void led_matrix_disable(void) { | 490 | void led_matrix_disable(void) { |
491 | led_matrix_disable_noeeprom(); | 491 | led_matrix_disable_noeeprom(); |
492 | eeconfig_update_led_matrix(); | 492 | led_eeconfig_update(true); |
493 | } | 493 | } |
494 | 494 | ||
495 | void led_matrix_disable_noeeprom(void) { | 495 | void led_matrix_disable_noeeprom(void) { |
@@ -511,9 +511,7 @@ void led_matrix_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom) { | |||
511 | led_matrix_eeconfig.mode = mode; | 511 | led_matrix_eeconfig.mode = mode; |
512 | } | 512 | } |
513 | led_task_state = STARTING; | 513 | led_task_state = STARTING; |
514 | if (write_to_eeprom) { | 514 | led_eeconfig_update(write_to_eeprom); |
515 | eeconfig_update_led_matrix(); | ||
516 | } | ||
517 | dprintf("led matrix mode [%s]: %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", led_matrix_eeconfig.mode); | 515 | dprintf("led matrix mode [%s]: %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", led_matrix_eeconfig.mode); |
518 | } | 516 | } |
519 | void led_matrix_mode_noeeprom(uint8_t mode) { led_matrix_mode_eeprom_helper(mode, false); } | 517 | void led_matrix_mode_noeeprom(uint8_t mode) { led_matrix_mode_eeprom_helper(mode, false); } |
@@ -540,9 +538,7 @@ void led_matrix_set_val_eeprom_helper(uint8_t val, bool write_to_eeprom) { | |||
540 | return; | 538 | return; |
541 | } | 539 | } |
542 | led_matrix_eeconfig.val = (val > LED_MATRIX_MAXIMUM_BRIGHTNESS) ? LED_MATRIX_MAXIMUM_BRIGHTNESS : val; | 540 | led_matrix_eeconfig.val = (val > LED_MATRIX_MAXIMUM_BRIGHTNESS) ? LED_MATRIX_MAXIMUM_BRIGHTNESS : val; |
543 | if (write_to_eeprom) { | 541 | led_eeconfig_update(write_to_eeprom); |
544 | eeconfig_update_led_matrix(); | ||
545 | } | ||
546 | dprintf("led matrix set val [%s]: %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", led_matrix_eeconfig.val); | 542 | dprintf("led matrix set val [%s]: %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", led_matrix_eeconfig.val); |
547 | } | 543 | } |
548 | void led_matrix_set_val_noeeprom(uint8_t val) { led_matrix_set_val_eeprom_helper(val, false); } | 544 | void led_matrix_set_val_noeeprom(uint8_t val) { led_matrix_set_val_eeprom_helper(val, false); } |
@@ -560,9 +556,7 @@ void led_matrix_decrease_val(void) { led_matrix_decrease_val_helper(true); } | |||
560 | 556 | ||
561 | void led_matrix_set_speed_eeprom_helper(uint8_t speed, bool write_to_eeprom) { | 557 | void led_matrix_set_speed_eeprom_helper(uint8_t speed, bool write_to_eeprom) { |
562 | led_matrix_eeconfig.speed = speed; | 558 | led_matrix_eeconfig.speed = speed; |
563 | if (write_to_eeprom) { | 559 | led_eeconfig_update(write_to_eeprom); |
564 | eeconfig_update_led_matrix(); | ||
565 | } | ||
566 | dprintf("led matrix set speed [%s]: %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", led_matrix_eeconfig.speed); | 560 | dprintf("led matrix set speed [%s]: %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", led_matrix_eeconfig.speed); |
567 | } | 561 | } |
568 | void led_matrix_set_speed_noeeprom(uint8_t speed) { led_matrix_set_speed_eeprom_helper(speed, false); } | 562 | void led_matrix_set_speed_noeeprom(uint8_t speed) { led_matrix_set_speed_eeprom_helper(speed, false); } |
diff --git a/quantum/led_matrix.h b/quantum/led_matrix/led_matrix.h index 0984de73b..6f85854fb 100644 --- a/quantum/led_matrix.h +++ b/quantum/led_matrix/led_matrix.h | |||
@@ -56,7 +56,7 @@ enum led_matrix_effects { | |||
56 | // -------------------------------------- | 56 | // -------------------------------------- |
57 | // -----Begin led effect enum macros----- | 57 | // -----Begin led effect enum macros----- |
58 | #define LED_MATRIX_EFFECT(name, ...) LED_MATRIX_##name, | 58 | #define LED_MATRIX_EFFECT(name, ...) LED_MATRIX_##name, |
59 | #include "led_matrix_animations/led_matrix_effects.inc" | 59 | #include "led_matrix_effects.inc" |
60 | #undef LED_MATRIX_EFFECT | 60 | #undef LED_MATRIX_EFFECT |
61 | 61 | ||
62 | #if defined(LED_MATRIX_CUSTOM_KB) || defined(LED_MATRIX_CUSTOM_USER) | 62 | #if defined(LED_MATRIX_CUSTOM_KB) || defined(LED_MATRIX_CUSTOM_USER) |
diff --git a/quantum/led_matrix_drivers.c b/quantum/led_matrix/led_matrix_drivers.c index 1d46b2c50..1d46b2c50 100644 --- a/quantum/led_matrix_drivers.c +++ b/quantum/led_matrix/led_matrix_drivers.c | |||
diff --git a/quantum/led_matrix_types.h b/quantum/led_matrix/led_matrix_types.h index 61cdbd9b8..61cdbd9b8 100644 --- a/quantum/led_matrix_types.h +++ b/quantum/led_matrix/led_matrix_types.h | |||
diff --git a/quantum/led_matrix_animations/led_matrix_effects.inc b/quantum/led_matrix_animations/led_matrix_effects.inc deleted file mode 100644 index 67237c568..000000000 --- a/quantum/led_matrix_animations/led_matrix_effects.inc +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | // Add your new core led matrix effect here, order determins enum order, requires "led_matrix_animations/ directory | ||
2 | #include "led_matrix_animations/solid_anim.h" | ||
3 | #include "led_matrix_animations/alpha_mods_anim.h" | ||
4 | #include "led_matrix_animations/breathing_anim.h" | ||
5 | #include "led_matrix_animations/band_anim.h" | ||
6 | #include "led_matrix_animations/band_pinwheel_anim.h" | ||
7 | #include "led_matrix_animations/band_spiral_anim.h" | ||
8 | #include "led_matrix_animations/cycle_left_right_anim.h" | ||
9 | #include "led_matrix_animations/cycle_up_down_anim.h" | ||
10 | #include "led_matrix_animations/cycle_out_in_anim.h" | ||
11 | #include "led_matrix_animations/dual_beacon_anim.h" | ||
12 | #include "led_matrix_animations/solid_reactive_simple_anim.h" | ||
13 | #include "led_matrix_animations/solid_reactive_wide.h" | ||
14 | #include "led_matrix_animations/solid_reactive_cross.h" | ||
15 | #include "led_matrix_animations/solid_reactive_nexus.h" | ||
16 | #include "led_matrix_animations/solid_splash_anim.h" | ||
17 | #include "led_matrix_animations/wave_left_right_anim.h" | ||
18 | #include "led_matrix_animations/wave_up_down_anim.h" | ||
diff --git a/quantum/matrix.c b/quantum/matrix.c index 34d6af2e6..ed4643f81 100644 --- a/quantum/matrix.c +++ b/quantum/matrix.c | |||
@@ -16,22 +16,69 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
16 | */ | 16 | */ |
17 | #include <stdint.h> | 17 | #include <stdint.h> |
18 | #include <stdbool.h> | 18 | #include <stdbool.h> |
19 | #include <string.h> | ||
19 | #include "util.h" | 20 | #include "util.h" |
20 | #include "matrix.h" | 21 | #include "matrix.h" |
21 | #include "debounce.h" | 22 | #include "debounce.h" |
22 | #include "quantum.h" | 23 | #include "quantum.h" |
24 | #ifdef SPLIT_KEYBOARD | ||
25 | # include "split_common/split_util.h" | ||
26 | # include "split_common/transactions.h" | ||
27 | |||
28 | # ifndef ERROR_DISCONNECT_COUNT | ||
29 | # define ERROR_DISCONNECT_COUNT 5 | ||
30 | # endif // ERROR_DISCONNECT_COUNT | ||
31 | |||
32 | # define ROWS_PER_HAND (MATRIX_ROWS / 2) | ||
33 | #else | ||
34 | # define ROWS_PER_HAND (MATRIX_ROWS) | ||
35 | #endif | ||
36 | |||
37 | #ifdef DIRECT_PINS_RIGHT | ||
38 | # define SPLIT_MUTABLE | ||
39 | #else | ||
40 | # define SPLIT_MUTABLE const | ||
41 | #endif | ||
42 | #ifdef MATRIX_ROW_PINS_RIGHT | ||
43 | # define SPLIT_MUTABLE_ROW | ||
44 | #else | ||
45 | # define SPLIT_MUTABLE_ROW const | ||
46 | #endif | ||
47 | #ifdef MATRIX_COL_PINS_RIGHT | ||
48 | # define SPLIT_MUTABLE_COL | ||
49 | #else | ||
50 | # define SPLIT_MUTABLE_COL const | ||
51 | #endif | ||
23 | 52 | ||
24 | #ifdef DIRECT_PINS | 53 | #ifdef DIRECT_PINS |
25 | static pin_t direct_pins[MATRIX_ROWS][MATRIX_COLS] = DIRECT_PINS; | 54 | static SPLIT_MUTABLE pin_t direct_pins[MATRIX_ROWS][MATRIX_COLS] = DIRECT_PINS; |
26 | #elif (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW) | 55 | #elif (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW) |
27 | static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; | 56 | # ifdef MATRIX_ROW_PINS |
28 | static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; | 57 | static SPLIT_MUTABLE_ROW pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; |
58 | # endif // MATRIX_ROW_PINS | ||
59 | # ifdef MATRIX_COL_PINS | ||
60 | static SPLIT_MUTABLE_COL pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; | ||
61 | # endif // MATRIX_COL_PINS | ||
29 | #endif | 62 | #endif |
30 | 63 | ||
31 | /* matrix state(1:on, 0:off) */ | 64 | /* matrix state(1:on, 0:off) */ |
32 | extern matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values | 65 | extern matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values |
33 | extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values | 66 | extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values |
34 | 67 | ||
68 | #ifdef SPLIT_KEYBOARD | ||
69 | // row offsets for each hand | ||
70 | uint8_t thisHand, thatHand; | ||
71 | #endif | ||
72 | |||
73 | // user-defined overridable functions | ||
74 | __attribute__((weak)) void matrix_init_pins(void); | ||
75 | __attribute__((weak)) void matrix_read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row); | ||
76 | __attribute__((weak)) void matrix_read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); | ||
77 | #ifdef SPLIT_KEYBOARD | ||
78 | __attribute__((weak)) void matrix_slave_scan_kb(void) { matrix_slave_scan_user(); } | ||
79 | __attribute__((weak)) void matrix_slave_scan_user(void) {} | ||
80 | #endif | ||
81 | |||
35 | static inline void setPinOutput_writeLow(pin_t pin) { | 82 | static inline void setPinOutput_writeLow(pin_t pin) { |
36 | ATOMIC_BLOCK_FORCEON { | 83 | ATOMIC_BLOCK_FORCEON { |
37 | setPinOutput(pin); | 84 | setPinOutput(pin); |
@@ -43,11 +90,19 @@ static inline void setPinInputHigh_atomic(pin_t pin) { | |||
43 | ATOMIC_BLOCK_FORCEON { setPinInputHigh(pin); } | 90 | ATOMIC_BLOCK_FORCEON { setPinInputHigh(pin); } |
44 | } | 91 | } |
45 | 92 | ||
93 | static inline uint8_t readMatrixPin(pin_t pin) { | ||
94 | if (pin != NO_PIN) { | ||
95 | return readPin(pin); | ||
96 | } else { | ||
97 | return 1; | ||
98 | } | ||
99 | } | ||
100 | |||
46 | // matrix code | 101 | // matrix code |
47 | 102 | ||
48 | #ifdef DIRECT_PINS | 103 | #ifdef DIRECT_PINS |
49 | 104 | ||
50 | static void init_pins(void) { | 105 | __attribute__((weak)) void matrix_init_pins(void) { |
51 | for (int row = 0; row < MATRIX_ROWS; row++) { | 106 | for (int row = 0; row < MATRIX_ROWS; row++) { |
52 | for (int col = 0; col < MATRIX_COLS; col++) { | 107 | for (int col = 0; col < MATRIX_COLS; col++) { |
53 | pin_t pin = direct_pins[row][col]; | 108 | pin_t pin = direct_pins[row][col]; |
@@ -58,7 +113,7 @@ static void init_pins(void) { | |||
58 | } | 113 | } |
59 | } | 114 | } |
60 | 115 | ||
61 | static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { | 116 | __attribute__((weak)) void matrix_read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { |
62 | // Start with a clear matrix row | 117 | // Start with a clear matrix row |
63 | matrix_row_t current_row_value = 0; | 118 | matrix_row_t current_row_value = 0; |
64 | 119 | ||
@@ -69,46 +124,57 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) | |||
69 | } | 124 | } |
70 | } | 125 | } |
71 | 126 | ||
72 | // If the row has changed, store the row and return the changed flag. | 127 | // Update the matrix |
73 | if (current_matrix[current_row] != current_row_value) { | 128 | current_matrix[current_row] = current_row_value; |
74 | current_matrix[current_row] = current_row_value; | ||
75 | return true; | ||
76 | } | ||
77 | return false; | ||
78 | } | 129 | } |
79 | 130 | ||
80 | #elif defined(DIODE_DIRECTION) | 131 | #elif defined(DIODE_DIRECTION) |
81 | # if (DIODE_DIRECTION == COL2ROW) | 132 | # if defined(MATRIX_ROW_PINS) && defined(MATRIX_COL_PINS) |
133 | # if (DIODE_DIRECTION == COL2ROW) | ||
82 | 134 | ||
83 | static void select_row(uint8_t row) { setPinOutput_writeLow(row_pins[row]); } | 135 | static bool select_row(uint8_t row) { |
136 | pin_t pin = row_pins[row]; | ||
137 | if (pin != NO_PIN) { | ||
138 | setPinOutput_writeLow(pin); | ||
139 | return true; | ||
140 | } | ||
141 | return false; | ||
142 | } | ||
84 | 143 | ||
85 | static void unselect_row(uint8_t row) { setPinInputHigh_atomic(row_pins[row]); } | 144 | static void unselect_row(uint8_t row) { |
145 | pin_t pin = row_pins[row]; | ||
146 | if (pin != NO_PIN) { | ||
147 | setPinInputHigh_atomic(pin); | ||
148 | } | ||
149 | } | ||
86 | 150 | ||
87 | static void unselect_rows(void) { | 151 | static void unselect_rows(void) { |
88 | for (uint8_t x = 0; x < MATRIX_ROWS; x++) { | 152 | for (uint8_t x = 0; x < MATRIX_ROWS; x++) { |
89 | setPinInputHigh_atomic(row_pins[x]); | 153 | unselect_row(x); |
90 | } | 154 | } |
91 | } | 155 | } |
92 | 156 | ||
93 | static void init_pins(void) { | 157 | __attribute__((weak)) void matrix_init_pins(void) { |
94 | unselect_rows(); | 158 | unselect_rows(); |
95 | for (uint8_t x = 0; x < MATRIX_COLS; x++) { | 159 | for (uint8_t x = 0; x < MATRIX_COLS; x++) { |
96 | setPinInputHigh_atomic(col_pins[x]); | 160 | if (col_pins[x] != NO_PIN) { |
161 | setPinInputHigh_atomic(col_pins[x]); | ||
162 | } | ||
97 | } | 163 | } |
98 | } | 164 | } |
99 | 165 | ||
100 | static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { | 166 | __attribute__((weak)) void matrix_read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { |
101 | // Start with a clear matrix row | 167 | // Start with a clear matrix row |
102 | matrix_row_t current_row_value = 0; | 168 | matrix_row_t current_row_value = 0; |
103 | 169 | ||
104 | // Select row | 170 | if (!select_row(current_row)) { // Select row |
105 | select_row(current_row); | 171 | return; // skip NO_PIN row |
172 | } | ||
106 | matrix_output_select_delay(); | 173 | matrix_output_select_delay(); |
107 | 174 | ||
108 | // For each col... | 175 | // For each col... |
109 | for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { | 176 | for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { |
110 | // Select the col pin to read (active low) | 177 | uint8_t pin_state = readMatrixPin(col_pins[col_index]); |
111 | uint8_t pin_state = readPin(col_pins[col_index]); | ||
112 | 178 | ||
113 | // Populate the matrix row with the state of the col pin | 179 | // Populate the matrix row with the state of the col pin |
114 | current_row_value |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index); | 180 | current_row_value |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index); |
@@ -118,79 +184,109 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) | |||
118 | unselect_row(current_row); | 184 | unselect_row(current_row); |
119 | matrix_output_unselect_delay(); // wait for all Col signals to go HIGH | 185 | matrix_output_unselect_delay(); // wait for all Col signals to go HIGH |
120 | 186 | ||
121 | // If the row has changed, store the row and return the changed flag. | 187 | // Update the matrix |
122 | if (current_matrix[current_row] != current_row_value) { | 188 | current_matrix[current_row] = current_row_value; |
123 | current_matrix[current_row] = current_row_value; | 189 | } |
190 | |||
191 | # elif (DIODE_DIRECTION == ROW2COL) | ||
192 | |||
193 | static bool select_col(uint8_t col) { | ||
194 | pin_t pin = col_pins[col]; | ||
195 | if (pin != NO_PIN) { | ||
196 | setPinOutput_writeLow(pin); | ||
124 | return true; | 197 | return true; |
125 | } | 198 | } |
126 | return false; | 199 | return false; |
127 | } | 200 | } |
128 | 201 | ||
129 | # elif (DIODE_DIRECTION == ROW2COL) | 202 | static void unselect_col(uint8_t col) { |
130 | 203 | pin_t pin = col_pins[col]; | |
131 | static void select_col(uint8_t col) { setPinOutput_writeLow(col_pins[col]); } | 204 | if (pin != NO_PIN) { |
132 | 205 | setPinInputHigh_atomic(pin); | |
133 | static void unselect_col(uint8_t col) { setPinInputHigh_atomic(col_pins[col]); } | 206 | } |
207 | } | ||
134 | 208 | ||
135 | static void unselect_cols(void) { | 209 | static void unselect_cols(void) { |
136 | for (uint8_t x = 0; x < MATRIX_COLS; x++) { | 210 | for (uint8_t x = 0; x < MATRIX_COLS; x++) { |
137 | setPinInputHigh_atomic(col_pins[x]); | 211 | unselect_col(x); |
138 | } | 212 | } |
139 | } | 213 | } |
140 | 214 | ||
141 | static void init_pins(void) { | 215 | __attribute__((weak)) void matrix_init_pins(void) { |
142 | unselect_cols(); | 216 | unselect_cols(); |
143 | for (uint8_t x = 0; x < MATRIX_ROWS; x++) { | 217 | for (uint8_t x = 0; x < MATRIX_ROWS; x++) { |
144 | setPinInputHigh_atomic(row_pins[x]); | 218 | if (row_pins[x] != NO_PIN) { |
219 | setPinInputHigh_atomic(row_pins[x]); | ||
220 | } | ||
145 | } | 221 | } |
146 | } | 222 | } |
147 | 223 | ||
148 | static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) { | 224 | __attribute__((weak)) void matrix_read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) { |
149 | bool matrix_changed = false; | ||
150 | |||
151 | // Select col | 225 | // Select col |
152 | select_col(current_col); | 226 | if (!select_col(current_col)) { // select col |
227 | return; // skip NO_PIN col | ||
228 | } | ||
153 | matrix_output_select_delay(); | 229 | matrix_output_select_delay(); |
154 | 230 | ||
155 | // For each row... | 231 | // For each row... |
156 | for (uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) { | 232 | for (uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) { |
157 | // Store last value of row prior to reading | ||
158 | matrix_row_t last_row_value = current_matrix[row_index]; | ||
159 | matrix_row_t current_row_value = last_row_value; | ||
160 | |||
161 | // Check row pin state | 233 | // Check row pin state |
162 | if (readPin(row_pins[row_index]) == 0) { | 234 | if (readMatrixPin(row_pins[row_index]) == 0) { |
163 | // Pin LO, set col bit | 235 | // Pin LO, set col bit |
164 | current_row_value |= (MATRIX_ROW_SHIFTER << current_col); | 236 | current_matrix[row_index] |= (MATRIX_ROW_SHIFTER << current_col); |
165 | } else { | 237 | } else { |
166 | // Pin HI, clear col bit | 238 | // Pin HI, clear col bit |
167 | current_row_value &= ~(MATRIX_ROW_SHIFTER << current_col); | 239 | current_matrix[row_index] &= ~(MATRIX_ROW_SHIFTER << current_col); |
168 | } | ||
169 | |||
170 | // Determine if the matrix changed state | ||
171 | if ((last_row_value != current_row_value)) { | ||
172 | matrix_changed |= true; | ||
173 | current_matrix[row_index] = current_row_value; | ||
174 | } | 240 | } |
175 | } | 241 | } |
176 | 242 | ||
177 | // Unselect col | 243 | // Unselect col |
178 | unselect_col(current_col); | 244 | unselect_col(current_col); |
179 | matrix_output_unselect_delay(); // wait for all Row signals to go HIGH | 245 | matrix_output_unselect_delay(); // wait for all Row signals to go HIGH |
180 | |||
181 | return matrix_changed; | ||
182 | } | 246 | } |
183 | 247 | ||
184 | # else | 248 | # else |
185 | # error DIODE_DIRECTION must be one of COL2ROW or ROW2COL! | 249 | # error DIODE_DIRECTION must be one of COL2ROW or ROW2COL! |
186 | # endif | 250 | # endif |
251 | # endif // defined(MATRIX_ROW_PINS) && defined(MATRIX_COL_PINS) | ||
187 | #else | 252 | #else |
188 | # error DIODE_DIRECTION is not defined! | 253 | # error DIODE_DIRECTION is not defined! |
189 | #endif | 254 | #endif |
190 | 255 | ||
191 | void matrix_init(void) { | 256 | void matrix_init(void) { |
257 | #ifdef SPLIT_KEYBOARD | ||
258 | split_pre_init(); | ||
259 | |||
260 | // Set pinout for right half if pinout for that half is defined | ||
261 | if (!isLeftHand) { | ||
262 | # ifdef DIRECT_PINS_RIGHT | ||
263 | const pin_t direct_pins_right[MATRIX_ROWS][MATRIX_COLS] = DIRECT_PINS_RIGHT; | ||
264 | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||
265 | for (uint8_t j = 0; j < MATRIX_COLS; j++) { | ||
266 | direct_pins[i][j] = direct_pins_right[i][j]; | ||
267 | } | ||
268 | } | ||
269 | # endif | ||
270 | # ifdef MATRIX_ROW_PINS_RIGHT | ||
271 | const pin_t row_pins_right[MATRIX_ROWS] = MATRIX_ROW_PINS_RIGHT; | ||
272 | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||
273 | row_pins[i] = row_pins_right[i]; | ||
274 | } | ||
275 | # endif | ||
276 | # ifdef MATRIX_COL_PINS_RIGHT | ||
277 | const pin_t col_pins_right[MATRIX_COLS] = MATRIX_COL_PINS_RIGHT; | ||
278 | for (uint8_t i = 0; i < MATRIX_COLS; i++) { | ||
279 | col_pins[i] = col_pins_right[i]; | ||
280 | } | ||
281 | # endif | ||
282 | } | ||
283 | |||
284 | thisHand = isLeftHand ? 0 : (ROWS_PER_HAND); | ||
285 | thatHand = ROWS_PER_HAND - thisHand; | ||
286 | #endif | ||
287 | |||
192 | // initialize key pins | 288 | // initialize key pins |
193 | init_pins(); | 289 | matrix_init_pins(); |
194 | 290 | ||
195 | // initialize matrix state: all keys off | 291 | // initialize matrix state: all keys off |
196 | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | 292 | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { |
@@ -198,28 +294,80 @@ void matrix_init(void) { | |||
198 | matrix[i] = 0; | 294 | matrix[i] = 0; |
199 | } | 295 | } |
200 | 296 | ||
201 | debounce_init(MATRIX_ROWS); | 297 | debounce_init(ROWS_PER_HAND); |
202 | 298 | ||
203 | matrix_init_quantum(); | 299 | matrix_init_quantum(); |
300 | |||
301 | #ifdef SPLIT_KEYBOARD | ||
302 | split_post_init(); | ||
303 | #endif | ||
204 | } | 304 | } |
205 | 305 | ||
206 | uint8_t matrix_scan(void) { | 306 | #ifdef SPLIT_KEYBOARD |
307 | bool matrix_post_scan(void) { | ||
207 | bool changed = false; | 308 | bool changed = false; |
309 | if (is_keyboard_master()) { | ||
310 | static uint8_t error_count; | ||
311 | |||
312 | matrix_row_t slave_matrix[ROWS_PER_HAND] = {0}; | ||
313 | if (!transport_master(matrix + thisHand, slave_matrix)) { | ||
314 | error_count++; | ||
315 | |||
316 | if (error_count > ERROR_DISCONNECT_COUNT) { | ||
317 | // reset other half if disconnected | ||
318 | for (int i = 0; i < ROWS_PER_HAND; ++i) { | ||
319 | matrix[thatHand + i] = 0; | ||
320 | slave_matrix[i] = 0; | ||
321 | } | ||
322 | |||
323 | changed = true; | ||
324 | } | ||
325 | } else { | ||
326 | error_count = 0; | ||
327 | |||
328 | for (int i = 0; i < ROWS_PER_HAND; ++i) { | ||
329 | if (matrix[thatHand + i] != slave_matrix[i]) { | ||
330 | matrix[thatHand + i] = slave_matrix[i]; | ||
331 | changed = true; | ||
332 | } | ||
333 | } | ||
334 | } | ||
335 | |||
336 | matrix_scan_quantum(); | ||
337 | } else { | ||
338 | transport_slave(matrix + thatHand, matrix + thisHand); | ||
339 | |||
340 | matrix_slave_scan_kb(); | ||
341 | } | ||
342 | |||
343 | return changed; | ||
344 | } | ||
345 | #endif | ||
346 | |||
347 | uint8_t matrix_scan(void) { | ||
348 | matrix_row_t curr_matrix[MATRIX_ROWS] = {0}; | ||
208 | 349 | ||
209 | #if defined(DIRECT_PINS) || (DIODE_DIRECTION == COL2ROW) | 350 | #if defined(DIRECT_PINS) || (DIODE_DIRECTION == COL2ROW) |
210 | // Set row, read cols | 351 | // Set row, read cols |
211 | for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) { | 352 | for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) { |
212 | changed |= read_cols_on_row(raw_matrix, current_row); | 353 | matrix_read_cols_on_row(curr_matrix, current_row); |
213 | } | 354 | } |
214 | #elif (DIODE_DIRECTION == ROW2COL) | 355 | #elif (DIODE_DIRECTION == ROW2COL) |
215 | // Set col, read rows | 356 | // Set col, read rows |
216 | for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { | 357 | for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { |
217 | changed |= read_rows_on_col(raw_matrix, current_col); | 358 | matrix_read_rows_on_col(curr_matrix, current_col); |
218 | } | 359 | } |
219 | #endif | 360 | #endif |
220 | 361 | ||
221 | debounce(raw_matrix, matrix, MATRIX_ROWS, changed); | 362 | bool changed = memcmp(raw_matrix, curr_matrix, sizeof(curr_matrix)) != 0; |
363 | if (changed) memcpy(raw_matrix, curr_matrix, sizeof(curr_matrix)); | ||
222 | 364 | ||
365 | #ifdef SPLIT_KEYBOARD | ||
366 | debounce(raw_matrix, matrix + thisHand, ROWS_PER_HAND, changed); | ||
367 | changed = (changed || matrix_post_scan()); | ||
368 | #else | ||
369 | debounce(raw_matrix, matrix, ROWS_PER_HAND, changed); | ||
223 | matrix_scan_quantum(); | 370 | matrix_scan_quantum(); |
371 | #endif | ||
224 | return (uint8_t)changed; | 372 | return (uint8_t)changed; |
225 | } | 373 | } |
diff --git a/quantum/mcu_selection.mk b/quantum/mcu_selection.mk index 9268c4522..ca0accd71 100644 --- a/quantum/mcu_selection.mk +++ b/quantum/mcu_selection.mk | |||
@@ -136,10 +136,6 @@ ifneq ($(findstring STM32F042, $(MCU)),) | |||
136 | 136 | ||
137 | USE_FPU ?= no | 137 | USE_FPU ?= no |
138 | 138 | ||
139 | # Options to pass to dfu-util when flashing | ||
140 | DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave | ||
141 | DFU_SUFFIX_ARGS ?= -v 0483 -p DF11 | ||
142 | |||
143 | # UF2 settings | 139 | # UF2 settings |
144 | UF2_FAMILY ?= STM32F0 | 140 | UF2_FAMILY ?= STM32F0 |
145 | endif | 141 | endif |
@@ -172,10 +168,6 @@ ifneq ($(findstring STM32F072, $(MCU)),) | |||
172 | 168 | ||
173 | USE_FPU ?= no | 169 | USE_FPU ?= no |
174 | 170 | ||
175 | # Options to pass to dfu-util when flashing | ||
176 | DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave | ||
177 | DFU_SUFFIX_ARGS ?= -v 0483 -p DF11 | ||
178 | |||
179 | # UF2 settings | 171 | # UF2 settings |
180 | UF2_FAMILY ?= STM32F0 | 172 | UF2_FAMILY ?= STM32F0 |
181 | endif | 173 | endif |
@@ -208,10 +200,6 @@ ifneq ($(findstring STM32F103, $(MCU)),) | |||
208 | 200 | ||
209 | USE_FPU ?= no | 201 | USE_FPU ?= no |
210 | 202 | ||
211 | # Options to pass to dfu-util when flashing | ||
212 | DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave | ||
213 | DFU_SUFFIX_ARGS ?= -v 0483 -p DF11 | ||
214 | |||
215 | # UF2 settings | 203 | # UF2 settings |
216 | UF2_FAMILY ?= STM32F1 | 204 | UF2_FAMILY ?= STM32F1 |
217 | endif | 205 | endif |
@@ -244,10 +232,6 @@ ifneq ($(findstring STM32F303, $(MCU)),) | |||
244 | 232 | ||
245 | USE_FPU ?= yes | 233 | USE_FPU ?= yes |
246 | 234 | ||
247 | # Options to pass to dfu-util when flashing | ||
248 | DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave | ||
249 | DFU_SUFFIX_ARGS ?= -v 0483 -p DF11 | ||
250 | |||
251 | # UF2 settings | 235 | # UF2 settings |
252 | UF2_FAMILY ?= STM32F3 | 236 | UF2_FAMILY ?= STM32F3 |
253 | endif | 237 | endif |
@@ -280,10 +264,6 @@ ifneq ($(findstring STM32F401, $(MCU)),) | |||
280 | 264 | ||
281 | USE_FPU ?= yes | 265 | USE_FPU ?= yes |
282 | 266 | ||
283 | # Options to pass to dfu-util when flashing | ||
284 | DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave | ||
285 | DFU_SUFFIX_ARGS ?= -v 0483 -p DF11 | ||
286 | |||
287 | # UF2 settings | 267 | # UF2 settings |
288 | UF2_FAMILY ?= STM32F4 | 268 | UF2_FAMILY ?= STM32F4 |
289 | endif | 269 | endif |
@@ -321,10 +301,6 @@ ifneq ($(findstring STM32F411, $(MCU)),) | |||
321 | 301 | ||
322 | USE_FPU ?= yes | 302 | USE_FPU ?= yes |
323 | 303 | ||
324 | # Options to pass to dfu-util when flashing | ||
325 | DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave | ||
326 | DFU_SUFFIX_ARGS ?= -v 0483 -p DF11 | ||
327 | |||
328 | # UF2 settings | 304 | # UF2 settings |
329 | UF2_FAMILY ?= STM32F4 | 305 | UF2_FAMILY ?= STM32F4 |
330 | endif | 306 | endif |
@@ -357,10 +333,6 @@ ifneq ($(findstring STM32F446, $(MCU)),) | |||
357 | BOARD ?= GENERIC_STM32_F446XE | 333 | BOARD ?= GENERIC_STM32_F446XE |
358 | 334 | ||
359 | USE_FPU ?= yes | 335 | USE_FPU ?= yes |
360 | |||
361 | # Options to pass to dfu-util when flashing | ||
362 | DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave | ||
363 | DFU_SUFFIX_ARGS ?= -v 0483 -p DF11 | ||
364 | endif | 336 | endif |
365 | 337 | ||
366 | ifneq ($(findstring STM32G431, $(MCU)),) | 338 | ifneq ($(findstring STM32G431, $(MCU)),) |
@@ -391,10 +363,6 @@ ifneq ($(findstring STM32G431, $(MCU)),) | |||
391 | 363 | ||
392 | USE_FPU ?= yes | 364 | USE_FPU ?= yes |
393 | 365 | ||
394 | # Options to pass to dfu-util when flashing | ||
395 | DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave | ||
396 | DFU_SUFFIX_ARGS ?= -v 0483 -p DF11 | ||
397 | |||
398 | # UF2 settings | 366 | # UF2 settings |
399 | UF2_FAMILY ?= STM32G4 | 367 | UF2_FAMILY ?= STM32G4 |
400 | endif | 368 | endif |
@@ -427,10 +395,6 @@ ifneq ($(findstring STM32G474, $(MCU)),) | |||
427 | 395 | ||
428 | USE_FPU ?= yes | 396 | USE_FPU ?= yes |
429 | 397 | ||
430 | # Options to pass to dfu-util when flashing | ||
431 | DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave | ||
432 | DFU_SUFFIX_ARGS ?= -v 0483 -p DF11 | ||
433 | |||
434 | # UF2 settings | 398 | # UF2 settings |
435 | UF2_FAMILY ?= STM32G4 | 399 | UF2_FAMILY ?= STM32G4 |
436 | endif | 400 | endif |
@@ -465,9 +429,39 @@ ifneq (,$(filter $(MCU),STM32L433 STM32L443)) | |||
465 | 429 | ||
466 | USE_FPU ?= yes | 430 | USE_FPU ?= yes |
467 | 431 | ||
468 | # Options to pass to dfu-util when flashing | 432 | # UF2 settings |
469 | DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave | 433 | UF2_FAMILY ?= STM32L4 |
470 | DFU_SUFFIX_ARGS ?= -v 0483 -p DF11 | 434 | endif |
435 | |||
436 | ifneq (,$(filter $(MCU),STM32L412 STM32L422)) | ||
437 | # Cortex version | ||
438 | MCU = cortex-m4 | ||
439 | |||
440 | # ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 | ||
441 | ARMV = 7 | ||
442 | |||
443 | ## chip/board settings | ||
444 | # - the next two should match the directories in | ||
445 | # <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) | ||
446 | MCU_FAMILY = STM32 | ||
447 | MCU_SERIES = STM32L4xx | ||
448 | |||
449 | # Linker script to use | ||
450 | # - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/ | ||
451 | # or <keyboard_dir>/ld/ | ||
452 | MCU_LDSCRIPT ?= STM32L412xB | ||
453 | |||
454 | # Startup code to use | ||
455 | # - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/ | ||
456 | MCU_STARTUP ?= stm32l4xx | ||
457 | |||
458 | # Board: it should exist either in <chibios>/os/hal/boards/, | ||
459 | # <keyboard_dir>/boards/, or drivers/boards/ | ||
460 | BOARD ?= GENERIC_STM32_L412XB | ||
461 | |||
462 | PLATFORM_NAME ?= platform_l432 | ||
463 | |||
464 | USE_FPU ?= yes | ||
471 | 465 | ||
472 | # UF2 settings | 466 | # UF2 settings |
473 | UF2_FAMILY ?= STM32L4 | 467 | UF2_FAMILY ?= STM32L4 |
diff --git a/quantum/mousekey.c b/quantum/mousekey.c index 99bfd6b96..c2291fb39 100644 --- a/quantum/mousekey.c +++ b/quantum/mousekey.c | |||
@@ -486,3 +486,5 @@ static void mousekey_debug(void) { | |||
486 | print_dec(mousekey_accel); | 486 | print_dec(mousekey_accel); |
487 | print(")\n"); | 487 | print(")\n"); |
488 | } | 488 | } |
489 | |||
490 | report_mouse_t mousekey_get_report(void) { return mouse_report; } | ||
diff --git a/quantum/mousekey.h b/quantum/mousekey.h index 70dc4bb5c..56c91b5f1 100644 --- a/quantum/mousekey.h +++ b/quantum/mousekey.h | |||
@@ -168,11 +168,12 @@ extern uint8_t mk_time_to_max; | |||
168 | extern uint8_t mk_wheel_max_speed; | 168 | extern uint8_t mk_wheel_max_speed; |
169 | extern uint8_t mk_wheel_time_to_max; | 169 | extern uint8_t mk_wheel_time_to_max; |
170 | 170 | ||
171 | void mousekey_task(void); | 171 | void mousekey_task(void); |
172 | void mousekey_on(uint8_t code); | 172 | void mousekey_on(uint8_t code); |
173 | void mousekey_off(uint8_t code); | 173 | void mousekey_off(uint8_t code); |
174 | void mousekey_clear(void); | 174 | void mousekey_clear(void); |
175 | void mousekey_send(void); | 175 | void mousekey_send(void); |
176 | report_mouse_t mousekey_get_report(void); | ||
176 | 177 | ||
177 | #ifdef __cplusplus | 178 | #ifdef __cplusplus |
178 | } | 179 | } |
diff --git a/quantum/process_keycode/process_rgb.c b/quantum/process_keycode/process_rgb.c index 167c0c03c..b9fee1ca5 100644 --- a/quantum/process_keycode/process_rgb.c +++ b/quantum/process_keycode/process_rgb.c | |||
@@ -14,7 +14,6 @@ | |||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
15 | */ | 15 | */ |
16 | #include "process_rgb.h" | 16 | #include "process_rgb.h" |
17 | #include "rgb.h" | ||
18 | 17 | ||
19 | typedef void (*rgb_func_pointer)(void); | 18 | typedef void (*rgb_func_pointer)(void); |
20 | 19 | ||
diff --git a/quantum/quantum.c b/quantum/quantum.c index 8ccdb774b..b4cfa28d7 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c | |||
@@ -340,13 +340,13 @@ void set_single_persistent_default_layer(uint8_t default_layer) { | |||
340 | #if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS) | 340 | #if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS) |
341 | PLAY_SONG(default_layer_songs[default_layer]); | 341 | PLAY_SONG(default_layer_songs[default_layer]); |
342 | #endif | 342 | #endif |
343 | eeconfig_update_default_layer(1U << default_layer); | 343 | eeconfig_update_default_layer((layer_state_t)1 << default_layer); |
344 | default_layer_set(1U << default_layer); | 344 | default_layer_set((layer_state_t)1 << default_layer); |
345 | } | 345 | } |
346 | 346 | ||
347 | layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3) { | 347 | layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3) { |
348 | layer_state_t mask12 = (1UL << layer1) | (1UL << layer2); | 348 | layer_state_t mask12 = ((layer_state_t)1 << layer1) | ((layer_state_t)1 << layer2); |
349 | layer_state_t mask3 = 1UL << layer3; | 349 | layer_state_t mask3 = (layer_state_t)1 << layer3; |
350 | return (state & mask12) == mask12 ? (state | mask3) : (state & ~mask3); | 350 | return (state & mask12) == mask12 ? (state | mask3) : (state & ~mask3); |
351 | } | 351 | } |
352 | 352 | ||
diff --git a/quantum/quantum.h b/quantum/quantum.h index e4a7c5723..66ba96fde 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h | |||
@@ -176,6 +176,10 @@ extern layer_state_t layer_state; | |||
176 | # include "oled_driver.h" | 176 | # include "oled_driver.h" |
177 | #endif | 177 | #endif |
178 | 178 | ||
179 | #ifdef ST7565_ENABLE | ||
180 | # include "st7565.h" | ||
181 | #endif | ||
182 | |||
179 | #ifdef DIP_SWITCH_ENABLE | 183 | #ifdef DIP_SWITCH_ENABLE |
180 | # include "dip_switch.h" | 184 | # include "dip_switch.h" |
181 | #endif | 185 | #endif |
diff --git a/quantum/rgb_matrix_animations/alpha_mods_anim.h b/quantum/rgb_matrix/animations/alpha_mods_anim.h index 426d88ef3..426d88ef3 100644 --- a/quantum/rgb_matrix_animations/alpha_mods_anim.h +++ b/quantum/rgb_matrix/animations/alpha_mods_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/breathing_anim.h b/quantum/rgb_matrix/animations/breathing_anim.h index 340bd93e5..340bd93e5 100644 --- a/quantum/rgb_matrix_animations/breathing_anim.h +++ b/quantum/rgb_matrix/animations/breathing_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/colorband_pinwheel_sat_anim.h b/quantum/rgb_matrix/animations/colorband_pinwheel_sat_anim.h index 3df3cfda7..3df3cfda7 100644 --- a/quantum/rgb_matrix_animations/colorband_pinwheel_sat_anim.h +++ b/quantum/rgb_matrix/animations/colorband_pinwheel_sat_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/colorband_pinwheel_val_anim.h b/quantum/rgb_matrix/animations/colorband_pinwheel_val_anim.h index 7d80074fd..7d80074fd 100644 --- a/quantum/rgb_matrix_animations/colorband_pinwheel_val_anim.h +++ b/quantum/rgb_matrix/animations/colorband_pinwheel_val_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/colorband_sat_anim.h b/quantum/rgb_matrix/animations/colorband_sat_anim.h index 35b830af6..35b830af6 100644 --- a/quantum/rgb_matrix_animations/colorband_sat_anim.h +++ b/quantum/rgb_matrix/animations/colorband_sat_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/colorband_spiral_sat_anim.h b/quantum/rgb_matrix/animations/colorband_spiral_sat_anim.h index 048157aa1..048157aa1 100644 --- a/quantum/rgb_matrix_animations/colorband_spiral_sat_anim.h +++ b/quantum/rgb_matrix/animations/colorband_spiral_sat_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/colorband_spiral_val_anim.h b/quantum/rgb_matrix/animations/colorband_spiral_val_anim.h index bff2da161..bff2da161 100644 --- a/quantum/rgb_matrix_animations/colorband_spiral_val_anim.h +++ b/quantum/rgb_matrix/animations/colorband_spiral_val_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/colorband_val_anim.h b/quantum/rgb_matrix/animations/colorband_val_anim.h index f1aaf1d06..f1aaf1d06 100644 --- a/quantum/rgb_matrix_animations/colorband_val_anim.h +++ b/quantum/rgb_matrix/animations/colorband_val_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/cycle_all_anim.h b/quantum/rgb_matrix/animations/cycle_all_anim.h index faf8598a3..faf8598a3 100644 --- a/quantum/rgb_matrix_animations/cycle_all_anim.h +++ b/quantum/rgb_matrix/animations/cycle_all_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/cycle_left_right_anim.h b/quantum/rgb_matrix/animations/cycle_left_right_anim.h index cf911eb93..cf911eb93 100644 --- a/quantum/rgb_matrix_animations/cycle_left_right_anim.h +++ b/quantum/rgb_matrix/animations/cycle_left_right_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/cycle_out_in_anim.h b/quantum/rgb_matrix/animations/cycle_out_in_anim.h index d66acd4b2..d66acd4b2 100644 --- a/quantum/rgb_matrix_animations/cycle_out_in_anim.h +++ b/quantum/rgb_matrix/animations/cycle_out_in_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/cycle_out_in_dual_anim.h b/quantum/rgb_matrix/animations/cycle_out_in_dual_anim.h index fe8396140..fe8396140 100644 --- a/quantum/rgb_matrix_animations/cycle_out_in_dual_anim.h +++ b/quantum/rgb_matrix/animations/cycle_out_in_dual_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/cycle_pinwheel_anim.h b/quantum/rgb_matrix/animations/cycle_pinwheel_anim.h index 779988709..779988709 100644 --- a/quantum/rgb_matrix_animations/cycle_pinwheel_anim.h +++ b/quantum/rgb_matrix/animations/cycle_pinwheel_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/cycle_spiral_anim.h b/quantum/rgb_matrix/animations/cycle_spiral_anim.h index 80cfb0dbc..80cfb0dbc 100644 --- a/quantum/rgb_matrix_animations/cycle_spiral_anim.h +++ b/quantum/rgb_matrix/animations/cycle_spiral_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/cycle_up_down_anim.h b/quantum/rgb_matrix/animations/cycle_up_down_anim.h index 5016f739d..5016f739d 100644 --- a/quantum/rgb_matrix_animations/cycle_up_down_anim.h +++ b/quantum/rgb_matrix/animations/cycle_up_down_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/digital_rain_anim.h b/quantum/rgb_matrix/animations/digital_rain_anim.h index 1de45f8e8..1de45f8e8 100644 --- a/quantum/rgb_matrix_animations/digital_rain_anim.h +++ b/quantum/rgb_matrix/animations/digital_rain_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/dual_beacon_anim.h b/quantum/rgb_matrix/animations/dual_beacon_anim.h index ce9487168..ce9487168 100644 --- a/quantum/rgb_matrix_animations/dual_beacon_anim.h +++ b/quantum/rgb_matrix/animations/dual_beacon_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/gradient_left_right_anim.h b/quantum/rgb_matrix/animations/gradient_left_right_anim.h index 53dfd04e2..53dfd04e2 100644 --- a/quantum/rgb_matrix_animations/gradient_left_right_anim.h +++ b/quantum/rgb_matrix/animations/gradient_left_right_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/gradient_up_down_anim.h b/quantum/rgb_matrix/animations/gradient_up_down_anim.h index 7e0d2898c..7e0d2898c 100644 --- a/quantum/rgb_matrix_animations/gradient_up_down_anim.h +++ b/quantum/rgb_matrix/animations/gradient_up_down_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/hue_breathing_anim.h b/quantum/rgb_matrix/animations/hue_breathing_anim.h index 54dea958a..54dea958a 100644 --- a/quantum/rgb_matrix_animations/hue_breathing_anim.h +++ b/quantum/rgb_matrix/animations/hue_breathing_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/hue_pendulum_anim.h b/quantum/rgb_matrix/animations/hue_pendulum_anim.h index 2d8d36174..2d8d36174 100644 --- a/quantum/rgb_matrix_animations/hue_pendulum_anim.h +++ b/quantum/rgb_matrix/animations/hue_pendulum_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/hue_wave_anim.h b/quantum/rgb_matrix/animations/hue_wave_anim.h index fd9026fc9..fd9026fc9 100644 --- a/quantum/rgb_matrix_animations/hue_wave_anim.h +++ b/quantum/rgb_matrix/animations/hue_wave_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/jellybean_raindrops_anim.h b/quantum/rgb_matrix/animations/jellybean_raindrops_anim.h index 9493b3850..a17e954b1 100644 --- a/quantum/rgb_matrix_animations/jellybean_raindrops_anim.h +++ b/quantum/rgb_matrix/animations/jellybean_raindrops_anim.h | |||
@@ -4,7 +4,7 @@ RGB_MATRIX_EFFECT(JELLYBEAN_RAINDROPS) | |||
4 | 4 | ||
5 | static void jellybean_raindrops_set_color(int i, effect_params_t* params) { | 5 | static void jellybean_raindrops_set_color(int i, effect_params_t* params) { |
6 | if (!HAS_ANY_FLAGS(g_led_config.flags[i], params->flags)) return; | 6 | if (!HAS_ANY_FLAGS(g_led_config.flags[i], params->flags)) return; |
7 | HSV hsv = {rand() & 0xFF, rand() & 0xFF, rgb_matrix_config.hsv.v}; | 7 | HSV hsv = {rand() & 0xFF, qadd8(rand() & 0x7F, 0x80), rgb_matrix_config.hsv.v}; |
8 | RGB rgb = rgb_matrix_hsv_to_rgb(hsv); | 8 | RGB rgb = rgb_matrix_hsv_to_rgb(hsv); |
9 | rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); | 9 | rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); |
10 | } | 10 | } |
diff --git a/quantum/rgb_matrix_animations/rainbow_beacon_anim.h b/quantum/rgb_matrix/animations/rainbow_beacon_anim.h index 977261182..977261182 100644 --- a/quantum/rgb_matrix_animations/rainbow_beacon_anim.h +++ b/quantum/rgb_matrix/animations/rainbow_beacon_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/rainbow_moving_chevron_anim.h b/quantum/rgb_matrix/animations/rainbow_moving_chevron_anim.h index e51e7b251..e51e7b251 100644 --- a/quantum/rgb_matrix_animations/rainbow_moving_chevron_anim.h +++ b/quantum/rgb_matrix/animations/rainbow_moving_chevron_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/rainbow_pinwheels_anim.h b/quantum/rgb_matrix/animations/rainbow_pinwheels_anim.h index 1cd4ed2ac..1cd4ed2ac 100644 --- a/quantum/rgb_matrix_animations/rainbow_pinwheels_anim.h +++ b/quantum/rgb_matrix/animations/rainbow_pinwheels_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/raindrops_anim.h b/quantum/rgb_matrix/animations/raindrops_anim.h index 38359cdca..38359cdca 100644 --- a/quantum/rgb_matrix_animations/raindrops_anim.h +++ b/quantum/rgb_matrix/animations/raindrops_anim.h | |||
diff --git a/quantum/rgb_matrix/animations/rgb_matrix_effects.inc b/quantum/rgb_matrix/animations/rgb_matrix_effects.inc new file mode 100644 index 000000000..302ad79c0 --- /dev/null +++ b/quantum/rgb_matrix/animations/rgb_matrix_effects.inc | |||
@@ -0,0 +1,37 @@ | |||
1 | // Add your new core rgb matrix effect here, order determines enum order | ||
2 | #include "solid_color_anim.h" | ||
3 | #include "alpha_mods_anim.h" | ||
4 | #include "gradient_up_down_anim.h" | ||
5 | #include "gradient_left_right_anim.h" | ||
6 | #include "breathing_anim.h" | ||
7 | #include "colorband_sat_anim.h" | ||
8 | #include "colorband_val_anim.h" | ||
9 | #include "colorband_pinwheel_sat_anim.h" | ||
10 | #include "colorband_pinwheel_val_anim.h" | ||
11 | #include "colorband_spiral_sat_anim.h" | ||
12 | #include "colorband_spiral_val_anim.h" | ||
13 | #include "cycle_all_anim.h" | ||
14 | #include "cycle_left_right_anim.h" | ||
15 | #include "cycle_up_down_anim.h" | ||
16 | #include "rainbow_moving_chevron_anim.h" | ||
17 | #include "cycle_out_in_anim.h" | ||
18 | #include "cycle_out_in_dual_anim.h" | ||
19 | #include "cycle_pinwheel_anim.h" | ||
20 | #include "cycle_spiral_anim.h" | ||
21 | #include "dual_beacon_anim.h" | ||
22 | #include "rainbow_beacon_anim.h" | ||
23 | #include "rainbow_pinwheels_anim.h" | ||
24 | #include "raindrops_anim.h" | ||
25 | #include "jellybean_raindrops_anim.h" | ||
26 | #include "hue_breathing_anim.h" | ||
27 | #include "hue_pendulum_anim.h" | ||
28 | #include "hue_wave_anim.h" | ||
29 | #include "typing_heatmap_anim.h" | ||
30 | #include "digital_rain_anim.h" | ||
31 | #include "solid_reactive_simple_anim.h" | ||
32 | #include "solid_reactive_anim.h" | ||
33 | #include "solid_reactive_wide.h" | ||
34 | #include "solid_reactive_cross.h" | ||
35 | #include "solid_reactive_nexus.h" | ||
36 | #include "splash_anim.h" | ||
37 | #include "solid_splash_anim.h" | ||
diff --git a/quantum/rgb_matrix_runners/effect_runner_dx_dy.h b/quantum/rgb_matrix/animations/runners/effect_runner_dx_dy.h index 4867609c8..4867609c8 100644 --- a/quantum/rgb_matrix_runners/effect_runner_dx_dy.h +++ b/quantum/rgb_matrix/animations/runners/effect_runner_dx_dy.h | |||
diff --git a/quantum/rgb_matrix_runners/effect_runner_dx_dy_dist.h b/quantum/rgb_matrix/animations/runners/effect_runner_dx_dy_dist.h index 9545b418d..9545b418d 100644 --- a/quantum/rgb_matrix_runners/effect_runner_dx_dy_dist.h +++ b/quantum/rgb_matrix/animations/runners/effect_runner_dx_dy_dist.h | |||
diff --git a/quantum/rgb_matrix_runners/effect_runner_i.h b/quantum/rgb_matrix/animations/runners/effect_runner_i.h index 1881cd6c6..1881cd6c6 100644 --- a/quantum/rgb_matrix_runners/effect_runner_i.h +++ b/quantum/rgb_matrix/animations/runners/effect_runner_i.h | |||
diff --git a/quantum/rgb_matrix_runners/effect_runner_reactive.h b/quantum/rgb_matrix/animations/runners/effect_runner_reactive.h index 75b7c0df4..75b7c0df4 100644 --- a/quantum/rgb_matrix_runners/effect_runner_reactive.h +++ b/quantum/rgb_matrix/animations/runners/effect_runner_reactive.h | |||
diff --git a/quantum/rgb_matrix_runners/effect_runner_reactive_splash.h b/quantum/rgb_matrix/animations/runners/effect_runner_reactive_splash.h index 2e46ffb35..2e46ffb35 100644 --- a/quantum/rgb_matrix_runners/effect_runner_reactive_splash.h +++ b/quantum/rgb_matrix/animations/runners/effect_runner_reactive_splash.h | |||
diff --git a/quantum/rgb_matrix_runners/effect_runner_sin_cos_i.h b/quantum/rgb_matrix/animations/runners/effect_runner_sin_cos_i.h index 02351de51..02351de51 100644 --- a/quantum/rgb_matrix_runners/effect_runner_sin_cos_i.h +++ b/quantum/rgb_matrix/animations/runners/effect_runner_sin_cos_i.h | |||
diff --git a/quantum/rgb_matrix/animations/runners/rgb_matrix_runners.inc b/quantum/rgb_matrix/animations/runners/rgb_matrix_runners.inc new file mode 100644 index 000000000..c09022bb0 --- /dev/null +++ b/quantum/rgb_matrix/animations/runners/rgb_matrix_runners.inc | |||
@@ -0,0 +1,6 @@ | |||
1 | #include "effect_runner_dx_dy_dist.h" | ||
2 | #include "effect_runner_dx_dy.h" | ||
3 | #include "effect_runner_i.h" | ||
4 | #include "effect_runner_sin_cos_i.h" | ||
5 | #include "effect_runner_reactive.h" | ||
6 | #include "effect_runner_reactive_splash.h" | ||
diff --git a/quantum/rgb_matrix_animations/solid_color_anim.h b/quantum/rgb_matrix/animations/solid_color_anim.h index 79d63cf13..79d63cf13 100644 --- a/quantum/rgb_matrix_animations/solid_color_anim.h +++ b/quantum/rgb_matrix/animations/solid_color_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/solid_reactive_anim.h b/quantum/rgb_matrix/animations/solid_reactive_anim.h index d45bb961b..d45bb961b 100644 --- a/quantum/rgb_matrix_animations/solid_reactive_anim.h +++ b/quantum/rgb_matrix/animations/solid_reactive_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/solid_reactive_cross.h b/quantum/rgb_matrix/animations/solid_reactive_cross.h index f76c68e8c..f76c68e8c 100644 --- a/quantum/rgb_matrix_animations/solid_reactive_cross.h +++ b/quantum/rgb_matrix/animations/solid_reactive_cross.h | |||
diff --git a/quantum/rgb_matrix_animations/solid_reactive_nexus.h b/quantum/rgb_matrix/animations/solid_reactive_nexus.h index 17f94e3c1..17f94e3c1 100644 --- a/quantum/rgb_matrix_animations/solid_reactive_nexus.h +++ b/quantum/rgb_matrix/animations/solid_reactive_nexus.h | |||
diff --git a/quantum/rgb_matrix_animations/solid_reactive_simple_anim.h b/quantum/rgb_matrix/animations/solid_reactive_simple_anim.h index 12eb248cc..12eb248cc 100644 --- a/quantum/rgb_matrix_animations/solid_reactive_simple_anim.h +++ b/quantum/rgb_matrix/animations/solid_reactive_simple_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/solid_reactive_wide.h b/quantum/rgb_matrix/animations/solid_reactive_wide.h index 1cc4dca72..1cc4dca72 100644 --- a/quantum/rgb_matrix_animations/solid_reactive_wide.h +++ b/quantum/rgb_matrix/animations/solid_reactive_wide.h | |||
diff --git a/quantum/rgb_matrix_animations/solid_splash_anim.h b/quantum/rgb_matrix/animations/solid_splash_anim.h index 99efb4996..99efb4996 100644 --- a/quantum/rgb_matrix_animations/solid_splash_anim.h +++ b/quantum/rgb_matrix/animations/solid_splash_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/splash_anim.h b/quantum/rgb_matrix/animations/splash_anim.h index 1415bcc0f..1415bcc0f 100644 --- a/quantum/rgb_matrix_animations/splash_anim.h +++ b/quantum/rgb_matrix/animations/splash_anim.h | |||
diff --git a/quantum/rgb_matrix_animations/typing_heatmap_anim.h b/quantum/rgb_matrix/animations/typing_heatmap_anim.h index e7dda11a2..e7dda11a2 100644 --- a/quantum/rgb_matrix_animations/typing_heatmap_anim.h +++ b/quantum/rgb_matrix/animations/typing_heatmap_anim.h | |||
diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix/rgb_matrix.c index ab8dbd849..789cd2860 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix/rgb_matrix.c | |||
@@ -31,22 +31,25 @@ const led_point_t k_rgb_matrix_center = {112, 32}; | |||
31 | const led_point_t k_rgb_matrix_center = RGB_MATRIX_CENTER; | 31 | const led_point_t k_rgb_matrix_center = RGB_MATRIX_CENTER; |
32 | #endif | 32 | #endif |
33 | 33 | ||
34 | // clang-format off | ||
35 | #ifndef RGB_MATRIX_IMMEDIATE_EEPROM | ||
36 | # define rgb_eeconfig_update(v) rgb_update_eeprom |= v | ||
37 | #else | ||
38 | # define rgb_eeconfig_update(v) if (v) eeconfig_update_rgb_matrix() | ||
39 | #endif | ||
40 | // clang-format on | ||
41 | |||
34 | __attribute__((weak)) RGB rgb_matrix_hsv_to_rgb(HSV hsv) { return hsv_to_rgb(hsv); } | 42 | __attribute__((weak)) RGB rgb_matrix_hsv_to_rgb(HSV hsv) { return hsv_to_rgb(hsv); } |
35 | 43 | ||
36 | // Generic effect runners | 44 | // Generic effect runners |
37 | #include "rgb_matrix_runners/effect_runner_dx_dy_dist.h" | 45 | #include "rgb_matrix_runners.inc" |
38 | #include "rgb_matrix_runners/effect_runner_dx_dy.h" | ||
39 | #include "rgb_matrix_runners/effect_runner_i.h" | ||
40 | #include "rgb_matrix_runners/effect_runner_sin_cos_i.h" | ||
41 | #include "rgb_matrix_runners/effect_runner_reactive.h" | ||
42 | #include "rgb_matrix_runners/effect_runner_reactive_splash.h" | ||
43 | 46 | ||
44 | // ------------------------------------------ | 47 | // ------------------------------------------ |
45 | // -----Begin rgb effect includes macros----- | 48 | // -----Begin rgb effect includes macros----- |
46 | #define RGB_MATRIX_EFFECT(name) | 49 | #define RGB_MATRIX_EFFECT(name) |
47 | #define RGB_MATRIX_CUSTOM_EFFECT_IMPLS | 50 | #define RGB_MATRIX_CUSTOM_EFFECT_IMPLS |
48 | 51 | ||
49 | #include "rgb_matrix_animations/rgb_matrix_effects.inc" | 52 | #include "rgb_matrix_effects.inc" |
50 | #ifdef RGB_MATRIX_CUSTOM_KB | 53 | #ifdef RGB_MATRIX_CUSTOM_KB |
51 | # include "rgb_matrix_kb.inc" | 54 | # include "rgb_matrix_kb.inc" |
52 | #endif | 55 | #endif |
@@ -67,10 +70,6 @@ __attribute__((weak)) RGB rgb_matrix_hsv_to_rgb(HSV hsv) { return hsv_to_rgb(hsv | |||
67 | # define RGB_DISABLE_TIMEOUT 0 | 70 | # define RGB_DISABLE_TIMEOUT 0 |
68 | #endif | 71 | #endif |
69 | 72 | ||
70 | #if RGB_DISABLE_WHEN_USB_SUSPENDED != 1 | ||
71 | # undef RGB_DISABLE_WHEN_USB_SUSPENDED | ||
72 | #endif | ||
73 | |||
74 | #if !defined(RGB_MATRIX_MAXIMUM_BRIGHTNESS) || RGB_MATRIX_MAXIMUM_BRIGHTNESS > UINT8_MAX | 73 | #if !defined(RGB_MATRIX_MAXIMUM_BRIGHTNESS) || RGB_MATRIX_MAXIMUM_BRIGHTNESS > UINT8_MAX |
75 | # undef RGB_MATRIX_MAXIMUM_BRIGHTNESS | 74 | # undef RGB_MATRIX_MAXIMUM_BRIGHTNESS |
76 | # define RGB_MATRIX_MAXIMUM_BRIGHTNESS UINT8_MAX | 75 | # define RGB_MATRIX_MAXIMUM_BRIGHTNESS UINT8_MAX |
@@ -129,6 +128,7 @@ last_hit_t g_last_hit_tracker; | |||
129 | 128 | ||
130 | // internals | 129 | // internals |
131 | static bool suspend_state = false; | 130 | static bool suspend_state = false; |
131 | static bool rgb_update_eeprom = false; | ||
132 | static uint8_t rgb_last_enable = UINT8_MAX; | 132 | static uint8_t rgb_last_enable = UINT8_MAX; |
133 | static uint8_t rgb_last_effect = UINT8_MAX; | 133 | static uint8_t rgb_last_effect = UINT8_MAX; |
134 | static effect_params_t rgb_effect_params = {0, LED_FLAG_ALL, false}; | 134 | static effect_params_t rgb_effect_params = {0, LED_FLAG_ALL, false}; |
@@ -315,6 +315,8 @@ static void rgb_task_timers(void) { | |||
315 | 315 | ||
316 | static void rgb_task_sync(void) { | 316 | static void rgb_task_sync(void) { |
317 | // next task | 317 | // next task |
318 | if (rgb_update_eeprom) eeconfig_update_rgb_matrix(); | ||
319 | rgb_update_eeprom = false; | ||
318 | if (sync_timer_elapsed32(g_rgb_timer) >= RGB_MATRIX_LED_FLUSH_LIMIT) rgb_task_state = STARTING; | 320 | if (sync_timer_elapsed32(g_rgb_timer) >= RGB_MATRIX_LED_FLUSH_LIMIT) rgb_task_state = STARTING; |
319 | } | 321 | } |
320 | 322 | ||
@@ -353,7 +355,7 @@ static void rgb_task_render(uint8_t effect) { | |||
353 | case RGB_MATRIX_##name: \ | 355 | case RGB_MATRIX_##name: \ |
354 | rendering = name(&rgb_effect_params); \ | 356 | rendering = name(&rgb_effect_params); \ |
355 | break; | 357 | break; |
356 | #include "rgb_matrix_animations/rgb_matrix_effects.inc" | 358 | #include "rgb_matrix_effects.inc" |
357 | #undef RGB_MATRIX_EFFECT | 359 | #undef RGB_MATRIX_EFFECT |
358 | 360 | ||
359 | #if defined(RGB_MATRIX_CUSTOM_KB) || defined(RGB_MATRIX_CUSTOM_USER) | 361 | #if defined(RGB_MATRIX_CUSTOM_KB) || defined(RGB_MATRIX_CUSTOM_USER) |
@@ -511,9 +513,7 @@ bool rgb_matrix_get_suspend_state(void) { return suspend_state; } | |||
511 | void rgb_matrix_toggle_eeprom_helper(bool write_to_eeprom) { | 513 | void rgb_matrix_toggle_eeprom_helper(bool write_to_eeprom) { |
512 | rgb_matrix_config.enable ^= 1; | 514 | rgb_matrix_config.enable ^= 1; |
513 | rgb_task_state = STARTING; | 515 | rgb_task_state = STARTING; |
514 | if (write_to_eeprom) { | 516 | rgb_eeconfig_update(write_to_eeprom); |
515 | eeconfig_update_rgb_matrix(); | ||
516 | } | ||
517 | dprintf("rgb matrix toggle [%s]: rgb_matrix_config.enable = %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", rgb_matrix_config.enable); | 517 | dprintf("rgb matrix toggle [%s]: rgb_matrix_config.enable = %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", rgb_matrix_config.enable); |
518 | } | 518 | } |
519 | void rgb_matrix_toggle_noeeprom(void) { rgb_matrix_toggle_eeprom_helper(false); } | 519 | void rgb_matrix_toggle_noeeprom(void) { rgb_matrix_toggle_eeprom_helper(false); } |
@@ -521,7 +521,7 @@ void rgb_matrix_toggle(void) { rgb_matrix_toggle_eeprom_helper(true); } | |||
521 | 521 | ||
522 | void rgb_matrix_enable(void) { | 522 | void rgb_matrix_enable(void) { |
523 | rgb_matrix_enable_noeeprom(); | 523 | rgb_matrix_enable_noeeprom(); |
524 | eeconfig_update_rgb_matrix(); | 524 | rgb_eeconfig_update(true); |
525 | } | 525 | } |
526 | 526 | ||
527 | void rgb_matrix_enable_noeeprom(void) { | 527 | void rgb_matrix_enable_noeeprom(void) { |
@@ -531,7 +531,7 @@ void rgb_matrix_enable_noeeprom(void) { | |||
531 | 531 | ||
532 | void rgb_matrix_disable(void) { | 532 | void rgb_matrix_disable(void) { |
533 | rgb_matrix_disable_noeeprom(); | 533 | rgb_matrix_disable_noeeprom(); |
534 | eeconfig_update_rgb_matrix(); | 534 | rgb_eeconfig_update(true); |
535 | } | 535 | } |
536 | 536 | ||
537 | void rgb_matrix_disable_noeeprom(void) { | 537 | void rgb_matrix_disable_noeeprom(void) { |
@@ -553,9 +553,7 @@ void rgb_matrix_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom) { | |||
553 | rgb_matrix_config.mode = mode; | 553 | rgb_matrix_config.mode = mode; |
554 | } | 554 | } |
555 | rgb_task_state = STARTING; | 555 | rgb_task_state = STARTING; |
556 | if (write_to_eeprom) { | 556 | rgb_eeconfig_update(write_to_eeprom); |
557 | eeconfig_update_rgb_matrix(); | ||
558 | } | ||
559 | dprintf("rgb matrix mode [%s]: %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", rgb_matrix_config.mode); | 557 | dprintf("rgb matrix mode [%s]: %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", rgb_matrix_config.mode); |
560 | } | 558 | } |
561 | void rgb_matrix_mode_noeeprom(uint8_t mode) { rgb_matrix_mode_eeprom_helper(mode, false); } | 559 | void rgb_matrix_mode_noeeprom(uint8_t mode) { rgb_matrix_mode_eeprom_helper(mode, false); } |
@@ -584,9 +582,7 @@ void rgb_matrix_sethsv_eeprom_helper(uint16_t hue, uint8_t sat, uint8_t val, boo | |||
584 | rgb_matrix_config.hsv.h = hue; | 582 | rgb_matrix_config.hsv.h = hue; |
585 | rgb_matrix_config.hsv.s = sat; | 583 | rgb_matrix_config.hsv.s = sat; |
586 | rgb_matrix_config.hsv.v = (val > RGB_MATRIX_MAXIMUM_BRIGHTNESS) ? RGB_MATRIX_MAXIMUM_BRIGHTNESS : val; | 584 | rgb_matrix_config.hsv.v = (val > RGB_MATRIX_MAXIMUM_BRIGHTNESS) ? RGB_MATRIX_MAXIMUM_BRIGHTNESS : val; |
587 | if (write_to_eeprom) { | 585 | rgb_eeconfig_update(write_to_eeprom); |
588 | eeconfig_update_rgb_matrix(); | ||
589 | } | ||
590 | dprintf("rgb matrix set hsv [%s]: %u,%u,%u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", rgb_matrix_config.hsv.h, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v); | 586 | dprintf("rgb matrix set hsv [%s]: %u,%u,%u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", rgb_matrix_config.hsv.h, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v); |
591 | } | 587 | } |
592 | void rgb_matrix_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val) { rgb_matrix_sethsv_eeprom_helper(hue, sat, val, false); } | 588 | void rgb_matrix_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val) { rgb_matrix_sethsv_eeprom_helper(hue, sat, val, false); } |
@@ -623,9 +619,7 @@ void rgb_matrix_decrease_val(void) { rgb_matrix_decrease_val_helper(true); } | |||
623 | 619 | ||
624 | void rgb_matrix_set_speed_eeprom_helper(uint8_t speed, bool write_to_eeprom) { | 620 | void rgb_matrix_set_speed_eeprom_helper(uint8_t speed, bool write_to_eeprom) { |
625 | rgb_matrix_config.speed = speed; | 621 | rgb_matrix_config.speed = speed; |
626 | if (write_to_eeprom) { | 622 | rgb_eeconfig_update(write_to_eeprom); |
627 | eeconfig_update_rgb_matrix(); | ||
628 | } | ||
629 | dprintf("rgb matrix set speed [%s]: %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", rgb_matrix_config.speed); | 623 | dprintf("rgb matrix set speed [%s]: %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", rgb_matrix_config.speed); |
630 | } | 624 | } |
631 | void rgb_matrix_set_speed_noeeprom(uint8_t speed) { rgb_matrix_set_speed_eeprom_helper(speed, false); } | 625 | void rgb_matrix_set_speed_noeeprom(uint8_t speed) { rgb_matrix_set_speed_eeprom_helper(speed, false); } |
diff --git a/quantum/rgb_matrix.h b/quantum/rgb_matrix/rgb_matrix.h index a615b8422..28f07c84d 100644 --- a/quantum/rgb_matrix.h +++ b/quantum/rgb_matrix/rgb_matrix.h | |||
@@ -33,6 +33,8 @@ | |||
33 | # include "is31fl3737.h" | 33 | # include "is31fl3737.h" |
34 | #elif defined(IS31FL3741) | 34 | #elif defined(IS31FL3741) |
35 | # include "is31fl3741.h" | 35 | # include "is31fl3741.h" |
36 | #elif defined(AW20216) | ||
37 | # include "aw20216.h" | ||
36 | #elif defined(WS2812) | 38 | #elif defined(WS2812) |
37 | # include "ws2812.h" | 39 | # include "ws2812.h" |
38 | #endif | 40 | #endif |
@@ -70,7 +72,7 @@ enum rgb_matrix_effects { | |||
70 | // -------------------------------------- | 72 | // -------------------------------------- |
71 | // -----Begin rgb effect enum macros----- | 73 | // -----Begin rgb effect enum macros----- |
72 | #define RGB_MATRIX_EFFECT(name, ...) RGB_MATRIX_##name, | 74 | #define RGB_MATRIX_EFFECT(name, ...) RGB_MATRIX_##name, |
73 | #include "rgb_matrix_animations/rgb_matrix_effects.inc" | 75 | #include "rgb_matrix_effects.inc" |
74 | #undef RGB_MATRIX_EFFECT | 76 | #undef RGB_MATRIX_EFFECT |
75 | 77 | ||
76 | #if defined(RGB_MATRIX_CUSTOM_KB) || defined(RGB_MATRIX_CUSTOM_USER) | 78 | #if defined(RGB_MATRIX_CUSTOM_KB) || defined(RGB_MATRIX_CUSTOM_USER) |
diff --git a/quantum/rgb_matrix_drivers.c b/quantum/rgb_matrix/rgb_matrix_drivers.c index 896fa6d0e..6a11d4791 100644 --- a/quantum/rgb_matrix_drivers.c +++ b/quantum/rgb_matrix/rgb_matrix_drivers.c | |||
@@ -171,6 +171,22 @@ const rgb_matrix_driver_t rgb_matrix_driver = { | |||
171 | }; | 171 | }; |
172 | # endif | 172 | # endif |
173 | 173 | ||
174 | #elif defined(AW20216) | ||
175 | # include "spi_master.h" | ||
176 | static void init(void) { | ||
177 | spi_init(); | ||
178 | AW20216_init(); | ||
179 | } | ||
180 | |||
181 | static void flush(void) { AW20216_update_pwm_buffers(); } | ||
182 | |||
183 | const rgb_matrix_driver_t rgb_matrix_driver = { | ||
184 | .init = init, | ||
185 | .flush = flush, | ||
186 | .set_color = AW20216_set_color, | ||
187 | .set_color_all = AW20216_set_color_all, | ||
188 | }; | ||
189 | |||
174 | #elif defined(WS2812) | 190 | #elif defined(WS2812) |
175 | # if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_CUSTOM_DRIVER) | 191 | # if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_CUSTOM_DRIVER) |
176 | # pragma message "Cannot use RGBLIGHT and RGB Matrix using WS2812 at the same time." | 192 | # pragma message "Cannot use RGBLIGHT and RGB Matrix using WS2812 at the same time." |
diff --git a/quantum/rgb_matrix_types.h b/quantum/rgb_matrix/rgb_matrix_types.h index df575d657..df575d657 100644 --- a/quantum/rgb_matrix_types.h +++ b/quantum/rgb_matrix/rgb_matrix_types.h | |||
diff --git a/quantum/rgb_matrix_animations/rgb_matrix_effects.inc b/quantum/rgb_matrix_animations/rgb_matrix_effects.inc deleted file mode 100644 index 053d44150..000000000 --- a/quantum/rgb_matrix_animations/rgb_matrix_effects.inc +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | // Add your new core rgb matrix effect here, order determins enum order, requires "rgb_matrix_animations/ directory | ||
2 | #include "rgb_matrix_animations/solid_color_anim.h" | ||
3 | #include "rgb_matrix_animations/alpha_mods_anim.h" | ||
4 | #include "rgb_matrix_animations/gradient_up_down_anim.h" | ||
5 | #include "rgb_matrix_animations/gradient_left_right_anim.h" | ||
6 | #include "rgb_matrix_animations/breathing_anim.h" | ||
7 | #include "rgb_matrix_animations/colorband_sat_anim.h" | ||
8 | #include "rgb_matrix_animations/colorband_val_anim.h" | ||
9 | #include "rgb_matrix_animations/colorband_pinwheel_sat_anim.h" | ||
10 | #include "rgb_matrix_animations/colorband_pinwheel_val_anim.h" | ||
11 | #include "rgb_matrix_animations/colorband_spiral_sat_anim.h" | ||
12 | #include "rgb_matrix_animations/colorband_spiral_val_anim.h" | ||
13 | #include "rgb_matrix_animations/cycle_all_anim.h" | ||
14 | #include "rgb_matrix_animations/cycle_left_right_anim.h" | ||
15 | #include "rgb_matrix_animations/cycle_up_down_anim.h" | ||
16 | #include "rgb_matrix_animations/rainbow_moving_chevron_anim.h" | ||
17 | #include "rgb_matrix_animations/cycle_out_in_anim.h" | ||
18 | #include "rgb_matrix_animations/cycle_out_in_dual_anim.h" | ||
19 | #include "rgb_matrix_animations/cycle_pinwheel_anim.h" | ||
20 | #include "rgb_matrix_animations/cycle_spiral_anim.h" | ||
21 | #include "rgb_matrix_animations/dual_beacon_anim.h" | ||
22 | #include "rgb_matrix_animations/rainbow_beacon_anim.h" | ||
23 | #include "rgb_matrix_animations/rainbow_pinwheels_anim.h" | ||
24 | #include "rgb_matrix_animations/raindrops_anim.h" | ||
25 | #include "rgb_matrix_animations/jellybean_raindrops_anim.h" | ||
26 | #include "rgb_matrix_animations/hue_breathing_anim.h" | ||
27 | #include "rgb_matrix_animations/hue_pendulum_anim.h" | ||
28 | #include "rgb_matrix_animations/hue_wave_anim.h" | ||
29 | #include "rgb_matrix_animations/typing_heatmap_anim.h" | ||
30 | #include "rgb_matrix_animations/digital_rain_anim.h" | ||
31 | #include "rgb_matrix_animations/solid_reactive_simple_anim.h" | ||
32 | #include "rgb_matrix_animations/solid_reactive_anim.h" | ||
33 | #include "rgb_matrix_animations/solid_reactive_wide.h" | ||
34 | #include "rgb_matrix_animations/solid_reactive_cross.h" | ||
35 | #include "rgb_matrix_animations/solid_reactive_nexus.h" | ||
36 | #include "rgb_matrix_animations/splash_anim.h" | ||
37 | #include "rgb_matrix_animations/solid_splash_anim.h" | ||
diff --git a/quantum/rgblight.c b/quantum/rgblight/rgblight.c index baa10ec41..54face173 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight/rgblight.c | |||
@@ -890,7 +890,7 @@ void rgblight_update_sync(rgblight_syncinfo_t *syncinfo, bool write_to_eeprom) { | |||
890 | animation_status.restart = true; | 890 | animation_status.restart = true; |
891 | } | 891 | } |
892 | # endif /* RGBLIGHT_SPLIT_NO_ANIMATION_SYNC */ | 892 | # endif /* RGBLIGHT_SPLIT_NO_ANIMATION_SYNC */ |
893 | # endif /* RGBLIGHT_USE_TIMER */ | 893 | # endif /* RGBLIGHT_USE_TIMER */ |
894 | } | 894 | } |
895 | #endif /* RGBLIGHT_SPLIT */ | 895 | #endif /* RGBLIGHT_SPLIT */ |
896 | 896 | ||
diff --git a/quantum/rgblight.h b/quantum/rgblight/rgblight.h index bec2c6695..bec2c6695 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight/rgblight.h | |||
diff --git a/quantum/rgblight_breathe_table.h b/quantum/rgblight/rgblight_breathe_table.h index 30245318b..30245318b 100644 --- a/quantum/rgblight_breathe_table.h +++ b/quantum/rgblight/rgblight_breathe_table.h | |||
diff --git a/quantum/rgblight_list.h b/quantum/rgblight/rgblight_list.h index f29a646b6..0fd68b75f 100644 --- a/quantum/rgblight_list.h +++ b/quantum/rgblight/rgblight_list.h | |||
@@ -15,49 +15,7 @@ | |||
15 | */ | 15 | */ |
16 | #pragma once | 16 | #pragma once |
17 | 17 | ||
18 | /* RGB COLORS */ | 18 | #include "color.h" |
19 | #define RGB_WHITE 0xFF, 0xFF, 0xFF | ||
20 | #define RGB_RED 0xFF, 0x00, 0x00 | ||
21 | #define RGB_CORAL 0xFF, 0x7C, 0x4D | ||
22 | #define RGB_ORANGE 0xFF, 0x80, 0x00 | ||
23 | #define RGB_GOLDENROD 0xD9, 0xA5, 0x21 | ||
24 | #define RGB_GOLD 0xFF, 0xD9, 0x00 | ||
25 | #define RGB_YELLOW 0xFF, 0xFF, 0x00 | ||
26 | #define RGB_CHARTREUSE 0x80, 0xFF, 0x00 | ||
27 | #define RGB_GREEN 0x00, 0xFF, 0x00 | ||
28 | #define RGB_SPRINGGREEN 0x00, 0xFF, 0x80 | ||
29 | #define RGB_TURQUOISE 0x47, 0x6E, 0x6A | ||
30 | #define RGB_TEAL 0x00, 0x80, 0x80 | ||
31 | #define RGB_CYAN 0x00, 0xFF, 0xFF | ||
32 | #define RGB_AZURE 0x99, 0xf5, 0xFF | ||
33 | #define RGB_BLUE 0x00, 0x00, 0xFF | ||
34 | #define RGB_PURPLE 0x7A, 0x00, 0xFF | ||
35 | #define RGB_MAGENTA 0xFF, 0x00, 0xFF | ||
36 | #define RGB_PINK 0xFF, 0x80, 0xBF | ||
37 | #define RGB_BLACK 0x00, 0x00, 0x00 | ||
38 | #define RGB_OFF RGB_BLACK | ||
39 | |||
40 | /* HSV COLORS */ | ||
41 | #define HSV_WHITE 0, 0, 255 | ||
42 | #define HSV_RED 0, 255, 255 | ||
43 | #define HSV_CORAL 11, 176, 255 | ||
44 | #define HSV_ORANGE 28, 255, 255 | ||
45 | #define HSV_GOLDENROD 30, 218, 218 | ||
46 | #define HSV_GOLD 36, 255, 255 | ||
47 | #define HSV_YELLOW 43, 255, 255 | ||
48 | #define HSV_CHARTREUSE 64, 255, 255 | ||
49 | #define HSV_GREEN 85, 255, 255 | ||
50 | #define HSV_SPRINGGREEN 106, 255, 255 | ||
51 | #define HSV_TURQUOISE 123, 90, 112 | ||
52 | #define HSV_TEAL 128, 255, 128 | ||
53 | #define HSV_CYAN 128, 255, 255 | ||
54 | #define HSV_AZURE 132, 102, 255 | ||
55 | #define HSV_BLUE 170, 255, 255 | ||
56 | #define HSV_PURPLE 191, 255, 255 | ||
57 | #define HSV_MAGENTA 213, 255, 255 | ||
58 | #define HSV_PINK 234, 128, 255 | ||
59 | #define HSV_BLACK 0, 0, 0 | ||
60 | #define HSV_OFF HSV_BLACK | ||
61 | 19 | ||
62 | /* | 20 | /* |
63 | ######################################################################################## | 21 | ######################################################################################## |
@@ -66,7 +24,7 @@ | |||
66 | ## ## | 24 | ## ## |
67 | ## The functions below have been deprecated and may be removed in a future release. ## | 25 | ## The functions below have been deprecated and may be removed in a future release. ## |
68 | ## ## | 26 | ## ## |
69 | ## Please use the values above with the RGB functions. ## | 27 | ## Please use the values in color.h with the RGB functions. ## |
70 | ## ## | 28 | ## ## |
71 | ## ## | 29 | ## ## |
72 | ## ## | 30 | ## ## |
diff --git a/quantum/rgblight_modes.h b/quantum/rgblight/rgblight_modes.h index 7abdb87bc..7abdb87bc 100644 --- a/quantum/rgblight_modes.h +++ b/quantum/rgblight/rgblight_modes.h | |||
diff --git a/quantum/rgblight_post_config.h b/quantum/rgblight/rgblight_post_config.h index 3c14cb610..3c14cb610 100644 --- a/quantum/rgblight_post_config.h +++ b/quantum/rgblight/rgblight_post_config.h | |||
diff --git a/quantum/serial_link/system/serial_link.c b/quantum/serial_link/system/serial_link.c index f77483ad8..6363f8ff3 100644 --- a/quantum/serial_link/system/serial_link.c +++ b/quantum/serial_link/system/serial_link.c | |||
@@ -29,10 +29,13 @@ SOFTWARE. | |||
29 | #include "serial_link/protocol/transport.h" | 29 | #include "serial_link/protocol/transport.h" |
30 | #include "serial_link/protocol/frame_router.h" | 30 | #include "serial_link/protocol/frame_router.h" |
31 | #include "matrix.h" | 31 | #include "matrix.h" |
32 | #include "sync_timer.h" | ||
32 | #include <stdbool.h> | 33 | #include <stdbool.h> |
33 | #include "print.h" | 34 | #include "print.h" |
34 | #include "config.h" | 35 | #include "config.h" |
35 | 36 | ||
37 | #define SYNC_TIMER_OFFSET 2 | ||
38 | |||
36 | static event_source_t new_data_event; | 39 | static event_source_t new_data_event; |
37 | static bool serial_link_connected; | 40 | static bool serial_link_connected; |
38 | static bool is_master = false; | 41 | static bool is_master = false; |
@@ -159,10 +162,16 @@ static matrix_object_t last_matrix = {}; | |||
159 | 162 | ||
160 | SLAVE_TO_MASTER_OBJECT(keyboard_matrix, matrix_object_t); | 163 | SLAVE_TO_MASTER_OBJECT(keyboard_matrix, matrix_object_t); |
161 | MASTER_TO_ALL_SLAVES_OBJECT(serial_link_connected, bool); | 164 | MASTER_TO_ALL_SLAVES_OBJECT(serial_link_connected, bool); |
165 | #ifndef DISABLE_SYNC_TIMER | ||
166 | MASTER_TO_ALL_SLAVES_OBJECT(sync_timer, uint32_t); | ||
167 | #endif | ||
162 | 168 | ||
163 | static remote_object_t* remote_objects[] = { | 169 | static remote_object_t* remote_objects[] = { |
164 | REMOTE_OBJECT(serial_link_connected), | 170 | REMOTE_OBJECT(serial_link_connected), |
165 | REMOTE_OBJECT(keyboard_matrix), | 171 | REMOTE_OBJECT(keyboard_matrix), |
172 | #ifndef DISABLE_SYNC_TIMER | ||
173 | REMOTE_OBJECT(sync_timer), | ||
174 | #endif | ||
166 | }; | 175 | }; |
167 | 176 | ||
168 | void init_serial_link(void) { | 177 | void init_serial_link(void) { |
@@ -200,14 +209,27 @@ void serial_link_update(void) { | |||
200 | m->rows[i] = matrix.rows[i]; | 209 | m->rows[i] = matrix.rows[i]; |
201 | } | 210 | } |
202 | end_write_keyboard_matrix(); | 211 | end_write_keyboard_matrix(); |
212 | |||
203 | *begin_write_serial_link_connected() = true; | 213 | *begin_write_serial_link_connected() = true; |
204 | end_write_serial_link_connected(); | 214 | end_write_serial_link_connected(); |
215 | |||
216 | #ifndef DISABLE_SYNC_TIMER | ||
217 | *begin_write_sync_timer() = sync_timer_read32() + SYNC_TIMER_OFFSET; | ||
218 | end_write_sync_timer(); | ||
219 | #endif | ||
205 | } | 220 | } |
206 | 221 | ||
207 | matrix_object_t* m = read_keyboard_matrix(0); | 222 | matrix_object_t* m = read_keyboard_matrix(0); |
208 | if (m) { | 223 | if (m) { |
209 | matrix_set_remote(m->rows, 0); | 224 | matrix_set_remote(m->rows, 0); |
210 | } | 225 | } |
226 | |||
227 | #ifndef DISABLE_SYNC_TIMER | ||
228 | uint32_t* t = read_sync_timer(); | ||
229 | if (t) { | ||
230 | sync_timer_update(*t); | ||
231 | } | ||
232 | #endif | ||
211 | } | 233 | } |
212 | 234 | ||
213 | void signal_data_written(void) { chEvtBroadcast(&new_data_event); } | 235 | void signal_data_written(void) { chEvtBroadcast(&new_data_event); } |
diff --git a/quantum/split_common/matrix.c b/quantum/split_common/matrix.c deleted file mode 100644 index 039e7d977..000000000 --- a/quantum/split_common/matrix.c +++ /dev/null | |||
@@ -1,309 +0,0 @@ | |||
1 | /* | ||
2 | Copyright 2012 Jun Wako <wakojun@gmail.com> | ||
3 | |||
4 | This program is free software: you can redistribute it and/or modify | ||
5 | it under the terms of the GNU General Public License as published by | ||
6 | the Free Software Foundation, either version 2 of the License, or | ||
7 | (at your option) any later version. | ||
8 | |||
9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | GNU General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
16 | */ | ||
17 | #include <stdint.h> | ||
18 | #include <stdbool.h> | ||
19 | #include "util.h" | ||
20 | #include "matrix.h" | ||
21 | #include "debounce.h" | ||
22 | #include "quantum.h" | ||
23 | #include "split_util.h" | ||
24 | #include "config.h" | ||
25 | #include "transport.h" | ||
26 | |||
27 | #define ERROR_DISCONNECT_COUNT 5 | ||
28 | |||
29 | #define ROWS_PER_HAND (MATRIX_ROWS / 2) | ||
30 | |||
31 | #ifdef DIRECT_PINS | ||
32 | static pin_t direct_pins[MATRIX_ROWS][MATRIX_COLS] = DIRECT_PINS; | ||
33 | #elif (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW) | ||
34 | static pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; | ||
35 | static pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; | ||
36 | #endif | ||
37 | |||
38 | /* matrix state(1:on, 0:off) */ | ||
39 | extern matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values | ||
40 | extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values | ||
41 | |||
42 | // row offsets for each hand | ||
43 | uint8_t thisHand, thatHand; | ||
44 | |||
45 | // user-defined overridable functions | ||
46 | __attribute__((weak)) void matrix_slave_scan_kb(void) { matrix_slave_scan_user(); } | ||
47 | __attribute__((weak)) void matrix_slave_scan_user(void) {} | ||
48 | |||
49 | static inline void setPinOutput_writeLow(pin_t pin) { | ||
50 | ATOMIC_BLOCK_FORCEON { | ||
51 | setPinOutput(pin); | ||
52 | writePinLow(pin); | ||
53 | } | ||
54 | } | ||
55 | |||
56 | static inline void setPinInputHigh_atomic(pin_t pin) { | ||
57 | ATOMIC_BLOCK_FORCEON { setPinInputHigh(pin); } | ||
58 | } | ||
59 | |||
60 | // matrix code | ||
61 | |||
62 | #ifdef DIRECT_PINS | ||
63 | |||
64 | static void init_pins(void) { | ||
65 | for (int row = 0; row < MATRIX_ROWS; row++) { | ||
66 | for (int col = 0; col < MATRIX_COLS; col++) { | ||
67 | pin_t pin = direct_pins[row][col]; | ||
68 | if (pin != NO_PIN) { | ||
69 | setPinInputHigh(pin); | ||
70 | } | ||
71 | } | ||
72 | } | ||
73 | } | ||
74 | |||
75 | static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { | ||
76 | // Start with a clear matrix row | ||
77 | matrix_row_t current_row_value = 0; | ||
78 | |||
79 | for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { | ||
80 | pin_t pin = direct_pins[current_row][col_index]; | ||
81 | if (pin != NO_PIN) { | ||
82 | current_row_value |= readPin(pin) ? 0 : (MATRIX_ROW_SHIFTER << col_index); | ||
83 | } | ||
84 | } | ||
85 | |||
86 | // If the row has changed, store the row and return the changed flag. | ||
87 | if (current_matrix[current_row] != current_row_value) { | ||
88 | current_matrix[current_row] = current_row_value; | ||
89 | return true; | ||
90 | } | ||
91 | return false; | ||
92 | } | ||
93 | |||
94 | #elif defined(DIODE_DIRECTION) | ||
95 | # if (DIODE_DIRECTION == COL2ROW) | ||
96 | |||
97 | static void select_row(uint8_t row) { setPinOutput_writeLow(row_pins[row]); } | ||
98 | |||
99 | static void unselect_row(uint8_t row) { setPinInputHigh_atomic(row_pins[row]); } | ||
100 | |||
101 | static void unselect_rows(void) { | ||
102 | for (uint8_t x = 0; x < ROWS_PER_HAND; x++) { | ||
103 | setPinInputHigh_atomic(row_pins[x]); | ||
104 | } | ||
105 | } | ||
106 | |||
107 | static void init_pins(void) { | ||
108 | unselect_rows(); | ||
109 | for (uint8_t x = 0; x < MATRIX_COLS; x++) { | ||
110 | setPinInputHigh_atomic(col_pins[x]); | ||
111 | } | ||
112 | } | ||
113 | |||
114 | static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { | ||
115 | // Start with a clear matrix row | ||
116 | matrix_row_t current_row_value = 0; | ||
117 | |||
118 | // Select row | ||
119 | select_row(current_row); | ||
120 | matrix_output_select_delay(); | ||
121 | |||
122 | // For each col... | ||
123 | for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { | ||
124 | // Select the col pin to read (active low) | ||
125 | uint8_t pin_state = readPin(col_pins[col_index]); | ||
126 | |||
127 | // Populate the matrix row with the state of the col pin | ||
128 | current_row_value |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index); | ||
129 | } | ||
130 | |||
131 | // Unselect row | ||
132 | unselect_row(current_row); | ||
133 | matrix_output_unselect_delay(); // wait for all Col signals to go HIGH | ||
134 | |||
135 | // If the row has changed, store the row and return the changed flag. | ||
136 | if (current_matrix[current_row] != current_row_value) { | ||
137 | current_matrix[current_row] = current_row_value; | ||
138 | return true; | ||
139 | } | ||
140 | return false; | ||
141 | } | ||
142 | |||
143 | # elif (DIODE_DIRECTION == ROW2COL) | ||
144 | |||
145 | static void select_col(uint8_t col) { setPinOutput_writeLow(col_pins[col]); } | ||
146 | |||
147 | static void unselect_col(uint8_t col) { setPinInputHigh_atomic(col_pins[col]); } | ||
148 | |||
149 | static void unselect_cols(void) { | ||
150 | for (uint8_t x = 0; x < MATRIX_COLS; x++) { | ||
151 | setPinInputHigh_atomic(col_pins[x]); | ||
152 | } | ||
153 | } | ||
154 | |||
155 | static void init_pins(void) { | ||
156 | unselect_cols(); | ||
157 | for (uint8_t x = 0; x < ROWS_PER_HAND; x++) { | ||
158 | setPinInputHigh_atomic(row_pins[x]); | ||
159 | } | ||
160 | } | ||
161 | |||
162 | static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) { | ||
163 | bool matrix_changed = false; | ||
164 | |||
165 | // Select col | ||
166 | select_col(current_col); | ||
167 | matrix_output_select_delay(); | ||
168 | |||
169 | // For each row... | ||
170 | for (uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) { | ||
171 | // Store last value of row prior to reading | ||
172 | matrix_row_t last_row_value = current_matrix[row_index]; | ||
173 | matrix_row_t current_row_value = last_row_value; | ||
174 | |||
175 | // Check row pin state | ||
176 | if (readPin(row_pins[row_index]) == 0) { | ||
177 | // Pin LO, set col bit | ||
178 | current_row_value |= (MATRIX_ROW_SHIFTER << current_col); | ||
179 | } else { | ||
180 | // Pin HI, clear col bit | ||
181 | current_row_value &= ~(MATRIX_ROW_SHIFTER << current_col); | ||
182 | } | ||
183 | |||
184 | // Determine if the matrix changed state | ||
185 | if ((last_row_value != current_row_value)) { | ||
186 | matrix_changed |= true; | ||
187 | current_matrix[row_index] = current_row_value; | ||
188 | } | ||
189 | } | ||
190 | |||
191 | // Unselect col | ||
192 | unselect_col(current_col); | ||
193 | matrix_output_unselect_delay(); // wait for all Row signals to go HIGH | ||
194 | |||
195 | return matrix_changed; | ||
196 | } | ||
197 | |||
198 | # else | ||
199 | # error DIODE_DIRECTION must be one of COL2ROW or ROW2COL! | ||
200 | # endif | ||
201 | #else | ||
202 | # error DIODE_DIRECTION is not defined! | ||
203 | #endif | ||
204 | |||
205 | void matrix_init(void) { | ||
206 | split_pre_init(); | ||
207 | |||
208 | // Set pinout for right half if pinout for that half is defined | ||
209 | if (!isLeftHand) { | ||
210 | #ifdef DIRECT_PINS_RIGHT | ||
211 | const pin_t direct_pins_right[MATRIX_ROWS][MATRIX_COLS] = DIRECT_PINS_RIGHT; | ||
212 | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||
213 | for (uint8_t j = 0; j < MATRIX_COLS; j++) { | ||
214 | direct_pins[i][j] = direct_pins_right[i][j]; | ||
215 | } | ||
216 | } | ||
217 | #endif | ||
218 | #ifdef MATRIX_ROW_PINS_RIGHT | ||
219 | const pin_t row_pins_right[MATRIX_ROWS] = MATRIX_ROW_PINS_RIGHT; | ||
220 | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||
221 | row_pins[i] = row_pins_right[i]; | ||
222 | } | ||
223 | #endif | ||
224 | #ifdef MATRIX_COL_PINS_RIGHT | ||
225 | const pin_t col_pins_right[MATRIX_COLS] = MATRIX_COL_PINS_RIGHT; | ||
226 | for (uint8_t i = 0; i < MATRIX_COLS; i++) { | ||
227 | col_pins[i] = col_pins_right[i]; | ||
228 | } | ||
229 | #endif | ||
230 | } | ||
231 | |||
232 | thisHand = isLeftHand ? 0 : (ROWS_PER_HAND); | ||
233 | thatHand = ROWS_PER_HAND - thisHand; | ||
234 | |||
235 | // initialize key pins | ||
236 | init_pins(); | ||
237 | |||
238 | // initialize matrix state: all keys off | ||
239 | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||
240 | raw_matrix[i] = 0; | ||
241 | matrix[i] = 0; | ||
242 | } | ||
243 | |||
244 | debounce_init(ROWS_PER_HAND); | ||
245 | |||
246 | matrix_init_quantum(); | ||
247 | |||
248 | split_post_init(); | ||
249 | } | ||
250 | |||
251 | bool matrix_post_scan(void) { | ||
252 | bool changed = false; | ||
253 | if (is_keyboard_master()) { | ||
254 | static uint8_t error_count; | ||
255 | |||
256 | matrix_row_t slave_matrix[ROWS_PER_HAND] = {0}; | ||
257 | if (!transport_master(matrix + thisHand, slave_matrix)) { | ||
258 | error_count++; | ||
259 | |||
260 | if (error_count > ERROR_DISCONNECT_COUNT) { | ||
261 | // reset other half if disconnected | ||
262 | for (int i = 0; i < ROWS_PER_HAND; ++i) { | ||
263 | matrix[thatHand + i] = 0; | ||
264 | slave_matrix[i] = 0; | ||
265 | } | ||
266 | |||
267 | changed = true; | ||
268 | } | ||
269 | } else { | ||
270 | error_count = 0; | ||
271 | |||
272 | for (int i = 0; i < ROWS_PER_HAND; ++i) { | ||
273 | if (matrix[thatHand + i] != slave_matrix[i]) { | ||
274 | matrix[thatHand + i] = slave_matrix[i]; | ||
275 | changed = true; | ||
276 | } | ||
277 | } | ||
278 | } | ||
279 | |||
280 | matrix_scan_quantum(); | ||
281 | } else { | ||
282 | transport_slave(matrix + thatHand, matrix + thisHand); | ||
283 | |||
284 | matrix_slave_scan_kb(); | ||
285 | } | ||
286 | |||
287 | return changed; | ||
288 | } | ||
289 | |||
290 | uint8_t matrix_scan(void) { | ||
291 | bool local_changed = false; | ||
292 | |||
293 | #if defined(DIRECT_PINS) || (DIODE_DIRECTION == COL2ROW) | ||
294 | // Set row, read cols | ||
295 | for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) { | ||
296 | local_changed |= read_cols_on_row(raw_matrix, current_row); | ||
297 | } | ||
298 | #elif (DIODE_DIRECTION == ROW2COL) | ||
299 | // Set col, read rows | ||
300 | for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { | ||
301 | local_changed |= read_rows_on_col(raw_matrix, current_col); | ||
302 | } | ||
303 | #endif | ||
304 | |||
305 | debounce(raw_matrix, matrix + thisHand, ROWS_PER_HAND, local_changed); | ||
306 | |||
307 | bool remote_changed = matrix_post_scan(); | ||
308 | return (uint8_t)(local_changed || remote_changed); | ||
309 | } | ||
diff --git a/quantum/split_common/post_config.h b/quantum/split_common/post_config.h index 4ae1d5273..a4c0a1956 100644 --- a/quantum/split_common/post_config.h +++ b/quantum/split_common/post_config.h | |||
@@ -7,13 +7,4 @@ | |||
7 | # ifndef F_SCL | 7 | # ifndef F_SCL |
8 | # define F_SCL 100000UL // SCL frequency | 8 | # define F_SCL 100000UL // SCL frequency |
9 | # endif | 9 | # endif |
10 | |||
11 | #else // use serial | ||
12 | // When using serial, the user must define RGBLIGHT_SPLIT explicitly | ||
13 | // in config.h as needed. | ||
14 | // see quantum/rgblight_post_config.h | ||
15 | # if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
16 | // When using serial and RGBLIGHT_SPLIT need separate transaction | ||
17 | # define SERIAL_USE_MULTI_TRANSACTION | ||
18 | # endif | ||
19 | #endif | 10 | #endif |
diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index 9e75e19ce..989829d2d 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c | |||
@@ -77,7 +77,11 @@ __attribute__((weak)) bool is_keyboard_left(void) { | |||
77 | #if defined(SPLIT_HAND_PIN) | 77 | #if defined(SPLIT_HAND_PIN) |
78 | // Test pin SPLIT_HAND_PIN for High/Low, if low it's right hand | 78 | // Test pin SPLIT_HAND_PIN for High/Low, if low it's right hand |
79 | setPinInput(SPLIT_HAND_PIN); | 79 | setPinInput(SPLIT_HAND_PIN); |
80 | # ifdef SPLIT_HAND_PIN_LOW_IS_LEFT | ||
81 | return !readPin(SPLIT_HAND_PIN); | ||
82 | # else | ||
80 | return readPin(SPLIT_HAND_PIN); | 83 | return readPin(SPLIT_HAND_PIN); |
84 | # endif | ||
81 | #elif defined(SPLIT_HAND_MATRIX_GRID) | 85 | #elif defined(SPLIT_HAND_MATRIX_GRID) |
82 | # ifdef SPLIT_HAND_MATRIX_GRID_LOW_IS_RIGHT | 86 | # ifdef SPLIT_HAND_MATRIX_GRID_LOW_IS_RIGHT |
83 | return peek_matrix_intersection(SPLIT_HAND_MATRIX_GRID); | 87 | return peek_matrix_intersection(SPLIT_HAND_MATRIX_GRID); |
diff --git a/quantum/split_common/transaction_id_define.h b/quantum/split_common/transaction_id_define.h new file mode 100644 index 000000000..464c73478 --- /dev/null +++ b/quantum/split_common/transaction_id_define.h | |||
@@ -0,0 +1,94 @@ | |||
1 | /* Copyright 2021 QMK | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #pragma once | ||
18 | |||
19 | enum serial_transaction_id { | ||
20 | #ifdef USE_I2C | ||
21 | I2C_EXECUTE_CALLBACK, | ||
22 | #endif // USE_I2C | ||
23 | |||
24 | GET_SLAVE_MATRIX_CHECKSUM, | ||
25 | GET_SLAVE_MATRIX_DATA, | ||
26 | |||
27 | #ifdef SPLIT_TRANSPORT_MIRROR | ||
28 | PUT_MASTER_MATRIX, | ||
29 | #endif // SPLIT_TRANSPORT_MIRROR | ||
30 | |||
31 | #ifdef ENCODER_ENABLE | ||
32 | GET_ENCODERS_CHECKSUM, | ||
33 | GET_ENCODERS_DATA, | ||
34 | #endif // ENCODER_ENABLE | ||
35 | |||
36 | #ifndef DISABLE_SYNC_TIMER | ||
37 | PUT_SYNC_TIMER, | ||
38 | #endif // DISABLE_SYNC_TIMER | ||
39 | |||
40 | #if !defined(NO_ACTION_LAYER) && defined(SPLIT_LAYER_STATE_ENABLE) | ||
41 | PUT_LAYER_STATE, | ||
42 | PUT_DEFAULT_LAYER_STATE, | ||
43 | #endif // !defined(NO_ACTION_LAYER) && defined(SPLIT_LAYER_STATE_ENABLE) | ||
44 | |||
45 | #ifdef SPLIT_LED_STATE_ENABLE | ||
46 | PUT_LED_STATE, | ||
47 | #endif // SPLIT_LED_STATE_ENABLE | ||
48 | |||
49 | #ifdef SPLIT_MODS_ENABLE | ||
50 | PUT_MODS, | ||
51 | #endif // SPLIT_MODS_ENABLE | ||
52 | |||
53 | #ifdef BACKLIGHT_ENABLE | ||
54 | PUT_BACKLIGHT, | ||
55 | #endif // BACKLIGHT_ENABLE | ||
56 | |||
57 | #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
58 | PUT_RGBLIGHT, | ||
59 | #endif // defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
60 | |||
61 | #if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
62 | PUT_LED_MATRIX, | ||
63 | #endif // defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
64 | |||
65 | #if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
66 | PUT_RGB_MATRIX, | ||
67 | #endif // defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
68 | |||
69 | #if defined(WPM_ENABLE) && defined(SPLIT_WPM_ENABLE) | ||
70 | PUT_WPM, | ||
71 | #endif // defined(WPM_ENABLE) && defined(SPLIT_WPM_ENABLE) | ||
72 | |||
73 | #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) | ||
74 | PUT_RPC_INFO, | ||
75 | PUT_RPC_REQ_DATA, | ||
76 | EXECUTE_RPC, | ||
77 | GET_RPC_RESP_DATA, | ||
78 | #endif // defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) | ||
79 | |||
80 | // keyboard-specific | ||
81 | #ifdef SPLIT_TRANSACTION_IDS_KB | ||
82 | SPLIT_TRANSACTION_IDS_KB, | ||
83 | #endif // SPLIT_TRANSACTION_IDS_KB | ||
84 | |||
85 | // user/keymap-specific | ||
86 | #ifdef SPLIT_TRANSACTION_IDS_USER | ||
87 | SPLIT_TRANSACTION_IDS_USER, | ||
88 | #endif // SPLIT_TRANSACTION_IDS_USER | ||
89 | |||
90 | NUM_TOTAL_TRANSACTIONS | ||
91 | }; | ||
92 | |||
93 | // Ensure we only use 5 bits for transaction | ||
94 | _Static_assert(NUM_TOTAL_TRANSACTIONS <= (1 << 5), "Max number of usable transactions exceeded"); | ||
diff --git a/quantum/split_common/transactions.c b/quantum/split_common/transactions.c new file mode 100644 index 000000000..abad626e0 --- /dev/null +++ b/quantum/split_common/transactions.c | |||
@@ -0,0 +1,655 @@ | |||
1 | /* Copyright 2021 QMK | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include <string.h> | ||
18 | #include <stddef.h> | ||
19 | |||
20 | #include "crc.h" | ||
21 | #include "debug.h" | ||
22 | #include "matrix.h" | ||
23 | #include "quantum.h" | ||
24 | #include "transactions.h" | ||
25 | #include "transport.h" | ||
26 | #include "transaction_id_define.h" | ||
27 | |||
28 | #define SYNC_TIMER_OFFSET 2 | ||
29 | |||
30 | #ifndef FORCED_SYNC_THROTTLE_MS | ||
31 | # define FORCED_SYNC_THROTTLE_MS 100 | ||
32 | #endif // FORCED_SYNC_THROTTLE_MS | ||
33 | |||
34 | #define sizeof_member(type, member) sizeof(((type *)NULL)->member) | ||
35 | |||
36 | #define trans_initiator2target_initializer_cb(member, cb) \ | ||
37 | { &dummy, sizeof_member(split_shared_memory_t, member), offsetof(split_shared_memory_t, member), 0, 0, cb } | ||
38 | #define trans_initiator2target_initializer(member) trans_initiator2target_initializer_cb(member, NULL) | ||
39 | |||
40 | #define trans_target2initiator_initializer_cb(member, cb) \ | ||
41 | { &dummy, 0, 0, sizeof_member(split_shared_memory_t, member), offsetof(split_shared_memory_t, member), cb } | ||
42 | #define trans_target2initiator_initializer(member) trans_target2initiator_initializer_cb(member, NULL) | ||
43 | |||
44 | #define transport_write(id, data, length) transport_execute_transaction(id, data, length, NULL, 0) | ||
45 | #define transport_read(id, data, length) transport_execute_transaction(id, NULL, 0, data, length) | ||
46 | |||
47 | #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) | ||
48 | // Forward-declare the RPC callback handlers | ||
49 | void slave_rpc_info_callback(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer); | ||
50 | void slave_rpc_exec_callback(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer); | ||
51 | #endif // defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) | ||
52 | |||
53 | //////////////////////////////////////////////////// | ||
54 | // Helpers | ||
55 | |||
56 | bool transaction_handler_master(bool okay, matrix_row_t master_matrix[], matrix_row_t slave_matrix[], const char *prefix, bool (*handler)(matrix_row_t master_matrix[], matrix_row_t slave_matrix[])) { | ||
57 | if (okay) { | ||
58 | bool this_okay = true; | ||
59 | for (int iter = 1; iter <= 10; ++iter) { | ||
60 | if (!this_okay) { | ||
61 | for (int i = 0; i < iter * iter; ++i) { | ||
62 | wait_us(10); | ||
63 | } | ||
64 | } | ||
65 | ATOMIC_BLOCK_FORCEON { this_okay = handler(master_matrix, slave_matrix); }; | ||
66 | if (this_okay) break; | ||
67 | } | ||
68 | okay &= this_okay; | ||
69 | if (!okay) { | ||
70 | dprintf("Failed to execute %s\n", prefix); | ||
71 | } | ||
72 | } | ||
73 | return okay; | ||
74 | } | ||
75 | |||
76 | #define TRANSACTION_HANDLER_MASTER(prefix) \ | ||
77 | do { \ | ||
78 | okay &= transaction_handler_master(okay, master_matrix, slave_matrix, #prefix, &prefix##_master); \ | ||
79 | } while (0) | ||
80 | |||
81 | #define TRANSACTION_HANDLER_SLAVE(prefix) \ | ||
82 | do { \ | ||
83 | ATOMIC_BLOCK_FORCEON { prefix##_slave(master_matrix, slave_matrix); }; \ | ||
84 | } while (0) | ||
85 | |||
86 | inline static bool read_if_checksum_mismatch(int8_t trans_id_checksum, int8_t trans_id_retrieve, uint32_t *last_update, void *destination, const void *equiv_shmem, size_t length) { | ||
87 | uint8_t curr_checksum; | ||
88 | bool okay = transport_read(trans_id_checksum, &curr_checksum, sizeof(curr_checksum)); | ||
89 | if (okay && (timer_elapsed32(*last_update) >= FORCED_SYNC_THROTTLE_MS || curr_checksum != crc8(equiv_shmem, length))) { | ||
90 | okay &= transport_read(trans_id_retrieve, destination, length); | ||
91 | okay &= curr_checksum == crc8(equiv_shmem, length); | ||
92 | if (okay) { | ||
93 | *last_update = timer_read32(); | ||
94 | } | ||
95 | } else { | ||
96 | memcpy(destination, equiv_shmem, length); | ||
97 | } | ||
98 | return okay; | ||
99 | } | ||
100 | |||
101 | inline static bool send_if_condition(int8_t trans_id, uint32_t *last_update, bool condition, void *source, size_t length) { | ||
102 | bool okay = true; | ||
103 | if (timer_elapsed32(*last_update) >= FORCED_SYNC_THROTTLE_MS || condition) { | ||
104 | okay &= transport_write(trans_id, source, length); | ||
105 | if (okay) { | ||
106 | *last_update = timer_read32(); | ||
107 | } | ||
108 | } | ||
109 | return okay; | ||
110 | } | ||
111 | |||
112 | inline static bool send_if_data_mismatch(int8_t trans_id, uint32_t *last_update, void *source, const void *equiv_shmem, size_t length) { | ||
113 | // Just run a memcmp to compare the source and equivalent shmem location | ||
114 | return send_if_condition(trans_id, last_update, (memcmp(source, equiv_shmem, length) != 0), source, length); | ||
115 | } | ||
116 | |||
117 | //////////////////////////////////////////////////// | ||
118 | // Slave matrix | ||
119 | |||
120 | static bool slave_matrix_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
121 | static uint32_t last_update = 0; | ||
122 | static matrix_row_t last_matrix[(MATRIX_ROWS) / 2] = {0}; // last successfully-read matrix, so we can replicate if there are checksum errors | ||
123 | matrix_row_t temp_matrix[(MATRIX_ROWS) / 2]; // holding area while we test whether or not checksum is correct | ||
124 | |||
125 | bool okay = read_if_checksum_mismatch(GET_SLAVE_MATRIX_CHECKSUM, GET_SLAVE_MATRIX_DATA, &last_update, temp_matrix, split_shmem->smatrix.matrix, sizeof(split_shmem->smatrix.matrix)); | ||
126 | if (okay) { | ||
127 | // Checksum matches the received data, save as the last matrix state | ||
128 | memcpy(last_matrix, temp_matrix, sizeof(temp_matrix)); | ||
129 | } | ||
130 | // Copy out the last-known-good matrix state to the slave matrix | ||
131 | memcpy(slave_matrix, last_matrix, sizeof(last_matrix)); | ||
132 | return okay; | ||
133 | } | ||
134 | |||
135 | static void slave_matrix_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
136 | memcpy(split_shmem->smatrix.matrix, slave_matrix, sizeof(split_shmem->smatrix.matrix)); | ||
137 | split_shmem->smatrix.checksum = crc8(split_shmem->smatrix.matrix, sizeof(split_shmem->smatrix.matrix)); | ||
138 | } | ||
139 | |||
140 | // clang-format off | ||
141 | #define TRANSACTIONS_SLAVE_MATRIX_MASTER() TRANSACTION_HANDLER_MASTER(slave_matrix_handlers) | ||
142 | #define TRANSACTIONS_SLAVE_MATRIX_SLAVE() TRANSACTION_HANDLER_SLAVE(slave_matrix_handlers) | ||
143 | #define TRANSACTIONS_SLAVE_MATRIX_REGISTRATIONS \ | ||
144 | [GET_SLAVE_MATRIX_CHECKSUM] = trans_target2initiator_initializer(smatrix.checksum), \ | ||
145 | [GET_SLAVE_MATRIX_DATA] = trans_target2initiator_initializer(smatrix.matrix), | ||
146 | // clang-format on | ||
147 | |||
148 | //////////////////////////////////////////////////// | ||
149 | // Master matrix | ||
150 | |||
151 | #ifdef SPLIT_TRANSPORT_MIRROR | ||
152 | |||
153 | static bool master_matrix_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
154 | static uint32_t last_update = 0; | ||
155 | return send_if_data_mismatch(PUT_MASTER_MATRIX, &last_update, master_matrix, split_shmem->mmatrix.matrix, sizeof(split_shmem->mmatrix.matrix)); | ||
156 | } | ||
157 | |||
158 | static void master_matrix_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
159 | // Always copy to the master matrix | ||
160 | memcpy(master_matrix, split_shmem->mmatrix.matrix, sizeof(split_shmem->mmatrix.matrix)); | ||
161 | } | ||
162 | |||
163 | # define TRANSACTIONS_MASTER_MATRIX_MASTER() TRANSACTION_HANDLER_MASTER(master_matrix_handlers) | ||
164 | # define TRANSACTIONS_MASTER_MATRIX_SLAVE() TRANSACTION_HANDLER_SLAVE(master_matrix_handlers) | ||
165 | # define TRANSACTIONS_MASTER_MATRIX_REGISTRATIONS [PUT_MASTER_MATRIX] = trans_initiator2target_initializer(mmatrix.matrix), | ||
166 | |||
167 | #else // SPLIT_TRANSPORT_MIRROR | ||
168 | |||
169 | # define TRANSACTIONS_MASTER_MATRIX_MASTER() | ||
170 | # define TRANSACTIONS_MASTER_MATRIX_SLAVE() | ||
171 | # define TRANSACTIONS_MASTER_MATRIX_REGISTRATIONS | ||
172 | |||
173 | #endif // SPLIT_TRANSPORT_MIRROR | ||
174 | |||
175 | //////////////////////////////////////////////////// | ||
176 | // Encoders | ||
177 | |||
178 | #ifdef ENCODER_ENABLE | ||
179 | |||
180 | static bool encoder_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
181 | static uint32_t last_update = 0; | ||
182 | uint8_t temp_state[NUMBER_OF_ENCODERS]; | ||
183 | |||
184 | bool okay = read_if_checksum_mismatch(GET_ENCODERS_CHECKSUM, GET_ENCODERS_DATA, &last_update, temp_state, split_shmem->encoders.state, sizeof(temp_state)); | ||
185 | if (okay) encoder_update_raw(temp_state); | ||
186 | return okay; | ||
187 | } | ||
188 | |||
189 | static void encoder_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
190 | uint8_t encoder_state[NUMBER_OF_ENCODERS]; | ||
191 | encoder_state_raw(encoder_state); | ||
192 | // Always prepare the encoder state for read. | ||
193 | memcpy(split_shmem->encoders.state, encoder_state, sizeof(encoder_state)); | ||
194 | // Now update the checksum given that the encoders has been written to | ||
195 | split_shmem->encoders.checksum = crc8(encoder_state, sizeof(encoder_state)); | ||
196 | } | ||
197 | |||
198 | // clang-format off | ||
199 | # define TRANSACTIONS_ENCODERS_MASTER() TRANSACTION_HANDLER_MASTER(encoder_handlers) | ||
200 | # define TRANSACTIONS_ENCODERS_SLAVE() TRANSACTION_HANDLER_SLAVE(encoder_handlers) | ||
201 | # define TRANSACTIONS_ENCODERS_REGISTRATIONS \ | ||
202 | [GET_ENCODERS_CHECKSUM] = trans_target2initiator_initializer(encoders.checksum), \ | ||
203 | [GET_ENCODERS_DATA] = trans_target2initiator_initializer(encoders.state), | ||
204 | // clang-format on | ||
205 | |||
206 | #else // ENCODER_ENABLE | ||
207 | |||
208 | # define TRANSACTIONS_ENCODERS_MASTER() | ||
209 | # define TRANSACTIONS_ENCODERS_SLAVE() | ||
210 | # define TRANSACTIONS_ENCODERS_REGISTRATIONS | ||
211 | |||
212 | #endif // ENCODER_ENABLE | ||
213 | |||
214 | //////////////////////////////////////////////////// | ||
215 | // Sync timer | ||
216 | |||
217 | #ifndef DISABLE_SYNC_TIMER | ||
218 | |||
219 | static bool sync_timer_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
220 | static uint32_t last_update = 0; | ||
221 | |||
222 | bool okay = true; | ||
223 | if (timer_elapsed32(last_update) >= FORCED_SYNC_THROTTLE_MS) { | ||
224 | uint32_t sync_timer = sync_timer_read32() + SYNC_TIMER_OFFSET; | ||
225 | okay &= transport_write(PUT_SYNC_TIMER, &sync_timer, sizeof(sync_timer)); | ||
226 | if (okay) { | ||
227 | last_update = timer_read32(); | ||
228 | } | ||
229 | } | ||
230 | return okay; | ||
231 | } | ||
232 | |||
233 | static void sync_timer_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
234 | static uint32_t last_sync_timer = 0; | ||
235 | if (last_sync_timer != split_shmem->sync_timer) { | ||
236 | last_sync_timer = split_shmem->sync_timer; | ||
237 | sync_timer_update(last_sync_timer); | ||
238 | } | ||
239 | } | ||
240 | |||
241 | # define TRANSACTIONS_SYNC_TIMER_MASTER() TRANSACTION_HANDLER_MASTER(sync_timer_handlers) | ||
242 | # define TRANSACTIONS_SYNC_TIMER_SLAVE() TRANSACTION_HANDLER_SLAVE(sync_timer_handlers) | ||
243 | # define TRANSACTIONS_SYNC_TIMER_REGISTRATIONS [PUT_SYNC_TIMER] = trans_initiator2target_initializer(sync_timer), | ||
244 | |||
245 | #else // DISABLE_SYNC_TIMER | ||
246 | |||
247 | # define TRANSACTIONS_SYNC_TIMER_MASTER() | ||
248 | # define TRANSACTIONS_SYNC_TIMER_SLAVE() | ||
249 | # define TRANSACTIONS_SYNC_TIMER_REGISTRATIONS | ||
250 | |||
251 | #endif // DISABLE_SYNC_TIMER | ||
252 | |||
253 | //////////////////////////////////////////////////// | ||
254 | // Layer state | ||
255 | |||
256 | #if !defined(NO_ACTION_LAYER) && defined(SPLIT_LAYER_STATE_ENABLE) | ||
257 | |||
258 | static bool layer_state_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
259 | static uint32_t last_layer_state_update = 0; | ||
260 | static uint32_t last_default_layer_state_update = 0; | ||
261 | |||
262 | bool okay = send_if_condition(PUT_LAYER_STATE, &last_layer_state_update, (layer_state != split_shmem->layers.layer_state), &layer_state, sizeof(layer_state)); | ||
263 | if (okay) { | ||
264 | okay &= send_if_condition(PUT_DEFAULT_LAYER_STATE, &last_default_layer_state_update, (default_layer_state != split_shmem->layers.default_layer_state), &default_layer_state, sizeof(default_layer_state)); | ||
265 | } | ||
266 | return okay; | ||
267 | } | ||
268 | |||
269 | static void layer_state_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
270 | layer_state = split_shmem->layers.layer_state; | ||
271 | default_layer_state = split_shmem->layers.default_layer_state; | ||
272 | } | ||
273 | |||
274 | // clang-format off | ||
275 | # define TRANSACTIONS_LAYER_STATE_MASTER() TRANSACTION_HANDLER_MASTER(layer_state_handlers) | ||
276 | # define TRANSACTIONS_LAYER_STATE_SLAVE() TRANSACTION_HANDLER_SLAVE(layer_state_handlers) | ||
277 | # define TRANSACTIONS_LAYER_STATE_REGISTRATIONS \ | ||
278 | [PUT_LAYER_STATE] = trans_initiator2target_initializer(layers.layer_state), \ | ||
279 | [PUT_DEFAULT_LAYER_STATE] = trans_initiator2target_initializer(layers.default_layer_state), | ||
280 | // clang-format on | ||
281 | |||
282 | #else // !defined(NO_ACTION_LAYER) && defined(SPLIT_LAYER_STATE_ENABLE) | ||
283 | |||
284 | # define TRANSACTIONS_LAYER_STATE_MASTER() | ||
285 | # define TRANSACTIONS_LAYER_STATE_SLAVE() | ||
286 | # define TRANSACTIONS_LAYER_STATE_REGISTRATIONS | ||
287 | |||
288 | #endif // !defined(NO_ACTION_LAYER) && defined(SPLIT_LAYER_STATE_ENABLE) | ||
289 | |||
290 | //////////////////////////////////////////////////// | ||
291 | // LED state | ||
292 | |||
293 | #ifdef SPLIT_LED_STATE_ENABLE | ||
294 | |||
295 | static bool led_state_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
296 | static uint32_t last_update = 0; | ||
297 | uint8_t led_state = host_keyboard_leds(); | ||
298 | return send_if_data_mismatch(PUT_LED_STATE, &last_update, &led_state, &split_shmem->led_state, sizeof(led_state)); | ||
299 | } | ||
300 | |||
301 | static void led_state_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
302 | void set_split_host_keyboard_leds(uint8_t led_state); | ||
303 | set_split_host_keyboard_leds(split_shmem->led_state); | ||
304 | } | ||
305 | |||
306 | # define TRANSACTIONS_LED_STATE_MASTER() TRANSACTION_HANDLER_MASTER(led_state_handlers) | ||
307 | # define TRANSACTIONS_LED_STATE_SLAVE() TRANSACTION_HANDLER_SLAVE(led_state_handlers) | ||
308 | # define TRANSACTIONS_LED_STATE_REGISTRATIONS [PUT_LED_STATE] = trans_initiator2target_initializer(led_state), | ||
309 | |||
310 | #else // SPLIT_LED_STATE_ENABLE | ||
311 | |||
312 | # define TRANSACTIONS_LED_STATE_MASTER() | ||
313 | # define TRANSACTIONS_LED_STATE_SLAVE() | ||
314 | # define TRANSACTIONS_LED_STATE_REGISTRATIONS | ||
315 | |||
316 | #endif // SPLIT_LED_STATE_ENABLE | ||
317 | |||
318 | //////////////////////////////////////////////////// | ||
319 | // Mods | ||
320 | |||
321 | #ifdef SPLIT_MODS_ENABLE | ||
322 | |||
323 | static bool mods_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
324 | static uint32_t last_update = 0; | ||
325 | bool mods_need_sync = timer_elapsed32(last_update) >= FORCED_SYNC_THROTTLE_MS; | ||
326 | split_mods_sync_t new_mods; | ||
327 | new_mods.real_mods = get_mods(); | ||
328 | if (!mods_need_sync && new_mods.real_mods != split_shmem->mods.real_mods) { | ||
329 | mods_need_sync = true; | ||
330 | } | ||
331 | |||
332 | new_mods.weak_mods = get_weak_mods(); | ||
333 | if (!mods_need_sync && new_mods.weak_mods != split_shmem->mods.weak_mods) { | ||
334 | mods_need_sync = true; | ||
335 | } | ||
336 | |||
337 | # ifndef NO_ACTION_ONESHOT | ||
338 | new_mods.oneshot_mods = get_oneshot_mods(); | ||
339 | if (!mods_need_sync && new_mods.oneshot_mods != split_shmem->mods.oneshot_mods) { | ||
340 | mods_need_sync = true; | ||
341 | } | ||
342 | # endif // NO_ACTION_ONESHOT | ||
343 | |||
344 | bool okay = true; | ||
345 | if (mods_need_sync) { | ||
346 | okay &= transport_write(PUT_MODS, &new_mods, sizeof(new_mods)); | ||
347 | if (okay) { | ||
348 | last_update = timer_read32(); | ||
349 | } | ||
350 | } | ||
351 | |||
352 | return okay; | ||
353 | } | ||
354 | |||
355 | static void mods_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
356 | set_mods(split_shmem->mods.real_mods); | ||
357 | set_weak_mods(split_shmem->mods.weak_mods); | ||
358 | # ifndef NO_ACTION_ONESHOT | ||
359 | set_oneshot_mods(split_shmem->mods.oneshot_mods); | ||
360 | # endif | ||
361 | } | ||
362 | |||
363 | # define TRANSACTIONS_MODS_MASTER() TRANSACTION_HANDLER_MASTER(mods_handlers) | ||
364 | # define TRANSACTIONS_MODS_SLAVE() TRANSACTION_HANDLER_SLAVE(mods_handlers) | ||
365 | # define TRANSACTIONS_MODS_REGISTRATIONS [PUT_MODS] = trans_initiator2target_initializer(mods), | ||
366 | |||
367 | #else // SPLIT_MODS_ENABLE | ||
368 | |||
369 | # define TRANSACTIONS_MODS_MASTER() | ||
370 | # define TRANSACTIONS_MODS_SLAVE() | ||
371 | # define TRANSACTIONS_MODS_REGISTRATIONS | ||
372 | |||
373 | #endif // SPLIT_MODS_ENABLE | ||
374 | |||
375 | //////////////////////////////////////////////////// | ||
376 | // Backlight | ||
377 | |||
378 | #ifdef BACKLIGHT_ENABLE | ||
379 | |||
380 | static bool backlight_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
381 | static uint32_t last_update = 0; | ||
382 | uint8_t level = is_backlight_enabled() ? get_backlight_level() : 0; | ||
383 | return send_if_condition(PUT_BACKLIGHT, &last_update, (level != split_shmem->backlight_level), &level, sizeof(level)); | ||
384 | } | ||
385 | |||
386 | static void backlight_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { backlight_set(split_shmem->backlight_level); } | ||
387 | |||
388 | # define TRANSACTIONS_BACKLIGHT_MASTER() TRANSACTION_HANDLER_MASTER(backlight_handlers) | ||
389 | # define TRANSACTIONS_BACKLIGHT_SLAVE() TRANSACTION_HANDLER_SLAVE(backlight_handlers) | ||
390 | # define TRANSACTIONS_BACKLIGHT_REGISTRATIONS [PUT_BACKLIGHT] = trans_initiator2target_initializer(backlight_level), | ||
391 | |||
392 | #else // BACKLIGHT_ENABLE | ||
393 | |||
394 | # define TRANSACTIONS_BACKLIGHT_MASTER() | ||
395 | # define TRANSACTIONS_BACKLIGHT_SLAVE() | ||
396 | # define TRANSACTIONS_BACKLIGHT_REGISTRATIONS | ||
397 | |||
398 | #endif // BACKLIGHT_ENABLE | ||
399 | |||
400 | //////////////////////////////////////////////////// | ||
401 | // RGBLIGHT | ||
402 | |||
403 | #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
404 | |||
405 | static bool rgblight_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
406 | static uint32_t last_update = 0; | ||
407 | rgblight_syncinfo_t rgblight_sync; | ||
408 | rgblight_get_syncinfo(&rgblight_sync); | ||
409 | if (send_if_condition(PUT_RGBLIGHT, &last_update, (rgblight_sync.status.change_flags != 0), &rgblight_sync, sizeof(rgblight_sync))) { | ||
410 | rgblight_clear_change_flags(); | ||
411 | } else { | ||
412 | return false; | ||
413 | } | ||
414 | return true; | ||
415 | } | ||
416 | |||
417 | static void rgblight_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
418 | // Update the RGB with the new data | ||
419 | if (split_shmem->rgblight_sync.status.change_flags != 0) { | ||
420 | rgblight_update_sync(&split_shmem->rgblight_sync, false); | ||
421 | split_shmem->rgblight_sync.status.change_flags = 0; | ||
422 | } | ||
423 | } | ||
424 | |||
425 | # define TRANSACTIONS_RGBLIGHT_MASTER() TRANSACTION_HANDLER_MASTER(rgblight_handlers) | ||
426 | # define TRANSACTIONS_RGBLIGHT_SLAVE() TRANSACTION_HANDLER_SLAVE(rgblight_handlers) | ||
427 | # define TRANSACTIONS_RGBLIGHT_REGISTRATIONS [PUT_RGBLIGHT] = trans_initiator2target_initializer(rgblight_sync), | ||
428 | |||
429 | #else // defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
430 | |||
431 | # define TRANSACTIONS_RGBLIGHT_MASTER() | ||
432 | # define TRANSACTIONS_RGBLIGHT_SLAVE() | ||
433 | # define TRANSACTIONS_RGBLIGHT_REGISTRATIONS | ||
434 | |||
435 | #endif // defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
436 | |||
437 | //////////////////////////////////////////////////// | ||
438 | // LED Matrix | ||
439 | |||
440 | #if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
441 | |||
442 | static bool led_matrix_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
443 | static uint32_t last_update = 0; | ||
444 | led_matrix_sync_t led_matrix_sync; | ||
445 | memcpy(&led_matrix_sync.led_matrix, &led_matrix_eeconfig, sizeof(led_eeconfig_t)); | ||
446 | led_matrix_sync.led_suspend_state = led_matrix_get_suspend_state(); | ||
447 | return send_if_data_mismatch(PUT_LED_MATRIX, &last_update, &led_matrix_sync, &split_shmem->led_matrix_sync, sizeof(led_matrix_sync)); | ||
448 | } | ||
449 | |||
450 | static void led_matrix_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
451 | memcpy(&led_matrix_eeconfig, &split_shmem->led_matrix_sync.led_matrix, sizeof(led_eeconfig_t)); | ||
452 | led_matrix_set_suspend_state(split_shmem->led_matrix_sync.led_suspend_state); | ||
453 | } | ||
454 | |||
455 | # define TRANSACTIONS_LED_MATRIX_MASTER() TRANSACTION_HANDLER_MASTER(led_matrix_handlers) | ||
456 | # define TRANSACTIONS_LED_MATRIX_SLAVE() TRANSACTION_HANDLER_SLAVE(led_matrix_handlers) | ||
457 | # define TRANSACTIONS_LED_MATRIX_REGISTRATIONS [PUT_LED_MATRIX] = trans_initiator2target_initializer(led_matrix_sync), | ||
458 | |||
459 | #else // defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
460 | |||
461 | # define TRANSACTIONS_LED_MATRIX_MASTER() | ||
462 | # define TRANSACTIONS_LED_MATRIX_SLAVE() | ||
463 | # define TRANSACTIONS_LED_MATRIX_REGISTRATIONS | ||
464 | |||
465 | #endif // defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
466 | |||
467 | //////////////////////////////////////////////////// | ||
468 | // RGB Matrix | ||
469 | |||
470 | #if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
471 | |||
472 | static bool rgb_matrix_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
473 | static uint32_t last_update = 0; | ||
474 | rgb_matrix_sync_t rgb_matrix_sync; | ||
475 | memcpy(&rgb_matrix_sync.rgb_matrix, &rgb_matrix_config, sizeof(rgb_config_t)); | ||
476 | rgb_matrix_sync.rgb_suspend_state = rgb_matrix_get_suspend_state(); | ||
477 | return send_if_data_mismatch(PUT_RGB_MATRIX, &last_update, &rgb_matrix_sync, &split_shmem->rgb_matrix_sync, sizeof(rgb_matrix_sync)); | ||
478 | } | ||
479 | |||
480 | static void rgb_matrix_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
481 | memcpy(&rgb_matrix_config, &split_shmem->rgb_matrix_sync.rgb_matrix, sizeof(rgb_config_t)); | ||
482 | rgb_matrix_set_suspend_state(split_shmem->rgb_matrix_sync.rgb_suspend_state); | ||
483 | } | ||
484 | |||
485 | # define TRANSACTIONS_RGB_MATRIX_MASTER() TRANSACTION_HANDLER_MASTER(rgb_matrix_handlers) | ||
486 | # define TRANSACTIONS_RGB_MATRIX_SLAVE() TRANSACTION_HANDLER_SLAVE(rgb_matrix_handlers) | ||
487 | # define TRANSACTIONS_RGB_MATRIX_REGISTRATIONS [PUT_RGB_MATRIX] = trans_initiator2target_initializer(rgb_matrix_sync), | ||
488 | |||
489 | #else // defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
490 | |||
491 | # define TRANSACTIONS_RGB_MATRIX_MASTER() | ||
492 | # define TRANSACTIONS_RGB_MATRIX_SLAVE() | ||
493 | # define TRANSACTIONS_RGB_MATRIX_REGISTRATIONS | ||
494 | |||
495 | #endif // defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
496 | |||
497 | //////////////////////////////////////////////////// | ||
498 | // WPM | ||
499 | |||
500 | #if defined(WPM_ENABLE) && defined(SPLIT_WPM_ENABLE) | ||
501 | |||
502 | static bool wpm_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
503 | static uint32_t last_update = 0; | ||
504 | uint8_t current_wpm = get_current_wpm(); | ||
505 | return send_if_condition(PUT_WPM, &last_update, (current_wpm != split_shmem->current_wpm), ¤t_wpm, sizeof(current_wpm)); | ||
506 | } | ||
507 | |||
508 | static void wpm_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { set_current_wpm(split_shmem->current_wpm); } | ||
509 | |||
510 | # define TRANSACTIONS_WPM_MASTER() TRANSACTION_HANDLER_MASTER(wpm_handlers) | ||
511 | # define TRANSACTIONS_WPM_SLAVE() TRANSACTION_HANDLER_SLAVE(wpm_handlers) | ||
512 | # define TRANSACTIONS_WPM_REGISTRATIONS [PUT_WPM] = trans_initiator2target_initializer(current_wpm), | ||
513 | |||
514 | #else // defined(WPM_ENABLE) && defined(SPLIT_WPM_ENABLE) | ||
515 | |||
516 | # define TRANSACTIONS_WPM_MASTER() | ||
517 | # define TRANSACTIONS_WPM_SLAVE() | ||
518 | # define TRANSACTIONS_WPM_REGISTRATIONS | ||
519 | |||
520 | #endif // defined(WPM_ENABLE) && defined(SPLIT_WPM_ENABLE) | ||
521 | |||
522 | //////////////////////////////////////////////////// | ||
523 | |||
524 | uint8_t dummy; | ||
525 | split_transaction_desc_t split_transaction_table[NUM_TOTAL_TRANSACTIONS] = { | ||
526 | // Set defaults | ||
527 | [0 ...(NUM_TOTAL_TRANSACTIONS - 1)] = {NULL, 0, 0, 0, 0, 0}, | ||
528 | |||
529 | #ifdef USE_I2C | ||
530 | [I2C_EXECUTE_CALLBACK] = trans_initiator2target_initializer(transaction_id), | ||
531 | #endif // USE_I2C | ||
532 | |||
533 | // clang-format off | ||
534 | TRANSACTIONS_SLAVE_MATRIX_REGISTRATIONS | ||
535 | TRANSACTIONS_MASTER_MATRIX_REGISTRATIONS | ||
536 | TRANSACTIONS_ENCODERS_REGISTRATIONS | ||
537 | TRANSACTIONS_SYNC_TIMER_REGISTRATIONS | ||
538 | TRANSACTIONS_LAYER_STATE_REGISTRATIONS | ||
539 | TRANSACTIONS_LED_STATE_REGISTRATIONS | ||
540 | TRANSACTIONS_MODS_REGISTRATIONS | ||
541 | TRANSACTIONS_BACKLIGHT_REGISTRATIONS | ||
542 | TRANSACTIONS_RGBLIGHT_REGISTRATIONS | ||
543 | TRANSACTIONS_LED_MATRIX_REGISTRATIONS | ||
544 | TRANSACTIONS_RGB_MATRIX_REGISTRATIONS | ||
545 | TRANSACTIONS_WPM_REGISTRATIONS | ||
546 | // clang-format on | ||
547 | |||
548 | #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) | ||
549 | [PUT_RPC_INFO] = trans_initiator2target_initializer_cb(rpc_info, slave_rpc_info_callback), | ||
550 | [PUT_RPC_REQ_DATA] = trans_initiator2target_initializer(rpc_m2s_buffer), | ||
551 | [EXECUTE_RPC] = trans_initiator2target_initializer_cb(rpc_info.transaction_id, slave_rpc_exec_callback), | ||
552 | [GET_RPC_RESP_DATA] = trans_target2initiator_initializer(rpc_s2m_buffer), | ||
553 | #endif // defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) | ||
554 | }; | ||
555 | |||
556 | bool transactions_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
557 | bool okay = true; | ||
558 | TRANSACTIONS_SLAVE_MATRIX_MASTER(); | ||
559 | TRANSACTIONS_MASTER_MATRIX_MASTER(); | ||
560 | TRANSACTIONS_ENCODERS_MASTER(); | ||
561 | TRANSACTIONS_SYNC_TIMER_MASTER(); | ||
562 | TRANSACTIONS_LAYER_STATE_MASTER(); | ||
563 | TRANSACTIONS_LED_STATE_MASTER(); | ||
564 | TRANSACTIONS_MODS_MASTER(); | ||
565 | TRANSACTIONS_BACKLIGHT_MASTER(); | ||
566 | TRANSACTIONS_RGBLIGHT_MASTER(); | ||
567 | TRANSACTIONS_LED_MATRIX_MASTER(); | ||
568 | TRANSACTIONS_RGB_MATRIX_MASTER(); | ||
569 | TRANSACTIONS_WPM_MASTER(); | ||
570 | return okay; | ||
571 | } | ||
572 | |||
573 | void transactions_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
574 | TRANSACTIONS_SLAVE_MATRIX_SLAVE(); | ||
575 | TRANSACTIONS_MASTER_MATRIX_SLAVE(); | ||
576 | TRANSACTIONS_ENCODERS_SLAVE(); | ||
577 | TRANSACTIONS_SYNC_TIMER_SLAVE(); | ||
578 | TRANSACTIONS_LAYER_STATE_SLAVE(); | ||
579 | TRANSACTIONS_LED_STATE_SLAVE(); | ||
580 | TRANSACTIONS_MODS_SLAVE(); | ||
581 | TRANSACTIONS_BACKLIGHT_SLAVE(); | ||
582 | TRANSACTIONS_RGBLIGHT_SLAVE(); | ||
583 | TRANSACTIONS_LED_MATRIX_SLAVE(); | ||
584 | TRANSACTIONS_RGB_MATRIX_SLAVE(); | ||
585 | TRANSACTIONS_WPM_SLAVE(); | ||
586 | } | ||
587 | |||
588 | #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) | ||
589 | |||
590 | void transaction_register_rpc(int8_t transaction_id, slave_callback_t callback) { | ||
591 | // Prevent invoking RPC on QMK core sync data | ||
592 | if (transaction_id <= GET_RPC_RESP_DATA) return; | ||
593 | |||
594 | // Set the callback | ||
595 | split_transaction_table[transaction_id].slave_callback = callback; | ||
596 | split_transaction_table[transaction_id].initiator2target_offset = offsetof(split_shared_memory_t, rpc_m2s_buffer); | ||
597 | split_transaction_table[transaction_id].target2initiator_offset = offsetof(split_shared_memory_t, rpc_s2m_buffer); | ||
598 | } | ||
599 | |||
600 | bool transaction_rpc_exec(int8_t transaction_id, uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer) { | ||
601 | // Prevent invoking RPC on QMK core sync data | ||
602 | if (transaction_id <= GET_RPC_RESP_DATA) return false; | ||
603 | // Prevent sizing issues | ||
604 | if (initiator2target_buffer_size > RPC_M2S_BUFFER_SIZE) return false; | ||
605 | if (target2initiator_buffer_size > RPC_S2M_BUFFER_SIZE) return false; | ||
606 | |||
607 | // Prepare the metadata block | ||
608 | rpc_sync_info_t info = {.transaction_id = transaction_id, .m2s_length = initiator2target_buffer_size, .s2m_length = target2initiator_buffer_size}; | ||
609 | |||
610 | // Make sure the local side knows that we're not sending the full block of data | ||
611 | split_transaction_table[PUT_RPC_REQ_DATA].initiator2target_buffer_size = initiator2target_buffer_size; | ||
612 | split_transaction_table[GET_RPC_RESP_DATA].target2initiator_buffer_size = target2initiator_buffer_size; | ||
613 | |||
614 | // Run through the sequence: | ||
615 | // * set the transaction ID and lengths | ||
616 | // * send the request data | ||
617 | // * execute RPC callback | ||
618 | // * retrieve the response data | ||
619 | if (!transport_write(PUT_RPC_INFO, &info, sizeof(info))) { | ||
620 | return false; | ||
621 | } | ||
622 | if (!transport_write(PUT_RPC_REQ_DATA, initiator2target_buffer, initiator2target_buffer_size)) { | ||
623 | return false; | ||
624 | } | ||
625 | if (!transport_write(EXECUTE_RPC, &transaction_id, sizeof(transaction_id))) { | ||
626 | return false; | ||
627 | } | ||
628 | if (!transport_read(GET_RPC_RESP_DATA, target2initiator_buffer, target2initiator_buffer_size)) { | ||
629 | return false; | ||
630 | } | ||
631 | return true; | ||
632 | } | ||
633 | |||
634 | void slave_rpc_info_callback(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer) { | ||
635 | // The RPC info block contains the intended transaction ID, as well as the sizes for both inbound and outbound data. | ||
636 | // Ignore the args -- the `split_shmem` already has the info, we just need to act upon it. | ||
637 | // We must keep the `split_transaction_table` non-const, so that it is able to be modified at runtime. | ||
638 | |||
639 | split_transaction_table[PUT_RPC_REQ_DATA].initiator2target_buffer_size = split_shmem->rpc_info.m2s_length; | ||
640 | split_transaction_table[GET_RPC_RESP_DATA].target2initiator_buffer_size = split_shmem->rpc_info.s2m_length; | ||
641 | } | ||
642 | |||
643 | void slave_rpc_exec_callback(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer) { | ||
644 | // We can assume that the buffer lengths are correctly set, now, given that sequentially the rpc_info callback was already executed. | ||
645 | // Go through the rpc_info and execute _that_ transaction's callback, with the scratch buffers as inputs. | ||
646 | int8_t transaction_id = split_shmem->rpc_info.transaction_id; | ||
647 | if (transaction_id < NUM_TOTAL_TRANSACTIONS) { | ||
648 | split_transaction_desc_t *trans = &split_transaction_table[transaction_id]; | ||
649 | if (trans->slave_callback) { | ||
650 | trans->slave_callback(split_shmem->rpc_info.m2s_length, split_shmem->rpc_m2s_buffer, split_shmem->rpc_info.s2m_length, split_shmem->rpc_s2m_buffer); | ||
651 | } | ||
652 | } | ||
653 | } | ||
654 | |||
655 | #endif // defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) | ||
diff --git a/quantum/split_common/transactions.h b/quantum/split_common/transactions.h new file mode 100644 index 000000000..4306ba1d8 --- /dev/null +++ b/quantum/split_common/transactions.h | |||
@@ -0,0 +1,54 @@ | |||
1 | /* Copyright 2021 QMK | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #pragma once | ||
18 | |||
19 | #include "stdint.h" | ||
20 | #include "stdbool.h" | ||
21 | |||
22 | #include "matrix.h" | ||
23 | #include "transaction_id_define.h" | ||
24 | #include "transport.h" | ||
25 | |||
26 | typedef void (*slave_callback_t)(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer); | ||
27 | |||
28 | // Split transaction Descriptor | ||
29 | typedef struct _split_transaction_desc_t { | ||
30 | uint8_t * status; | ||
31 | uint8_t initiator2target_buffer_size; | ||
32 | uint16_t initiator2target_offset; | ||
33 | uint8_t target2initiator_buffer_size; | ||
34 | uint16_t target2initiator_offset; | ||
35 | slave_callback_t slave_callback; | ||
36 | } split_transaction_desc_t; | ||
37 | |||
38 | // Forward declaration for the split transactions | ||
39 | extern split_transaction_desc_t split_transaction_table[NUM_TOTAL_TRANSACTIONS]; | ||
40 | |||
41 | #define split_shmem_offset_ptr(offset) ((void *)(((uint8_t *)split_shmem) + (offset))) | ||
42 | #define split_trans_initiator2target_buffer(trans) (split_shmem_offset_ptr((trans)->initiator2target_offset)) | ||
43 | #define split_trans_target2initiator_buffer(trans) (split_shmem_offset_ptr((trans)->target2initiator_offset)) | ||
44 | |||
45 | // returns false if valid data not received from slave | ||
46 | bool transactions_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]); | ||
47 | void transactions_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]); | ||
48 | |||
49 | void transaction_register_rpc(int8_t transaction_id, slave_callback_t callback); | ||
50 | |||
51 | bool transaction_rpc_exec(int8_t transaction_id, uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer); | ||
52 | |||
53 | #define transaction_rpc_send(transaction_id, initiator2target_buffer_size, initiator2target_buffer) transaction_rpc_exec(transaction_id, initiator2target_buffer_size, initiator2target_buffer, 0, NULL) | ||
54 | #define transaction_rpc_recv(transaction_id, target2initiator_buffer_size, target2initiator_buffer) transaction_rpc_exec(transaction_id, 0, NULL, target2initiator_buffer_size, target2initiator_buffer) | ||
diff --git a/quantum/split_common/transport.c b/quantum/split_common/transport.c index 9ed0f7591..a711ef85f 100644 --- a/quantum/split_common/transport.c +++ b/quantum/split_common/transport.c | |||
@@ -1,452 +1,118 @@ | |||
1 | #include <string.h> | 1 | /* Copyright 2021 QMK |
2 | #include <stddef.h> | 2 | * |
3 | 3 | * This program is free software: you can redistribute it and/or modify | |
4 | #include "config.h" | 4 | * it under the terms of the GNU General Public License as published by |
5 | #include "matrix.h" | 5 | * the Free Software Foundation, either version 2 of the License, or |
6 | #include "quantum.h" | 6 | * (at your option) any later version. |
7 | 7 | * | |
8 | #define ROWS_PER_HAND (MATRIX_ROWS / 2) | 8 | * This program is distributed in the hope that it will be useful, |
9 | #define SYNC_TIMER_OFFSET 2 | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
10 | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | #ifdef RGBLIGHT_ENABLE | 11 | * GNU General Public License for more details. |
12 | # include "rgblight.h" | 12 | * |
13 | #endif | 13 | * You should have received a copy of the GNU General Public License |
14 | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
15 | #ifdef BACKLIGHT_ENABLE | 15 | */ |
16 | # include "backlight.h" | ||
17 | #endif | ||
18 | |||
19 | #ifdef ENCODER_ENABLE | ||
20 | # include "encoder.h" | ||
21 | static pin_t encoders_pad[] = ENCODERS_PAD_A; | ||
22 | # define NUMBER_OF_ENCODERS (sizeof(encoders_pad) / sizeof(pin_t)) | ||
23 | #endif | ||
24 | |||
25 | #if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
26 | # include "led_matrix.h" | ||
27 | #endif | ||
28 | #if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
29 | # include "rgb_matrix.h" | ||
30 | #endif | ||
31 | |||
32 | #if defined(USE_I2C) | ||
33 | 16 | ||
34 | # include "i2c_master.h" | 17 | #include <string.h> |
35 | # include "i2c_slave.h" | 18 | #include <debug.h> |
36 | |||
37 | typedef struct _I2C_slave_buffer_t { | ||
38 | # ifndef DISABLE_SYNC_TIMER | ||
39 | uint32_t sync_timer; | ||
40 | # endif | ||
41 | # ifdef SPLIT_TRANSPORT_MIRROR | ||
42 | matrix_row_t mmatrix[ROWS_PER_HAND]; | ||
43 | # endif | ||
44 | matrix_row_t smatrix[ROWS_PER_HAND]; | ||
45 | # ifdef SPLIT_MODS_ENABLE | ||
46 | uint8_t real_mods; | ||
47 | uint8_t weak_mods; | ||
48 | # ifndef NO_ACTION_ONESHOT | ||
49 | uint8_t oneshot_mods; | ||
50 | # endif | ||
51 | # endif | ||
52 | # ifdef BACKLIGHT_ENABLE | ||
53 | uint8_t backlight_level; | ||
54 | # endif | ||
55 | # if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
56 | rgblight_syncinfo_t rgblight_sync; | ||
57 | # endif | ||
58 | # ifdef ENCODER_ENABLE | ||
59 | uint8_t encoder_state[NUMBER_OF_ENCODERS]; | ||
60 | # endif | ||
61 | # ifdef WPM_ENABLE | ||
62 | uint8_t current_wpm; | ||
63 | # endif | ||
64 | # if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
65 | led_eeconfig_t led_matrix; | ||
66 | bool led_suspend_state; | ||
67 | # endif | ||
68 | # if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
69 | rgb_config_t rgb_matrix; | ||
70 | bool rgb_suspend_state; | ||
71 | # endif | ||
72 | } I2C_slave_buffer_t; | ||
73 | 19 | ||
74 | static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_reg; | 20 | #include "transactions.h" |
21 | #include "transport.h" | ||
22 | #include "transaction_id_define.h" | ||
23 | #include "atomic_util.h" | ||
75 | 24 | ||
76 | # define I2C_SYNC_TIME_START offsetof(I2C_slave_buffer_t, sync_timer) | 25 | #ifdef USE_I2C |
77 | # define I2C_KEYMAP_MASTER_START offsetof(I2C_slave_buffer_t, mmatrix) | ||
78 | # define I2C_KEYMAP_SLAVE_START offsetof(I2C_slave_buffer_t, smatrix) | ||
79 | # define I2C_REAL_MODS_START offsetof(I2C_slave_buffer_t, real_mods) | ||
80 | # define I2C_WEAK_MODS_START offsetof(I2C_slave_buffer_t, weak_mods) | ||
81 | # define I2C_ONESHOT_MODS_START offsetof(I2C_slave_buffer_t, oneshot_mods) | ||
82 | # define I2C_BACKLIGHT_START offsetof(I2C_slave_buffer_t, backlight_level) | ||
83 | # define I2C_RGB_START offsetof(I2C_slave_buffer_t, rgblight_sync) | ||
84 | # define I2C_ENCODER_START offsetof(I2C_slave_buffer_t, encoder_state) | ||
85 | # define I2C_WPM_START offsetof(I2C_slave_buffer_t, current_wpm) | ||
86 | # define I2C_LED_MATRIX_START offsetof(I2C_slave_buffer_t, led_matrix) | ||
87 | # define I2C_LED_SUSPEND_START offsetof(I2C_slave_buffer_t, led_suspend_state) | ||
88 | # define I2C_RGB_MATRIX_START offsetof(I2C_slave_buffer_t, rgb_matrix) | ||
89 | # define I2C_RGB_SUSPEND_START offsetof(I2C_slave_buffer_t, rgb_suspend_state) | ||
90 | 26 | ||
91 | # define TIMEOUT 100 | 27 | # ifndef SLAVE_I2C_TIMEOUT |
28 | # define SLAVE_I2C_TIMEOUT 100 | ||
29 | # endif // SLAVE_I2C_TIMEOUT | ||
92 | 30 | ||
93 | # ifndef SLAVE_I2C_ADDRESS | 31 | # ifndef SLAVE_I2C_ADDRESS |
94 | # define SLAVE_I2C_ADDRESS 0x32 | 32 | # define SLAVE_I2C_ADDRESS 0x32 |
95 | # endif | 33 | # endif |
96 | 34 | ||
97 | // Get rows from other half over i2c | 35 | # include "i2c_master.h" |
98 | bool transport_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | 36 | # include "i2c_slave.h" |
99 | i2c_readReg(SLAVE_I2C_ADDRESS, I2C_KEYMAP_SLAVE_START, (void *)slave_matrix, sizeof(i2c_buffer->smatrix), TIMEOUT); | ||
100 | # ifdef SPLIT_TRANSPORT_MIRROR | ||
101 | i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_KEYMAP_MASTER_START, (void *)master_matrix, sizeof(i2c_buffer->mmatrix), TIMEOUT); | ||
102 | # endif | ||
103 | 37 | ||
104 | // write backlight info | 38 | // Ensure the I2C buffer has enough space |
105 | # ifdef BACKLIGHT_ENABLE | 39 | _Static_assert(sizeof(split_shared_memory_t) <= I2C_SLAVE_REG_COUNT, "split_shared_memory_t too large for I2C_SLAVE_REG_COUNT"); |
106 | uint8_t level = is_backlight_enabled() ? get_backlight_level() : 0; | ||
107 | if (level != i2c_buffer->backlight_level) { | ||
108 | if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_BACKLIGHT_START, (void *)&level, sizeof(level), TIMEOUT) >= 0) { | ||
109 | i2c_buffer->backlight_level = level; | ||
110 | } | ||
111 | } | ||
112 | # endif | ||
113 | 40 | ||
114 | # if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | 41 | split_shared_memory_t *const split_shmem = (split_shared_memory_t *)i2c_slave_reg; |
115 | if (rgblight_get_change_flags()) { | ||
116 | rgblight_syncinfo_t rgblight_sync; | ||
117 | rgblight_get_syncinfo(&rgblight_sync); | ||
118 | if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_START, (void *)&rgblight_sync, sizeof(rgblight_sync), TIMEOUT) >= 0) { | ||
119 | rgblight_clear_change_flags(); | ||
120 | } | ||
121 | } | ||
122 | # endif | ||
123 | 42 | ||
124 | # ifdef ENCODER_ENABLE | 43 | void transport_master_init(void) { i2c_init(); } |
125 | i2c_readReg(SLAVE_I2C_ADDRESS, I2C_ENCODER_START, (void *)i2c_buffer->encoder_state, sizeof(i2c_buffer->encoder_state), TIMEOUT); | 44 | void transport_slave_init(void) { i2c_slave_init(SLAVE_I2C_ADDRESS); } |
126 | encoder_update_raw(i2c_buffer->encoder_state); | ||
127 | # endif | ||
128 | 45 | ||
129 | # ifdef WPM_ENABLE | 46 | i2c_status_t transport_trigger_callback(int8_t id) { |
130 | uint8_t current_wpm = get_current_wpm(); | 47 | // If there's no callback, indicate that we were successful |
131 | if (current_wpm != i2c_buffer->current_wpm) { | 48 | if (!split_transaction_table[id].slave_callback) { |
132 | if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_WPM_START, (void *)¤t_wpm, sizeof(current_wpm), TIMEOUT) >= 0) { | 49 | return I2C_STATUS_SUCCESS; |
133 | i2c_buffer->current_wpm = current_wpm; | ||
134 | } | ||
135 | } | 50 | } |
136 | # endif | ||
137 | 51 | ||
138 | # ifdef SPLIT_MODS_ENABLE | 52 | // Kick off the "callback executor", now that data has been written to the slave |
139 | uint8_t real_mods = get_mods(); | 53 | split_shmem->transaction_id = id; |
140 | if (real_mods != i2c_buffer->real_mods) { | 54 | split_transaction_desc_t *trans = &split_transaction_table[I2C_EXECUTE_CALLBACK]; |
141 | if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_REAL_MODS_START, (void *)&real_mods, sizeof(real_mods), TIMEOUT) >= 0) { | 55 | return i2c_writeReg(SLAVE_I2C_ADDRESS, trans->initiator2target_offset, split_trans_initiator2target_buffer(trans), trans->initiator2target_buffer_size, SLAVE_I2C_TIMEOUT); |
142 | i2c_buffer->real_mods = real_mods; | 56 | } |
57 | |||
58 | bool transport_execute_transaction(int8_t id, const void *initiator2target_buf, uint16_t initiator2target_length, void *target2initiator_buf, uint16_t target2initiator_length) { | ||
59 | i2c_status_t status; | ||
60 | split_transaction_desc_t *trans = &split_transaction_table[id]; | ||
61 | if (initiator2target_length > 0) { | ||
62 | size_t len = trans->initiator2target_buffer_size < initiator2target_length ? trans->initiator2target_buffer_size : initiator2target_length; | ||
63 | memcpy(split_trans_initiator2target_buffer(trans), initiator2target_buf, len); | ||
64 | if ((status = i2c_writeReg(SLAVE_I2C_ADDRESS, trans->initiator2target_offset, split_trans_initiator2target_buffer(trans), len, SLAVE_I2C_TIMEOUT)) < 0) { | ||
65 | return false; | ||
143 | } | 66 | } |
144 | } | 67 | } |
145 | 68 | ||
146 | uint8_t weak_mods = get_weak_mods(); | 69 | // If we need to execute a callback on the slave, do so |
147 | if (weak_mods != i2c_buffer->weak_mods) { | 70 | if ((status = transport_trigger_callback(id)) < 0) { |
148 | if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_WEAK_MODS_START, (void *)&weak_mods, sizeof(weak_mods), TIMEOUT) >= 0) { | 71 | return false; |
149 | i2c_buffer->weak_mods = weak_mods; | ||
150 | } | ||
151 | } | 72 | } |
152 | 73 | ||
153 | # ifndef NO_ACTION_ONESHOT | 74 | if (target2initiator_length > 0) { |
154 | uint8_t oneshot_mods = get_oneshot_mods(); | 75 | size_t len = trans->target2initiator_buffer_size < target2initiator_length ? trans->target2initiator_buffer_size : target2initiator_length; |
155 | if (oneshot_mods != i2c_buffer->oneshot_mods) { | 76 | if ((status = i2c_readReg(SLAVE_I2C_ADDRESS, trans->target2initiator_offset, split_trans_target2initiator_buffer(trans), len, SLAVE_I2C_TIMEOUT)) < 0) { |
156 | if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_ONESHOT_MODS_START, (void *)&oneshot_mods, sizeof(oneshot_mods), TIMEOUT) >= 0) { | 77 | return false; |
157 | i2c_buffer->oneshot_mods = oneshot_mods; | ||
158 | } | 78 | } |
79 | memcpy(target2initiator_buf, split_trans_target2initiator_buffer(trans), len); | ||
159 | } | 80 | } |
160 | # endif | ||
161 | # endif | ||
162 | 81 | ||
163 | # if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
164 | i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_LED_MATRIX_START, (void *)led_matrix_eeconfig, sizeof(i2c_buffer->led_matrix), TIMEOUT); | ||
165 | bool suspend_state = led_matrix_get_suspend_state(); | ||
166 | i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_LED_SUSPEND_START, (void *)suspend_state, sizeof(i2c_buffer->led_suspend_state), TIMEOUT); | ||
167 | # endif | ||
168 | # if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
169 | i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_MATRIX_START, (void *)rgb_matrix_config, sizeof(i2c_buffer->rgb_matrix), TIMEOUT); | ||
170 | bool suspend_state = rgb_matrix_get_suspend_state(); | ||
171 | i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_SUSPEND_START, (void *)suspend_state, sizeof(i2c_buffer->rgb_suspend_state), TIMEOUT); | ||
172 | # endif | ||
173 | |||
174 | # ifndef DISABLE_SYNC_TIMER | ||
175 | i2c_buffer->sync_timer = sync_timer_read32() + SYNC_TIMER_OFFSET; | ||
176 | i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_SYNC_TIME_START, (void *)&i2c_buffer->sync_timer, sizeof(i2c_buffer->sync_timer), TIMEOUT); | ||
177 | # endif | ||
178 | return true; | 82 | return true; |
179 | } | 83 | } |
180 | 84 | ||
181 | void transport_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | 85 | #else // USE_I2C |
182 | # ifndef DISABLE_SYNC_TIMER | ||
183 | sync_timer_update(i2c_buffer->sync_timer); | ||
184 | # endif | ||
185 | // Copy matrix to I2C buffer | ||
186 | memcpy((void *)i2c_buffer->smatrix, (void *)slave_matrix, sizeof(i2c_buffer->smatrix)); | ||
187 | # ifdef SPLIT_TRANSPORT_MIRROR | ||
188 | memcpy((void *)master_matrix, (void *)i2c_buffer->mmatrix, sizeof(i2c_buffer->mmatrix)); | ||
189 | # endif | ||
190 | |||
191 | // Read Backlight Info | ||
192 | # ifdef BACKLIGHT_ENABLE | ||
193 | backlight_set(i2c_buffer->backlight_level); | ||
194 | # endif | ||
195 | |||
196 | # if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
197 | // Update the RGB with the new data | ||
198 | if (i2c_buffer->rgblight_sync.status.change_flags != 0) { | ||
199 | rgblight_update_sync(&i2c_buffer->rgblight_sync, false); | ||
200 | i2c_buffer->rgblight_sync.status.change_flags = 0; | ||
201 | } | ||
202 | # endif | ||
203 | |||
204 | # ifdef ENCODER_ENABLE | ||
205 | encoder_state_raw(i2c_buffer->encoder_state); | ||
206 | # endif | ||
207 | |||
208 | # ifdef WPM_ENABLE | ||
209 | set_current_wpm(i2c_buffer->current_wpm); | ||
210 | # endif | ||
211 | |||
212 | # ifdef SPLIT_MODS_ENABLE | ||
213 | set_mods(i2c_buffer->real_mods); | ||
214 | set_weak_mods(i2c_buffer->weak_mods); | ||
215 | # ifndef NO_ACTION_ONESHOT | ||
216 | set_oneshot_mods(i2c_buffer->oneshot_mods); | ||
217 | # endif | ||
218 | # endif | ||
219 | |||
220 | # if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
221 | memcpy((void *)i2c_buffer->led_matrix, (void *)led_matrix_eeconfig, sizeof(i2c_buffer->led_matrix)); | ||
222 | led_matrix_set_suspend_state(i2c_buffer->led_suspend_state); | ||
223 | # endif | ||
224 | # if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
225 | memcpy((void *)i2c_buffer->rgb_matrix, (void *)rgb_matrix_config, sizeof(i2c_buffer->rgb_matrix)); | ||
226 | rgb_matrix_set_suspend_state(i2c_buffer->rgb_suspend_state); | ||
227 | # endif | ||
228 | } | ||
229 | |||
230 | void transport_master_init(void) { i2c_init(); } | ||
231 | |||
232 | void transport_slave_init(void) { i2c_slave_init(SLAVE_I2C_ADDRESS); } | ||
233 | |||
234 | #else // USE_SERIAL | ||
235 | 86 | ||
236 | # include "serial.h" | 87 | # include "serial.h" |
237 | 88 | ||
238 | typedef struct _Serial_s2m_buffer_t { | 89 | static split_shared_memory_t shared_memory; |
239 | // TODO: if MATRIX_COLS > 8 change to uint8_t packed_matrix[] for pack/unpack | 90 | split_shared_memory_t *const split_shmem = &shared_memory; |
240 | matrix_row_t smatrix[ROWS_PER_HAND]; | ||
241 | |||
242 | # ifdef ENCODER_ENABLE | ||
243 | uint8_t encoder_state[NUMBER_OF_ENCODERS]; | ||
244 | # endif | ||
245 | |||
246 | } Serial_s2m_buffer_t; | ||
247 | |||
248 | typedef struct _Serial_m2s_buffer_t { | ||
249 | # ifdef SPLIT_MODS_ENABLE | ||
250 | uint8_t real_mods; | ||
251 | uint8_t weak_mods; | ||
252 | # ifndef NO_ACTION_ONESHOT | ||
253 | uint8_t oneshot_mods; | ||
254 | # endif | ||
255 | # endif | ||
256 | # ifndef DISABLE_SYNC_TIMER | ||
257 | uint32_t sync_timer; | ||
258 | # endif | ||
259 | # ifdef SPLIT_TRANSPORT_MIRROR | ||
260 | matrix_row_t mmatrix[ROWS_PER_HAND]; | ||
261 | # endif | ||
262 | # ifdef BACKLIGHT_ENABLE | ||
263 | uint8_t backlight_level; | ||
264 | # endif | ||
265 | # ifdef WPM_ENABLE | ||
266 | uint8_t current_wpm; | ||
267 | # endif | ||
268 | # if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
269 | led_eeconfig_t led_matrix; | ||
270 | bool led_suspend_state; | ||
271 | # endif | ||
272 | # if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
273 | rgb_config_t rgb_matrix; | ||
274 | bool rgb_suspend_state; | ||
275 | # endif | ||
276 | } Serial_m2s_buffer_t; | ||
277 | |||
278 | # if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
279 | // When MCUs on both sides drive their respective RGB LED chains, | ||
280 | // it is necessary to synchronize, so it is necessary to communicate RGB | ||
281 | // information. In that case, define RGBLIGHT_SPLIT with info on the number | ||
282 | // of LEDs on each half. | ||
283 | // | ||
284 | // Otherwise, if the master side MCU drives both sides RGB LED chains, | ||
285 | // there is no need to communicate. | ||
286 | |||
287 | typedef struct _Serial_rgblight_t { | ||
288 | rgblight_syncinfo_t rgblight_sync; | ||
289 | } Serial_rgblight_t; | ||
290 | 91 | ||
291 | volatile Serial_rgblight_t serial_rgblight = {}; | 92 | void transport_master_init(void) { soft_serial_initiator_init(); } |
292 | uint8_t volatile status_rgblight = 0; | 93 | void transport_slave_init(void) { soft_serial_target_init(); } |
293 | # endif | ||
294 | |||
295 | volatile Serial_s2m_buffer_t serial_s2m_buffer = {}; | ||
296 | volatile Serial_m2s_buffer_t serial_m2s_buffer = {}; | ||
297 | uint8_t volatile status0 = 0; | ||
298 | |||
299 | enum serial_transaction_id { | ||
300 | GET_SLAVE_MATRIX = 0, | ||
301 | # if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
302 | PUT_RGBLIGHT, | ||
303 | # endif | ||
304 | }; | ||
305 | |||
306 | SSTD_t transactions[] = { | ||
307 | [GET_SLAVE_MATRIX] = | ||
308 | { | ||
309 | (uint8_t *)&status0, | ||
310 | sizeof(serial_m2s_buffer), | ||
311 | (uint8_t *)&serial_m2s_buffer, | ||
312 | sizeof(serial_s2m_buffer), | ||
313 | (uint8_t *)&serial_s2m_buffer, | ||
314 | }, | ||
315 | # if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
316 | [PUT_RGBLIGHT] = | ||
317 | { | ||
318 | (uint8_t *)&status_rgblight, sizeof(serial_rgblight), (uint8_t *)&serial_rgblight, 0, NULL // no slave to master transfer | ||
319 | }, | ||
320 | # endif | ||
321 | }; | ||
322 | |||
323 | void transport_master_init(void) { soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } | ||
324 | |||
325 | void transport_slave_init(void) { soft_serial_target_init(transactions, TID_LIMIT(transactions)); } | ||
326 | 94 | ||
327 | # if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | 95 | bool transport_execute_transaction(int8_t id, const void *initiator2target_buf, uint16_t initiator2target_length, void *target2initiator_buf, uint16_t target2initiator_length) { |
328 | 96 | split_transaction_desc_t *trans = &split_transaction_table[id]; | |
329 | // rgblight synchronization information communication. | 97 | if (initiator2target_length > 0) { |
330 | 98 | size_t len = trans->initiator2target_buffer_size < initiator2target_length ? trans->initiator2target_buffer_size : initiator2target_length; | |
331 | void transport_rgblight_master(void) { | 99 | memcpy(split_trans_initiator2target_buffer(trans), initiator2target_buf, len); |
332 | if (rgblight_get_change_flags()) { | ||
333 | rgblight_get_syncinfo((rgblight_syncinfo_t *)&serial_rgblight.rgblight_sync); | ||
334 | if (soft_serial_transaction(PUT_RGBLIGHT) == TRANSACTION_END) { | ||
335 | rgblight_clear_change_flags(); | ||
336 | } | ||
337 | } | ||
338 | } | ||
339 | |||
340 | void transport_rgblight_slave(void) { | ||
341 | if (status_rgblight == TRANSACTION_ACCEPTED) { | ||
342 | rgblight_update_sync((rgblight_syncinfo_t *)&serial_rgblight.rgblight_sync, false); | ||
343 | status_rgblight = TRANSACTION_END; | ||
344 | } | 100 | } |
345 | } | ||
346 | 101 | ||
347 | # else | 102 | if (soft_serial_transaction(id) != TRANSACTION_END) { |
348 | # define transport_rgblight_master() | ||
349 | # define transport_rgblight_slave() | ||
350 | # endif | ||
351 | |||
352 | bool transport_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
353 | # ifndef SERIAL_USE_MULTI_TRANSACTION | ||
354 | if (soft_serial_transaction() != TRANSACTION_END) { | ||
355 | return false; | ||
356 | } | ||
357 | # else | ||
358 | transport_rgblight_master(); | ||
359 | if (soft_serial_transaction(GET_SLAVE_MATRIX) != TRANSACTION_END) { | ||
360 | return false; | 103 | return false; |
361 | } | 104 | } |
362 | # endif | ||
363 | 105 | ||
364 | // TODO: if MATRIX_COLS > 8 change to unpack() | 106 | if (target2initiator_length > 0) { |
365 | for (int i = 0; i < ROWS_PER_HAND; ++i) { | 107 | size_t len = trans->target2initiator_buffer_size < target2initiator_length ? trans->target2initiator_buffer_size : target2initiator_length; |
366 | slave_matrix[i] = serial_s2m_buffer.smatrix[i]; | 108 | memcpy(target2initiator_buf, split_trans_target2initiator_buffer(trans), len); |
367 | # ifdef SPLIT_TRANSPORT_MIRROR | ||
368 | serial_m2s_buffer.mmatrix[i] = master_matrix[i]; | ||
369 | # endif | ||
370 | } | 109 | } |
371 | 110 | ||
372 | # ifdef BACKLIGHT_ENABLE | ||
373 | // Write backlight level for slave to read | ||
374 | serial_m2s_buffer.backlight_level = is_backlight_enabled() ? get_backlight_level() : 0; | ||
375 | # endif | ||
376 | |||
377 | # ifdef ENCODER_ENABLE | ||
378 | encoder_update_raw((uint8_t *)serial_s2m_buffer.encoder_state); | ||
379 | # endif | ||
380 | |||
381 | # ifdef WPM_ENABLE | ||
382 | // Write wpm to slave | ||
383 | serial_m2s_buffer.current_wpm = get_current_wpm(); | ||
384 | # endif | ||
385 | |||
386 | # ifdef SPLIT_MODS_ENABLE | ||
387 | serial_m2s_buffer.real_mods = get_mods(); | ||
388 | serial_m2s_buffer.weak_mods = get_weak_mods(); | ||
389 | # ifndef NO_ACTION_ONESHOT | ||
390 | serial_m2s_buffer.oneshot_mods = get_oneshot_mods(); | ||
391 | # endif | ||
392 | # endif | ||
393 | |||
394 | # if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
395 | serial_m2s_buffer.led_matrix = led_matrix_eeconfig; | ||
396 | serial_m2s_buffer.led_suspend_state = led_matrix_get_suspend_state(); | ||
397 | # endif | ||
398 | # if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
399 | serial_m2s_buffer.rgb_matrix = rgb_matrix_config; | ||
400 | serial_m2s_buffer.rgb_suspend_state = rgb_matrix_get_suspend_state(); | ||
401 | # endif | ||
402 | |||
403 | # ifndef DISABLE_SYNC_TIMER | ||
404 | serial_m2s_buffer.sync_timer = sync_timer_read32() + SYNC_TIMER_OFFSET; | ||
405 | # endif | ||
406 | return true; | 111 | return true; |
407 | } | 112 | } |
408 | 113 | ||
409 | void transport_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | 114 | #endif // USE_I2C |
410 | transport_rgblight_slave(); | ||
411 | # ifndef DISABLE_SYNC_TIMER | ||
412 | sync_timer_update(serial_m2s_buffer.sync_timer); | ||
413 | # endif | ||
414 | |||
415 | // TODO: if MATRIX_COLS > 8 change to pack() | ||
416 | for (int i = 0; i < ROWS_PER_HAND; ++i) { | ||
417 | serial_s2m_buffer.smatrix[i] = slave_matrix[i]; | ||
418 | # ifdef SPLIT_TRANSPORT_MIRROR | ||
419 | master_matrix[i] = serial_m2s_buffer.mmatrix[i]; | ||
420 | # endif | ||
421 | } | ||
422 | # ifdef BACKLIGHT_ENABLE | ||
423 | backlight_set(serial_m2s_buffer.backlight_level); | ||
424 | # endif | ||
425 | |||
426 | # ifdef ENCODER_ENABLE | ||
427 | encoder_state_raw((uint8_t *)serial_s2m_buffer.encoder_state); | ||
428 | # endif | ||
429 | 115 | ||
430 | # ifdef WPM_ENABLE | 116 | bool transport_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { return transactions_master(master_matrix, slave_matrix); } |
431 | set_current_wpm(serial_m2s_buffer.current_wpm); | ||
432 | # endif | ||
433 | |||
434 | # ifdef SPLIT_MODS_ENABLE | ||
435 | set_mods(serial_m2s_buffer.real_mods); | ||
436 | set_weak_mods(serial_m2s_buffer.weak_mods); | ||
437 | # ifndef NO_ACTION_ONESHOT | ||
438 | set_oneshot_mods(serial_m2s_buffer.oneshot_mods); | ||
439 | # endif | ||
440 | # endif | ||
441 | |||
442 | # if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
443 | led_matrix_eeconfig = serial_m2s_buffer.led_matrix; | ||
444 | led_matrix_set_suspend_state(serial_m2s_buffer.led_suspend_state); | ||
445 | # endif | ||
446 | # if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
447 | rgb_matrix_config = serial_m2s_buffer.rgb_matrix; | ||
448 | rgb_matrix_set_suspend_state(serial_m2s_buffer.rgb_suspend_state); | ||
449 | # endif | ||
450 | } | ||
451 | 117 | ||
452 | #endif | 118 | void transport_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { transactions_slave(master_matrix, slave_matrix); } \ No newline at end of file |
diff --git a/quantum/split_common/transport.h b/quantum/split_common/transport.h index a9f66301b..2e07f6b25 100644 --- a/quantum/split_common/transport.h +++ b/quantum/split_common/transport.h | |||
@@ -1,10 +1,175 @@ | |||
1 | /* Copyright 2021 QMK | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
1 | #pragma once | 17 | #pragma once |
2 | 18 | ||
19 | #include "stdint.h" | ||
20 | #include "stdbool.h" | ||
21 | |||
22 | #include "progmem.h" | ||
23 | #include "action_layer.h" | ||
3 | #include "matrix.h" | 24 | #include "matrix.h" |
4 | 25 | ||
26 | #ifndef RPC_M2S_BUFFER_SIZE | ||
27 | # define RPC_M2S_BUFFER_SIZE 32 | ||
28 | #endif // RPC_M2S_BUFFER_SIZE | ||
29 | |||
30 | #ifndef RPC_S2M_BUFFER_SIZE | ||
31 | # define RPC_S2M_BUFFER_SIZE 32 | ||
32 | #endif // RPC_S2M_BUFFER_SIZE | ||
33 | |||
5 | void transport_master_init(void); | 34 | void transport_master_init(void); |
6 | void transport_slave_init(void); | 35 | void transport_slave_init(void); |
7 | 36 | ||
8 | // returns false if valid data not received from slave | 37 | // returns false if valid data not received from slave |
9 | bool transport_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]); | 38 | bool transport_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]); |
10 | void transport_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]); | 39 | void transport_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]); |
40 | |||
41 | bool transport_execute_transaction(int8_t id, const void *initiator2target_buf, uint16_t initiator2target_length, void *target2initiator_buf, uint16_t target2initiator_length); | ||
42 | |||
43 | #ifdef ENCODER_ENABLE | ||
44 | # include "encoder.h" | ||
45 | # define NUMBER_OF_ENCODERS (sizeof((pin_t[])ENCODERS_PAD_A) / sizeof(pin_t)) | ||
46 | #endif // ENCODER_ENABLE | ||
47 | |||
48 | #ifdef BACKLIGHT_ENABLE | ||
49 | # include "backlight.h" | ||
50 | #endif // BACKLIGHT_ENABLE | ||
51 | |||
52 | #ifdef RGBLIGHT_ENABLE | ||
53 | # include "rgblight.h" | ||
54 | #endif // RGBLIGHT_ENABLE | ||
55 | |||
56 | typedef struct _split_slave_matrix_sync_t { | ||
57 | uint8_t checksum; | ||
58 | matrix_row_t matrix[(MATRIX_ROWS) / 2]; | ||
59 | } split_slave_matrix_sync_t; | ||
60 | |||
61 | #ifdef SPLIT_TRANSPORT_MIRROR | ||
62 | typedef struct _split_master_matrix_sync_t { | ||
63 | matrix_row_t matrix[(MATRIX_ROWS) / 2]; | ||
64 | } split_master_matrix_sync_t; | ||
65 | #endif // SPLIT_TRANSPORT_MIRROR | ||
66 | |||
67 | #ifdef ENCODER_ENABLE | ||
68 | typedef struct _split_slave_encoder_sync_t { | ||
69 | uint8_t checksum; | ||
70 | uint8_t state[NUMBER_OF_ENCODERS]; | ||
71 | } split_slave_encoder_sync_t; | ||
72 | #endif // ENCODER_ENABLE | ||
73 | |||
74 | #if !defined(NO_ACTION_LAYER) && defined(SPLIT_LAYER_STATE_ENABLE) | ||
75 | typedef struct _split_layers_sync_t { | ||
76 | layer_state_t layer_state; | ||
77 | layer_state_t default_layer_state; | ||
78 | } split_layers_sync_t; | ||
79 | #endif // !defined(NO_ACTION_LAYER) && defined(SPLIT_LAYER_STATE_ENABLE) | ||
80 | |||
81 | #if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
82 | # include "led_matrix.h" | ||
83 | |||
84 | typedef struct _led_matrix_sync_t { | ||
85 | led_eeconfig_t led_matrix; | ||
86 | bool led_suspend_state; | ||
87 | } led_matrix_sync_t; | ||
88 | #endif // defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
89 | |||
90 | #if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
91 | # include "rgb_matrix.h" | ||
92 | |||
93 | typedef struct _rgb_matrix_sync_t { | ||
94 | rgb_config_t rgb_matrix; | ||
95 | bool rgb_suspend_state; | ||
96 | } rgb_matrix_sync_t; | ||
97 | #endif // defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
98 | |||
99 | #ifdef SPLIT_MODS_ENABLE | ||
100 | typedef struct _split_mods_sync_t { | ||
101 | uint8_t real_mods; | ||
102 | uint8_t weak_mods; | ||
103 | # ifndef NO_ACTION_ONESHOT | ||
104 | uint8_t oneshot_mods; | ||
105 | # endif // NO_ACTION_ONESHOT | ||
106 | } split_mods_sync_t; | ||
107 | #endif // SPLIT_MODS_ENABLE | ||
108 | |||
109 | #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) | ||
110 | typedef struct _rpc_sync_info_t { | ||
111 | int8_t transaction_id; | ||
112 | uint8_t m2s_length; | ||
113 | uint8_t s2m_length; | ||
114 | } rpc_sync_info_t; | ||
115 | #endif // defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) | ||
116 | |||
117 | typedef struct _split_shared_memory_t { | ||
118 | #ifdef USE_I2C | ||
119 | int8_t transaction_id; | ||
120 | #endif // USE_I2C | ||
121 | |||
122 | split_slave_matrix_sync_t smatrix; | ||
123 | |||
124 | #ifdef SPLIT_TRANSPORT_MIRROR | ||
125 | split_master_matrix_sync_t mmatrix; | ||
126 | #endif // SPLIT_TRANSPORT_MIRROR | ||
127 | |||
128 | #ifdef ENCODER_ENABLE | ||
129 | split_slave_encoder_sync_t encoders; | ||
130 | #endif // ENCODER_ENABLE | ||
131 | |||
132 | #ifndef DISABLE_SYNC_TIMER | ||
133 | uint32_t sync_timer; | ||
134 | #endif // DISABLE_SYNC_TIMER | ||
135 | |||
136 | #if !defined(NO_ACTION_LAYER) && defined(SPLIT_LAYER_STATE_ENABLE) | ||
137 | split_layers_sync_t layers; | ||
138 | #endif // !defined(NO_ACTION_LAYER) && defined(SPLIT_LAYER_STATE_ENABLE) | ||
139 | |||
140 | #ifdef SPLIT_LED_STATE_ENABLE | ||
141 | uint8_t led_state; | ||
142 | #endif // SPLIT_LED_STATE_ENABLE | ||
143 | |||
144 | #ifdef SPLIT_MODS_ENABLE | ||
145 | split_mods_sync_t mods; | ||
146 | #endif // SPLIT_MODS_ENABLE | ||
147 | |||
148 | #ifdef BACKLIGHT_ENABLE | ||
149 | uint8_t backlight_level; | ||
150 | #endif // BACKLIGHT_ENABLE | ||
151 | |||
152 | #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
153 | rgblight_syncinfo_t rgblight_sync; | ||
154 | #endif // defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
155 | |||
156 | #if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
157 | led_matrix_sync_t led_matrix_sync; | ||
158 | #endif // defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
159 | |||
160 | #if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
161 | rgb_matrix_sync_t rgb_matrix_sync; | ||
162 | #endif // defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
163 | |||
164 | #if defined(WPM_ENABLE) && defined(SPLIT_WPM_ENABLE) | ||
165 | uint8_t current_wpm; | ||
166 | #endif // defined(WPM_ENABLE) && defined(SPLIT_WPM_ENABLE) | ||
167 | |||
168 | #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) | ||
169 | rpc_sync_info_t rpc_info; | ||
170 | uint8_t rpc_m2s_buffer[RPC_M2S_BUFFER_SIZE]; | ||
171 | uint8_t rpc_s2m_buffer[RPC_S2M_BUFFER_SIZE]; | ||
172 | #endif // defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) | ||
173 | } split_shared_memory_t; | ||
174 | |||
175 | extern split_shared_memory_t *const split_shmem; \ No newline at end of file | ||