diff options
author | Drashna Jaelre <drashna@live.com> | 2021-07-01 00:42:32 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-01 00:42:32 -0700 |
commit | b7cf9a888a607dc024d74ee72c0ebbd8e0ddfdbe (patch) | |
tree | 3510846d4d53682e5ec9b964d093ef97c0b33bc7 /users | |
parent | bbe45185e30eb8d0e974f02b0ea809ed773221be (diff) | |
download | qmk_firmware-b7cf9a888a607dc024d74ee72c0ebbd8e0ddfdbe.tar.gz qmk_firmware-b7cf9a888a607dc024d74ee72c0ebbd8e0ddfdbe.zip |
Drashna's split updates (#13350)
Co-authored-by: Ryan <fauxpark@gmail.com>
Diffstat (limited to 'users')
-rw-r--r-- | users/drashna/config.h | 167 | ||||
-rw-r--r-- | users/drashna/drashna.c | 31 | ||||
-rw-r--r-- | users/drashna/drashna.h | 9 | ||||
-rw-r--r-- | users/drashna/drashna_font.h | 5 | ||||
-rw-r--r-- | users/drashna/drashna_transport.c | 603 | ||||
-rw-r--r-- | users/drashna/oled_stuff.c | 83 | ||||
-rw-r--r-- | users/drashna/oled_stuff.h | 165 | ||||
-rw-r--r-- | users/drashna/process_records.c | 62 | ||||
-rw-r--r-- | users/drashna/process_records.h | 82 | ||||
-rw-r--r-- | users/drashna/rgb_matrix_stuff.c | 54 | ||||
-rw-r--r-- | users/drashna/rgb_stuff.c | 100 | ||||
-rw-r--r-- | users/drashna/rules.mk | 43 | ||||
-rw-r--r-- | users/drashna/tap_dances.c | 8 | ||||
-rw-r--r-- | users/drashna/tap_dances.h | 2 | ||||
-rw-r--r-- | users/drashna/template.c | 6 | ||||
-rw-r--r-- | users/drashna/template.h | 4 | ||||
-rw-r--r-- | users/drashna/transport_sync.c | 80 | ||||
-rw-r--r-- | users/drashna/transport_sync.h | 22 |
18 files changed, 523 insertions, 1003 deletions
diff --git a/users/drashna/config.h b/users/drashna/config.h index 796485689..445e18082 100644 --- a/users/drashna/config.h +++ b/users/drashna/config.h | |||
@@ -17,34 +17,49 @@ | |||
17 | #pragma once | 17 | #pragma once |
18 | 18 | ||
19 | // Use custom magic number so that when switching branches, EEPROM always gets reset | 19 | // Use custom magic number so that when switching branches, EEPROM always gets reset |
20 | #define EECONFIG_MAGIC_NUMBER (uint16_t)0x1339 | 20 | #define EECONFIG_MAGIC_NUMBER (uint16_t)0x1339 |
21 | 21 | ||
22 | /* Set Polling rate to 1000Hz */ | 22 | /* Set Polling rate to 1000Hz */ |
23 | #define USB_POLLING_INTERVAL_MS 1 | 23 | #define USB_POLLING_INTERVAL_MS 1 |
24 | 24 | ||
25 | #if defined(SPLIT_KEYBOARD) | 25 | #if defined(SPLIT_KEYBOARD) |
26 | # define SPLIT_MODS_ENABLE | 26 | # define SPLIT_MODS_ENABLE |
27 | # define SPLIT_TRANSPORT_MIRROR | 27 | # define SPLIT_LAYER_STATE_ENABLE |
28 | # define SPLIT_LED_STATE_ENABLE | ||
29 | |||
30 | // # define SPLIT_TRANSPORT_MIRROR | ||
28 | # define SERIAL_USE_MULTI_TRANSACTION | 31 | # define SERIAL_USE_MULTI_TRANSACTION |
29 | // # define SPLIT_NUM_TRANSACTIONS_KB 2 | 32 | # define SPLIT_TRANSACTION_IDS_USER RPC_ID_USER_STATE_SYNC |
30 | #endif | 33 | #endif |
31 | 34 | ||
32 | #ifdef AUDIO_ENABLE | 35 | #ifdef AUDIO_ENABLE |
33 | |||
34 | # define AUDIO_CLICKY | 36 | # define AUDIO_CLICKY |
35 | # define STARTUP_SONG SONG(RICK_ROLL) | ||
36 | # define GOODBYE_SONG SONG(SONIC_RING) | ||
37 | # define DEFAULT_LAYER_SONGS \ | ||
38 | { SONG(QWERTY_SOUND), SONG(COLEMAK_SOUND), SONG(DVORAK_SOUND), SONG(OVERWATCH_THEME) } | ||
39 | |||
40 | # define AUDIO_CLICKY_FREQ_RANDOMNESS 1.5f | 37 | # define AUDIO_CLICKY_FREQ_RANDOMNESS 1.5f |
41 | 38 | ||
42 | # define UNICODE_SONG_MAC SONG(RICK_ROLL) | 39 | # ifdef USER_SONG_LIST |
43 | # define UNICODE_SONG_LNX SONG(RICK_ROLL) | 40 | # define STARTUP_SONG SONG(RICK_ROLL) |
44 | # define UNICODE_SONG_WIN SONG(RICK_ROLL) | 41 | # define GOODBYE_SONG SONG(SONIC_RING) |
45 | # define UNICODE_SONG_BSD SONG(RICK_ROLL) | 42 | # define DEFAULT_LAYER_SONGS \ |
46 | # define UNICODE_SONG_WINC SONG(RICK_ROLL) | 43 | { SONG(QWERTY_SOUND), SONG(COLEMAK_SOUND), SONG(DVORAK_SOUND), SONG(OVERWATCH_THEME) } |
47 | #endif // !AUDIO_ENABLE | 44 | # define UNICODE_SONG_MAC SONG(MARIO_THEME) |
45 | # define UNICODE_SONG_LNX SONG(MARIO_POWERUP) | ||
46 | # define UNICODE_SONG_WIN SONG(MARIO_ONEUP) | ||
47 | # define UNICODE_SONG_BSD SONG(RICK_ROLL) | ||
48 | # define UNICODE_SONG_WINC SONG(RICK_ROLL) | ||
49 | # else | ||
50 | # define STARTUP_SONG SONG(STARTUP_SOUND) | ||
51 | # define GOODBYE_SONG SONG(GOODBYE_SOUND) | ||
52 | # define DEFAULT_LAYER_SONGS \ | ||
53 | { SONG(QWERTY_SOUND), SONG(COLEMAK_SOUND), SONG(DVORAK_SOUND), SONG(WORKMAN_SOUND) } | ||
54 | # define UNICODE_SONG_MAC SONG(QWERTY_SOUND) | ||
55 | # define UNICODE_SONG_LNX SONG(COLEMAK_SOUND) | ||
56 | # define UNICODE_SONG_WIN SONG(DVORAK_SOUND) | ||
57 | # define UNICODE_SONG_BSD SONG(WORKMAN_SOUND) | ||
58 | # define UNICODE_SONG_WINC SONG(PLOVER_GOODBYE_SOUND) | ||
59 | # endif | ||
60 | #endif // !AUDIO_ENABLE | ||
61 | |||
62 | #define UNICODE_SELECTED_MODES UC_WIN, UC_MAC | ||
48 | 63 | ||
49 | #ifdef RGBLIGHT_ENABLE | 64 | #ifdef RGBLIGHT_ENABLE |
50 | # define RGBLIGHT_SLEEP | 65 | # define RGBLIGHT_SLEEP |
@@ -56,18 +71,16 @@ | |||
56 | # else | 71 | # else |
57 | # define RGBLIGHT_ANIMATIONS | 72 | # define RGBLIGHT_ANIMATIONS |
58 | # endif | 73 | # endif |
59 | # define RGBLIGHT_EFFECT_TWINKLE_LIFE 250 | 74 | # define RGBLIGHT_EFFECT_TWINKLE_LIFE 250 |
60 | # define RGBLIGHT_EFFECT_TWINKLE_PROBABILITY 1/24 | 75 | # define RGBLIGHT_EFFECT_TWINKLE_PROBABILITY 1 / 24 |
61 | #endif // RGBLIGHT_ENABLE | 76 | #endif // RGBLIGHT_ENABLE |
62 | 77 | ||
63 | #ifdef RGB_MATRIX_ENABLE | 78 | #ifdef RGB_MATRIX_ENABLE |
64 | # define RGB_MATRIX_KEYPRESSES // reacts to keypresses (will slow down matrix scan by a lot) | 79 | # define RGB_MATRIX_KEYPRESSES // reacts to keypresses (will slow down matrix scan by a lot) |
65 | // # define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (not recommened) | 80 | // # define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (not recommened) |
66 | # define RGB_MATRIX_FRAMEBUFFER_EFFECTS | 81 | # define RGB_MATRIX_FRAMEBUFFER_EFFECTS |
67 | // # define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects | 82 | // # define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects |
68 | # define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended | 83 | // # define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended |
69 | // # define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255 | ||
70 | // # define EECONFIG_RGB_MATRIX (uint32_t *)16 | ||
71 | 84 | ||
72 | # if defined(__AVR__) && !defined(__AVR_AT90USB1286__) && !defined(KEYBOARD_launchpad) | 85 | # if defined(__AVR__) && !defined(__AVR_AT90USB1286__) && !defined(KEYBOARD_launchpad) |
73 | # define DISABLE_RGB_MATRIX_ALPHAS_MODS | 86 | # define DISABLE_RGB_MATRIX_ALPHAS_MODS |
@@ -107,8 +120,8 @@ | |||
107 | # define DISABLE_RGB_MATRIX_MULTISPLASH | 120 | # define DISABLE_RGB_MATRIX_MULTISPLASH |
108 | # define DISABLE_RGB_MATRIX_SOLID_SPLASH | 121 | # define DISABLE_RGB_MATRIX_SOLID_SPLASH |
109 | # define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH | 122 | # define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH |
110 | # endif // AVR | 123 | # endif // AVR |
111 | #endif // RGB_MATRIX_ENABLE | 124 | #endif // RGB_MATRIX_ENABLE |
112 | 125 | ||
113 | #ifdef OLED_DRIVER_ENABLE | 126 | #ifdef OLED_DRIVER_ENABLE |
114 | # ifdef SPLIT_KEYBOARD | 127 | # ifdef SPLIT_KEYBOARD |
@@ -120,7 +133,7 @@ | |||
120 | # ifdef OLED_FONT_H | 133 | # ifdef OLED_FONT_H |
121 | # undef OLED_FONT_H | 134 | # undef OLED_FONT_H |
122 | # endif | 135 | # endif |
123 | # define OLED_FONT_H "drashna_font.h" | 136 | # define OLED_FONT_H "drashna_font.h" |
124 | # define OLED_FONT_END 255 | 137 | # define OLED_FONT_END 255 |
125 | // # define OLED_FONT_5X5 | 138 | // # define OLED_FONT_5X5 |
126 | // # define OLED_FONT_AZTECH | 139 | // # define OLED_FONT_AZTECH |
@@ -135,16 +148,16 @@ | |||
135 | 148 | ||
136 | #ifndef ONESHOT_TAP_TOGGLE | 149 | #ifndef ONESHOT_TAP_TOGGLE |
137 | # define ONESHOT_TAP_TOGGLE 2 | 150 | # define ONESHOT_TAP_TOGGLE 2 |
138 | #endif // !ONESHOT_TAP_TOGGLE | 151 | #endif // !ONESHOT_TAP_TOGGLE |
139 | 152 | ||
140 | #ifndef ONESHOT_TIMEOUT | 153 | #ifndef ONESHOT_TIMEOUT |
141 | # define ONESHOT_TIMEOUT 3000 | 154 | # define ONESHOT_TIMEOUT 3000 |
142 | #endif // !ONESHOT_TIMEOUT | 155 | #endif // !ONESHOT_TIMEOUT |
143 | 156 | ||
144 | #ifdef QMK_KEYS_PER_SCAN | 157 | #ifdef QMK_KEYS_PER_SCAN |
145 | # undef QMK_KEYS_PER_SCAN | 158 | # undef QMK_KEYS_PER_SCAN |
146 | # define QMK_KEYS_PER_SCAN 2 | 159 | # define QMK_KEYS_PER_SCAN 2 |
147 | #endif // !QMK_KEYS_PER_SCAN | 160 | #endif // !QMK_KEYS_PER_SCAN |
148 | 161 | ||
149 | // this makes it possible to do rolling combos (zx) with keys that | 162 | // this makes it possible to do rolling combos (zx) with keys that |
150 | // convert to other keys on hold (z becomes ctrl when you hold it, | 163 | // convert to other keys on hold (z becomes ctrl when you hold it, |
@@ -152,8 +165,8 @@ | |||
152 | // actually sends Ctrl-x. That's bad.) | 165 | // actually sends Ctrl-x. That's bad.) |
153 | #define IGNORE_MOD_TAP_INTERRUPT | 166 | #define IGNORE_MOD_TAP_INTERRUPT |
154 | #undef PERMISSIVE_HOLD | 167 | #undef PERMISSIVE_HOLD |
155 | //#define TAPPING_FORCE_HOLD | 168 | //#define TAPPING_FORCE_HOLD_PER_KEY |
156 | //#define RETRO_TAPPING | 169 | //#define RETRO_TAPPING_PER_KEY |
157 | #ifndef KEYBOARD_kyria_rev1 | 170 | #ifndef KEYBOARD_kyria_rev1 |
158 | # define TAPPING_TERM_PER_KEY | 171 | # define TAPPING_TERM_PER_KEY |
159 | #endif | 172 | #endif |
@@ -166,7 +179,7 @@ | |||
166 | 179 | ||
167 | #ifdef TAPPING_TERM | 180 | #ifdef TAPPING_TERM |
168 | # undef TAPPING_TERM | 181 | # undef TAPPING_TERM |
169 | #endif // TAPPING_TERM | 182 | #endif // TAPPING_TERM |
170 | #if defined(KEYBOARD_ergodox_ez) | 183 | #if defined(KEYBOARD_ergodox_ez) |
171 | # define TAPPING_TERM 185 | 184 | # define TAPPING_TERM 185 |
172 | #elif defined(KEYBOARD_crkbd) | 185 | #elif defined(KEYBOARD_crkbd) |
@@ -185,14 +198,16 @@ | |||
185 | # undef LOCKING_RESYNC_ENABLE | 198 | # undef LOCKING_RESYNC_ENABLE |
186 | #endif | 199 | #endif |
187 | 200 | ||
201 | #define LAYER_STATE_16BIT | ||
202 | |||
188 | #ifdef CONVERT_TO_PROTON_C | 203 | #ifdef CONVERT_TO_PROTON_C |
189 | // pins that are available but not present on Pro Micro | 204 | // pins that are available but not present on Pro Micro |
190 | # define A3 PAL_LINE(GPIOA, 3) | 205 | # define A3 PAL_LINE(GPIOA, 3) |
191 | # define A4 PAL_LINE(GPIOA, 4) | 206 | # define A4 PAL_LINE(GPIOA, 4) |
192 | # define A5 PAL_LINE(GPIOA, 5) | 207 | # define A5 PAL_LINE(GPIOA, 5) |
193 | # define A6 PAL_LINE(GPIOA, 6) | 208 | # define A6 PAL_LINE(GPIOA, 6) |
194 | # define A7 PAL_LINE(GPIOA, 7) | 209 | # define A7 PAL_LINE(GPIOA, 7) |
195 | # define A8 PAL_LINE(GPIOA, 8) | 210 | # define A8 PAL_LINE(GPIOA, 8) |
196 | # define A13 PAL_LINE(GPIOA, 13) | 211 | # define A13 PAL_LINE(GPIOA, 13) |
197 | # define A14 PAL_LINE(GPIOA, 14) | 212 | # define A14 PAL_LINE(GPIOA, 14) |
198 | # define A15 PAL_LINE(GPIOA, 15) | 213 | # define A15 PAL_LINE(GPIOA, 15) |
@@ -203,3 +218,79 @@ | |||
203 | # define C14 PAL_LINE(GPIOC, 14) | 218 | # define C14 PAL_LINE(GPIOC, 14) |
204 | # define C15 PAL_LINE(GPIOC, 15) | 219 | # define C15 PAL_LINE(GPIOC, 15) |
205 | #endif | 220 | #endif |
221 | |||
222 | #ifdef MOUSEKEY_ENABLE | ||
223 | // mouse movement config | ||
224 | # ifdef MK_3_SPEED | ||
225 | # undef MK_3_SPEED | ||
226 | # endif | ||
227 | # define MK_KINETIC_SPEED | ||
228 | # ifdef MK_KINETIC_SPEED | ||
229 | # ifndef MOUSEKEY_DELAY | ||
230 | # define MOUSEKEY_DELAY 8 | ||
231 | # endif | ||
232 | # ifndef MOUSEKEY_INTERVAL | ||
233 | # define MOUSEKEY_INTERVAL 20 | ||
234 | # endif | ||
235 | # ifdef MOUSEKEY_MOVE_DELTA | ||
236 | # define MOUSEKEY_MOVE_DELTA 25 | ||
237 | # endif | ||
238 | # else | ||
239 | # ifndef MOUSEKEY_DELAY | ||
240 | # define MOUSEKEY_DELAY 300 | ||
241 | # endif | ||
242 | # ifndef MOUSEKEY_INTERVAL | ||
243 | # define MOUSEKEY_INTERVAL 50 | ||
244 | # endif | ||
245 | # ifndef MOUSEKEY_MOVE_DELTA | ||
246 | # define MOUSEKEY_MOVE_DELTA 5 | ||
247 | # endif | ||
248 | # endif | ||
249 | # ifndef MOUSEKEY_MAX_SPEED | ||
250 | # define MOUSEKEY_MAX_SPEED 7 | ||
251 | # endif | ||
252 | # ifndef MOUSEKEY_TIME_TO_MAX | ||
253 | # define MOUSEKEY_TIME_TO_MAX 60 | ||
254 | # endif | ||
255 | # ifndef MOUSEKEY_INITIAL_SPEED | ||
256 | # define MOUSEKEY_INITIAL_SPEED 100 | ||
257 | # endif | ||
258 | # ifndef MOUSEKEY_BASE_SPEED | ||
259 | # define MOUSEKEY_BASE_SPEED 1000 | ||
260 | # endif | ||
261 | # ifndef MOUSEKEY_DECELERATED_SPEED | ||
262 | # define MOUSEKEY_DECELERATED_SPEED 400 | ||
263 | # endif | ||
264 | # ifndef MOUSEKEY_ACCELERATED_SPEED | ||
265 | # define MOUSEKEY_ACCELERATED_SPEED 3000 | ||
266 | # endif | ||
267 | // mouse scroll config | ||
268 | # ifndef MOUSEKEY_WHEEL_DELAY | ||
269 | # define MOUSEKEY_WHEEL_DELAY 15 | ||
270 | # endif | ||
271 | # ifndef MOUSEKEY_WHEEL_DELTA | ||
272 | # define MOUSEKEY_WHEEL_DELTA 1 | ||
273 | # endif | ||
274 | # ifndef MOUSEKEY_WHEEL_INTERVAL | ||
275 | # define MOUSEKEY_WHEEL_INTERVAL 50 | ||
276 | # endif | ||
277 | # ifndef MOUSEKEY_WHEEL_MAX_SPEED | ||
278 | # define MOUSEKEY_WHEEL_MAX_SPEED 8 | ||
279 | # endif | ||
280 | # ifndef MOUSEKEY_WHEEL_TIME_TO_MAX | ||
281 | # define MOUSEKEY_WHEEL_TIME_TO_MAX 80 | ||
282 | # endif | ||
283 | // mouse scroll kinetic config | ||
284 | # ifndef MOUSEKEY_WHEEL_INITIAL_MOVEMENTS | ||
285 | # define MOUSEKEY_WHEEL_INITIAL_MOVEMENTS 8 | ||
286 | # endif | ||
287 | # ifndef MOUSEKEY_WHEEL_BASE_MOVEMENTS | ||
288 | # define MOUSEKEY_WHEEL_BASE_MOVEMENTS 48 | ||
289 | # endif | ||
290 | # ifndef MOUSEKEY_WHEEL_ACCELERATED_MOVEMENTS | ||
291 | # define MOUSEKEY_WHEEL_ACCELERATED_MOVEMENTS 48 | ||
292 | # endif | ||
293 | # ifndef MOUSEKEY_WHEEL_DECELERATED_MOVEMENTS | ||
294 | # define MOUSEKEY_WHEEL_DECELERATED_MOVEMENTS 8 | ||
295 | # endif | ||
296 | #endif // MOUSEKEY_ENABLE | ||
diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index a49373726..b54d0cfcc 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c | |||
@@ -86,6 +86,9 @@ void keyboard_post_init_user(void) { | |||
86 | #if defined(RGB_MATRIX_ENABLE) | 86 | #if defined(RGB_MATRIX_ENABLE) |
87 | keyboard_post_init_rgb_matrix(); | 87 | keyboard_post_init_rgb_matrix(); |
88 | #endif | 88 | #endif |
89 | #if defined(SPLIT_KEYBOARD) && defined(SPLIT_TRANSACTION_IDS_USER) | ||
90 | keyboard_post_init_transport_sync(); | ||
91 | #endif | ||
89 | keyboard_post_init_keymap(); | 92 | keyboard_post_init_keymap(); |
90 | } | 93 | } |
91 | 94 | ||
@@ -100,12 +103,12 @@ void shutdown_user(void) { | |||
100 | rgblight_enable_noeeprom(); | 103 | rgblight_enable_noeeprom(); |
101 | rgblight_mode_noeeprom(1); | 104 | rgblight_mode_noeeprom(1); |
102 | rgblight_setrgb_red(); | 105 | rgblight_setrgb_red(); |
103 | #endif // RGBLIGHT_ENABLE | 106 | #endif // RGBLIGHT_ENABLE |
104 | #ifdef RGB_MATRIX_ENABLE | 107 | #ifdef RGB_MATRIX_ENABLE |
105 | rgb_matrix_set_color_all(0xFF, 0x00, 0x00); | 108 | rgb_matrix_set_color_all(0xFF, 0x00, 0x00); |
106 | rgb_matrix_update_pwm_buffers(); | 109 | rgb_matrix_update_pwm_buffers(); |
107 | 110 | ||
108 | #endif // RGB_MATRIX_ENABLE | 111 | #endif // RGB_MATRIX_ENABLE |
109 | shutdown_keymap(); | 112 | shutdown_keymap(); |
110 | } | 113 | } |
111 | 114 | ||
@@ -120,7 +123,11 @@ void suspend_power_down_user(void) { | |||
120 | 123 | ||
121 | __attribute__((weak)) void suspend_wakeup_init_keymap(void) {} | 124 | __attribute__((weak)) void suspend_wakeup_init_keymap(void) {} |
122 | 125 | ||
123 | void suspend_wakeup_init_user(void) { suspend_wakeup_init_keymap(); } | 126 | void suspend_wakeup_init_user(void) { |
127 | if (layer_state_is(_GAMEPAD)) { layer_off(_GAMEPAD); } | ||
128 | if (layer_state_is(_DIABLO)) { layer_off(_DIABLO); } | ||
129 | suspend_wakeup_init_keymap(); | ||
130 | } | ||
124 | 131 | ||
125 | __attribute__((weak)) void matrix_scan_keymap(void) {} | 132 | __attribute__((weak)) void matrix_scan_keymap(void) {} |
126 | 133 | ||
@@ -135,13 +142,13 @@ void matrix_scan_user(void) { | |||
135 | startup_user(); | 142 | startup_user(); |
136 | } | 143 | } |
137 | 144 | ||
138 | #ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code. | 145 | #ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code. |
139 | run_diablo_macro_check(); | 146 | run_diablo_macro_check(); |
140 | #endif // TAP_DANCE_ENABLE | 147 | #endif // TAP_DANCE_ENABLE |
141 | 148 | ||
142 | #if defined(RGBLIGHT_ENABLE) | 149 | #if defined(RGBLIGHT_ENABLE) |
143 | matrix_scan_rgb_light(); | 150 | matrix_scan_rgb_light(); |
144 | #endif // RGBLIGHT_ENABLE | 151 | #endif // RGBLIGHT_ENABLE |
145 | #if defined(RGB_MATRIX_ENABLE) | 152 | #if defined(RGB_MATRIX_ENABLE) |
146 | matrix_scan_rgb_matrix(); | 153 | matrix_scan_rgb_matrix(); |
147 | #endif | 154 | #endif |
@@ -160,15 +167,13 @@ __attribute__((weak)) layer_state_t layer_state_set_keymap(layer_state_t state) | |||
160 | // on layer change, no matter where the change was initiated | 167 | // on layer change, no matter where the change was initiated |
161 | // Then runs keymap's layer change check | 168 | // Then runs keymap's layer change check |
162 | layer_state_t layer_state_set_user(layer_state_t state) { | 169 | layer_state_t layer_state_set_user(layer_state_t state) { |
163 | if (!is_keyboard_master()) { | 170 | if (!is_keyboard_master()) { return state; } |
164 | return state; | ||
165 | } | ||
166 | 171 | ||
167 | state = layer_state_set_keymap(state); | 172 | state = layer_state_set_keymap(state); |
168 | state = update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST); | 173 | state = update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST); |
169 | #if defined(RGBLIGHT_ENABLE) | 174 | #if defined(RGBLIGHT_ENABLE) |
170 | state = layer_state_set_rgb_light(state); | 175 | state = layer_state_set_rgb_light(state); |
171 | #endif // RGBLIGHT_ENABLE | 176 | #endif // RGBLIGHT_ENABLE |
172 | #if defined(AUDIO_ENABLE) && !defined(__arm__) | 177 | #if defined(AUDIO_ENABLE) && !defined(__arm__) |
173 | static bool is_gamepad_on = false; | 178 | static bool is_gamepad_on = false; |
174 | if (layer_state_cmp(state, _GAMEPAD) != is_gamepad_on) { | 179 | if (layer_state_cmp(state, _GAMEPAD) != is_gamepad_on) { |
@@ -187,15 +192,13 @@ __attribute__((weak)) layer_state_t default_layer_state_set_keymap(layer_state_t | |||
187 | 192 | ||
188 | // Runs state check and changes underglow color and animation | 193 | // Runs state check and changes underglow color and animation |
189 | layer_state_t default_layer_state_set_user(layer_state_t state) { | 194 | layer_state_t default_layer_state_set_user(layer_state_t state) { |
190 | if (!is_keyboard_master()) { | 195 | if (!is_keyboard_master()) { return state; } |
191 | return state; | ||
192 | } | ||
193 | 196 | ||
194 | state = default_layer_state_set_keymap(state); | 197 | state = default_layer_state_set_keymap(state); |
195 | #if 0 | 198 | #if 0 |
196 | # if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) | 199 | # if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) |
197 | state = default_layer_state_set_rgb(state); | 200 | state = default_layer_state_set_rgb(state); |
198 | # endif // RGBLIGHT_ENABLE | 201 | # endif // RGBLIGHT_ENABLE |
199 | #endif | 202 | #endif |
200 | return state; | 203 | return state; |
201 | } | 204 | } |
diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h index e37c73bb2..f1d756f74 100644 --- a/users/drashna/drashna.h +++ b/users/drashna/drashna.h | |||
@@ -22,7 +22,7 @@ | |||
22 | #include "process_records.h" | 22 | #include "process_records.h" |
23 | #ifdef TAP_DANCE_ENABLE | 23 | #ifdef TAP_DANCE_ENABLE |
24 | # include "tap_dances.h" | 24 | # include "tap_dances.h" |
25 | #endif // TAP_DANCE_ENABLE | 25 | #endif // TAP_DANCE_ENABLE |
26 | #if defined(RGBLIGHT_ENABLE) | 26 | #if defined(RGBLIGHT_ENABLE) |
27 | # include "rgb_stuff.h" | 27 | # include "rgb_stuff.h" |
28 | #endif | 28 | #endif |
@@ -35,6 +35,9 @@ | |||
35 | #if defined(PIMORONI_TRACKBALL_ENABLE) | 35 | #if defined(PIMORONI_TRACKBALL_ENABLE) |
36 | # include "drivers/sensors/pimoroni_trackball.h" | 36 | # include "drivers/sensors/pimoroni_trackball.h" |
37 | #endif | 37 | #endif |
38 | #ifdef SPLIT_KEYBOARD | ||
39 | # include "transport_sync.h" | ||
40 | #endif | ||
38 | 41 | ||
39 | /* Define layer names */ | 42 | /* Define layer names */ |
40 | enum userspace_layers { | 43 | enum userspace_layers { |
@@ -98,12 +101,12 @@ We use custom codes here, so we can substitute the right stuff | |||
98 | # define KC_D3_2 TD(TD_D3_2) | 101 | # define KC_D3_2 TD(TD_D3_2) |
99 | # define KC_D3_3 TD(TD_D3_3) | 102 | # define KC_D3_3 TD(TD_D3_3) |
100 | # define KC_D3_4 TD(TD_D3_4) | 103 | # define KC_D3_4 TD(TD_D3_4) |
101 | #else // TAP_DANCE_ENABLE | 104 | #else // TAP_DANCE_ENABLE |
102 | # define KC_D3_1 KC_1 | 105 | # define KC_D3_1 KC_1 |
103 | # define KC_D3_2 KC_2 | 106 | # define KC_D3_2 KC_2 |
104 | # define KC_D3_3 KC_3 | 107 | # define KC_D3_3 KC_3 |
105 | # define KC_D3_4 KC_4 | 108 | # define KC_D3_4 KC_4 |
106 | #endif // TAP_DANCE_ENABLE | 109 | #endif // TAP_DANCE_ENABLE |
107 | 110 | ||
108 | #if defined(DRASHNA_CUSTOM_TRANSPORT) && defined(POINTING_DEVICE_ENABLE) | 111 | #if defined(DRASHNA_CUSTOM_TRANSPORT) && defined(POINTING_DEVICE_ENABLE) |
109 | void master_mouse_send(int8_t x, int8_t y); | 112 | void master_mouse_send(int8_t x, int8_t y); |
diff --git a/users/drashna/drashna_font.h b/users/drashna/drashna_font.h index 6a3865a44..46ebf3710 100644 --- a/users/drashna/drashna_font.h +++ b/users/drashna/drashna_font.h | |||
@@ -5,8 +5,9 @@ | |||
5 | 5 | ||
6 | #include "progmem.h" | 6 | #include "progmem.h" |
7 | 7 | ||
8 | // clang-format off | ||
8 | static const unsigned char font[] PROGMEM = { | 9 | static const unsigned char font[] PROGMEM = { |
9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 0 | 10 | 0x07, 0x08, 0x7F, 0x08, 0x07, 0x00, // 0x00 0 |
10 | 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, // 0x01 1 | 11 | 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, // 0x01 1 |
11 | 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, // 0x02 2 | 12 | 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, // 0x02 2 |
12 | 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, // 0x03 3 ♥ | 13 | 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, // 0x03 3 ♥ |
@@ -1304,3 +1305,5 @@ static const unsigned char font[] PROGMEM = { | |||
1304 | 1305 | ||
1305 | #endif | 1306 | #endif |
1306 | }; | 1307 | }; |
1308 | |||
1309 | // clang-format on | ||
diff --git a/users/drashna/drashna_transport.c b/users/drashna/drashna_transport.c deleted file mode 100644 index 9df11c9bd..000000000 --- a/users/drashna/drashna_transport.c +++ /dev/null | |||
@@ -1,603 +0,0 @@ | |||
1 | /* Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com> | ||
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 "matrix.h" | ||
21 | #include QMK_KEYBOARD_H | ||
22 | |||
23 | #define ROWS_PER_HAND (MATRIX_ROWS / 2) | ||
24 | #define SYNC_TIMER_OFFSET 2 | ||
25 | |||
26 | #ifdef RGBLIGHT_ENABLE | ||
27 | # include "rgblight.h" | ||
28 | #endif | ||
29 | |||
30 | #ifdef BACKLIGHT_ENABLE | ||
31 | # include "backlight.h" | ||
32 | #endif | ||
33 | |||
34 | #ifdef ENCODER_ENABLE | ||
35 | # include "encoder.h" | ||
36 | static pin_t encoders_pad[] = ENCODERS_PAD_A; | ||
37 | # define NUMBER_OF_ENCODERS (sizeof(encoders_pad) / sizeof(pin_t)) | ||
38 | #endif | ||
39 | |||
40 | #ifdef POINTING_DEVICE_ENABLE | ||
41 | static uint16_t device_cpi = 0; | ||
42 | static int8_t split_mouse_x = 0, split_mouse_y = 0; | ||
43 | #endif | ||
44 | |||
45 | #ifdef OLED_DRIVER_ENABLE | ||
46 | # include "oled_driver.h" | ||
47 | #endif | ||
48 | |||
49 | #if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
50 | # include "led_matrix.h" | ||
51 | #endif | ||
52 | #if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
53 | # include "rgb_matrix.h" | ||
54 | #endif | ||
55 | |||
56 | #if defined(USE_I2C) | ||
57 | |||
58 | # include "i2c_master.h" | ||
59 | # include "i2c_slave.h" | ||
60 | |||
61 | typedef struct _I2C_slave_buffer_t { | ||
62 | # ifndef DISABLE_SYNC_TIMER | ||
63 | uint32_t sync_timer; | ||
64 | # endif | ||
65 | # ifdef SPLIT_TRANSPORT_MIRROR | ||
66 | matrix_row_t mmatrix[ROWS_PER_HAND]; | ||
67 | # endif | ||
68 | matrix_row_t smatrix[ROWS_PER_HAND]; | ||
69 | # ifdef SPLIT_MODS_ENABLE | ||
70 | uint8_t real_mods; | ||
71 | uint8_t weak_mods; | ||
72 | # ifndef NO_ACTION_ONESHOT | ||
73 | uint8_t oneshot_mods; | ||
74 | # endif | ||
75 | # endif | ||
76 | # ifdef BACKLIGHT_ENABLE | ||
77 | uint8_t backlight_level; | ||
78 | # endif | ||
79 | # if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
80 | rgblight_syncinfo_t rgblight_sync; | ||
81 | # endif | ||
82 | # ifdef ENCODER_ENABLE | ||
83 | uint8_t encoder_state[NUMBER_OF_ENCODERS]; | ||
84 | # endif | ||
85 | # ifdef WPM_ENABLE | ||
86 | uint8_t current_wpm; | ||
87 | # endif | ||
88 | # if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
89 | led_eeconfig_t led_matrix; | ||
90 | bool led_suspend_state; | ||
91 | # endif | ||
92 | # if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
93 | rgb_config_t rgb_matrix; | ||
94 | bool rgb_suspend_state; | ||
95 | # endif | ||
96 | int8_t mouse_x; | ||
97 | int8_t mouse_y; | ||
98 | uint16_t device_cpi; | ||
99 | bool oled_on; | ||
100 | layer_state_t t_layer_state; | ||
101 | layer_state_t t_default_layer_state; | ||
102 | } __attribute__((packed)) I2C_slave_buffer_t; | ||
103 | |||
104 | static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_reg; | ||
105 | |||
106 | # define I2C_BACKLIGHT_START offsetof(I2C_slave_buffer_t, backlight_level) | ||
107 | # define I2C_RGB_START offsetof(I2C_slave_buffer_t, rgblight_sync) | ||
108 | # define I2C_KEYMAP_MASTER_START offsetof(I2C_slave_buffer_t, mmatrix) | ||
109 | # define I2C_KEYMAP_SLAVE_START offsetof(I2C_slave_buffer_t, smatrix) | ||
110 | # define I2C_SYNC_TIME_START offsetof(I2C_slave_buffer_t, sync_timer) | ||
111 | # define I2C_REAL_MODS_START offsetof(I2C_slave_buffer_t, real_mods) | ||
112 | # define I2C_WEAK_MODS_START offsetof(I2C_slave_buffer_t, weak_mods) | ||
113 | # define I2C_ONESHOT_MODS_START offsetof(I2C_slave_buffer_t, oneshot_mods) | ||
114 | # define I2C_ENCODER_START offsetof(I2C_slave_buffer_t, encoder_state) | ||
115 | # define I2C_WPM_START offsetof(I2C_slave_buffer_t, current_wpm) | ||
116 | # define I2C_MOUSE_X_START offsetof(I2C_slave_buffer_t, mouse_x) | ||
117 | # define I2C_MOUSE_Y_START offsetof(I2C_slave_buffer_t, mouse_y) | ||
118 | # define I2C_MOUSE_DPI_START offsetof(I2C_slave_buffer_t, device_cpi) | ||
119 | # define I2C_OLED_ON_START offsetof(I2C_slave_buffer_t, oled_on) | ||
120 | # define I2C_LAYER_STATE_START offsetof(I2C_slave_buffer_t, t_layer_state) | ||
121 | # define I2C_DEFAULT_LAYER_STATE_START offsetof(I2C_slave_buffer_t, t_default_layer_state) | ||
122 | # define I2C_LED_MATRIX_START offsetof(I2C_slave_buffer_t, led_matrix) | ||
123 | # define I2C_LED_SUSPEND_START offsetof(I2C_slave_buffer_t, led_suspend_state) | ||
124 | # define I2C_RGB_MATRIX_START offsetof(I2C_slave_buffer_t, rgb_matrix) | ||
125 | # define I2C_RGB_SUSPEND_START offsetof(I2C_slave_buffer_t, rgb_suspend_state) | ||
126 | |||
127 | # define TIMEOUT 100 | ||
128 | |||
129 | # ifndef SLAVE_I2C_ADDRESS | ||
130 | # define SLAVE_I2C_ADDRESS 0x32 | ||
131 | # endif | ||
132 | |||
133 | // Get rows from other half over i2c | ||
134 | bool transport_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
135 | i2c_readReg(SLAVE_I2C_ADDRESS, I2C_KEYMAP_SLAVE_START, (void *)slave_matrix, sizeof(i2c_buffer->smatrix), TIMEOUT); | ||
136 | # ifdef SPLIT_TRANSPORT_MIRROR | ||
137 | i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_KEYMAP_MASTER_START, (void *)master_matrix, sizeof(i2c_buffer->mmatrix), TIMEOUT); | ||
138 | # endif | ||
139 | // write backlight info | ||
140 | # ifdef BACKLIGHT_ENABLE | ||
141 | uint8_t level = is_backlight_enabled() ? get_backlight_level() : 0; | ||
142 | if (level != i2c_buffer->backlight_level) { | ||
143 | if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_BACKLIGHT_START, (void *)&level, sizeof(level), TIMEOUT) >= 0) { | ||
144 | i2c_buffer->backlight_level = level; | ||
145 | } | ||
146 | } | ||
147 | # endif | ||
148 | |||
149 | # if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
150 | if (rgblight_get_change_flags()) { | ||
151 | rgblight_syncinfo_t rgblight_sync; | ||
152 | rgblight_get_syncinfo(&rgblight_sync); | ||
153 | if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_START, (void *)&rgblight_sync, sizeof(rgblight_sync), TIMEOUT) >= 0) { | ||
154 | rgblight_clear_change_flags(); | ||
155 | } | ||
156 | } | ||
157 | # endif | ||
158 | |||
159 | # ifdef ENCODER_ENABLE | ||
160 | i2c_readReg(SLAVE_I2C_ADDRESS, I2C_ENCODER_START, (void *)i2c_buffer->encoder_state, sizeof(i2c_buffer->encoder_state), TIMEOUT); | ||
161 | encoder_update_raw(i2c_buffer->encoder_state); | ||
162 | # endif | ||
163 | |||
164 | # ifdef WPM_ENABLE | ||
165 | uint8_t current_wpm = get_current_wpm(); | ||
166 | if (current_wpm != i2c_buffer->current_wpm) { | ||
167 | if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_WPM_START, (void *)¤t_wpm, sizeof(current_wpm), TIMEOUT) >= 0) { | ||
168 | i2c_buffer->current_wpm = current_wpm; | ||
169 | } | ||
170 | } | ||
171 | # endif | ||
172 | |||
173 | # ifdef POINTING_DEVICE_ENABLE | ||
174 | if (is_keyboard_left()) { | ||
175 | report_mouse_t temp_report = pointing_device_get_report(); | ||
176 | i2c_readReg(SLAVE_I2C_ADDRESS, I2C_MOUSE_X_START, (void *)&i2c_buffer->mouse_x, sizeof(i2c_buffer->mouse_x), TIMEOUT); | ||
177 | temp_report.x = i2c_buffer->mouse_x; | ||
178 | i2c_readReg(SLAVE_I2C_ADDRESS, I2C_MOUSE_Y_START, (void *)&i2c_buffer->mouse_y, sizeof(i2c_buffer->mouse_y), TIMEOUT); | ||
179 | temp_report.y = i2c_buffer->mouse_y; | ||
180 | pointing_device_set_report(temp_report); | ||
181 | |||
182 | if (device_cpi != i2c_buffer->device_cpi) { | ||
183 | if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_MOUSE_DPI_START, (void *)&device_cpi, sizeof(device_cpi), TIMEOUT) >= 0) { | ||
184 | i2c_buffer->device_cpi = device_cpi | ||
185 | } | ||
186 | } | ||
187 | } | ||
188 | # endif | ||
189 | |||
190 | # ifdef SPLIT_MODS_ENABLE | ||
191 | uint8_t real_mods = get_mods(); | ||
192 | if (real_mods != i2c_buffer->real_mods) { | ||
193 | if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_REAL_MODS_START, (void *)&real_mods, sizeof(real_mods), TIMEOUT) >= 0) { | ||
194 | i2c_buffer->real_mods = real_mods; | ||
195 | } | ||
196 | } | ||
197 | |||
198 | uint8_t weak_mods = get_weak_mods(); | ||
199 | if (weak_mods != i2c_buffer->weak_mods) { | ||
200 | if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_WEAK_MODS_START, (void *)&weak_mods, sizeof(weak_mods), TIMEOUT) >= 0) { | ||
201 | i2c_buffer->weak_mods = weak_mods; | ||
202 | } | ||
203 | } | ||
204 | |||
205 | # ifndef NO_ACTION_ONESHOT | ||
206 | uint8_t oneshot_mods = get_oneshot_mods(); | ||
207 | if (oneshot_mods != i2c_buffer->oneshot_mods) { | ||
208 | if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_ONESHOT_MODS_START, (void *)&oneshot_mods, sizeof(oneshot_mods), TIMEOUT) >= 0) { | ||
209 | i2c_buffer->oneshot_mods = oneshot_mods; | ||
210 | } | ||
211 | } | ||
212 | # endif | ||
213 | # endif | ||
214 | |||
215 | if (layer_state != i2c_buffer->t_layer_state) { | ||
216 | if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_LAYER_STATE_START, (void *)&layer_state, sizeof(layer_state), TIMEOUT) >= 0) { | ||
217 | i2c_buffer->t_layer_state = layer_state; | ||
218 | } | ||
219 | } | ||
220 | |||
221 | if (default_layer_state != i2c_buffer->t_default_layer_state) { | ||
222 | if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_DEFAULT_LAYER_STATE_START, (void *)&default_layer_state, sizeof(default_layer_state), TIMEOUT) >= 0) { | ||
223 | i2c_buffer->t_default_layer_state = default_layer_state; | ||
224 | } | ||
225 | } | ||
226 | |||
227 | # ifdef OLED_DRIVER_ENABLE | ||
228 | bool is_oled_on = is_oled_on(); | ||
229 | if (is_oled_on != i2c_buffer->oled_on) { | ||
230 | if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_LAYER_STATE_START, (void *)&is_oled_on, sizeof(is_oled_on), TIMEOUT) >= 0) { | ||
231 | i2c_buffer->oled_on = is_oled_on; | ||
232 | } | ||
233 | } | ||
234 | # endif | ||
235 | |||
236 | # if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
237 | i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_LED_MATRIX_START, (void *)led_matrix_eeconfig, sizeof(i2c_buffer->led_matrix), TIMEOUT); | ||
238 | bool suspend_state = led_matrix_get_suspend_state(); | ||
239 | i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_LED_SUSPEND_START, (void *)suspend_state, sizeof(i2c_buffer->led_suspend_state), TIMEOUT); | ||
240 | # endif | ||
241 | # if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
242 | i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_MATRIX_START, (void *)rgb_matrix_config, sizeof(i2c_buffer->rgb_matrix), TIMEOUT); | ||
243 | bool suspend_state = rgb_matrix_get_suspend_state(); | ||
244 | i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_SUSPEND_START, (void *)suspend_state, sizeof(i2c_buffer->rgb_suspend_state), TIMEOUT); | ||
245 | # endif | ||
246 | |||
247 | # ifndef DISABLE_SYNC_TIMER | ||
248 | i2c_buffer->sync_timer = sync_timer_read32() + SYNC_TIMER_OFFSET; | ||
249 | i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_SYNC_TIME_START, (void *)&i2c_buffer->sync_timer, sizeof(i2c_buffer->sync_timer), TIMEOUT); | ||
250 | # endif | ||
251 | |||
252 | return true; | ||
253 | } | ||
254 | |||
255 | void transport_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
256 | # ifndef DISABLE_SYNC_TIMER | ||
257 | sync_timer_update(i2c_buffer->sync_timer); | ||
258 | # endif | ||
259 | // Copy matrix to I2C buffer | ||
260 | memcpy((void *)i2c_buffer->smatrix, (void *)slave_matrix, sizeof(i2c_buffer->smatrix)); | ||
261 | # ifdef SPLIT_TRANSPORT_MIRROR | ||
262 | memcpy((void *)master_matrix, (void *)i2c_buffer->mmatrix, sizeof(i2c_buffer->mmatrix)); | ||
263 | # endif | ||
264 | |||
265 | // Read Backlight Info | ||
266 | # ifdef BACKLIGHT_ENABLE | ||
267 | backlight_set(i2c_buffer->backlight_level); | ||
268 | # endif | ||
269 | |||
270 | # if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
271 | // Update the RGB with the new data | ||
272 | if (i2c_buffer->rgblight_sync.status.change_flags != 0) { | ||
273 | rgblight_update_sync(&i2c_buffer->rgblight_sync, false); | ||
274 | i2c_buffer->rgblight_sync.status.change_flags = 0; | ||
275 | } | ||
276 | # endif | ||
277 | |||
278 | # ifdef ENCODER_ENABLE | ||
279 | encoder_state_raw(i2c_buffer->encoder_state); | ||
280 | # endif | ||
281 | |||
282 | # ifdef WPM_ENABLE | ||
283 | set_current_wpm(i2c_buffer->current_wpm); | ||
284 | # endif | ||
285 | |||
286 | # ifdef POINTING_DEVICE_ENABLE | ||
287 | if (!is_keyboard_left()) { | ||
288 | static uint16_t cpi; | ||
289 | if (cpi != i2c_buffer->device_cpi) { | ||
290 | cpi = i2c_buffer->device_cpi; | ||
291 | pmw_set_cpi(cpi); | ||
292 | } | ||
293 | i2c_buffer->mouse_x = split_mouse_x; | ||
294 | i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_MOUSE_X_START, (void *)&i2c_buffer->mouse_x, sizeof(i2c_buffer->mouse_x), TIMEOUT); | ||
295 | i2c_buffer->mouse_y = split_mouse_y; | ||
296 | i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_MOUSE_Y_START, (void *)&i2c_buffer->mouse_y, sizeof(i2c_buffer->mouse_y), TIMEOUT); | ||
297 | } | ||
298 | |||
299 | # endif | ||
300 | |||
301 | # ifdef SPLIT_MODS_ENABLE | ||
302 | set_mods(i2c_buffer->real_mods); | ||
303 | set_weak_mods(i2c_buffer->weak_mods); | ||
304 | # ifndef NO_ACTION_ONESHOT | ||
305 | set_oneshot_mods(i2c_buffer->oneshot_mods); | ||
306 | # endif | ||
307 | # endif | ||
308 | |||
309 | if (layer_state != i2c_buffer->t_layer_state) { | ||
310 | layer_state = i2c_buffer->t_layer_state; | ||
311 | } | ||
312 | if (default_layer_state != i2c_buffer->t_default_layer_state) { | ||
313 | default_layer_state = i2c_buffer->t_default_layer_state; | ||
314 | } | ||
315 | |||
316 | # ifdef OLED_DRIVER_ENABLE | ||
317 | if (i2c_buffer->oled_on) { | ||
318 | oled_on(); | ||
319 | } else { | ||
320 | oled_off(); | ||
321 | } | ||
322 | # endif | ||
323 | |||
324 | # if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
325 | memcpy((void *)i2c_buffer->led_matrix, (void *)led_matrix_eeconfig, sizeof(i2c_buffer->led_matrix)); | ||
326 | led_matrix_set_suspend_state(i2c_buffer->led_suspend_state); | ||
327 | # endif | ||
328 | # if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
329 | memcpy((void *)i2c_buffer->rgb_matrix, (void *)rgb_matrix_config, sizeof(i2c_buffer->rgb_matrix)); | ||
330 | rgb_matrix_set_suspend_state(i2c_buffer->rgb_suspend_state); | ||
331 | # endif | ||
332 | } | ||
333 | |||
334 | void transport_master_init(void) { i2c_init(); } | ||
335 | |||
336 | void transport_slave_init(void) { i2c_slave_init(SLAVE_I2C_ADDRESS); } | ||
337 | |||
338 | #else // USE_SERIAL | ||
339 | |||
340 | # include "serial.h" | ||
341 | |||
342 | typedef struct _Serial_s2m_buffer_t { | ||
343 | // TODO: if MATRIX_COLS > 8 change to uint8_t packed_matrix[] for pack/unpack | ||
344 | matrix_row_t smatrix[ROWS_PER_HAND]; | ||
345 | # ifdef ENCODER_ENABLE | ||
346 | uint8_t encoder_state[NUMBER_OF_ENCODERS]; | ||
347 | # endif | ||
348 | int8_t mouse_x; | ||
349 | int8_t mouse_y; | ||
350 | } __attribute__((packed)) Serial_s2m_buffer_t; | ||
351 | |||
352 | typedef struct _Serial_m2s_buffer_t { | ||
353 | # ifdef SPLIT_MODS_ENABLE | ||
354 | uint8_t real_mods; | ||
355 | uint8_t weak_mods; | ||
356 | # ifndef NO_ACTION_ONESHOT | ||
357 | uint8_t oneshot_mods; | ||
358 | # endif | ||
359 | # endif | ||
360 | # ifndef DISABLE_SYNC_TIMER | ||
361 | uint32_t sync_timer; | ||
362 | # endif | ||
363 | # ifdef SPLIT_TRANSPORT_MIRROR | ||
364 | matrix_row_t mmatrix[ROWS_PER_HAND]; | ||
365 | # endif | ||
366 | # ifdef BACKLIGHT_ENABLE | ||
367 | uint8_t backlight_level; | ||
368 | # endif | ||
369 | # ifdef WPM_ENABLE | ||
370 | uint8_t current_wpm; | ||
371 | # endif | ||
372 | uint16_t device_cpi; | ||
373 | bool oled_on; | ||
374 | layer_state_t t_layer_state; | ||
375 | layer_state_t t_default_layer_state; | ||
376 | # if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
377 | led_eeconfig_t led_matrix; | ||
378 | bool led_suspend_state; | ||
379 | # endif | ||
380 | # if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
381 | rgb_config_t rgb_matrix; | ||
382 | bool rgb_suspend_state; | ||
383 | # endif | ||
384 | } __attribute__((packed)) Serial_m2s_buffer_t; | ||
385 | |||
386 | # if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
387 | // When MCUs on both sides drive their respective RGB LED chains, | ||
388 | // it is necessary to synchronize, so it is necessary to communicate RGB | ||
389 | // information. In that case, define RGBLIGHT_SPLIT with info on the number | ||
390 | // of LEDs on each half. | ||
391 | // | ||
392 | // Otherwise, if the master side MCU drives both sides RGB LED chains, | ||
393 | // there is no need to communicate. | ||
394 | |||
395 | typedef struct _Serial_rgblight_t { | ||
396 | rgblight_syncinfo_t rgblight_sync; | ||
397 | } Serial_rgblight_t; | ||
398 | |||
399 | volatile Serial_rgblight_t serial_rgblight = {}; | ||
400 | uint8_t volatile status_rgblight = 0; | ||
401 | # endif | ||
402 | |||
403 | volatile Serial_s2m_buffer_t serial_s2m_buffer = {}; | ||
404 | volatile Serial_m2s_buffer_t serial_m2s_buffer = {}; | ||
405 | uint8_t volatile status0 = 0; | ||
406 | |||
407 | enum serial_transaction_id { | ||
408 | GET_SLAVE_MATRIX = 0, | ||
409 | # if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
410 | PUT_RGBLIGHT, | ||
411 | # endif | ||
412 | }; | ||
413 | |||
414 | SSTD_t transactions[] = { | ||
415 | [GET_SLAVE_MATRIX] = | ||
416 | { | ||
417 | (uint8_t *)&status0, | ||
418 | sizeof(serial_m2s_buffer), | ||
419 | (uint8_t *)&serial_m2s_buffer, | ||
420 | sizeof(serial_s2m_buffer), | ||
421 | (uint8_t *)&serial_s2m_buffer, | ||
422 | }, | ||
423 | # if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
424 | [PUT_RGBLIGHT] = | ||
425 | { | ||
426 | (uint8_t *)&status_rgblight, sizeof(serial_rgblight), (uint8_t *)&serial_rgblight, 0, NULL // no slave to master transfer | ||
427 | }, | ||
428 | # endif | ||
429 | }; | ||
430 | |||
431 | void transport_master_init(void) { soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } | ||
432 | |||
433 | void transport_slave_init(void) { soft_serial_target_init(transactions, TID_LIMIT(transactions)); } | ||
434 | |||
435 | # if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) | ||
436 | |||
437 | // rgblight synchronization information communication. | ||
438 | |||
439 | void transport_rgblight_master(void) { | ||
440 | if (rgblight_get_change_flags()) { | ||
441 | rgblight_get_syncinfo((rgblight_syncinfo_t *)&serial_rgblight.rgblight_sync); | ||
442 | if (soft_serial_transaction(PUT_RGBLIGHT) == TRANSACTION_END) { | ||
443 | rgblight_clear_change_flags(); | ||
444 | } | ||
445 | } | ||
446 | } | ||
447 | |||
448 | void transport_rgblight_slave(void) { | ||
449 | if (status_rgblight == TRANSACTION_ACCEPTED) { | ||
450 | rgblight_update_sync((rgblight_syncinfo_t *)&serial_rgblight.rgblight_sync, false); | ||
451 | status_rgblight = TRANSACTION_END; | ||
452 | } | ||
453 | } | ||
454 | |||
455 | # else | ||
456 | # define transport_rgblight_master() | ||
457 | # define transport_rgblight_slave() | ||
458 | # endif | ||
459 | |||
460 | bool transport_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
461 | # ifndef SERIAL_USE_MULTI_TRANSACTION | ||
462 | if (soft_serial_transaction() != TRANSACTION_END) { | ||
463 | return false; | ||
464 | } | ||
465 | # else | ||
466 | transport_rgblight_master(); | ||
467 | if (soft_serial_transaction(GET_SLAVE_MATRIX) != TRANSACTION_END) { | ||
468 | return false; | ||
469 | } | ||
470 | # endif | ||
471 | |||
472 | // TODO: if MATRIX_COLS > 8 change to unpack() | ||
473 | for (int i = 0; i < ROWS_PER_HAND; ++i) { | ||
474 | slave_matrix[i] = serial_s2m_buffer.smatrix[i]; | ||
475 | # ifdef SPLIT_TRANSPORT_MIRROR | ||
476 | serial_m2s_buffer.mmatrix[i] = master_matrix[i]; | ||
477 | # endif | ||
478 | } | ||
479 | |||
480 | # ifdef BACKLIGHT_ENABLE | ||
481 | // Write backlight level for slave to read | ||
482 | serial_m2s_buffer.backlight_level = is_backlight_enabled() ? get_backlight_level() : 0; | ||
483 | # endif | ||
484 | |||
485 | # ifdef ENCODER_ENABLE | ||
486 | encoder_update_raw((uint8_t *)serial_s2m_buffer.encoder_state); | ||
487 | # endif | ||
488 | |||
489 | # ifdef WPM_ENABLE | ||
490 | // Write wpm to slave | ||
491 | serial_m2s_buffer.current_wpm = get_current_wpm(); | ||
492 | # endif | ||
493 | |||
494 | # ifdef SPLIT_MODS_ENABLE | ||
495 | serial_m2s_buffer.real_mods = get_mods(); | ||
496 | serial_m2s_buffer.weak_mods = get_weak_mods(); | ||
497 | # ifndef NO_ACTION_ONESHOT | ||
498 | serial_m2s_buffer.oneshot_mods = get_oneshot_mods(); | ||
499 | # endif | ||
500 | # endif | ||
501 | |||
502 | # ifdef POINTING_DEVICE_ENABLE | ||
503 | if (is_keyboard_left()) { | ||
504 | report_mouse_t temp_report = pointing_device_get_report(); | ||
505 | temp_report.x = serial_s2m_buffer.mouse_x; | ||
506 | temp_report.y = serial_s2m_buffer.mouse_y; | ||
507 | pointing_device_set_report(temp_report); | ||
508 | serial_m2s_buffer.device_cpi = device_cpi; | ||
509 | } | ||
510 | # endif | ||
511 | |||
512 | serial_m2s_buffer.t_layer_state = layer_state; | ||
513 | serial_m2s_buffer.t_default_layer_state = default_layer_state; | ||
514 | # ifdef OLED_DRIVER_ENABLE | ||
515 | serial_m2s_buffer.oled_on = is_oled_on(); | ||
516 | # endif | ||
517 | |||
518 | # if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
519 | serial_m2s_buffer.led_matrix = led_matrix_eeconfig; | ||
520 | serial_m2s_buffer.led_suspend_state = led_matrix_get_suspend_state(); | ||
521 | # endif | ||
522 | # if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
523 | serial_m2s_buffer.rgb_matrix = rgb_matrix_config; | ||
524 | serial_m2s_buffer.rgb_suspend_state = rgb_matrix_get_suspend_state(); | ||
525 | # endif | ||
526 | |||
527 | # ifndef DISABLE_SYNC_TIMER | ||
528 | serial_m2s_buffer.sync_timer = sync_timer_read32() + SYNC_TIMER_OFFSET; | ||
529 | # endif | ||
530 | return true; | ||
531 | } | ||
532 | |||
533 | void transport_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { | ||
534 | transport_rgblight_slave(); | ||
535 | # ifndef DISABLE_SYNC_TIMER | ||
536 | sync_timer_update(serial_m2s_buffer.sync_timer); | ||
537 | # endif | ||
538 | |||
539 | // TODO: if MATRIX_COLS > 8 change to pack() | ||
540 | for (int i = 0; i < ROWS_PER_HAND; ++i) { | ||
541 | serial_s2m_buffer.smatrix[i] = slave_matrix[i]; | ||
542 | # ifdef SPLIT_TRANSPORT_MIRROR | ||
543 | master_matrix[i] = serial_m2s_buffer.mmatrix[i]; | ||
544 | # endif | ||
545 | } | ||
546 | |||
547 | # ifdef BACKLIGHT_ENABLE | ||
548 | backlight_set(serial_m2s_buffer.backlight_level); | ||
549 | # endif | ||
550 | |||
551 | # ifdef ENCODER_ENABLE | ||
552 | encoder_state_raw((uint8_t *)serial_s2m_buffer.encoder_state); | ||
553 | # endif | ||
554 | |||
555 | # ifdef WPM_ENABLE | ||
556 | set_current_wpm(serial_m2s_buffer.current_wpm); | ||
557 | # endif | ||
558 | |||
559 | # ifdef SPLIT_MODS_ENABLE | ||
560 | set_mods(serial_m2s_buffer.real_mods); | ||
561 | set_weak_mods(serial_m2s_buffer.weak_mods); | ||
562 | # ifndef NO_ACTION_ONESHOT | ||
563 | set_oneshot_mods(serial_m2s_buffer.oneshot_mods); | ||
564 | # endif | ||
565 | # endif | ||
566 | |||
567 | # ifdef POINTING_DEVICE_ENABLE | ||
568 | if (!is_keyboard_left()) { | ||
569 | static uint16_t cpi; | ||
570 | if (cpi != serial_m2s_buffer.device_cpi) { | ||
571 | cpi = serial_m2s_buffer.device_cpi; | ||
572 | pmw_set_cpi(cpi); | ||
573 | } | ||
574 | serial_s2m_buffer.mouse_x = split_mouse_x; | ||
575 | serial_s2m_buffer.mouse_y = split_mouse_y; | ||
576 | } | ||
577 | # endif | ||
578 | |||
579 | if (layer_state != serial_m2s_buffer.t_layer_state) { | ||
580 | layer_state = serial_m2s_buffer.t_layer_state; | ||
581 | } | ||
582 | if (default_layer_state != serial_m2s_buffer.t_default_layer_state) { | ||
583 | default_layer_state = serial_m2s_buffer.t_default_layer_state; | ||
584 | } | ||
585 | # ifdef OLED_DRIVER_ENABLE | ||
586 | if (serial_m2s_buffer.oled_on) { | ||
587 | oled_on(); | ||
588 | } else { | ||
589 | oled_off(); | ||
590 | } | ||
591 | # endif | ||
592 | |||
593 | # if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT) | ||
594 | led_matrix_eeconfig = serial_m2s_buffer.led_matrix; | ||
595 | led_matrix_set_suspend_state(serial_m2s_buffer.led_suspend_state); | ||
596 | # endif | ||
597 | # if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) | ||
598 | rgb_matrix_config = serial_m2s_buffer.rgb_matrix; | ||
599 | rgb_matrix_set_suspend_state(serial_m2s_buffer.rgb_suspend_state); | ||
600 | # endif | ||
601 | } | ||
602 | |||
603 | #endif | ||
diff --git a/users/drashna/oled_stuff.c b/users/drashna/oled_stuff.c index 98e467d93..253c5181e 100644 --- a/users/drashna/oled_stuff.c +++ b/users/drashna/oled_stuff.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #endif | 25 | #endif |
26 | 26 | ||
27 | uint32_t oled_timer = 0; | 27 | uint32_t oled_timer = 0; |
28 | static char keylog_str[KEYLOGGER_LENGTH + 1] = {"\n"}; | 28 | static char keylog_str[KEYLOGGER_LENGTH + 1] = { 0 }; |
29 | static uint16_t log_timer = 0; | 29 | static uint16_t log_timer = 0; |
30 | 30 | ||
31 | // clang-format off | 31 | // clang-format off |
@@ -57,12 +57,12 @@ void add_keylog(uint16_t keycode) { | |||
57 | keycode = 0; | 57 | keycode = 0; |
58 | } | 58 | } |
59 | 59 | ||
60 | for (uint8_t i = (KEYLOGGER_LENGTH - 1); i > 0; --i) { | 60 | for (uint8_t i = 1; i < KEYLOGGER_LENGTH; i++) { |
61 | keylog_str[i] = keylog_str[i - 1]; | 61 | keylog_str[i-1] = keylog_str[i]; |
62 | } | 62 | } |
63 | 63 | ||
64 | if (keycode < (sizeof(code_to_name) / sizeof(char))) { | 64 | if (keycode < (sizeof(code_to_name) / sizeof(char))) { |
65 | keylog_str[0] = pgm_read_byte(&code_to_name[keycode]); | 65 | keylog_str[(KEYLOGGER_LENGTH - 1)] = pgm_read_byte(&code_to_name[keycode]); |
66 | } | 66 | } |
67 | 67 | ||
68 | log_timer = timer_read(); | 68 | log_timer = timer_read(); |
@@ -92,30 +92,14 @@ void render_keylogger_status(void) { | |||
92 | void render_default_layer_state(void) { | 92 | void render_default_layer_state(void) { |
93 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_NAME), false); | 93 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_NAME), false); |
94 | switch (get_highest_layer(default_layer_state)) { | 94 | switch (get_highest_layer(default_layer_state)) { |
95 | case _QWERTY: | 95 | case _QWERTY: oled_write_P(PSTR(OLED_RENDER_LAYOUT_QWERTY), false); break; |
96 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_QWERTY), false); | 96 | case _COLEMAK: oled_write_P(PSTR(OLED_RENDER_LAYOUT_COLEMAK), false); break; |
97 | break; | 97 | case _DVORAK: oled_write_P(PSTR(OLED_RENDER_LAYOUT_DVORAK), false); break; |
98 | case _COLEMAK: | 98 | case _WORKMAN: oled_write_P(PSTR(OLED_RENDER_LAYOUT_WORKMAN), false); break; |
99 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_COLEMAK), false); | 99 | case _NORMAN: oled_write_P(PSTR(OLED_RENDER_LAYOUT_NORMAN), false); break; |
100 | break; | 100 | case _MALTRON: oled_write_P(PSTR(OLED_RENDER_LAYOUT_MALTRON), false); break; |
101 | case _DVORAK: | 101 | case _EUCALYN: oled_write_P(PSTR(OLED_RENDER_LAYOUT_EUCALYN), false); break; |
102 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_DVORAK), false); | 102 | case _CARPLAX: oled_write_P(PSTR(OLED_RENDER_LAYOUT_CARPLAX), false); break; |
103 | break; | ||
104 | case _WORKMAN: | ||
105 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_WORKMAN), false); | ||
106 | break; | ||
107 | case _NORMAN: | ||
108 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_NORMAN), false); | ||
109 | break; | ||
110 | case _MALTRON: | ||
111 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_MALTRON), false); | ||
112 | break; | ||
113 | case _EUCALYN: | ||
114 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_EUCALYN), false); | ||
115 | break; | ||
116 | case _CARPLAX: | ||
117 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_CARPLAX), false); | ||
118 | break; | ||
119 | } | 103 | } |
120 | #ifdef OLED_DISPLAY_128X64 | 104 | #ifdef OLED_DISPLAY_128X64 |
121 | oled_advance_page(true); | 105 | oled_advance_page(true); |
@@ -159,12 +143,12 @@ void render_keylock_status(uint8_t led_usb_state) { | |||
159 | } | 143 | } |
160 | void render_matrix_scan_rate(void) { | 144 | void render_matrix_scan_rate(void) { |
161 | #ifdef DEBUG_MATRIX_SCAN_RATE | 145 | #ifdef DEBUG_MATRIX_SCAN_RATE |
162 | char matrix_rate[5]; | 146 | char matrix_rate[5]; |
163 | uint16_t n = get_matrix_scan_rate(); | 147 | uint16_t n = get_matrix_scan_rate(); |
164 | matrix_rate[4] = '\0'; | 148 | matrix_rate[4] = '\0'; |
165 | matrix_rate[3] = '0' + n % 10; | 149 | matrix_rate[3] = '0' + n % 10; |
166 | matrix_rate[2] = ( n /= 10) % 10 ? '0' + (n) % 10 : (n / 10) % 10 ? '0' : ' '; | 150 | matrix_rate[2] = (n /= 10) % 10 ? '0' + (n) % 10 : (n / 10) % 10 ? '0' : ' '; |
167 | matrix_rate[1] = n / 10 ? '0' + n / 10 : ' '; | 151 | matrix_rate[1] = n / 10 ? '0' + n / 10 : ' '; |
168 | matrix_rate[0] = ' '; | 152 | matrix_rate[0] = ' '; |
169 | oled_write_P(PSTR("MS:"), false); | 153 | oled_write_P(PSTR("MS:"), false); |
170 | oled_write(matrix_rate, false); | 154 | oled_write(matrix_rate, false); |
@@ -284,6 +268,10 @@ void render_user_status(void) { | |||
284 | oled_write_P(rgb_layer_status[userspace_config.rgb_layer_change], false); | 268 | oled_write_P(rgb_layer_status[userspace_config.rgb_layer_change], false); |
285 | static const char PROGMEM nukem_good[2][3] = {{0xF8, 0xF9, 0}, {0xF6, 0xF7, 0}}; | 269 | static const char PROGMEM nukem_good[2][3] = {{0xF8, 0xF9, 0}, {0xF6, 0xF7, 0}}; |
286 | oled_write_P(nukem_good[0], userspace_config.nuke_switch); | 270 | oled_write_P(nukem_good[0], userspace_config.nuke_switch); |
271 | #if defined(UNICODE_ENABLE) | ||
272 | static const char PROGMEM uc_mod_status[5][3] = {{0xEA, 0xEB, 0}, {0xEC, 0xED, 0}}; | ||
273 | oled_write_P(uc_mod_status[get_unicode_input_mode() == UC_MAC], false); | ||
274 | #endif | ||
287 | #if defined(OLED_DISPLAY_128X64) | 275 | #if defined(OLED_DISPLAY_128X64) |
288 | oled_advance_page(true); | 276 | oled_advance_page(true); |
289 | #endif | 277 | #endif |
@@ -306,34 +294,34 @@ void render_wpm(void) { | |||
306 | char wpm_counter[4]; | 294 | char wpm_counter[4]; |
307 | wpm_counter[3] = '\0'; | 295 | wpm_counter[3] = '\0'; |
308 | wpm_counter[2] = '0' + n % 10; | 296 | wpm_counter[2] = '0' + n % 10; |
309 | wpm_counter[1] = ( n /= 10) % 10 ? '0' + (n) % 10 : (n / 10) % 10 ? '0' : ' '; | 297 | wpm_counter[1] = (n /= 10) % 10 ? '0' + (n) % 10 : (n / 10) % 10 ? '0' : ' '; |
310 | wpm_counter[0] = n / 10 ? '0' + n / 10 : ' '; | 298 | wpm_counter[0] = n / 10 ? '0' + n / 10 : ' '; |
311 | # else | 299 | # else |
312 | char wpm_counter[6]; | 300 | char wpm_counter[6]; |
313 | wpm_counter[5] = '\0'; | 301 | wpm_counter[5] = '\0'; |
314 | wpm_counter[4] = '0' + n % 10; | 302 | wpm_counter[4] = '0' + n % 10; |
315 | wpm_counter[3] = ( n /= 10) % 10 ? '0' + (n) % 10 : (n / 10) % 10 ? '0' : ' '; | 303 | wpm_counter[3] = (n /= 10) % 10 ? '0' + (n) % 10 : (n / 10) % 10 ? '0' : ' '; |
316 | wpm_counter[2] = n / 10 ? '0' + n / 10 : ' '; | 304 | wpm_counter[2] = n / 10 ? '0' + n / 10 : ' '; |
317 | wpm_counter[1] = ' '; | 305 | wpm_counter[1] = ' '; |
318 | wpm_counter[0] = ' '; | 306 | wpm_counter[0] = ' '; |
319 | # endif | 307 | # endif |
320 | oled_write_P(PSTR(OLED_RENDER_WPM_COUNTER), false); | 308 | oled_write_P(PSTR(OLED_RENDER_WPM_COUNTER), false); |
321 | oled_write(wpm_counter, false); | 309 | oled_write(wpm_counter, false); |
322 | #endif | 310 | #endif |
323 | } | 311 | } |
324 | 312 | ||
325 | #ifdef KEYBOARD_handwired_dactyl_manuform_5x6_right_trackball | 313 | #if defined(KEYBOARD_handwired_tractyl_manuform_5x6_right) |
326 | extern keyboard_config_t keyboard_config; | 314 | extern keyboard_config_t keyboard_config; |
327 | extern uint16_t dpi_array[]; | 315 | extern uint16_t dpi_array[]; |
328 | 316 | ||
329 | void render_pointing_dpi_status(void) { | 317 | void render_pointing_dpi_status(void) { |
330 | char dpi_status[6]; | 318 | char dpi_status[6]; |
331 | uint16_t n = dpi_array[keyboard_config.dpi_config]; | 319 | uint16_t n = dpi_array[keyboard_config.dpi_config]; |
332 | dpi_status[5] = '\0'; | 320 | dpi_status[5] = '\0'; |
333 | dpi_status[4] = '0' + n % 10; | 321 | dpi_status[4] = '0' + n % 10; |
334 | dpi_status[3] = ( n /= 10) % 10 ? '0' + (n) % 10 : (n / 10) % 10 ? '0' : ' '; | 322 | dpi_status[3] = (n /= 10) % 10 ? '0' + (n) % 10 : (n / 10) % 10 ? '0' : ' '; |
335 | dpi_status[2] = ( n /= 10) % 10 ? '0' + (n) % 10 : (n / 10) % 10 ? '0' : ' '; | 323 | dpi_status[2] = (n /= 10) % 10 ? '0' + (n) % 10 : (n / 10) % 10 ? '0' : ' '; |
336 | dpi_status[1] = n / 10 ? '0' + n / 10 : ' '; | 324 | dpi_status[1] = n / 10 ? '0' + n / 10 : ' '; |
337 | dpi_status[0] = ' '; | 325 | dpi_status[0] = ' '; |
338 | oled_write_P(PSTR(" DPI: "), false); | 326 | oled_write_P(PSTR(" DPI: "), false); |
339 | oled_write(dpi_status, false); | 327 | oled_write(dpi_status, false); |
@@ -360,7 +348,7 @@ void render_status_main(void) { | |||
360 | # else | 348 | # else |
361 | render_wpm(); | 349 | render_wpm(); |
362 | # endif | 350 | # endif |
363 | # ifdef KEYBOARD_handwired_dactyl_manuform_5x6_right_trackball | 351 | # if defined(KEYBOARD_handwired_tractyl_manuform_5x6_right) |
364 | render_pointing_dpi_status(); | 352 | render_pointing_dpi_status(); |
365 | # endif | 353 | # endif |
366 | oled_write_P(PSTR("\n"), false); | 354 | oled_write_P(PSTR("\n"), false); |
@@ -375,6 +363,15 @@ void render_status_main(void) { | |||
375 | render_keylogger_status(); | 363 | render_keylogger_status(); |
376 | } | 364 | } |
377 | 365 | ||
366 | __attribute__((weak)) oled_rotation_t oled_init_keymap(oled_rotation_t rotation) { return rotation; } | ||
367 | |||
368 | oled_rotation_t oled_init_user(oled_rotation_t rotation) { | ||
369 | for (uint8_t i = 0; i < (KEYLOGGER_LENGTH - 1); i++) { | ||
370 | add_keylog(0); | ||
371 | } | ||
372 | return oled_init_keymap(rotation); | ||
373 | } | ||
374 | |||
378 | void oled_task_user(void) { | 375 | void oled_task_user(void) { |
379 | update_log(); | 376 | update_log(); |
380 | 377 | ||
@@ -385,7 +382,7 @@ void oled_task_user(void) { | |||
385 | } else { | 382 | } else { |
386 | oled_on(); | 383 | oled_on(); |
387 | } | 384 | } |
388 | render_status_main(); // Renders the current keyboard state (layer, lock, caps, scroll, etc) | 385 | render_status_main(); // Renders the current keyboard state (layer, lock, caps, scroll, etc) |
389 | } else { | 386 | } else { |
390 | render_status_secondary(); | 387 | render_status_secondary(); |
391 | } | 388 | } |
diff --git a/users/drashna/oled_stuff.h b/users/drashna/oled_stuff.h index 1f4440bd4..ad9cf09ed 100644 --- a/users/drashna/oled_stuff.h +++ b/users/drashna/oled_stuff.h | |||
@@ -19,97 +19,98 @@ | |||
19 | #include "quantum.h" | 19 | #include "quantum.h" |
20 | #include "oled_driver.h" | 20 | #include "oled_driver.h" |
21 | 21 | ||
22 | void oled_driver_render_logo(void); | 22 | void oled_driver_render_logo(void); |
23 | bool process_record_user_oled(uint16_t keycode, keyrecord_t *record); | 23 | bool process_record_user_oled(uint16_t keycode, keyrecord_t *record); |
24 | oled_rotation_t oled_init_keymap(oled_rotation_t rotation); | ||
24 | extern uint32_t oled_timer; | 25 | extern uint32_t oled_timer; |
25 | 26 | ||
26 | #ifdef OLED_DISPLAY_128X64 | 27 | #ifdef OLED_DISPLAY_128X64 |
27 | # define OLED_RENDER_KEYLOGGER "Keylogger: " | 28 | # define OLED_RENDER_KEYLOGGER "Keylogger: " |
28 | 29 | ||
29 | # define OLED_RENDER_LAYOUT_NAME "Layout: " | 30 | # define OLED_RENDER_LAYOUT_NAME "Layout: " |
30 | # define OLED_RENDER_LAYOUT_QWERTY "Qwerty" | 31 | # define OLED_RENDER_LAYOUT_QWERTY "Qwerty" |
31 | # define OLED_RENDER_LAYOUT_COLEMAK "Colemak" | 32 | # define OLED_RENDER_LAYOUT_COLEMAK "Colemak" |
32 | # define OLED_RENDER_LAYOUT_DVORAK "Dvorak" | 33 | # define OLED_RENDER_LAYOUT_DVORAK "Dvorak" |
33 | # define OLED_RENDER_LAYOUT_WORKMAN "Workman" | 34 | # define OLED_RENDER_LAYOUT_WORKMAN "Workman" |
34 | # define OLED_RENDER_LAYOUT_NORMAN "Norman" | 35 | # define OLED_RENDER_LAYOUT_NORMAN "Norman" |
35 | # define OLED_RENDER_LAYOUT_MALTRON "Matron" | 36 | # define OLED_RENDER_LAYOUT_MALTRON "Matron" |
36 | # define OLED_RENDER_LAYOUT_EUCALYN "Eucalyn" | 37 | # define OLED_RENDER_LAYOUT_EUCALYN "Eucalyn" |
37 | # define OLED_RENDER_LAYOUT_CARPLAX "Carplax" | 38 | # define OLED_RENDER_LAYOUT_CARPLAX "Carplax" |
38 | 39 | ||
39 | # define OLED_RENDER_LAYER_NAME "Layer:" | 40 | # define OLED_RENDER_LAYER_NAME "Layer:" |
40 | # define OLED_RENDER_LAYER_LOWER "Lower" | 41 | # define OLED_RENDER_LAYER_LOWER "Lower" |
41 | # define OLED_RENDER_LAYER_RAISE "Raise" | 42 | # define OLED_RENDER_LAYER_RAISE "Raise" |
42 | # define OLED_RENDER_LAYER_ADJUST "Adjust" | 43 | # define OLED_RENDER_LAYER_ADJUST "Adjust" |
43 | # define OLED_RENDER_LAYER_MODS "Mods" | 44 | # define OLED_RENDER_LAYER_MODS "Mods" |
44 | 45 | ||
45 | # define OLED_RENDER_LOCK_NAME "Lock: " | 46 | # define OLED_RENDER_LOCK_NAME "Lock: " |
46 | # define OLED_RENDER_LOCK_NUML "NUML" | 47 | # define OLED_RENDER_LOCK_NUML "NUML" |
47 | # define OLED_RENDER_LOCK_CAPS "CAPS" | 48 | # define OLED_RENDER_LOCK_CAPS "CAPS" |
48 | # define OLED_RENDER_LOCK_SCLK "SCLK" | 49 | # define OLED_RENDER_LOCK_SCLK "SCLK" |
49 | 50 | ||
50 | # define OLED_RENDER_MODS_NAME "Mods:" | 51 | # define OLED_RENDER_MODS_NAME "Mods:" |
51 | # define OLED_RENDER_MODS_SFT "Sft" | 52 | # define OLED_RENDER_MODS_SFT "Sft" |
52 | # define OLED_RENDER_MODS_CTL "Ctl" | 53 | # define OLED_RENDER_MODS_CTL "Ctl" |
53 | # define OLED_RENDER_MODS_ALT "Alt" | 54 | # define OLED_RENDER_MODS_ALT "Alt" |
54 | # define OLED_RENDER_MODS_GUI "GUI" | 55 | # define OLED_RENDER_MODS_GUI "GUI" |
55 | 56 | ||
56 | # define OLED_RENDER_BOOTMAGIC_NAME "Boot " | 57 | # define OLED_RENDER_BOOTMAGIC_NAME "Boot " |
57 | # define OLED_RENDER_BOOTMAGIC_NKRO "NKRO" | 58 | # define OLED_RENDER_BOOTMAGIC_NKRO "NKRO" |
58 | # define OLED_RENDER_BOOTMAGIC_NOGUI "nGUI" | 59 | # define OLED_RENDER_BOOTMAGIC_NOGUI "nGUI" |
59 | # define OLED_RENDER_BOOTMAGIC_GRV "GRV" | 60 | # define OLED_RENDER_BOOTMAGIC_GRV "GRV" |
60 | # define OLED_RENDER_BOOTMAGIC_ONESHOT "1SHT" | 61 | # define OLED_RENDER_BOOTMAGIC_ONESHOT "1SHT" |
61 | # define OLED_RENDER_BOOTMAGIC_SWAP "SWAP" | 62 | # define OLED_RENDER_BOOTMAGIC_SWAP "SWAP" |
62 | # define OLED_RENDER_BOOTMAGIC_CAPS "CAPS" | 63 | # define OLED_RENDER_BOOTMAGIC_CAPS "CAPS" |
63 | 64 | ||
64 | # define OLED_RENDER_USER_NAME "USER:" | 65 | # define OLED_RENDER_USER_NAME "USER:" |
65 | # define OLED_RENDER_USER_ANIM "Anim" | 66 | # define OLED_RENDER_USER_ANIM "Anim" |
66 | # define OLED_RENDER_USER_LAYR "Layr" | 67 | # define OLED_RENDER_USER_LAYR "Layr" |
67 | # define OLED_RENDER_USER_NUKE "Nuke" | 68 | # define OLED_RENDER_USER_NUKE "Nuke" |
68 | 69 | ||
69 | # define OLED_RENDER_WPM_COUNTER "WPM: " | 70 | # define OLED_RENDER_WPM_COUNTER "WPM: " |
70 | #else | 71 | #else |
71 | # define OLED_RENDER_KEYLOGGER "KLogr" | 72 | # define OLED_RENDER_KEYLOGGER "KLogr" |
72 | 73 | ||
73 | # define OLED_RENDER_LAYOUT_NAME "Lyout" | 74 | # define OLED_RENDER_LAYOUT_NAME "Lyout" |
74 | # define OLED_RENDER_LAYOUT_QWERTY " QRTY" | 75 | # define OLED_RENDER_LAYOUT_QWERTY " QRTY" |
75 | # define OLED_RENDER_LAYOUT_COLEMAK " COLE" | 76 | # define OLED_RENDER_LAYOUT_COLEMAK " COLE" |
76 | # define OLED_RENDER_LAYOUT_DVORAK " DVRK" | 77 | # define OLED_RENDER_LAYOUT_DVORAK " DVRK" |
77 | # define OLED_RENDER_LAYOUT_WORKMAN " WKMN" | 78 | # define OLED_RENDER_LAYOUT_WORKMAN " WKMN" |
78 | # define OLED_RENDER_LAYOUT_NORMAN " NORM" | 79 | # define OLED_RENDER_LAYOUT_NORMAN " NORM" |
79 | # define OLED_RENDER_LAYOUT_MALTRON " MLTN" | 80 | # define OLED_RENDER_LAYOUT_MALTRON " MLTN" |
80 | # define OLED_RENDER_LAYOUT_EUCALYN " ECLN" | 81 | # define OLED_RENDER_LAYOUT_EUCALYN " ECLN" |
81 | # define OLED_RENDER_LAYOUT_CARPLAX " CRPX" | 82 | # define OLED_RENDER_LAYOUT_CARPLAX " CRPX" |
82 | 83 | ||
83 | # define OLED_RENDER_LAYER_NAME "LAYER" | 84 | # define OLED_RENDER_LAYER_NAME "LAYER" |
84 | # define OLED_RENDER_LAYER_LOWER "Lower" | 85 | # define OLED_RENDER_LAYER_LOWER "Lower" |
85 | # define OLED_RENDER_LAYER_RAISE "Raise" | 86 | # define OLED_RENDER_LAYER_RAISE "Raise" |
86 | # define OLED_RENDER_LAYER_ADJUST "Adjst" | 87 | # define OLED_RENDER_LAYER_ADJUST "Adjst" |
87 | # define OLED_RENDER_LAYER_MODS " Mods" | 88 | # define OLED_RENDER_LAYER_MODS " Mods" |
88 | 89 | ||
89 | # define OLED_RENDER_LOCK_NAME "Lock:" | 90 | # define OLED_RENDER_LOCK_NAME "Lock:" |
90 | # define OLED_RENDER_LOCK_NUML "NumL" | 91 | # define OLED_RENDER_LOCK_NUML "NumL" |
91 | # define OLED_RENDER_LOCK_CAPS "CapL" | 92 | # define OLED_RENDER_LOCK_CAPS "CapL" |
92 | # define OLED_RENDER_LOCK_SCLK "ScrL" | 93 | # define OLED_RENDER_LOCK_SCLK "ScrL" |
93 | 94 | ||
94 | # define OLED_RENDER_MODS_NAME "Mods: " | 95 | # define OLED_RENDER_MODS_NAME "Mods: " |
95 | # define OLED_RENDER_MODS_SFT "Shft" | 96 | # define OLED_RENDER_MODS_SFT "Shft" |
96 | # define OLED_RENDER_MODS_CTL "Ctrl" | 97 | # define OLED_RENDER_MODS_CTL "Ctrl" |
97 | # define OLED_RENDER_MODS_ALT "Alt\n" | 98 | # define OLED_RENDER_MODS_ALT "Alt\n" |
98 | # define OLED_RENDER_MODS_GUI "GUI\n" | 99 | # define OLED_RENDER_MODS_GUI "GUI\n" |
99 | 100 | ||
100 | # define OLED_RENDER_BOOTMAGIC_NAME "BTMGK" | 101 | # define OLED_RENDER_BOOTMAGIC_NAME "BTMGK" |
101 | # define OLED_RENDER_BOOTMAGIC_NKRO "NKRO" | 102 | # define OLED_RENDER_BOOTMAGIC_NKRO "NKRO" |
102 | # define OLED_RENDER_BOOTMAGIC_NOGUI "nGUI" | 103 | # define OLED_RENDER_BOOTMAGIC_NOGUI "nGUI" |
103 | # define OLED_RENDER_BOOTMAGIC_GRV "GRV" | 104 | # define OLED_RENDER_BOOTMAGIC_GRV "GRV" |
104 | # define OLED_RENDER_BOOTMAGIC_ONESHOT "1SHT" | 105 | # define OLED_RENDER_BOOTMAGIC_ONESHOT "1SHT" |
105 | # define OLED_RENDER_BOOTMAGIC_SWAP "SWAP" | 106 | # define OLED_RENDER_BOOTMAGIC_SWAP "SWAP" |
106 | # define OLED_RENDER_BOOTMAGIC_CAPS "CAPS" | 107 | # define OLED_RENDER_BOOTMAGIC_CAPS "CAPS" |
107 | 108 | ||
108 | # define OLED_RENDER_USER_NAME "USER:" | 109 | # define OLED_RENDER_USER_NAME "USER:" |
109 | # define OLED_RENDER_USER_ANIM "Anim" | 110 | # define OLED_RENDER_USER_ANIM "Anim" |
110 | # define OLED_RENDER_USER_LAYR "Layr" | 111 | # define OLED_RENDER_USER_LAYR "Layr" |
111 | # define OLED_RENDER_USER_NUKE "Nuke" | 112 | # define OLED_RENDER_USER_NUKE "Nuke" |
112 | 113 | ||
113 | # define OLED_RENDER_WPM_COUNTER "WPM: " | 114 | # define OLED_RENDER_WPM_COUNTER "WPM: " |
114 | 115 | ||
115 | #endif | 116 | #endif |
diff --git a/users/drashna/process_records.c b/users/drashna/process_records.c index ef901226e..124354a5b 100644 --- a/users/drashna/process_records.c +++ b/users/drashna/process_records.c | |||
@@ -29,10 +29,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
29 | // If console is enabled, it will print the matrix position and status of each key pressed | 29 | // If console is enabled, it will print the matrix position and status of each key pressed |
30 | #ifdef KEYLOGGER_ENABLE | 30 | #ifdef KEYLOGGER_ENABLE |
31 | uprintf("KL: kc: 0x%04X, col: %2u, row: %2u, pressed: %b, time: %5u, int: %b, count: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed, record->event.time, record->tap.interrupted, record->tap.count); | 31 | uprintf("KL: kc: 0x%04X, col: %2u, row: %2u, pressed: %b, time: %5u, int: %b, count: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed, record->event.time, record->tap.interrupted, record->tap.count); |
32 | #endif // KEYLOGGER_ENABLE | 32 | #endif // KEYLOGGER_ENABLE |
33 | #ifdef OLED_DRIVER_ENABLE | 33 | #ifdef OLED_DRIVER_ENABLE |
34 | process_record_user_oled(keycode, record); | 34 | process_record_user_oled(keycode, record); |
35 | #endif // OLED | 35 | #endif // OLED |
36 | 36 | ||
37 | if (!(process_record_keymap(keycode, record) && process_record_secrets(keycode, record) | 37 | if (!(process_record_keymap(keycode, record) && process_record_secrets(keycode, record) |
38 | #ifdef RGB_MATRIX_ENABLE | 38 | #ifdef RGB_MATRIX_ENABLE |
@@ -59,7 +59,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
59 | } | 59 | } |
60 | break; | 60 | break; |
61 | 61 | ||
62 | case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader | 62 | case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader |
63 | if (!record->event.pressed) { | 63 | if (!record->event.pressed) { |
64 | #ifndef MAKE_BOOTLOADER | 64 | #ifndef MAKE_BOOTLOADER |
65 | uint8_t temp_mod = mod_config(get_mods()); | 65 | uint8_t temp_mod = mod_config(get_mods()); |
@@ -90,56 +90,44 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
90 | 90 | ||
91 | break; | 91 | break; |
92 | 92 | ||
93 | case VRSN: // Prints firmware version | 93 | case VRSN: // Prints firmware version |
94 | if (record->event.pressed) { | 94 | if (record->event.pressed) { send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), TAP_CODE_DELAY); } |
95 | send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), TAP_CODE_DELAY); | ||
96 | } | ||
97 | break; | 95 | break; |
98 | 96 | ||
99 | case KC_DIABLO_CLEAR: // reset all Diablo timers, disabling them | 97 | case KC_DIABLO_CLEAR: // reset all Diablo timers, disabling them |
100 | #ifdef TAP_DANCE_ENABLE | 98 | #ifdef TAP_DANCE_ENABLE |
101 | if (record->event.pressed) { | 99 | if (record->event.pressed) { |
102 | for (uint8_t index = 0; index < 4; index++) { | 100 | for (uint8_t index = 0; index < 4; index++) { diablo_timer[index].key_interval = 0; } |
103 | diablo_timer[index].key_interval = 0; | ||
104 | } | ||
105 | } | 101 | } |
106 | #endif // TAP_DANCE_ENABLE | 102 | #endif // TAP_DANCE_ENABLE |
107 | break; | 103 | break; |
108 | 104 | ||
109 | case KC_CCCV: // One key copy/paste | 105 | case KC_CCCV: // One key copy/paste |
110 | if (record->event.pressed) { | 106 | if (record->event.pressed) { |
111 | copy_paste_timer = timer_read(); | 107 | copy_paste_timer = timer_read(); |
112 | } else { | 108 | } else { |
113 | if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy | 109 | if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy |
114 | tap_code16(LCTL(KC_C)); | 110 | tap_code16(LCTL(KC_C)); |
115 | } else { // Tap, paste | 111 | } else { // Tap, paste |
116 | tap_code16(LCTL(KC_V)); | 112 | tap_code16(LCTL(KC_V)); |
117 | } | 113 | } |
118 | } | 114 | } |
119 | break; | 115 | break; |
120 | #ifdef UNICODE_ENABLE | 116 | #ifdef UNICODE_ENABLE |
121 | case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻ | 117 | case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻ |
122 | if (record->event.pressed) { | 118 | if (record->event.pressed) { send_unicode_string("(ノಠ痊ಠ)ノ彡┻━┻"); } |
123 | send_unicode_string("(ノಠ痊ಠ)ノ彡┻━┻"); | ||
124 | } | ||
125 | break; | 119 | break; |
126 | case UC_TABL: // ┬─┬ノ( º _ ºノ) | 120 | case UC_TABL: // ┬─┬ノ( º _ ºノ) |
127 | if (record->event.pressed) { | 121 | if (record->event.pressed) { send_unicode_string("┬─┬ノ( º _ ºノ)"); } |
128 | send_unicode_string("┬─┬ノ( º _ ºノ)"); | ||
129 | } | ||
130 | break; | 122 | break; |
131 | case UC_SHRG: // ¯\_(ツ)_/¯ | 123 | case UC_SHRG: // ¯\_(ツ)_/¯ |
132 | if (record->event.pressed) { | 124 | if (record->event.pressed) { send_unicode_string("¯\\_(ツ)_/¯"); } |
133 | send_unicode_string("¯\\_(ツ)_/¯"); | ||
134 | } | ||
135 | break; | 125 | break; |
136 | case UC_DISA: // ಠ_ಠ | 126 | case UC_DISA: // ಠ_ಠ |
137 | if (record->event.pressed) { | 127 | if (record->event.pressed) { send_unicode_string("ಠ_ಠ"); } |
138 | send_unicode_string("ಠ_ಠ"); | ||
139 | } | ||
140 | break; | 128 | break; |
141 | #endif | 129 | #endif |
142 | case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal | 130 | case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal |
143 | #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) | 131 | #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) |
144 | if (record->event.pressed) { | 132 | if (record->event.pressed) { |
145 | userspace_config.rgb_layer_change ^= 1; | 133 | userspace_config.rgb_layer_change ^= 1; |
@@ -149,14 +137,14 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
149 | # if defined(RGBLIGHT_ENABLE) && defined(RGB_MATRIX_ENABLE) | 137 | # if defined(RGBLIGHT_ENABLE) && defined(RGB_MATRIX_ENABLE) |
150 | rgblight_enable_noeeprom(); | 138 | rgblight_enable_noeeprom(); |
151 | # endif | 139 | # endif |
152 | layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better) | 140 | layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better) |
153 | # if defined(RGBLIGHT_ENABLE) && defined(RGB_MATRIX_ENABLE) | 141 | # if defined(RGBLIGHT_ENABLE) && defined(RGB_MATRIX_ENABLE) |
154 | } else { | 142 | } else { |
155 | rgblight_disable_noeeprom(); | 143 | rgblight_disable_noeeprom(); |
156 | # endif | 144 | # endif |
157 | } | 145 | } |
158 | } | 146 | } |
159 | #endif // RGBLIGHT_ENABLE | 147 | #endif // RGBLIGHT_ENABLE |
160 | break; | 148 | break; |
161 | 149 | ||
162 | #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) | 150 | #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) |
@@ -176,7 +164,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
176 | } | 164 | } |
177 | return false; | 165 | return false; |
178 | break; | 166 | break; |
179 | case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions | 167 | case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions |
180 | if (record->event.pressed) { | 168 | if (record->event.pressed) { |
181 | bool is_eeprom_updated; | 169 | bool is_eeprom_updated; |
182 | # if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) | 170 | # if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES) |
@@ -194,9 +182,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
194 | is_eeprom_updated = true; | 182 | is_eeprom_updated = true; |
195 | } | 183 | } |
196 | # endif | 184 | # endif |
197 | if (is_eeprom_updated) { | 185 | if (is_eeprom_updated) { eeconfig_update_user(userspace_config.raw); } |
198 | eeconfig_update_user(userspace_config.raw); | ||
199 | } | ||
200 | } | 186 | } |
201 | #endif | 187 | #endif |
202 | } | 188 | } |
diff --git a/users/drashna/process_records.h b/users/drashna/process_records.h index f60e6d7eb..f65cfc03c 100644 --- a/users/drashna/process_records.h +++ b/users/drashna/process_records.h | |||
@@ -17,58 +17,58 @@ | |||
17 | #pragma once | 17 | #pragma once |
18 | #include "drashna.h" | 18 | #include "drashna.h" |
19 | 19 | ||
20 | #if defined(KEYBOARD_handwired_dactyl_manuform_5x6_right_trackball) | 20 | #if defined(KEYBOARD_handwired_tractyl_manuform_5x6_right) |
21 | # define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE | 21 | # define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE |
22 | #else | 22 | #else |
23 | # define PLACEHOLDER_SAFE_RANGE SAFE_RANGE | 23 | # define PLACEHOLDER_SAFE_RANGE SAFE_RANGE |
24 | #endif | 24 | #endif |
25 | 25 | ||
26 | enum userspace_custom_keycodes { | 26 | enum userspace_custom_keycodes { |
27 | VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info | 27 | VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info |
28 | KC_QWERTY, // Sets default layer to QWERTY | 28 | KC_QWERTY, // Sets default layer to QWERTY |
29 | KC_COLEMAK, // Sets default layer to COLEMAK | 29 | KC_COLEMAK, // Sets default layer to COLEMAK |
30 | KC_DVORAK, // Sets default layer to DVORAK | 30 | KC_DVORAK, // Sets default layer to DVORAK |
31 | KC_WORKMAN, // Sets default layer to WORKMAN | 31 | KC_WORKMAN, // Sets default layer to WORKMAN |
32 | KC_DIABLO_CLEAR, // Clears all Diablo Timers | 32 | KC_DIABLO_CLEAR, // Clears all Diablo Timers |
33 | KC_MAKE, // Run keyboard's customized make command | 33 | KC_MAKE, // Run keyboard's customized make command |
34 | KC_RGB_T, // Toggles RGB Layer Indication mode | 34 | KC_RGB_T, // Toggles RGB Layer Indication mode |
35 | RGB_IDL, // RGB Idling animations | 35 | RGB_IDL, // RGB Idling animations |
36 | KC_SECRET_1, // test1 | 36 | KC_SECRET_1, // test1 |
37 | KC_SECRET_2, // test2 | 37 | KC_SECRET_2, // test2 |
38 | KC_SECRET_3, // test3 | 38 | KC_SECRET_3, // test3 |
39 | KC_SECRET_4, // test4 | 39 | KC_SECRET_4, // test4 |
40 | KC_SECRET_5, // test5 | 40 | KC_SECRET_5, // test5 |
41 | KC_CCCV, // Hold to copy, tap to paste | 41 | KC_CCCV, // Hold to copy, tap to paste |
42 | KC_NUKE, // NUCLEAR LAUNCH DETECTED!!! | 42 | KC_NUKE, // NUCLEAR LAUNCH DETECTED!!! |
43 | UC_FLIP, // (ಠ痊ಠ)┻━┻ | 43 | UC_FLIP, // (ಠ痊ಠ)┻━┻ |
44 | UC_TABL, // ┬─┬ノ( º _ ºノ) | 44 | UC_TABL, // ┬─┬ノ( º _ ºノ) |
45 | UC_SHRG, // ¯\_(ツ)_/¯ | 45 | UC_SHRG, // ¯\_(ツ)_/¯ |
46 | UC_DISA, // ಠ_ಠ | 46 | UC_DISA, // ಠ_ಠ |
47 | NEW_SAFE_RANGE // use "NEWPLACEHOLDER for keymap specific codes | 47 | NEW_SAFE_RANGE // use "NEWPLACEHOLDER for keymap specific codes |
48 | }; | 48 | }; |
49 | 49 | ||
50 | bool process_record_secrets(uint16_t keycode, keyrecord_t *record); | 50 | bool process_record_secrets(uint16_t keycode, keyrecord_t *record); |
51 | bool process_record_keymap(uint16_t keycode, keyrecord_t *record); | 51 | bool process_record_keymap(uint16_t keycode, keyrecord_t *record); |
52 | 52 | ||
53 | #define LOWER MO(_LOWER) | 53 | #define LOWER MO(_LOWER) |
54 | #define RAISE MO(_RAISE) | 54 | #define RAISE MO(_RAISE) |
55 | #define ADJUST MO(_ADJUST) | 55 | #define ADJUST MO(_ADJUST) |
56 | #define TG_MODS OS_TOGG | 56 | #define TG_MODS OS_TOGG |
57 | #define TG_GAME TG(_GAMEPAD) | 57 | #define TG_GAME TG(_GAMEPAD) |
58 | #define TG_DBLO TG(_DIABLO) | 58 | #define TG_DBLO TG(_DIABLO) |
59 | #define OS_LWR OSL(_LOWER) | 59 | #define OS_LWR OSL(_LOWER) |
60 | #define OS_RSE OSL(_RAISE) | 60 | #define OS_RSE OSL(_RAISE) |
61 | 61 | ||
62 | #define KC_SEC1 KC_SECRET_1 | 62 | #define KC_SEC1 KC_SECRET_1 |
63 | #define KC_SEC2 KC_SECRET_2 | 63 | #define KC_SEC2 KC_SECRET_2 |
64 | #define KC_SEC3 KC_SECRET_3 | 64 | #define KC_SEC3 KC_SECRET_3 |
65 | #define KC_SEC4 KC_SECRET_4 | 65 | #define KC_SEC4 KC_SECRET_4 |
66 | #define KC_SEC5 KC_SECRET_5 | 66 | #define KC_SEC5 KC_SECRET_5 |
67 | 67 | ||
68 | #define QWERTY KC_QWERTY | 68 | #define QWERTY KC_QWERTY |
69 | #define DVORAK KC_DVORAK | 69 | #define DVORAK KC_DVORAK |
70 | #define COLEMAK KC_COLEMAK | 70 | #define COLEMAK KC_COLEMAK |
71 | #define WORKMAN KC_WORKMAN | 71 | #define WORKMAN KC_WORKMAN |
72 | 72 | ||
73 | #define KC_RESET RESET | 73 | #define KC_RESET RESET |
74 | #define KC_RST KC_RESET | 74 | #define KC_RST KC_RESET |
@@ -77,9 +77,9 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record); | |||
77 | # define KC_C1R3 SH_T(KC_TAB) | 77 | # define KC_C1R3 SH_T(KC_TAB) |
78 | #elif defined(DRASHNA_LP) | 78 | #elif defined(DRASHNA_LP) |
79 | # define KC_C1R3 TG(_GAMEPAD) | 79 | # define KC_C1R3 TG(_GAMEPAD) |
80 | #else // SWAP_HANDS_ENABLE | 80 | #else // SWAP_HANDS_ENABLE |
81 | # define KC_C1R3 KC_TAB | 81 | # define KC_C1R3 KC_TAB |
82 | #endif // SWAP_HANDS_ENABLE | 82 | #endif // SWAP_HANDS_ENABLE |
83 | 83 | ||
84 | #define BK_LWER LT(_LOWER, KC_BSPC) | 84 | #define BK_LWER LT(_LOWER, KC_BSPC) |
85 | #define SP_LWER LT(_LOWER, KC_SPC) | 85 | #define SP_LWER LT(_LOWER, KC_SPC) |
diff --git a/users/drashna/rgb_matrix_stuff.c b/users/drashna/rgb_matrix_stuff.c index 9e9e1e427..9fbe6214b 100644 --- a/users/drashna/rgb_matrix_stuff.c +++ b/users/drashna/rgb_matrix_stuff.c | |||
@@ -28,33 +28,27 @@ static uint32_t hypno_timer; | |||
28 | 28 | ||
29 | void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode, uint8_t speed, uint8_t led_type, uint8_t led_min, uint8_t led_max) { | 29 | void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode, uint8_t speed, uint8_t led_type, uint8_t led_min, uint8_t led_max) { |
30 | HSV hsv = {hue, sat, val}; | 30 | HSV hsv = {hue, sat, val}; |
31 | if (hsv.v > rgb_matrix_get_val()) { | 31 | if (hsv.v > rgb_matrix_get_val()) { hsv.v = rgb_matrix_get_val(); } |
32 | hsv.v = rgb_matrix_get_val(); | ||
33 | } | ||
34 | 32 | ||
35 | switch (mode) { | 33 | switch (mode) { |
36 | case 1: // breathing | 34 | case 1: // breathing |
37 | { | 35 | { |
38 | uint16_t time = scale16by8(g_rgb_timer, speed / 8); | 36 | uint16_t time = scale16by8(g_rgb_timer, speed / 8); |
39 | hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v); | 37 | hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v); |
40 | RGB rgb = hsv_to_rgb(hsv); | 38 | RGB rgb = hsv_to_rgb(hsv); |
41 | for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { | 39 | for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { |
42 | if (HAS_FLAGS(g_led_config.flags[i], led_type)) { | 40 | if (HAS_FLAGS(g_led_config.flags[i], led_type)) { RGB_MATRIX_INDICATOR_SET_COLOR(i, rgb.r, rgb.g, rgb.b); } |
43 | RGB_MATRIX_INDICATOR_SET_COLOR(i, rgb.r, rgb.g, rgb.b); | ||
44 | } | 41 | } |
42 | break; | ||
45 | } | 43 | } |
46 | break; | 44 | default: // Solid Color |
47 | } | 45 | { |
48 | default: // Solid Color | 46 | RGB rgb = hsv_to_rgb(hsv); |
49 | { | 47 | for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { |
50 | RGB rgb = hsv_to_rgb(hsv); | 48 | if (HAS_FLAGS(g_led_config.flags[i], led_type)) { RGB_MATRIX_INDICATOR_SET_COLOR(i, rgb.r, rgb.g, rgb.b); } |
51 | for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { | ||
52 | if (HAS_FLAGS(g_led_config.flags[i], led_type)) { | ||
53 | RGB_MATRIX_INDICATOR_SET_COLOR(i, rgb.r, rgb.g, rgb.b); | ||
54 | } | 49 | } |
50 | break; | ||
55 | } | 51 | } |
56 | break; | ||
57 | } | ||
58 | } | 52 | } |
59 | } | 53 | } |
60 | 54 | ||
@@ -62,38 +56,30 @@ __attribute__((weak)) void rgb_matrix_indicator_keymap(void) {} | |||
62 | 56 | ||
63 | void matrix_scan_rgb_matrix(void) { | 57 | void matrix_scan_rgb_matrix(void) { |
64 | #if defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) | 58 | #if defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) |
65 | if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_TYPING_HEATMAP && sync_timer_elapsed32(hypno_timer) > 15000) { | 59 | if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_TYPING_HEATMAP && sync_timer_elapsed32(hypno_timer) > 15000) { rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE); } |
66 | rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE); | ||
67 | } | ||
68 | #endif | 60 | #endif |
69 | rgb_matrix_indicator_keymap(); | 61 | rgb_matrix_indicator_keymap(); |
70 | } | 62 | } |
71 | 63 | ||
72 | void keyboard_post_init_rgb_matrix(void) { | 64 | void keyboard_post_init_rgb_matrix(void) { |
73 | #if defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) | 65 | #if defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) |
74 | if (userspace_config.rgb_matrix_idle_anim) { | 66 | if (userspace_config.rgb_matrix_idle_anim) { rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE); } |
75 | rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE); | ||
76 | } | ||
77 | #endif | 67 | #endif |
78 | } | 68 | } |
79 | 69 | ||
80 | bool process_record_user_rgb_matrix(uint16_t keycode, keyrecord_t *record) { | 70 | bool process_record_user_rgb_matrix(uint16_t keycode, keyrecord_t *record) { |
81 | #if defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) | 71 | #if defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) |
82 | hypno_timer = sync_timer_read32(); | 72 | hypno_timer = sync_timer_read32(); |
83 | if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_REST_MODE) { | 73 | if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_REST_MODE) { rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP); } |
84 | rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP); | ||
85 | } | ||
86 | #endif | 74 | #endif |
87 | switch (keycode) { | 75 | switch (keycode) { |
88 | case RGB_IDL: // This allows me to use underglow as layer indication, or as normal | 76 | case RGB_IDL: // This allows me to use underglow as layer indication, or as normal |
89 | #if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) | 77 | #if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) |
90 | if (record->event.pressed) { | 78 | if (record->event.pressed) { |
91 | userspace_config.rgb_matrix_idle_anim ^= 1; | 79 | userspace_config.rgb_matrix_idle_anim ^= 1; |
92 | dprintf("RGB Matrix Idle Animation [EEPROM]: %u\n", userspace_config.rgb_matrix_idle_anim); | 80 | dprintf("RGB Matrix Idle Animation [EEPROM]: %u\n", userspace_config.rgb_matrix_idle_anim); |
93 | eeconfig_update_user(userspace_config.raw); | 81 | eeconfig_update_user(userspace_config.raw); |
94 | if (userspace_config.rgb_matrix_idle_anim) { | 82 | if (userspace_config.rgb_matrix_idle_anim) { rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP); } |
95 | rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP); | ||
96 | } | ||
97 | } | 83 | } |
98 | #endif | 84 | #endif |
99 | break; | 85 | break; |
diff --git a/users/drashna/rgb_stuff.c b/users/drashna/rgb_stuff.c index 6723ad4bf..1665638cf 100644 --- a/users/drashna/rgb_stuff.c +++ b/users/drashna/rgb_stuff.c | |||
@@ -28,7 +28,7 @@ void rgblight_sethsv_default_helper(uint8_t index) { rgblight_sethsv_at(rgblight | |||
28 | static rgblight_fadeout lights[RGBLED_NUM]; | 28 | static rgblight_fadeout lights[RGBLED_NUM]; |
29 | 29 | ||
30 | /* Handler for fading/twinkling effect */ | 30 | /* Handler for fading/twinkling effect */ |
31 | void scan_rgblight_fadeout(void) { // Don't effing change this function .... rgblight_sethsv is supppppper intensive | 31 | void scan_rgblight_fadeout(void) { // Don't effing change this function .... rgblight_sethsv is supppppper intensive |
32 | bool litup = false; | 32 | bool litup = false; |
33 | 33 | ||
34 | for (uint8_t light_index = 0; light_index < RGBLED_NUM; ++light_index) { | 34 | for (uint8_t light_index = 0; light_index < RGBLED_NUM; ++light_index) { |
@@ -38,21 +38,15 @@ void scan_rgblight_fadeout(void) { // Don't effing change this function .... rg | |||
38 | 38 | ||
39 | if (light->life) { | 39 | if (light->life) { |
40 | light->life -= 1; | 40 | light->life -= 1; |
41 | if (get_highest_layer(layer_state) == 0) { | 41 | if (get_highest_layer(layer_state) == 0) { sethsv(light->hue + rand() % 0xF, 255, light->life, (LED_TYPE *)&led[light_index]); } |
42 | sethsv(light->hue + rand() % 0xF, 255, light->life, (LED_TYPE *)&led[light_index]); | ||
43 | } | ||
44 | light->timer = sync_timer_read(); | 42 | light->timer = sync_timer_read(); |
45 | } else { | 43 | } else { |
46 | if (light->enabled && get_highest_layer(layer_state) == 0) { | 44 | if (light->enabled && get_highest_layer(layer_state) == 0) { rgblight_sethsv_default_helper(light_index); } |
47 | rgblight_sethsv_default_helper(light_index); | ||
48 | } | ||
49 | litup = light->enabled = false; | 45 | litup = light->enabled = false; |
50 | } | 46 | } |
51 | } | 47 | } |
52 | } | 48 | } |
53 | if (litup && get_highest_layer(layer_state) == 0) { | 49 | if (litup && get_highest_layer(layer_state) == 0) { rgblight_set(); } |
54 | rgblight_set(); | ||
55 | } | ||
56 | } | 50 | } |
57 | 51 | ||
58 | /* Triggers a LED to fade/twinkle. | 52 | /* Triggers a LED to fade/twinkle. |
@@ -98,9 +92,7 @@ void start_rgb_light(void) { | |||
98 | bool process_record_user_rgb_light(uint16_t keycode, keyrecord_t *record) { | 92 | bool process_record_user_rgb_light(uint16_t keycode, keyrecord_t *record) { |
99 | uint16_t temp_keycode = keycode; | 93 | uint16_t temp_keycode = keycode; |
100 | // Filter out the actual keycode from MT and LT keys. | 94 | // Filter out the actual keycode from MT and LT keys. |
101 | if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { | 95 | if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { temp_keycode &= 0xFF; } |
102 | temp_keycode &= 0xFF; | ||
103 | } | ||
104 | 96 | ||
105 | switch (temp_keycode) { | 97 | switch (temp_keycode) { |
106 | # ifdef RGBLIGHT_TWINKLE | 98 | # ifdef RGBLIGHT_TWINKLE |
@@ -110,11 +102,9 @@ bool process_record_user_rgb_light(uint16_t keycode, keyrecord_t *record) { | |||
110 | case KC_KP_SLASH ... KC_KP_DOT: | 102 | case KC_KP_SLASH ... KC_KP_DOT: |
111 | case KC_F13 ... KC_F24: | 103 | case KC_F13 ... KC_F24: |
112 | case KC_AUDIO_MUTE ... KC_MEDIA_REWIND: | 104 | case KC_AUDIO_MUTE ... KC_MEDIA_REWIND: |
113 | if (record->event.pressed) { | 105 | if (record->event.pressed) { start_rgb_light(); } |
114 | start_rgb_light(); | ||
115 | } | ||
116 | break; | 106 | break; |
117 | # endif // RGBLIGHT_TWINKLE | 107 | # endif // RGBLIGHT_TWINKLE |
118 | } | 108 | } |
119 | return true; | 109 | return true; |
120 | } | 110 | } |
@@ -129,9 +119,7 @@ static uint16_t rgblight_startup_loop_timer; | |||
129 | void keyboard_post_init_rgb_light(void) { | 119 | void keyboard_post_init_rgb_light(void) { |
130 | # if defined(RGBLIGHT_STARTUP_ANIMATION) | 120 | # if defined(RGBLIGHT_STARTUP_ANIMATION) |
131 | is_enabled = rgblight_is_enabled(); | 121 | is_enabled = rgblight_is_enabled(); |
132 | if (userspace_config.rgb_layer_change) { | 122 | if (userspace_config.rgb_layer_change) { rgblight_enable_noeeprom(); } |
133 | rgblight_enable_noeeprom(); | ||
134 | } | ||
135 | if (rgblight_is_enabled()) { | 123 | if (rgblight_is_enabled()) { |
136 | layer_state_set_rgb_light(layer_state); | 124 | layer_state_set_rgb_light(layer_state); |
137 | old_hue = rgblight_get_hue(); | 125 | old_hue = rgblight_get_hue(); |
@@ -145,7 +133,7 @@ void keyboard_post_init_rgb_light(void) { | |||
145 | void matrix_scan_rgb_light(void) { | 133 | void matrix_scan_rgb_light(void) { |
146 | # ifdef RGBLIGHT_TWINKLE | 134 | # ifdef RGBLIGHT_TWINKLE |
147 | scan_rgblight_fadeout(); | 135 | scan_rgblight_fadeout(); |
148 | # endif // RGBLIGHT_ENABLE | 136 | # endif // RGBLIGHT_ENABLE |
149 | 137 | ||
150 | # if defined(RGBLIGHT_STARTUP_ANIMATION) | 138 | # if defined(RGBLIGHT_STARTUP_ANIMATION) |
151 | if (is_rgblight_startup && is_keyboard_master()) { | 139 | if (is_rgblight_startup && is_keyboard_master()) { |
@@ -156,12 +144,8 @@ void matrix_scan_rgb_light(void) { | |||
156 | rgblight_startup_loop_timer = sync_timer_read(); | 144 | rgblight_startup_loop_timer = sync_timer_read(); |
157 | if (counter == 255) { | 145 | if (counter == 255) { |
158 | is_rgblight_startup = false; | 146 | is_rgblight_startup = false; |
159 | if (!is_enabled) { | 147 | if (!is_enabled) { rgblight_disable_noeeprom(); } |
160 | rgblight_disable_noeeprom(); | 148 | if (userspace_config.rgb_layer_change) { layer_state_set_rgb_light(layer_state); } |
161 | } | ||
162 | if (userspace_config.rgb_layer_change) { | ||
163 | layer_state_set_rgb_light(layer_state); | ||
164 | } | ||
165 | } | 149 | } |
166 | } | 150 | } |
167 | } | 151 | } |
@@ -179,55 +163,25 @@ layer_state_t layer_state_set_rgb_light(layer_state_t state) { | |||
179 | if (userspace_config.rgb_layer_change) { | 163 | if (userspace_config.rgb_layer_change) { |
180 | switch (get_highest_layer(state | default_layer_state)) { | 164 | switch (get_highest_layer(state | default_layer_state)) { |
181 | case _MACROS: // mouse | 165 | case _MACROS: // mouse |
182 | if (!layer_state_cmp(state, _GAMEPAD) && !layer_state_cmp(state, _DIABLO)) { | 166 | if (!layer_state_cmp(state, _GAMEPAD) && !layer_state_cmp(state, _DIABLO)) { rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_BREATHING + 3); } |
183 | rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_BREATHING + 3); | ||
184 | } | ||
185 | break; | ||
186 | case _MEDIA: | ||
187 | rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_KNIGHT + 1); | ||
188 | break; | ||
189 | case _GAMEPAD: | ||
190 | rgblight_set_hsv_and_mode(HSV_ORANGE, RGBLIGHT_MODE_SNAKE + 2); | ||
191 | break; | ||
192 | case _DIABLO: | ||
193 | rgblight_set_hsv_and_mode(HSV_RED, RGBLIGHT_MODE_BREATHING + 3); | ||
194 | break; | ||
195 | case _RAISE: | ||
196 | rgblight_set_hsv_and_mode(HSV_YELLOW, RGBLIGHT_MODE_BREATHING + 3); | ||
197 | break; | ||
198 | case _LOWER: | ||
199 | rgblight_set_hsv_and_mode(HSV_GREEN, RGBLIGHT_MODE_BREATHING + 3); | ||
200 | break; | ||
201 | case _ADJUST: | ||
202 | rgblight_set_hsv_and_mode(HSV_RED, RGBLIGHT_MODE_KNIGHT + 2); | ||
203 | break; | ||
204 | case _COLEMAK: | ||
205 | rgblight_set_hsv_and_mode(HSV_MAGENTA, RGBLIGHT_MODE_STATIC_LIGHT); | ||
206 | break; | ||
207 | case _DVORAK: | ||
208 | rgblight_set_hsv_and_mode(HSV_SPRINGGREEN, RGBLIGHT_MODE_STATIC_LIGHT); | ||
209 | break; | ||
210 | case _WORKMAN: | ||
211 | rgblight_set_hsv_and_mode(HSV_GOLDENROD, RGBLIGHT_MODE_STATIC_LIGHT); | ||
212 | break; | ||
213 | case _NORMAN: | ||
214 | rgblight_set_hsv_and_mode(HSV_CORAL, RGBLIGHT_MODE_STATIC_LIGHT); | ||
215 | break; | ||
216 | case _MALTRON: | ||
217 | rgblight_set_hsv_and_mode(HSV_YELLOW, RGBLIGHT_MODE_STATIC_LIGHT); | ||
218 | break; | ||
219 | case _EUCALYN: | ||
220 | rgblight_set_hsv_and_mode(HSV_PINK, RGBLIGHT_MODE_STATIC_LIGHT); | ||
221 | break; | ||
222 | case _CARPLAX: | ||
223 | rgblight_set_hsv_and_mode(HSV_BLUE, RGBLIGHT_MODE_STATIC_LIGHT); | ||
224 | break; | ||
225 | default: | ||
226 | rgblight_set_hsv_and_mode(HSV_CYAN, RGBLIGHT_MODE_STATIC_LIGHT); | ||
227 | break; | 167 | break; |
168 | case _MEDIA: rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_KNIGHT + 1); break; | ||
169 | case _GAMEPAD: rgblight_set_hsv_and_mode(HSV_ORANGE, RGBLIGHT_MODE_SNAKE + 2); break; | ||
170 | case _DIABLO: rgblight_set_hsv_and_mode(HSV_RED, RGBLIGHT_MODE_BREATHING + 3); break; | ||
171 | case _RAISE: rgblight_set_hsv_and_mode(HSV_YELLOW, RGBLIGHT_MODE_BREATHING + 3); break; | ||
172 | case _LOWER: rgblight_set_hsv_and_mode(HSV_GREEN, RGBLIGHT_MODE_BREATHING + 3); break; | ||
173 | case _ADJUST: rgblight_set_hsv_and_mode(HSV_RED, RGBLIGHT_MODE_KNIGHT + 2); break; | ||
174 | case _COLEMAK: rgblight_set_hsv_and_mode(HSV_MAGENTA, RGBLIGHT_MODE_STATIC_LIGHT); break; | ||
175 | case _DVORAK: rgblight_set_hsv_and_mode(HSV_SPRINGGREEN, RGBLIGHT_MODE_STATIC_LIGHT); break; | ||
176 | case _WORKMAN: rgblight_set_hsv_and_mode(HSV_GOLDENROD, RGBLIGHT_MODE_STATIC_LIGHT); break; | ||
177 | case _NORMAN: rgblight_set_hsv_and_mode(HSV_CORAL, RGBLIGHT_MODE_STATIC_LIGHT); break; | ||
178 | case _MALTRON: rgblight_set_hsv_and_mode(HSV_YELLOW, RGBLIGHT_MODE_STATIC_LIGHT); break; | ||
179 | case _EUCALYN: rgblight_set_hsv_and_mode(HSV_PINK, RGBLIGHT_MODE_STATIC_LIGHT); break; | ||
180 | case _CARPLAX: rgblight_set_hsv_and_mode(HSV_BLUE, RGBLIGHT_MODE_STATIC_LIGHT); break; | ||
181 | default: rgblight_set_hsv_and_mode(HSV_CYAN, RGBLIGHT_MODE_STATIC_LIGHT); break; | ||
228 | } | 182 | } |
229 | } | 183 | } |
230 | # endif // RGBLIGHT_ENABLE | 184 | # endif // RGBLIGHT_ENABLE |
231 | 185 | ||
232 | return state; | 186 | return state; |
233 | } | 187 | } |
diff --git a/users/drashna/rules.mk b/users/drashna/rules.mk index fa4fb2420..b9156f6a4 100644 --- a/users/drashna/rules.mk +++ b/users/drashna/rules.mk | |||
@@ -80,28 +80,29 @@ endif | |||
80 | 80 | ||
81 | CUSTOM_SPLIT_TRANSPORT ?= yes | 81 | CUSTOM_SPLIT_TRANSPORT ?= yes |
82 | ifeq ($(strip $(SPLIT_KEYBOARD)), yes) | 82 | ifeq ($(strip $(SPLIT_KEYBOARD)), yes) |
83 | ifneq ($(strip $(SPLIT_TRANSPORT)), custom) | 83 | QUANTUM_LIB_SRC += transport_sync.c |
84 | ifeq ($(strip $(CUSTOM_SPLIT_TRANSPORT)), yes) | 84 | # ifneq ($(strip $(SPLIT_TRANSPORT)), custom) |
85 | SPLIT_TRANSPORT = custom | 85 | # ifeq ($(strip $(CUSTOM_SPLIT_TRANSPORT)), yes) |
86 | QUANTUM_LIB_SRC += drashna_transport.c | 86 | # SPLIT_TRANSPORT = custom |
87 | OPT_DEFS += -DDRASHNA_CUSTOM_TRANSPORT | 87 | # QUANTUM_LIB_SRC += drashna_transport.c |
88 | # Unused functions are pruned away, which is why we can add multiple drivers here without bloat. | 88 | # OPT_DEFS += -DDRASHNA_CUSTOM_TRANSPORT |
89 | ifeq ($(PLATFORM),AVR) | 89 | # # Unused functions are pruned away, which is why we can add multiple drivers here without bloat. |
90 | ifneq ($(NO_I2C),yes) | 90 | # ifeq ($(PLATFORM),AVR) |
91 | QUANTUM_LIB_SRC += i2c_master.c \ | 91 | # ifneq ($(NO_I2C),yes) |
92 | i2c_slave.c | 92 | # QUANTUM_LIB_SRC += i2c_master.c \ |
93 | endif | 93 | # i2c_slave.c |
94 | endif | 94 | # endif |
95 | # endif | ||
95 | 96 | ||
96 | SERIAL_DRIVER ?= bitbang | 97 | # SERIAL_DRIVER ?= bitbang |
97 | OPT_DEFS += -DSERIAL_DRIVER_$(strip $(shell echo $(SERIAL_DRIVER) | tr '[:lower:]' '[:upper:]')) | 98 | # OPT_DEFS += -DSERIAL_DRIVER_$(strip $(shell echo $(SERIAL_DRIVER) | tr '[:lower:]' '[:upper:]')) |
98 | ifeq ($(strip $(SERIAL_DRIVER)), bitbang) | 99 | # ifeq ($(strip $(SERIAL_DRIVER)), bitbang) |
99 | QUANTUM_LIB_SRC += serial.c | 100 | # QUANTUM_LIB_SRC += serial.c |
100 | else | 101 | # else |
101 | QUANTUM_LIB_SRC += serial_$(strip $(SERIAL_DRIVER)).c | 102 | # QUANTUM_LIB_SRC += serial_$(strip $(SERIAL_DRIVER)).c |
102 | endif | 103 | # endif |
103 | endif | 104 | # endif |
104 | endif | 105 | # endif |
105 | endif | 106 | endif |
106 | 107 | ||
107 | # DEBUG_MATRIX_SCAN_RATE_ENABLE = api | 108 | # DEBUG_MATRIX_SCAN_RATE_ENABLE = api |
diff --git a/users/drashna/tap_dances.c b/users/drashna/tap_dances.c index 01873489d..6b27afc5a 100644 --- a/users/drashna/tap_dances.c +++ b/users/drashna/tap_dances.c | |||
@@ -26,7 +26,7 @@ uint8_t diablo_times[] = {0, 1, 3, 5, 10, 30}; | |||
26 | 26 | ||
27 | // Cycle through the times for the macro, starting at 0, for disabled. | 27 | // Cycle through the times for the macro, starting at 0, for disabled. |
28 | void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data) { | 28 | void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data) { |
29 | diable_keys_t *diablo_keys = (diable_keys_t *)user_data; | 29 | diable_keys_t *diablo_keys = (diable_keys_t *)user_data; |
30 | // Sets the keycode based on the index | 30 | // Sets the keycode based on the index |
31 | diablo_timer[diablo_keys->index].keycode = diablo_keys->keycode; | 31 | diablo_timer[diablo_keys->index].keycode = diablo_keys->keycode; |
32 | 32 | ||
@@ -34,7 +34,7 @@ void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data) { | |||
34 | if (state->count >= (sizeof(diablo_times) / sizeof(uint8_t))) { | 34 | if (state->count >= (sizeof(diablo_times) / sizeof(uint8_t))) { |
35 | diablo_timer[diablo_keys->index].key_interval = 0; | 35 | diablo_timer[diablo_keys->index].key_interval = 0; |
36 | reset_tap_dance(state); | 36 | reset_tap_dance(state); |
37 | } else { // else set the interval (tapdance count starts at 1, array starts at 0, so offset by one) | 37 | } else { // else set the interval (tapdance count starts at 1, array starts at 0, so offset by one) |
38 | diablo_timer[diablo_keys->index].key_interval = diablo_times[state->count - 1]; | 38 | diablo_timer[diablo_keys->index].key_interval = diablo_times[state->count - 1]; |
39 | } | 39 | } |
40 | } | 40 | } |
@@ -64,9 +64,7 @@ void run_diablo_macro_check(void) { | |||
64 | // reset the timer, since enough time has passed | 64 | // reset the timer, since enough time has passed |
65 | diablo_timer[index].timer = timer_read(); | 65 | diablo_timer[index].timer = timer_read(); |
66 | // send keycode ONLY if we're on the diablo layer. | 66 | // send keycode ONLY if we're on the diablo layer. |
67 | if (IS_LAYER_ON(_DIABLO)) { | 67 | if (IS_LAYER_ON(_DIABLO)) { tap_code(diablo_timer[index].keycode); } |
68 | tap_code(diablo_timer[index].keycode); | ||
69 | } | ||
70 | } | 68 | } |
71 | } | 69 | } |
72 | } | 70 | } |
diff --git a/users/drashna/tap_dances.h b/users/drashna/tap_dances.h index 7f73f2803..182cc6756 100644 --- a/users/drashna/tap_dances.h +++ b/users/drashna/tap_dances.h | |||
@@ -43,4 +43,4 @@ enum { | |||
43 | TD_D3_4 | 43 | TD_D3_4 |
44 | }; | 44 | }; |
45 | // clang-format on | 45 | // clang-format on |
46 | #endif // TAP_DANCE_ENABLE | 46 | #endif // TAP_DANCE_ENABLE |
diff --git a/users/drashna/template.c b/users/drashna/template.c index f98964ae4..636955c43 100644 --- a/users/drashna/template.c +++ b/users/drashna/template.c | |||
@@ -54,9 +54,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
54 | break; | 54 | break; |
55 | 55 | ||
56 | case VRSN: | 56 | case VRSN: |
57 | if (record->event.pressed) { | 57 | if (record->event.pressed) { SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); } |
58 | SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); | ||
59 | } | ||
60 | return false; | 58 | return false; |
61 | break; | 59 | break; |
62 | } | 60 | } |
@@ -89,7 +87,7 @@ __attribute__((weak)) void startup_keymap(void) {} | |||
89 | void startup_user(void) { | 87 | void startup_user(void) { |
90 | #ifdef RGBLIGHT_ENABLE | 88 | #ifdef RGBLIGHT_ENABLE |
91 | matrix_init_rgb(); | 89 | matrix_init_rgb(); |
92 | #endif // RGBLIGHT_ENABLE | 90 | #endif // RGBLIGHT_ENABLE |
93 | startup_keymap(); | 91 | startup_keymap(); |
94 | } | 92 | } |
95 | 93 | ||
diff --git a/users/drashna/template.h b/users/drashna/template.h index cb1ad75d8..e00a0530e 100644 --- a/users/drashna/template.h +++ b/users/drashna/template.h | |||
@@ -24,8 +24,8 @@ | |||
24 | #define BASE 0 | 24 | #define BASE 0 |
25 | 25 | ||
26 | enum custom_keycodes { | 26 | enum custom_keycodes { |
27 | VRSN = SAFE_RANGE, // can always be here | 27 | VRSN = SAFE_RANGE, // can always be here |
28 | KC_MAKE, | 28 | KC_MAKE, |
29 | KC_RESET, | 29 | KC_RESET, |
30 | NEWPLACEHOLDER // use "NEWPLACEHOLDER for keymap specific codes | 30 | NEWPLACEHOLDER // use "NEWPLACEHOLDER for keymap specific codes |
31 | }; | 31 | }; |
diff --git a/users/drashna/transport_sync.c b/users/drashna/transport_sync.c new file mode 100644 index 000000000..baa1f7651 --- /dev/null +++ b/users/drashna/transport_sync.c | |||
@@ -0,0 +1,80 @@ | |||
1 | #ifdef SPLIT_TRANSACTION_IDS_USER | ||
2 | #include "transport_sync.h" | ||
3 | #include "transactions.h" | ||
4 | #include <string.h> | ||
5 | |||
6 | typedef struct { | ||
7 | bool oled_on; | ||
8 | uint16_t keymap_config; | ||
9 | } user_runtime_config_t; | ||
10 | |||
11 | user_runtime_config_t user_state; | ||
12 | |||
13 | void user_sync(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer) { | ||
14 | if (initiator2target_buffer_size == sizeof(user_state)) { | ||
15 | memcpy(&user_state, initiator2target_buffer, initiator2target_buffer_size); | ||
16 | } | ||
17 | } | ||
18 | |||
19 | void keyboard_post_init_transport_sync(void) { | ||
20 | // Register keyboard state sync split transaction | ||
21 | transaction_register_rpc(RPC_ID_USER_STATE_SYNC, user_sync); | ||
22 | } | ||
23 | |||
24 | void user_state_update(void) { | ||
25 | if (is_keyboard_master()) { | ||
26 | |||
27 | #ifdef OLED_DRIVER_ENABLE | ||
28 | user_state.oled_on = is_oled_on(); | ||
29 | #endif | ||
30 | |||
31 | user_state.keymap_config = keymap_config.raw; | ||
32 | } else { | ||
33 | #ifdef OLED_DRIVER_ENABLE | ||
34 | if (user_state.oled_on) { | ||
35 | oled_on(); | ||
36 | } else { | ||
37 | oled_off(); | ||
38 | } | ||
39 | #endif | ||
40 | if (keymap_config.raw != user_state.keymap_config) { | ||
41 | keymap_config.raw = user_state.keymap_config; | ||
42 | } | ||
43 | } | ||
44 | } | ||
45 | |||
46 | void user_state_sync(void) { | ||
47 | if (is_keyboard_master()) { | ||
48 | // Keep track of the last state, so that we can tell if we need to propagate to slave | ||
49 | static user_runtime_config_t last_user_state; | ||
50 | static uint32_t last_sync; | ||
51 | bool needs_sync = false; | ||
52 | |||
53 | // Check if the state values are different | ||
54 | if (memcmp(&user_state, &last_user_state, sizeof(user_state))) { | ||
55 | needs_sync = true; | ||
56 | memcpy(&last_user_state, &user_state, sizeof(user_state)); | ||
57 | } | ||
58 | |||
59 | // Send to slave every 500ms regardless of state change | ||
60 | if (timer_elapsed32(last_sync) > 250) { | ||
61 | needs_sync = true; | ||
62 | } | ||
63 | |||
64 | // Perform the sync if requested | ||
65 | if (needs_sync) { | ||
66 | if (transaction_rpc_send(RPC_ID_USER_STATE_SYNC, sizeof(user_state), &user_state)) { | ||
67 | last_sync = timer_read32(); | ||
68 | } | ||
69 | } | ||
70 | } | ||
71 | } | ||
72 | |||
73 | void housekeeping_task_user(void) { | ||
74 | // Update kb_state so we can send to slave | ||
75 | user_state_update(); | ||
76 | |||
77 | // Data sync from master to slave | ||
78 | user_state_sync(); | ||
79 | } | ||
80 | #endif | ||
diff --git a/users/drashna/transport_sync.h b/users/drashna/transport_sync.h new file mode 100644 index 000000000..e2b3eae76 --- /dev/null +++ b/users/drashna/transport_sync.h | |||
@@ -0,0 +1,22 @@ | |||
1 | |||
2 | /* Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.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 | |||
18 | #pragma once | ||
19 | |||
20 | #include "drashna.h" | ||
21 | |||
22 | void keyboard_post_init_transport_sync(void); | ||