aboutsummaryrefslogtreecommitdiff
path: root/tmk_core/common/keyboard.c
diff options
context:
space:
mode:
authorXScorpion2 <rcalt2vt@gmail.com>2021-02-15 18:30:33 -0600
committerGitHub <noreply@github.com>2021-02-16 11:30:33 +1100
commitd1806a26e4ad75fa0e0405283803eba22c1a49ba (patch)
tree25bf2750e9770781cff373114bd44736463a91f1 /tmk_core/common/keyboard.c
parent1bc8a6e5d49861b268f9274a8686a2640e36e0b5 (diff)
downloadqmk_firmware-d1806a26e4ad75fa0e0405283803eba22c1a49ba.tar.gz
qmk_firmware-d1806a26e4ad75fa0e0405283803eba22c1a49ba.zip
Split transport mirror (#11046)
* Split transport mirror support * Updated RGB Matrix to respond to electrical events instead of key events * split matrix slave fix
Diffstat (limited to 'tmk_core/common/keyboard.c')
-rw-r--r--tmk_core/common/keyboard.c62
1 files changed, 43 insertions, 19 deletions
diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c
index 299bda2c1..34fed0cab 100644
--- a/tmk_core/common/keyboard.c
+++ b/tmk_core/common/keyboard.c
@@ -54,6 +54,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
54#ifdef RGBLIGHT_ENABLE 54#ifdef RGBLIGHT_ENABLE
55# include "rgblight.h" 55# include "rgblight.h"
56#endif 56#endif
57#ifdef RGB_MATRIX_ENABLE
58# include "rgb_matrix.h"
59#endif
57#ifdef ENCODER_ENABLE 60#ifdef ENCODER_ENABLE
58# include "encoder.h" 61# include "encoder.h"
59#endif 62#endif
@@ -304,6 +307,9 @@ void keyboard_init(void) {
304#ifdef RGBLIGHT_ENABLE 307#ifdef RGBLIGHT_ENABLE
305 rgblight_init(); 308 rgblight_init();
306#endif 309#endif
310#ifdef RGB_MATRIX_ENABLE
311 rgb_matrix_init();
312#endif
307#ifdef ENCODER_ENABLE 313#ifdef ENCODER_ENABLE
308 encoder_init(); 314 encoder_init();
309#endif 315#endif
@@ -328,6 +334,17 @@ void keyboard_init(void) {
328 keyboard_post_init_kb(); /* Always keep this last */ 334 keyboard_post_init_kb(); /* Always keep this last */
329} 335}
330 336
337/** \brief key_event_task
338 *
339 * This function is responsible for calling into other systems when they need to respond to electrical switch press events.
340 * This is differnet than keycode events as no layer processing, or filtering occurs.
341 */
342void switch_events(uint8_t row, uint8_t col, bool pressed) {
343#if defined(RGB_MATRIX_ENABLE)
344 process_rgb_matrix(row, col, pressed);
345#endif
346}
347
331/** \brief Keyboard task: Do keyboard routine jobs 348/** \brief Keyboard task: Do keyboard routine jobs
332 * 349 *
333 * Do routine keyboard jobs: 350 * Do routine keyboard jobs:
@@ -358,32 +375,35 @@ void keyboard_task(void) {
358 uint8_t matrix_changed = matrix_scan(); 375 uint8_t matrix_changed = matrix_scan();
359 if (matrix_changed) last_matrix_activity_trigger(); 376 if (matrix_changed) last_matrix_activity_trigger();
360 377
361 if (should_process_keypress()) { 378 for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
362 for (uint8_t r = 0; r < MATRIX_ROWS; r++) { 379 matrix_row = matrix_get_row(r);
363 matrix_row = matrix_get_row(r); 380 matrix_change = matrix_row ^ matrix_prev[r];
364 matrix_change = matrix_row ^ matrix_prev[r]; 381 if (matrix_change) {
365 if (matrix_change) {
366#ifdef MATRIX_HAS_GHOST 382#ifdef MATRIX_HAS_GHOST
367 if (has_ghost_in_row(r, matrix_row)) { 383 if (has_ghost_in_row(r, matrix_row)) {
368 continue; 384 continue;
369 } 385 }
370#endif 386#endif
371 if (debug_matrix) matrix_print(); 387 if (debug_matrix) matrix_print();
372 matrix_row_t col_mask = 1; 388 matrix_row_t col_mask = 1;
373 for (uint8_t c = 0; c < MATRIX_COLS; c++, col_mask <<= 1) { 389 for (uint8_t c = 0; c < MATRIX_COLS; c++, col_mask <<= 1) {
374 if (matrix_change & col_mask) { 390 if (matrix_change & col_mask) {
391 if (should_process_keypress()) {
375 action_exec((keyevent_t){ 392 action_exec((keyevent_t){
376 .key = (keypos_t){.row = r, .col = c}, .pressed = (matrix_row & col_mask), .time = (timer_read() | 1) /* time should not be 0 */ 393 .key = (keypos_t){.row = r, .col = c}, .pressed = (matrix_row & col_mask), .time = (timer_read() | 1) /* time should not be 0 */
377 }); 394 });
378 // record a processed key 395 }
379 matrix_prev[r] ^= col_mask; 396 // record a processed key
397 matrix_prev[r] ^= col_mask;
398
399 switch_events(r, c, (matrix_row & col_mask));
400
380#ifdef QMK_KEYS_PER_SCAN 401#ifdef QMK_KEYS_PER_SCAN
381 // only jump out if we have processed "enough" keys. 402 // only jump out if we have processed "enough" keys.
382 if (++keys_processed >= QMK_KEYS_PER_SCAN) 403 if (++keys_processed >= QMK_KEYS_PER_SCAN)
383#endif 404#endif
384 // process a key per task call 405 // process a key per task call
385 goto MATRIX_LOOP_END; 406 goto MATRIX_LOOP_END;
386 }
387 } 407 }
388 } 408 }
389 } 409 }
@@ -405,6 +425,10 @@ MATRIX_LOOP_END:
405 rgblight_task(); 425 rgblight_task();
406#endif 426#endif
407 427
428#ifdef RGB_MATRIX_ENABLE
429 rgb_matrix_task();
430#endif
431
408#if defined(BACKLIGHT_ENABLE) 432#if defined(BACKLIGHT_ENABLE)
409# if defined(BACKLIGHT_PIN) || defined(BACKLIGHT_PINS) 433# if defined(BACKLIGHT_PIN) || defined(BACKLIGHT_PINS)
410 backlight_task(); 434 backlight_task();