diff options
Diffstat (limited to 'quantum/quantum.c')
-rw-r--r-- | quantum/quantum.c | 86 |
1 files changed, 51 insertions, 35 deletions
diff --git a/quantum/quantum.c b/quantum/quantum.c index 90df0293b7..82c7a5265b 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -28,8 +28,10 @@ # define BREATHING_PERIOD 6 #endif -#include "backlight.h" -extern backlight_config_t backlight_config; +#ifdef BACKLIGHT_ENABLE +# include "backlight.h" + extern backlight_config_t backlight_config; +#endif #ifdef FAUXCLICKY_ENABLE # include "fauxclicky.h" @@ -55,6 +57,10 @@ extern backlight_config_t backlight_config; # include "encoder.h" #endif +#ifdef WEBUSB_ENABLE +# include "webusb.h" +#endif + #ifdef AUDIO_ENABLE # ifndef GOODBYE_SONG # define GOODBYE_SONG SONG(GOODBYE_SOUND) @@ -89,44 +95,28 @@ static void do_code16(uint16_t code, void (*f)(uint8_t)) { return; } - if (code & QK_LCTL) f(KC_LCTL); - if (code & QK_LSFT) f(KC_LSFT); - if (code & QK_LALT) f(KC_LALT); - if (code & QK_LGUI) f(KC_LGUI); - - if (code < QK_RMODS_MIN) return; - - if (code & QK_RCTL) f(KC_RCTL); - if (code & QK_RSFT) f(KC_RSFT); - if (code & QK_RALT) f(KC_RALT); - if (code & QK_RGUI) f(KC_RGUI); -} - -static inline void qk_register_weak_mods(uint8_t kc) { - add_weak_mods(MOD_BIT(kc)); - send_keyboard_report(); -} - -static inline void qk_unregister_weak_mods(uint8_t kc) { - del_weak_mods(MOD_BIT(kc)); - send_keyboard_report(); -} + uint8_t mods_to_send = 0; -static inline void qk_register_mods(uint8_t kc) { - add_weak_mods(MOD_BIT(kc)); - send_keyboard_report(); -} + if (code & QK_RMODS_MIN) { // Right mod flag is set + if (code & QK_LCTL) mods_to_send |= MOD_BIT(KC_RCTL); + if (code & QK_LSFT) mods_to_send |= MOD_BIT(KC_RSFT); + if (code & QK_LALT) mods_to_send |= MOD_BIT(KC_RALT); + if (code & QK_LGUI) mods_to_send |= MOD_BIT(KC_RGUI); + } else { + if (code & QK_LCTL) mods_to_send |= MOD_BIT(KC_LCTL); + if (code & QK_LSFT) mods_to_send |= MOD_BIT(KC_LSFT); + if (code & QK_LALT) mods_to_send |= MOD_BIT(KC_LALT); + if (code & QK_LGUI) mods_to_send |= MOD_BIT(KC_LGUI); + } -static inline void qk_unregister_mods(uint8_t kc) { - del_weak_mods(MOD_BIT(kc)); - send_keyboard_report(); + f(mods_to_send); } void register_code16(uint16_t code) { if (IS_MOD(code) || code == KC_NO) { - do_code16(code, qk_register_mods); + do_code16(code, register_mods); } else { - do_code16(code, qk_register_weak_mods); + do_code16(code, register_weak_mods); } register_code(code); } @@ -134,9 +124,9 @@ void register_code16(uint16_t code) { void unregister_code16(uint16_t code) { unregister_code(code); if (IS_MOD(code) || code == KC_NO) { - do_code16(code, qk_unregister_mods); + do_code16(code, unregister_mods); } else { - do_code16(code, qk_unregister_weak_mods); + do_code16(code, unregister_weak_mods); } } @@ -581,6 +571,7 @@ bool process_record_quantum(keyrecord_t *record) { keymap_config.swap_backslash_backspace = true; break; case MAGIC_HOST_NKRO: + clear_keyboard(); // clear first buffer to prevent stuck keys keymap_config.nkro = true; break; case MAGIC_SWAP_ALT_GUI: @@ -623,6 +614,7 @@ bool process_record_quantum(keyrecord_t *record) { keymap_config.swap_backslash_backspace = false; break; case MAGIC_UNHOST_NKRO: + clear_keyboard(); // clear first buffer to prevent stuck keys keymap_config.nkro = false; break; case MAGIC_UNSWAP_ALT_GUI: @@ -660,6 +652,7 @@ bool process_record_quantum(keyrecord_t *record) { #endif break; case MAGIC_TOGGLE_NKRO: + clear_keyboard(); // clear first buffer to prevent stuck keys keymap_config.nkro = !keymap_config.nkro; break; default: @@ -724,6 +717,13 @@ bool process_record_quantum(keyrecord_t *record) { return false; } #endif +#ifdef WEBUSB_ENABLE + case WEBUSB_PAIR: + if (record->event.pressed) { + webusb_state.pairing = true; + } + return false; +#endif } return process_action_kb(record); @@ -1104,6 +1104,22 @@ void matrix_scan_quantum() { # define COMxx1 COM1A1 # define OCRxx OCR1A # endif +# elif defined(__AVR_ATmega328P__) && (BACKLIGHT_PIN == B1 || BACKLIGHT_PIN == B2) +# define HARDWARE_PWM +# define ICRx ICR1 +# define TCCRxA TCCR1A +# define TCCRxB TCCR1B +# define TIMERx_OVF_vect TIMER1_OVF_vect +# define TIMSKx TIMSK1 +# define TOIEx TOIE1 + +# if BACKLIGHT_PIN == B1 +# define COMxx1 COM1A1 +# define OCRxx OCR1A +# elif BACKLIGHT_PIN == B2 +# define COMxx1 COM1B1 +# define OCRxx OCR1B +# endif # else # if !defined(BACKLIGHT_CUSTOM_DRIVER) # if !defined(B5_AUDIO) && !defined(B6_AUDIO) && !defined(B7_AUDIO) |