diff options
Diffstat (limited to 'users/spidey3/spidey3.c')
| -rw-r--r-- | users/spidey3/spidey3.c | 271 |
1 files changed, 229 insertions, 42 deletions
diff --git a/users/spidey3/spidey3.c b/users/spidey3/spidey3.c index 8be99dea0..9d696494f 100644 --- a/users/spidey3/spidey3.c +++ b/users/spidey3/spidey3.c | |||
| @@ -1,80 +1,267 @@ | |||
| 1 | #include QMK_KEYBOARD_H | 1 | #include QMK_KEYBOARD_H |
| 2 | 2 | ||
| 3 | #include "spidey3.h" | 3 | #include "spidey3.h" |
| 4 | #include "version.h" | ||
| 5 | #include <stdlib.h> | ||
| 4 | 6 | ||
| 5 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | 7 | static bool rand_seeded = false; |
| 6 | 8 | ||
| 7 | // If console is enabled, it will print the matrix position and status of each key pressed | 9 | uint16_t spi_replace_mode = SPI_NORMAL; |
| 8 | // dprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed); | 10 | bool spi_gflock = false; |
| 9 | 11 | ||
| 10 | if (record->event.pressed) { | 12 | #if defined(CONSOLE_ENABLE) && !defined(NO_DEBUG) |
| 11 | switch (keycode) { | 13 | static uint32_t matrix_scan_count = 0; |
| 12 | #ifndef NO_DEBUG | 14 | static bool reported_version = false; |
| 13 | // Re-implement this here, but fix the persistence! | 15 | |
| 14 | case DEBUG: | 16 | # if defined(SPI_DEBUG_SCAN_RATE) |
| 15 | debug_enable ^= 1; | 17 | static uint32_t matrix_timer = 0; |
| 16 | if (debug_enable) { | 18 | static uint32_t last_matrix_scan_count = 0; |
| 17 | print("DEBUG: enabled.\n"); | 19 | # endif |
| 18 | } else { | 20 | |
| 19 | print("DEBUG: disabled.\n"); | 21 | void matrix_scan_user(void) { |
| 22 | # if defined(SPI_DEBUG_SCAN_RATE) | ||
| 23 | matrix_scan_count++; | ||
| 24 | if (debug_enable) { | ||
| 25 | uint32_t timer_now = timer_read32(); | ||
| 26 | if (matrix_timer == 0) { | ||
| 27 | matrix_timer = timer_now; | ||
| 28 | last_matrix_scan_count = matrix_scan_count; | ||
| 29 | matrix_scan_count = 0; | ||
| 30 | } else if (TIMER_DIFF_32(timer_now, matrix_timer) > SPI_SCAN_RATE_INTERVAL * 1000) { | ||
| 31 | matrix_timer = timer_now; | ||
| 32 | last_matrix_scan_count = matrix_scan_count; | ||
| 33 | matrix_scan_count = 0; | ||
| 34 | if (!reported_version) { | ||
| 35 | uprintln(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE); | ||
| 36 | reported_version = true; | ||
| 37 | } | ||
| 38 | uprintf("scan rate: %lu/s\n", last_matrix_scan_count / SPI_SCAN_RATE_INTERVAL); | ||
| 39 | } | ||
| 40 | } | ||
| 41 | # else | ||
| 42 | if (!reported_version) { | ||
| 43 | matrix_scan_count++; | ||
| 44 | if (matrix_scan_count > 300) { | ||
| 45 | uprintln(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE); | ||
| 46 | reported_version = true; | ||
| 20 | } | 47 | } |
| 21 | eeconfig_update_debug(debug_config.raw); | 48 | } |
| 49 | # endif | ||
| 50 | } | ||
| 51 | #endif | ||
| 52 | |||
| 53 | bool process_record_glyph_replacement(uint16_t keycode, keyrecord_t *record, uint32_t baseAlphaLower, uint32_t baseAlphaUpper, uint32_t zeroGlyph, uint32_t baseNumberOne, uint32_t spaceGlyph) { | ||
| 54 | uint8_t temp_mod = get_mods(); | ||
| 55 | #ifndef NO_ACTION_ONESHOT | ||
| 56 | uint8_t temp_osm = get_oneshot_mods(); | ||
| 57 | #else | ||
| 58 | uint8_t temp_osm = 0; | ||
| 59 | #endif | ||
| 60 | if ((((temp_mod | temp_osm) & (MOD_MASK_CTRL | MOD_MASK_ALT | MOD_MASK_GUI))) == 0) { | ||
| 61 | switch (keycode) { | ||
| 62 | case KC_A ... KC_Z: | ||
| 63 | if (record->event.pressed) { | ||
| 64 | clear_mods(); | ||
| 65 | #ifndef NO_ACTION_ONESHOT | ||
| 66 | clear_oneshot_mods(); | ||
| 67 | #endif | ||
| 68 | |||
| 69 | unicode_input_start(); | ||
| 70 | uint32_t base = ((temp_mod | temp_osm) & MOD_MASK_SHIFT) ? baseAlphaUpper : baseAlphaLower; | ||
| 71 | register_hex32(base + (keycode - KC_A)); | ||
| 72 | unicode_input_finish(); | ||
| 73 | |||
| 74 | set_mods(temp_mod); | ||
| 75 | } | ||
| 76 | return false; | ||
| 77 | case KC_0: | ||
| 78 | if ((temp_mod | temp_osm) & MOD_MASK_SHIFT) { // skip shifted numbers, so that we can still use symbols etc. | ||
| 79 | return true; | ||
| 80 | } | ||
| 81 | if (record->event.pressed) { | ||
| 82 | unicode_input_start(); | ||
| 83 | register_hex32(zeroGlyph); | ||
| 84 | unicode_input_finish(); | ||
| 85 | } | ||
| 86 | return false; | ||
| 87 | case KC_1 ... KC_9: | ||
| 88 | if ((temp_mod | temp_osm) & MOD_MASK_SHIFT) { // skip shifted numbers, so that we can still use symbols etc. | ||
| 89 | return true; | ||
| 90 | } | ||
| 91 | if (record->event.pressed) { | ||
| 92 | unicode_input_start(); | ||
| 93 | register_hex32(baseNumberOne + (keycode - KC_1)); | ||
| 94 | unicode_input_finish(); | ||
| 95 | } | ||
| 96 | return false; | ||
| 97 | case KC_SPACE: | ||
| 98 | if (record->event.pressed) { | ||
| 99 | unicode_input_start(); | ||
| 100 | register_hex32(spaceGlyph); // em space | ||
| 101 | unicode_input_finish(); | ||
| 102 | } | ||
| 103 | return false; | ||
| 104 | } | ||
| 105 | } | ||
| 106 | |||
| 107 | return true; | ||
| 108 | } | ||
| 109 | |||
| 110 | bool process_gflock(uint16_t keycode, keyrecord_t *record) { | ||
| 111 | if (!spi_gflock) { | ||
| 112 | return true; | ||
| 113 | } | ||
| 114 | |||
| 115 | if (record->event.pressed) { | ||
| 116 | register_code16(G(keycode)); | ||
| 117 | } else { | ||
| 118 | unregister_code16(G(keycode)); | ||
| 119 | } | ||
| 120 | return false; | ||
| 121 | } | ||
| 122 | |||
| 123 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||
| 124 | if (!rand_seeded) { | ||
| 125 | srand(record->event.time % keycode); | ||
| 126 | rand_seeded = true; | ||
| 127 | } | ||
| 128 | |||
| 129 | if (record->event.pressed) { | ||
| 130 | switch (keycode) { | ||
| 131 | #ifndef NO_DEBUG | ||
| 132 | // Re-implement this here, but fix the persistence! | ||
| 133 | case DEBUG: | ||
| 134 | if (!debug_enable) { | ||
| 135 | debug_enable = 1; | ||
| 136 | # if defined(SPI_DEBUG_SCAN_RATE) | ||
| 137 | matrix_timer = 0; | ||
| 138 | reported_version = false; | ||
| 139 | # endif | ||
| 140 | } else if (!debug_keyboard) { | ||
| 141 | debug_keyboard = 1; | ||
| 142 | } else if (!debug_matrix) { | ||
| 143 | debug_matrix = 1; | ||
| 144 | } else { | ||
| 145 | debug_enable = 0; | ||
| 146 | debug_keyboard = 0; | ||
| 147 | debug_matrix = 0; | ||
| 148 | } | ||
| 149 | uprintf("DEBUG: enable=%u, keyboard=%u, matrix=%u\n", debug_enable, debug_keyboard, debug_matrix); | ||
| 150 | eeconfig_update_debug(debug_config.raw); | ||
| 151 | return false; | ||
| 22 | #endif | 152 | #endif |
| 23 | break; | 153 | |
| 24 | case SPI_LNX: | 154 | // clang-format off |
| 25 | dprint("SPI_LNX\n"); | 155 | |
| 26 | set_single_persistent_default_layer(_BASE); | 156 | case CH_CPNL: host_consumer_send(AL_CONTROL_PANEL); return false; |
| 27 | layer_off(_OSX); | 157 | case CH_ASST: host_consumer_send(AL_ASSISTANT); return false; |
| 158 | case CH_SUSP: tap_code16(LGUI(LSFT(KC_L))); return true; | ||
| 159 | |||
| 160 | // clang-format on | ||
| 161 | |||
| 162 | case SPI_LNX: | ||
| 163 | dprint("SPI_LNX\n"); | ||
| 164 | set_single_persistent_default_layer(_BASE); | ||
| 165 | layer_off(_OSX); | ||
| 28 | #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) | 166 | #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) |
| 29 | set_unicode_input_mode(UC_LNX); | 167 | set_unicode_input_mode(UC_LNX); |
| 30 | #endif | 168 | #endif |
| 31 | break; | 169 | break; |
| 32 | case SPI_OSX: | 170 | case SPI_OSX: |
| 33 | dprint("SPI_OSX\n"); | 171 | dprint("SPI_OSX\n"); |
| 34 | set_single_persistent_default_layer(_OSX); | 172 | set_single_persistent_default_layer(_OSX); |
| 35 | #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) | 173 | #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) |
| 36 | set_unicode_input_mode(UC_OSX); | 174 | set_unicode_input_mode(UC_OSX); |
| 37 | #endif | 175 | #endif |
| 38 | break; | 176 | break; |
| 39 | case SPI_WIN: | 177 | case SPI_WIN: |
| 40 | dprint("SPI_WIN\n"); | 178 | dprint("SPI_WIN\n"); |
| 41 | set_single_persistent_default_layer(_BASE); | 179 | set_single_persistent_default_layer(_BASE); |
| 42 | layer_off(_OSX); | 180 | layer_off(_OSX); |
| 43 | #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) | 181 | #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) |
| 44 | set_unicode_input_mode(UC_WINC); | 182 | set_unicode_input_mode(UC_WINC); |
| 45 | #endif | 183 | #endif |
| 46 | break; | 184 | break; |
| 185 | |||
| 186 | case SPI_NORMAL ... SPI_FRAKTR: | ||
| 187 | spi_replace_mode = (spi_replace_mode == keycode) ? SPI_NORMAL : keycode; | ||
| 188 | dprintf("spi_replace_mode = %u\n", spi_replace_mode); | ||
| 189 | break; | ||
| 190 | |||
| 191 | case SPI_GFLOCK: | ||
| 192 | spi_gflock = !spi_gflock; | ||
| 193 | dprintf("spi_gflock = %u\n", spi_gflock); | ||
| 194 | break; | ||
| 195 | } | ||
| 196 | } else { | ||
| 197 | switch (keycode) { | ||
| 198 | case CH_CPNL: | ||
| 199 | case CH_ASST: | ||
| 200 | host_consumer_send(0); | ||
| 201 | return false; | ||
| 202 | } | ||
| 203 | } | ||
| 204 | |||
| 205 | switch (keycode) { | ||
| 206 | case KC_A ... KC_0: | ||
| 207 | case KC_SPACE: | ||
| 208 | switch (spi_replace_mode) { | ||
| 209 | case SPI_WIDE: | ||
| 210 | return process_record_glyph_replacement(keycode, record, 0xFF41, 0xFF21, 0xFF10, 0xFF11, 0x2003); | ||
| 211 | case SPI_SCRIPT: | ||
| 212 | return process_record_glyph_replacement(keycode, record, 0x1D4EA, 0x1D4D0, 0x1D7CE, 0x1D7CF, 0x2002); | ||
| 213 | case SPI_BLOCKS: | ||
| 214 | return process_record_glyph_replacement(keycode, record, 0x1F170, 0x1F170, '0', '1', 0x2002); | ||
| 215 | case SPI_CIRCLE: | ||
| 216 | return process_record_glyph_replacement(keycode, record, 0x1F150, 0x1F150, '0', '1', 0x2002); | ||
| 217 | case SPI_SQUARE: | ||
| 218 | return process_record_glyph_replacement(keycode, record, 0x1F130, 0x1F130, '0', '1', 0x2002); | ||
| 219 | case SPI_PARENS: | ||
| 220 | return process_record_glyph_replacement(keycode, record, 0x1F110, 0x1F110, '0', '1', 0x2002); | ||
| 221 | case SPI_FRAKTR: | ||
| 222 | return process_record_glyph_replacement(keycode, record, 0x1D586, 0x1D56C, '0', '1', 0x2002); | ||
| 223 | } | ||
| 224 | break; | ||
| 225 | |||
| 226 | case KC_F1 ... KC_F24: | ||
| 227 | return process_gflock(keycode, record); | ||
| 47 | } | 228 | } |
| 48 | } | ||
| 49 | 229 | ||
| 50 | #ifdef RGBLIGHT_ENABLE | 230 | #ifdef RGBLIGHT_ENABLE |
| 51 | bool res = process_record_user_rgb(keycode, record); | 231 | bool res = process_record_user_rgb(keycode, record); |
| 52 | if (res) return true; | 232 | if (!res) return false; |
| 53 | #endif | 233 | #endif |
| 54 | 234 | ||
| 55 | return false; | 235 | return true; |
| 236 | } | ||
| 237 | |||
| 238 | void post_process_record_user(uint16_t keycode, keyrecord_t *record) { | ||
| 239 | #ifdef RGBLIGHT_ENABLE | ||
| 240 | post_process_record_user_rgb(keycode, record); | ||
| 241 | #endif | ||
| 242 | return; | ||
| 56 | } | 243 | } |
| 57 | 244 | ||
| 58 | layer_state_t default_layer_state_set_user(layer_state_t state) { | 245 | layer_state_t default_layer_state_set_user(layer_state_t state) { |
| 59 | #ifdef RGBLIGHT_ENABLE | 246 | #ifdef RGBLIGHT_ENABLE |
| 60 | return default_layer_state_set_user_rgb(state); | 247 | return default_layer_state_set_user_rgb(state); |
| 61 | #else | 248 | #else |
| 62 | return state; | 249 | return state; |
| 63 | #endif | 250 | #endif |
| 64 | } | 251 | } |
| 65 | 252 | ||
| 66 | layer_state_t layer_state_set_user(layer_state_t state) { | 253 | layer_state_t layer_state_set_user(layer_state_t state) { |
| 67 | #ifdef RGBLIGHT_ENABLE | 254 | #ifdef RGBLIGHT_ENABLE |
| 68 | return layer_state_set_user_rgb(state); | 255 | return layer_state_set_user_rgb(state); |
| 69 | #else | 256 | #else |
| 70 | return state; | 257 | return state; |
| 71 | #endif | 258 | #endif |
| 72 | } | 259 | } |
| 73 | 260 | ||
| 74 | bool led_update_user(led_t led_state) { | 261 | bool led_update_user(led_t led_state) { |
| 75 | #ifdef RGBLIGHT_ENABLE | 262 | #ifdef RGBLIGHT_ENABLE |
| 76 | return led_update_user_rgb(led_state); | 263 | return led_update_user_rgb(led_state); |
| 77 | #else | 264 | #else |
| 78 | return true; | 265 | return true; |
| 79 | #endif | 266 | #endif |
| 80 | } | 267 | } |
