diff options
| author | Joshua Diamond <josh@windowoffire.com> | 2020-06-05 05:01:47 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-06-05 02:01:47 -0700 |
| commit | d03bc3a9c185f97d3813758e7f6df7c879f42ad0 (patch) | |
| tree | 8b5a0b3aeede0aed5ab52061b8a129f808525526 /users/spidey3 | |
| parent | c12e429da28399004dddcf2c67f7cb4bca8d28e4 (diff) | |
| download | qmk_firmware-d03bc3a9c185f97d3813758e7f6df7c879f42ad0.tar.gz qmk_firmware-d03bc3a9c185f97d3813758e7f6df7c879f42ad0.zip | |
Major enhancements to spidey3 keymaps and userspace (#9261)
* Add Chrome OS specific keys to 75_ansi/spidey3
* Clean up duplicative settings in rules.mk
* Refactor spidey3 userspace to use rgb layer blink
* Blink green on wakeup
* Improve _FN layer indicator
* Glyph transformation modes: wide, script, fraktur, and enclosed characters
* Add spider unicode glyph
* Fix compile error when NO_ACTION_ONESHOT
* Add a few more emoji
* Further refinement of lighting layer usage
* Fix reversed yes/no ack
* Lighting layers override RGB off
* Fix missing wide and incorrect script numbers
* Add LOL and surprise emoji
* Add missing break in switch statement
* Trim firmware size
* Use usage ID definitions in report.h
* Some minor whitespace cleanup
* Disable some unused features to reduce firmware size
* Print version on startup
* Seed rand() on first keystroke
* Add a key to immediately sleep CrOS
* Switch to Bootmagic Lite
* Trim down firmware size a little bit more
* Make RGBLIGHT_MODE_TWINKLE+4 my default
* Scan rate debug / fix version printing
Delay printing version on startup (console may not be ready)
Better scan rate reporting
* Disable locking caps, etc. to save more space
* Enable LTO
* Better seed for rand()
* Set MAX_LAYER for some performance improvement
* Another scan rate improvement
* Set manufacturer
* New startup animation
* Add GUI lock for F-keys (for CrOS)
* Add visual indication for glyph replacement and F-keys GUI lock
* Some cleanup; run cformat on spidey3 userspace
* Cycle between debug verbosity options
* Fix disable RGB Lighting after wakeup on Mac
Diffstat (limited to 'users/spidey3')
| -rw-r--r-- | users/spidey3/config.h | 18 | ||||
| -rw-r--r-- | users/spidey3/init.c | 20 | ||||
| -rw-r--r-- | users/spidey3/layer_rgb.c | 311 | ||||
| -rw-r--r-- | users/spidey3/rules.mk | 2 | ||||
| -rw-r--r-- | users/spidey3/spidey3.c | 271 | ||||
| -rw-r--r-- | users/spidey3/spidey3.h | 72 | ||||
| -rw-r--r-- | users/spidey3/unicode.c | 30 | ||||
| -rw-r--r-- | users/spidey3/unicode.h | 13 |
8 files changed, 570 insertions, 167 deletions
diff --git a/users/spidey3/config.h b/users/spidey3/config.h index 9da7f5530..053240718 100644 --- a/users/spidey3/config.h +++ b/users/spidey3/config.h | |||
| @@ -3,3 +3,21 @@ | |||
| 3 | #define LED_DISABLE_WHEN_USB_SUSPENDED true | 3 | #define LED_DISABLE_WHEN_USB_SUSPENDED true |
| 4 | #define RGB_DISABLE_WHEN_USB_SUSPENDED true | 4 | #define RGB_DISABLE_WHEN_USB_SUSPENDED true |
| 5 | #define RGBLIGHT_LAYERS | 5 | #define RGBLIGHT_LAYERS |
| 6 | #define RGBLIGHT_MAX_LAYERS 16 | ||
| 7 | #define RGBLIGHT_LAYER_BLINK | ||
| 8 | #define RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF | ||
| 9 | |||
| 10 | #undef RGBLIGHT_ANIMATIONS | ||
| 11 | #define RGBLIGHT_EFFECT_BREATHING | ||
| 12 | #define RGBLIGHT_EFFECT_RAINBOW_MOOD | ||
| 13 | #define RGBLIGHT_EFFECT_RAINBOW_SWIRL | ||
| 14 | #define RGBLIGHT_EFFECT_SNAKE | ||
| 15 | #define RGBLIGHT_EFFECT_KNIGHT | ||
| 16 | #define RGBLIGHT_EFFECT_STATIC_GRADIENT | ||
| 17 | #define RGBLIGHT_EFFECT_ALTERNATING | ||
| 18 | #define RGBLIGHT_EFFECT_TWINKLE | ||
| 19 | |||
| 20 | #define SPI_DEBUG_SCAN_RATE | ||
| 21 | |||
| 22 | #undef MANUFACTURER | ||
| 23 | #define MANUFACTURER Window of Fire | ||
diff --git a/users/spidey3/init.c b/users/spidey3/init.c index b92394609..273c2b289 100644 --- a/users/spidey3/init.c +++ b/users/spidey3/init.c | |||
| @@ -1,30 +1,28 @@ | |||
| 1 | #include "spidey3.h" | 1 | #include "spidey3.h" |
| 2 | 2 | ||
| 3 | void keyboard_post_init_user(void) { | 3 | void keyboard_post_init_user(void) { |
| 4 | print("keyboard_post_init_user\n"); | ||
| 5 | uprintf("\tdebug_enable=%u\n", debug_enable); | ||
| 6 | #ifdef RGBLIGHT_ENABLE | 4 | #ifdef RGBLIGHT_ENABLE |
| 7 | keyboard_post_init_user_rgb(); | 5 | keyboard_post_init_user_rgb(); |
| 8 | #endif | 6 | #endif |
| 9 | } | 7 | } |
| 10 | 8 | ||
| 11 | void eeconfig_init_user(void) { | 9 | void eeconfig_init_user(void) { |
| 12 | print("eeconfig_init_user\n"); | 10 | print("eeconfig_init_user\n"); |
| 13 | set_single_persistent_default_layer(_BASE); | 11 | set_single_persistent_default_layer(_BASE); |
| 14 | #ifdef UNICODEMAP_ENABLE | 12 | #ifdef UNICODEMAP_ENABLE |
| 15 | eeconfig_init_user_unicode(); | 13 | eeconfig_init_user_unicode(); |
| 16 | #endif | 14 | #endif |
| 17 | 15 | ||
| 18 | #ifdef RGBLIGHT_ENABLE | 16 | #ifdef RGBLIGHT_ENABLE |
| 19 | eeconfig_init_user_rgb(); | 17 | eeconfig_init_user_rgb(); |
| 20 | #endif | 18 | #endif |
| 21 | } | 19 | } |
| 22 | 20 | ||
| 23 | void shutdown_user() { | 21 | void shutdown_user() { |
| 24 | #ifdef RGBLIGHT_ENABLE | 22 | #ifdef RGBLIGHT_ENABLE |
| 25 | clear_rgb_layers(); | 23 | clear_rgb_layers(); |
| 26 | rgblight_enable(); | 24 | rgblight_enable(); |
| 27 | rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); | 25 | rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); |
| 28 | rgblight_sethsv_noeeprom(HSV_RED); | 26 | rgblight_sethsv_noeeprom(HSV_RED); |
| 29 | #endif | 27 | #endif |
| 30 | } | 28 | } |
diff --git a/users/spidey3/layer_rgb.c b/users/spidey3/layer_rgb.c index 75e66384e..160cc4317 100644 --- a/users/spidey3/layer_rgb.c +++ b/users/spidey3/layer_rgb.c | |||
| @@ -5,127 +5,280 @@ | |||
| 5 | 5 | ||
| 6 | uint32_t rgb_mode; | 6 | uint32_t rgb_mode; |
| 7 | uint16_t rgb_hue; | 7 | uint16_t rgb_hue; |
| 8 | uint8_t rgb_sat; | 8 | uint8_t rgb_sat; |
| 9 | uint8_t rgb_val; | 9 | uint8_t rgb_val; |
| 10 | bool rgb_saved = 0; | 10 | bool rgb_saved = 0; |
| 11 | 11 | ||
| 12 | void spidey_swirl(void) { | 12 | void spidey_glow(void) { |
| 13 | dprint("Setting Spidey Swirl!\n"); | 13 | rgblight_enable(); |
| 14 | rgblight_enable(); | 14 | rgblight_mode(RGBLIGHT_MODE_TWINKLE + 4); |
| 15 | rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL); | 15 | rgblight_sethsv(213, 255, 128); |
| 16 | rgblight_sethsv(213, 255, 128); | ||
| 17 | #ifdef VELOCIKEY_ENABLE | 16 | #ifdef VELOCIKEY_ENABLE |
| 18 | if (!velocikey_enabled()) | 17 | if (velocikey_enabled()) velocikey_toggle(); |
| 19 | velocikey_toggle(); | ||
| 20 | #endif | 18 | #endif |
| 21 | } | 19 | } |
| 22 | 20 | ||
| 23 | void eeconfig_init_user_rgb(void) | 21 | void eeconfig_init_user_rgb(void) { spidey_glow(); } |
| 24 | { | 22 | |
| 25 | spidey_swirl(); | 23 | // clang-format off |
| 26 | } | 24 | |
| 25 | // Convenience macros | ||
| 26 | #define CORNER_BL(color) { 0, 1, color } | ||
| 27 | #define CORNER_BR(color) { RGBLED_NUM / 2 - 1, 1, color } | ||
| 28 | #define CORNER_FR(color) { RGBLED_NUM / 2, 1, color } | ||
| 29 | #define CORNER_FL(color) { RGBLED_NUM - 1, 1, color } | ||
| 30 | #define CORNERS(color) {0, 1, color}, {RGBLED_NUM / 2 - 1, 2, color}, { RGBLED_NUM - 1, 1, color } | ||
| 31 | #define FRONT(inset, color) { RGBLED_NUM / 2 + inset, RGBLED_NUM / 2 - 2 * inset, color } | ||
| 32 | #define BACK(inset, color) { inset, RGBLED_NUM / 2 - 2 * inset, color } | ||
| 33 | |||
| 34 | #define LAYER_OFFSET 0 | ||
| 35 | const rgblight_segment_t PROGMEM _layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNER_BR(HSV_PURPLE)); | ||
| 36 | const rgblight_segment_t PROGMEM _layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNERS(HSV_MAGENTA)); | ||
| 37 | const rgblight_segment_t PROGMEM _layer3_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNERS(HSV_GREEN)); | ||
| 38 | |||
| 39 | #define LOCK_OFFSET 3 | ||
| 40 | const rgblight_segment_t PROGMEM _numlock_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(3, HSV_YELLOW)); | ||
| 41 | const rgblight_segment_t PROGMEM _capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNER_FL(HSV_AZURE)); | ||
| 42 | const rgblight_segment_t PROGMEM _scrolllock_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNER_FR(HSV_ORANGE)); | ||
| 43 | |||
| 44 | #define MISC_OFFSET 6 | ||
| 45 | const rgblight_segment_t PROGMEM _gflock_layer[] = RGBLIGHT_LAYER_SEGMENTS(BACK(1, HSV_ORANGE)); | ||
| 46 | const rgblight_segment_t PROGMEM _glyphreplace_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_ORANGE)); | ||
| 47 | |||
| 48 | #define ACK_OFFSET 8 | ||
| 49 | const rgblight_segment_t PROGMEM _no_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_RED)); | ||
| 50 | const rgblight_segment_t PROGMEM _yes_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_GREEN)); | ||
| 51 | const rgblight_segment_t PROGMEM _meh_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_YELLOW)); | ||
| 52 | |||
| 53 | // Now define the array of layers. Higher numbered layers take precedence. | ||
| 54 | const rgblight_segment_t *const PROGMEM _rgb_layers[] = { | ||
| 55 | [LAYER_OFFSET + 0] = _layer1_layer, | ||
| 56 | [LAYER_OFFSET + 1] = _layer2_layer, | ||
| 57 | [LAYER_OFFSET + 2] = _layer3_layer, | ||
| 58 | |||
| 59 | [LOCK_OFFSET + USB_LED_NUM_LOCK] = _numlock_layer, | ||
| 60 | [LOCK_OFFSET + USB_LED_CAPS_LOCK] = _capslock_layer, | ||
| 61 | [LOCK_OFFSET + USB_LED_SCROLL_LOCK] = _scrolllock_layer, | ||
| 62 | |||
| 63 | [MISC_OFFSET + 0] = _gflock_layer, | ||
| 64 | [MISC_OFFSET + 1] = _glyphreplace_layer, | ||
| 65 | |||
| 66 | [ACK_OFFSET + ACK_NO] = _no_layer, | ||
| 67 | [ACK_OFFSET + ACK_YES] = _yes_layer, | ||
| 68 | [ACK_OFFSET + ACK_MEH] = _meh_layer, | ||
| 27 | 69 | ||
| 28 | const rgblight_segment_t PROGMEM _capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS( {0, 2, HSV_AZURE}, {14, 2, HSV_AZURE} ); | 70 | [ACK_OFFSET + ACK_MEH + 1] = NULL |
| 29 | const rgblight_segment_t PROGMEM _layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS( {7, 1, HSV_PURPLE} ); | 71 | }; |
| 30 | const rgblight_segment_t PROGMEM _layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS( {10, 3, HSV_MAGENTA} ); | 72 | |
| 31 | const rgblight_segment_t PROGMEM _layer3_layer[] = RGBLIGHT_LAYER_SEGMENTS( {10, 1, HSV_GREEN} ); | 73 | // clang-format on |
| 32 | const rgblight_segment_t PROGMEM _yes_layer[] = RGBLIGHT_LAYER_SEGMENTS( {9, 6, HSV_GREEN} ); | ||
| 33 | const rgblight_segment_t PROGMEM _no_layer[] = RGBLIGHT_LAYER_SEGMENTS( {9, 6, HSV_RED} ); | ||
| 34 | 74 | ||
| 35 | // Now define the array of layers. Later layers take precedence | ||
| 36 | const rgblight_segment_t* const PROGMEM _rgb_layers[] = | ||
| 37 | RGBLIGHT_LAYERS_LIST( _capslock_layer, _layer1_layer, _layer2_layer, _layer3_layer, _yes_layer, _no_layer ); | ||
| 38 | const uint8_t PROGMEM _n_rgb_layers = sizeof(_rgb_layers) / sizeof(_rgb_layers[0]) - 1; | 75 | const uint8_t PROGMEM _n_rgb_layers = sizeof(_rgb_layers) / sizeof(_rgb_layers[0]) - 1; |
| 39 | 76 | ||
| 40 | void clear_rgb_layers() { | 77 | void clear_rgb_layers() { |
| 41 | for (uint8_t i=0; i<_n_rgb_layers; i++) { | 78 | dprint("clear_rgb_layers()\n"); |
| 79 | for (uint8_t i = 0; i < _n_rgb_layers; i++) { | ||
| 42 | rgblight_set_layer_state(i, false); | 80 | rgblight_set_layer_state(i, false); |
| 43 | } | 81 | } |
| 44 | } | 82 | } |
| 45 | 83 | ||
| 46 | void do_rgb_layers(layer_state_t state, uint8_t start, uint8_t end) { | 84 | void do_rgb_layers(layer_state_t state, uint8_t start, uint8_t end) { |
| 47 | dprint("do_rgb_layers()\n"); | 85 | for (uint8_t i = start; i < end; i++) { |
| 48 | for (uint8_t i=start; i<end; i++) { | 86 | bool is_on = layer_state_cmp(state, i); |
| 49 | bool is_on = layer_state_cmp(state, i); | 87 | dprintf("layer[%u]=%u\n", i, is_on); |
| 50 | dprintf("\tlayer[%d]=%u\n", i, is_on); | 88 | rgblight_set_layer_state(LAYER_OFFSET + i - 1, is_on); |
| 51 | rgblight_set_layer_state(i, is_on); | ||
| 52 | } | 89 | } |
| 53 | } | 90 | } |
| 54 | 91 | ||
| 92 | extern rgblight_config_t rgblight_config; | ||
| 93 | extern rgblight_status_t rgblight_status; | ||
| 94 | static bool startup_animation_done = false; | ||
| 95 | |||
| 55 | void keyboard_post_init_user_rgb(void) { | 96 | void keyboard_post_init_user_rgb(void) { |
| 56 | do_rgb_layers(default_layer_state, 1u, RGB_LAYER_BASE_REGULAR); | ||
| 57 | do_rgb_layers(layer_state, RGB_LAYER_BASE_REGULAR, RGB_LAYER_BASE_ACKS); | ||
| 58 | do_rgb_layers(0, RGB_LAYER_BASE_ACKS, _n_rgb_layers); | ||
| 59 | // Enable the LED layers | 97 | // Enable the LED layers |
| 60 | rgblight_layers = _rgb_layers; | 98 | rgblight_layers = _rgb_layers; |
| 99 | do_rgb_layers(default_layer_state, LAYER_BASE_DEFAULT + 1, LAYER_BASE_REGULAR); | ||
| 100 | do_rgb_layers(layer_state, LAYER_BASE_REGULAR, LAYER_BASE_END); | ||
| 101 | |||
| 102 | // Startup animation | ||
| 103 | { | ||
| 104 | bool is_enabled = rgblight_config.enable; | ||
| 105 | uint8_t old_hue = rgblight_config.hue; | ||
| 106 | uint8_t old_sat = rgblight_config.sat; | ||
| 107 | uint8_t old_val = rgblight_config.val; | ||
| 108 | uint8_t old_mode = rgblight_config.mode; | ||
| 109 | |||
| 110 | bool ramp_down = | ||
| 111 | #ifdef RGBLIGHT_EFFECT_BREATHING | ||
| 112 | (rgblight_status.base_mode == RGBLIGHT_MODE_BREATHING) || | ||
| 113 | #endif | ||
| 114 | #ifdef RGBLIGHT_EFFECT_SNAKE | ||
| 115 | (rgblight_status.base_mode == RGBLIGHT_MODE_SNAKE) || | ||
| 116 | #endif | ||
| 117 | #ifdef RGBLIGHT_EFFECT_KNIGHT | ||
| 118 | (rgblight_status.base_mode == RGBLIGHT_MODE_KNIGHT) || | ||
| 119 | #endif | ||
| 120 | #ifdef RGBLIGHT_EFFECT_TWINKLE | ||
| 121 | (rgblight_status.base_mode == RGBLIGHT_MODE_TWINKLE) || | ||
| 122 | #endif | ||
| 123 | !is_enabled; | ||
| 124 | |||
| 125 | bool ramp_to = | ||
| 126 | #ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT | ||
| 127 | (rgblight_status.base_mode == RGBLIGHT_MODE_STATIC_GRADIENT) || | ||
| 128 | #endif | ||
| 129 | #ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD | ||
| 130 | (rgblight_status.base_mode == RGBLIGHT_MODE_RAINBOW_MOOD) || | ||
| 131 | #endif | ||
| 132 | #ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL | ||
| 133 | (rgblight_status.base_mode == RGBLIGHT_MODE_RAINBOW_SWIRL) || | ||
| 134 | #endif | ||
| 135 | #ifdef RGBLIGHT_EFFECT_RAINBOW_CHRISTMAS | ||
| 136 | (rgblight_status.base_mode == RGBLIGHT_MODE_CHRISTMAS) || | ||
| 137 | #endif | ||
| 138 | #ifdef RGBLIGHT_EFFECT_RAINBOW_RGB_TEST_ | ||
| 139 | (rgblight_status.base_mode == RGBLIGHT_MODE_RGB_TEST) || | ||
| 140 | #endif | ||
| 141 | (rgblight_status.base_mode == RGBLIGHT_MODE_STATIC_LIGHT); | ||
| 142 | |||
| 143 | #define STARTUP_ANIMATION_SATURATION 200 | ||
| 144 | #define STARTUP_ANIMATION_VALUE 255 | ||
| 145 | #define STARTUP_ANIMATION_STEP 5 | ||
| 146 | |||
| 147 | rgblight_enable_noeeprom(); | ||
| 148 | if (rgblight_config.enable) { | ||
| 149 | rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); | ||
| 150 | for (uint8_t i = 0; i < STARTUP_ANIMATION_VALUE; i += STARTUP_ANIMATION_STEP) { | ||
| 151 | rgblight_sethsv_noeeprom(old_hue, STARTUP_ANIMATION_SATURATION, i); | ||
| 152 | matrix_scan(); | ||
| 153 | wait_ms(10); | ||
| 154 | } | ||
| 155 | for (uint8_t i = 255; i > 0; i -= STARTUP_ANIMATION_STEP) { | ||
| 156 | rgblight_sethsv_noeeprom((i + old_hue) % 255, STARTUP_ANIMATION_SATURATION, STARTUP_ANIMATION_VALUE); | ||
| 157 | matrix_scan(); | ||
| 158 | wait_ms(10); | ||
| 159 | } | ||
| 160 | |||
| 161 | if (ramp_down) { | ||
| 162 | dprintln("ramp_down"); | ||
| 163 | for (uint8_t i = STARTUP_ANIMATION_VALUE; i > 0; i -= STARTUP_ANIMATION_STEP) { | ||
| 164 | rgblight_sethsv_noeeprom(old_hue, STARTUP_ANIMATION_SATURATION, i); | ||
| 165 | matrix_scan(); | ||
| 166 | wait_ms(10); | ||
| 167 | } | ||
| 168 | } else if (ramp_to) { | ||
| 169 | dprintf("ramp_to s=%u, v=%u\n", old_sat, old_val); | ||
| 170 | uint8_t steps = 50; | ||
| 171 | for (uint8_t i = 0; i < steps; i++) { | ||
| 172 | uint8_t s = STARTUP_ANIMATION_SATURATION + i * (((float)old_sat - STARTUP_ANIMATION_SATURATION) / (float)steps); | ||
| 173 | uint8_t v = STARTUP_ANIMATION_VALUE + i * (((float)old_val - STARTUP_ANIMATION_VALUE) / (float)steps); | ||
| 174 | rgblight_sethsv_noeeprom(old_hue, s, v); | ||
| 175 | matrix_scan(); | ||
| 176 | wait_ms(10); | ||
| 177 | } | ||
| 178 | } | ||
| 179 | rgblight_mode_noeeprom(old_mode); | ||
| 180 | } | ||
| 181 | if (is_enabled) { | ||
| 182 | rgblight_sethsv_noeeprom(old_hue, old_sat, old_val); | ||
| 183 | } else { | ||
| 184 | rgblight_disable_noeeprom(); | ||
| 185 | // Hack! | ||
| 186 | // rgblight_sethsv_noeeprom() doesn't update these if rgblight is disabled, | ||
| 187 | // but if do it before disabling we get an ugly flash. | ||
| 188 | rgblight_config.hue = old_hue; | ||
| 189 | rgblight_config.sat = old_sat; | ||
| 190 | rgblight_config.val = old_val; | ||
| 191 | } | ||
| 192 | dprint("done\n"); | ||
| 193 | startup_animation_done = true; | ||
| 194 | } | ||
| 61 | } | 195 | } |
| 62 | 196 | ||
| 63 | layer_state_t default_layer_state_set_user_rgb(layer_state_t state) { | 197 | layer_state_t default_layer_state_set_user_rgb(layer_state_t state) { |
| 64 | dprint("default_layer_state_set_user_rgb()\n"); | 198 | do_rgb_layers(state, 1u, LAYER_BASE_REGULAR); |
| 65 | do_rgb_layers(state, 1u, RGB_LAYER_BASE_REGULAR); | ||
| 66 | return state; | 199 | return state; |
| 67 | } | 200 | } |
| 68 | 201 | ||
| 69 | layer_state_t layer_state_set_user_rgb(layer_state_t state) { | 202 | layer_state_t layer_state_set_user_rgb(layer_state_t state) { |
| 70 | dprint("layer_state_set_user_rgb()\n"); | 203 | do_rgb_layers(state, LAYER_BASE_REGULAR, LAYER_BASE_END); |
| 71 | do_rgb_layers(state, RGB_LAYER_BASE_REGULAR, RGB_LAYER_BASE_ACKS); | ||
| 72 | return state; | 204 | return state; |
| 73 | } | 205 | } |
| 74 | 206 | ||
| 75 | bool led_update_user_rgb(led_t led_state) { | 207 | bool led_update_user_rgb(led_t led_state) { |
| 76 | dprintf("caps_lock=%u\n", led_state.caps_lock); | 208 | dprintf("num=%u, cap=%u, scl=%u, cmp=%u, kan=%u\n", led_state.num_lock, led_state.caps_lock, led_state.scroll_lock, led_state.compose, led_state.kana); |
| 77 | rgblight_set_layer_state(0, led_state.caps_lock); | 209 | |
| 210 | rgblight_set_layer_state(LOCK_OFFSET + USB_LED_NUM_LOCK, led_state.num_lock); | ||
| 211 | rgblight_set_layer_state(LOCK_OFFSET + USB_LED_CAPS_LOCK, led_state.caps_lock); | ||
| 212 | rgblight_set_layer_state(LOCK_OFFSET + USB_LED_SCROLL_LOCK, led_state.scroll_lock); | ||
| 213 | |||
| 78 | return true; | 214 | return true; |
| 79 | } | 215 | } |
| 80 | 216 | ||
| 81 | void rgb_layer_ack(bool yn, bool pressed) { | 217 | void rgb_layer_ack_yn(bool yn) { rgb_layer_ack(yn ? ACK_YES : ACK_NO); } |
| 82 | uint8_t layer = RGB_LAYER_BASE_ACKS + (yn ? 0 : 1); | 218 | |
| 83 | rgblight_set_layer_state(layer, pressed); | 219 | void rgb_layer_ack(layer_ack_t n) { |
| 220 | uint8_t layer = ACK_OFFSET + n; | ||
| 221 | dprintf("rgb_layer_ack(%u) ==> %u\n", n, layer); | ||
| 222 | rgblight_blink_layer(layer, RGB_LAYER_ACK_DURATION); | ||
| 84 | } | 223 | } |
| 85 | 224 | ||
| 86 | extern keymap_config_t keymap_config; | 225 | extern keymap_config_t keymap_config; |
| 226 | extern rgblight_config_t rgblight_config; | ||
| 227 | |||
| 228 | extern bool spi_gflock; | ||
| 229 | extern uint16_t spi_replace_mode; | ||
| 87 | 230 | ||
| 88 | bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { | 231 | bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { |
| 89 | bool pressed = record->event.pressed; | 232 | if (record->event.pressed) { |
| 90 | 233 | switch (keycode) { | |
| 91 | switch (keycode) { | 234 | case SPI_GLO: |
| 92 | case SPI_GLO: | 235 | spidey_glow(); |
| 93 | if (pressed) { | 236 | return false; |
| 94 | spidey_swirl(); | 237 | } |
| 95 | } | 238 | } |
| 96 | return false; | 239 | |
| 97 | 240 | return true; | |
| 98 | // Acks follow... | 241 | } |
| 99 | case DEBUG: | 242 | |
| 100 | rgb_layer_ack(debug_enable, pressed); | 243 | void post_process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { |
| 101 | return false; | 244 | switch (keycode) { |
| 102 | 245 | // Acks follow... | |
| 103 | case SPI_LNX: | 246 | case DEBUG: |
| 104 | case SPI_OSX: | 247 | rgb_layer_ack_yn(debug_enable); |
| 105 | case SPI_WIN: | 248 | break; |
| 106 | rgb_layer_ack(true, pressed); | 249 | |
| 107 | return false; | 250 | case SPI_LNX: |
| 108 | 251 | case SPI_OSX: | |
| 109 | // Tricky! | 252 | case SPI_WIN: |
| 110 | // For these, on press the toggle hasn't happened yet, | 253 | rgb_layer_ack(ACK_MEH); |
| 111 | // so we need a little logic to invert, assuming that | 254 | break; |
| 112 | // on key press the flag WILL be toggled, and on key | 255 | |
| 113 | // release the flag has already been toggled. | 256 | case SPI_GFLOCK: |
| 257 | rgb_layer_ack_yn(spi_gflock); | ||
| 258 | rgblight_set_layer_state(MISC_OFFSET + 0, spi_gflock); | ||
| 259 | break; | ||
| 260 | |||
| 261 | case SPI_NORMAL ... SPI_FRAKTR: | ||
| 262 | rgb_layer_ack_yn(spi_replace_mode != SPI_NORMAL); | ||
| 263 | rgblight_set_layer_state(MISC_OFFSET + 1, spi_replace_mode != SPI_NORMAL); | ||
| 264 | break; | ||
| 265 | |||
| 266 | case RGB_TOG: | ||
| 267 | rgb_layer_ack_yn(rgblight_config.enable); | ||
| 268 | break; | ||
| 114 | 269 | ||
| 115 | #ifdef VELOCIKEY_ENABLE | 270 | #ifdef VELOCIKEY_ENABLE |
| 116 | case VLK_TOG: | 271 | case VLK_TOG: |
| 117 | rgb_layer_ack(pressed != velocikey_enabled(), pressed); | 272 | rgb_layer_ack_yn(velocikey_enabled()); |
| 118 | return true; | 273 | break; |
| 119 | #endif | 274 | #endif |
| 120 | 275 | ||
| 121 | #ifdef NKRO_ENABLE | 276 | #ifdef NKRO_ENABLE |
| 122 | case NK_TOGG: | 277 | case NK_TOGG: |
| 123 | case NK_ON: | 278 | case NK_ON: |
| 124 | case NK_OFF: | 279 | case NK_OFF: |
| 125 | rgb_layer_ack(pressed != keymap_config.nkro, pressed); | 280 | rgb_layer_ack_yn(keymap_config.nkro); |
| 126 | return true; | 281 | break; |
| 127 | #endif | 282 | #endif |
| 128 | } | 283 | } |
| 129 | |||
| 130 | return true; | ||
| 131 | } | 284 | } |
diff --git a/users/spidey3/rules.mk b/users/spidey3/rules.mk index 0a77d2bfc..2d4da2294 100644 --- a/users/spidey3/rules.mk +++ b/users/spidey3/rules.mk | |||
| @@ -1,3 +1,5 @@ | |||
| 1 | BOOTMAGIC_ENABLE = lite | ||
| 2 | LTO_ENABLE = yes | ||
| 1 | 3 | ||
| 2 | SRC += init.c | 4 | SRC += init.c |
| 3 | SRC += spidey3.c | 5 | SRC += spidey3.c |
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 | } |
diff --git a/users/spidey3/spidey3.h b/users/spidey3/spidey3.h index 224858391..5bfba4e59 100644 --- a/users/spidey3/spidey3.h +++ b/users/spidey3/spidey3.h | |||
| @@ -3,41 +3,71 @@ | |||
| 3 | #include QMK_KEYBOARD_H | 3 | #include QMK_KEYBOARD_H |
| 4 | 4 | ||
| 5 | #ifdef UNICODEMAP_ENABLE | 5 | #ifdef UNICODEMAP_ENABLE |
| 6 | #include "unicode.h" | 6 | # include "unicode.h" |
| 7 | #endif | 7 | #endif |
| 8 | 8 | ||
| 9 | enum userspace_layers { | 9 | enum userspace_layers { |
| 10 | _BASE = 0, | 10 | _BASE = 0, |
| 11 | _OSX, | 11 | _OSX, |
| 12 | _NUMPAD, | 12 | _NUMPAD, |
| 13 | _FN, | 13 | _FN, |
| 14 | }; | ||
| 15 | |||
| 16 | enum rgb_base_layer { | ||
| 17 | RGB_LAYER_BASE_DEFAULT = _BASE, | ||
| 18 | RGB_LAYER_BASE_REGULAR = _NUMPAD, | ||
| 19 | RGB_LAYER_BASE_ACKS = _FN+1, | ||
| 20 | }; | 14 | }; |
| 21 | 15 | ||
| 22 | enum custom_keycodes { | 16 | enum custom_keycodes { |
| 23 | SPI_GLO = SAFE_RANGE, | 17 | SPI_GLO = SAFE_RANGE, |
| 24 | SPI_LNX, | 18 | SPI_LNX, // Mode: Linux |
| 25 | SPI_OSX, | 19 | SPI_OSX, // Mode: Mac |
| 26 | SPI_WIN, | 20 | SPI_WIN, // Mode: Windows |
| 21 | CH_CPNL, // AL Control Panel | ||
| 22 | CH_ASST, // AL Context-aware Desktop Assistant | ||
| 23 | CH_SUSP, // Suspend | ||
| 24 | |||
| 25 | SPI_NORMAL, | ||
| 26 | SPI_WIDE, | ||
| 27 | SPI_SCRIPT, | ||
| 28 | SPI_BLOCKS, | ||
| 29 | SPI_CIRCLE, | ||
| 30 | SPI_SQUARE, | ||
| 31 | SPI_PARENS, | ||
| 32 | SPI_FRAKTR, | ||
| 33 | SPI_GFLOCK, | ||
| 27 | }; | 34 | }; |
| 28 | 35 | ||
| 29 | #ifdef RGBLIGHT_ENABLE | 36 | #ifdef RGBLIGHT_ENABLE |
| 30 | void eeconfig_init_user_rgb(void); | 37 | |
| 31 | void matrix_init_user_rgb(void); | 38 | enum layer_base { |
| 32 | void keyboard_post_init_user_rgb(void); | 39 | LAYER_BASE_DEFAULT = _BASE, |
| 33 | bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record); | 40 | LAYER_BASE_REGULAR = _NUMPAD, |
| 41 | LAYER_BASE_END = _FN + 1, | ||
| 42 | }; | ||
| 43 | |||
| 44 | typedef enum layer_ack { | ||
| 45 | ACK_NO = 0, | ||
| 46 | ACK_YES, | ||
| 47 | ACK_MEH, | ||
| 48 | } layer_ack_t; | ||
| 49 | |||
| 50 | # define RGB_LAYER_ACK_DURATION 500 | ||
| 51 | |||
| 52 | void eeconfig_init_user_rgb(void); | ||
| 53 | void matrix_init_user_rgb(void); | ||
| 54 | void keyboard_post_init_user_rgb(void); | ||
| 55 | bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record); | ||
| 56 | void post_process_record_user_rgb(uint16_t keycode, keyrecord_t *record); | ||
| 34 | layer_state_t layer_state_set_user_rgb(layer_state_t state); | 57 | layer_state_t layer_state_set_user_rgb(layer_state_t state); |
| 35 | layer_state_t default_layer_state_set_user_rgb(layer_state_t state); | 58 | layer_state_t default_layer_state_set_user_rgb(layer_state_t state); |
| 36 | bool led_update_user_rgb(led_t led_state); | 59 | bool led_update_user_rgb(led_t led_state); |
| 37 | void clear_rgb_layers(void); | 60 | void rgb_layer_ack(layer_ack_t n); |
| 61 | void rgb_layer_ack_yn(bool yn); | ||
| 62 | void clear_rgb_layers(void); | ||
| 38 | #endif | 63 | #endif |
| 39 | 64 | ||
| 40 | #ifdef UNICODEMAP_ENABLE | 65 | #ifdef UNICODEMAP_ENABLE |
| 41 | void eeconfig_init_user_unicode(void); | 66 | void eeconfig_init_user_unicode(void); |
| 42 | #endif | 67 | #endif |
| 43 | 68 | ||
| 69 | #ifdef SPI_DEBUG_SCAN_RATE | ||
| 70 | # ifndef SPI_SCAN_RATE_INTERVAL | ||
| 71 | # define SPI_SCAN_RATE_INTERVAL 10 | ||
| 72 | # endif | ||
| 73 | #endif | ||
diff --git a/users/spidey3/unicode.c b/users/spidey3/unicode.c index 41ceef837..39a990674 100644 --- a/users/spidey3/unicode.c +++ b/users/spidey3/unicode.c | |||
| @@ -2,18 +2,24 @@ | |||
| 2 | #include "unicode.h" | 2 | #include "unicode.h" |
| 3 | 3 | ||
| 4 | const uint32_t PROGMEM unicode_map[] = { | 4 | const uint32_t PROGMEM unicode_map[] = { |
| 5 | [BUL1] = 0x2022, // • | 5 | [BUL1] = 0x2022, // • |
| 6 | [BUL2] = 0x25E6, // ◦ | 6 | [BUL2] = 0x25E6, // ◦ |
| 7 | [LARR] = 0x2190, // ← | 7 | [LARR] = 0x2190, // ← |
| 8 | [RARR] = 0x2192, // → | 8 | [RARR] = 0x2192, // → |
| 9 | [ENDASH] = 0x2013, // – | 9 | [ENDASH] = 0x2013, // – |
| 10 | [EMDASH] = 0x2014, // — | 10 | [EMDASH] = 0x2014, // — |
| 11 | [SPIDER] = 0x1F577, // 🕷 | ||
| 12 | [SAD] = 0x2639, // ☹ | ||
| 13 | [MEH] = 0x1F611, // 😑 | ||
| 14 | [HAPPY] = 0x1F600, // 😀 | ||
| 15 | [ANGRY] = 0x1F620, // 😠 | ||
| 16 | [THUMBUP] = 0x1F44D, // 👍 | ||
| 17 | [THUMBDN] = 0x1F44E, // 👎 | ||
| 18 | [LOL] = 0x1F602, // 😂 | ||
| 19 | [SURPRISE] = 0x1F62E, // 😮 | ||
| 11 | }; | 20 | }; |
| 12 | 21 | ||
| 13 | void eeconfig_init_user_unicode(void) | 22 | void eeconfig_init_user_unicode(void) { |
| 14 | { | 23 | // Default to Linux style |
| 15 | // Default to Linux style | 24 | set_unicode_input_mode(UC_LNX); |
| 16 | set_unicode_input_mode(UC_LNX); | ||
| 17 | } | 25 | } |
| 18 | |||
| 19 | |||
diff --git a/users/spidey3/unicode.h b/users/spidey3/unicode.h index 72a91e8a8..db7824983 100644 --- a/users/spidey3/unicode.h +++ b/users/spidey3/unicode.h | |||
| @@ -11,9 +11,18 @@ enum unicode_names { | |||
| 11 | RARR, | 11 | RARR, |
| 12 | ENDASH, | 12 | ENDASH, |
| 13 | EMDASH, | 13 | EMDASH, |
| 14 | SPIDER, | ||
| 15 | SAD, | ||
| 16 | MEH, | ||
| 17 | HAPPY, | ||
| 18 | ANGRY, | ||
| 19 | THUMBUP, | ||
| 20 | THUMBDN, | ||
| 21 | LOL, | ||
| 22 | SURPRISE, | ||
| 14 | }; | 23 | }; |
| 15 | 24 | ||
| 16 | #define X_BUL (XP(BUL1, BUL2)) | 25 | # define X_BUL (XP(BUL1, BUL2)) |
| 17 | #define X_DASH (XP(ENDASH, EMDASH)) | 26 | # define X_DASH (XP(ENDASH, EMDASH)) |
| 18 | 27 | ||
| 19 | #endif | 28 | #endif |
