//------------------------------------------------------- void led_clearAllBlinkLeds() { for(int i=0;i<NUM_OF_BLINKABLE_LEDS;i++) { //reset led led_reset(led_blinkLedNumber[i]); //set slot to inactive led_blinkingLeds &= ~(1<<i); } };
void led_set_layer_indicator(void) { static uint8_t oldlayer = 255; led_reset(); rgbsps_set(LED_IND_GUI, COLOR_BLANK); rgbsps_set(LED_IND_FUN, COLOR_BLANK); rgbsps_set(LED_IND_NUM, COLOR_BLANK); rgbsps_set(LED_IND_PUNC, COLOR_BLANK); rgbsps_set(LED_IND_GREEK, COLOR_BLANK); rgbsps_set(LED_IND_EMOJI, COLOR_BLANK); uint8_t layer = biton32(layer_state); if (oldlayer == layer) { return; } oldlayer = layer; if (layer <= _DEFAULT_LAYER_MAX) { rgbsps_send(); return; } switch(layer) { case _GUI: rgbsps_set(LED_IND_GUI, THEME_COLOR_GUI); break; case _FUN: rgbsps_set(LED_IND_FUN, THEME_COLOR_FUN); break; case _NUM: rgbsps_set(LED_IND_NUM, THEME_COLOR_NUM); break; case _PUNC: rgbsps_set(LED_IND_PUNC, THEME_COLOR_PUNC); break; case _GREEKL: case _GREEKU: rgbsps_set(LED_IND_GREEK, THEME_COLOR_GREEK); break; case _EMOJI: rgbsps_set(LED_IND_EMOJI, THEME_COLOR_EMOJI); break; default: rgbsps_set(LED_IND_GUI, THEME_COLOR_OTHERLAYER); rgbsps_set(LED_IND_FUN, THEME_COLOR_OTHERLAYER); rgbsps_set(LED_IND_NUM, THEME_COLOR_OTHERLAYER); rgbsps_set(LED_IND_PUNC, THEME_COLOR_OTHERLAYER); rgbsps_set(LED_IND_GREEK, THEME_COLOR_OTHERLAYER); rgbsps_set(LED_IND_EMOJI, THEME_COLOR_OTHERLAYER); } rgbsps_send(); }
//-------------------------------------------------- void led_setActive_step(uint8_t stepNr) { stepNr /= 8; //128 steps auf 16 reduzieren uint8_t ledNr; ledNr = stepNr+LED_STEP1; if(led_currentStepLed != ledNr) { led_reset(led_currentStepLed); led_currentStepLed = ledNr; led_toggleTemp(ledNr); } };
//------------------------------------------------------- void led_setBlinkLed(const uint8_t ledNr, const uint8_t onOff) { if(onOff) { //--- turn on blinking --- //search for a free blink slot for(int i=0;i<NUM_OF_BLINKABLE_LEDS;i++) { if( !(led_blinkingLeds & (1<<i))) { //we found a free slot //store led number led_blinkLedNumber[i] = ledNr; //set slot to active led_blinkingLeds |= (1<<i); //turn on LED led_toggleTemp(ledNr); break; } } } else { //--- turn off blinking --- //search the slot with matching ledNr for(int i=0;i<NUM_OF_BLINKABLE_LEDS;i++) { if(led_blinkLedNumber[i] == ledNr) { //we found the matching slot //set slot to inactive led_blinkingLeds &= ~(1<<i); led_reset(ledNr); } } } };
//------------------------------------------------------- void led_tickHandler() { for(int i=0;i<NUM_OF_PULSABLE_LEDS;i++) { //if the led is active at the moment if(led_pulsingLeds & (1<<i)) { //if the on time has passed if(time_sysTick > led_pulseEndTime[i]) { //set slot to inactive led_pulsingLeds &= ~(1<<i); // reset LED led_reset(led_pulseLedNumber[i]); } } } //second condition is to prevent hanging LEDs if a systick overflow occurs if( (time_sysTick > led_nextBlinkTime) || ( (led_nextBlinkTime-time_sysTick) > LED_BLINK_TIME*2) ) { led_nextBlinkTime = time_sysTick + LED_BLINK_TIME; for(int i=0;i<NUM_OF_BLINKABLE_LEDS;i++) { //if the led is active at the moment if(led_blinkingLeds & (1<<i)) { //toggle led led_toggleTemp(led_blinkLedNumber[i]); //set next toggle time } } } }
bool process_record_user(uint16_t keycode, keyrecord_t *record) { static bool lshift = false; static bool rshift = false; static uint8_t layer = 0; lshift = keyboard_report->mods & MOD_BIT(KC_LSFT); rshift = keyboard_report->mods & MOD_BIT(KC_RSFT); layer = biton32(layer_state); #ifdef DOUBLESPACE_LAYER_ENABLE // double-space: send space immediately if any other key depressed before space is released if ((lspace_active ^ rspace_active) && keycode != LSPACE && keycode != RSPACE && record->event.pressed) { if (lspace_active) { if (!lspace_emitted) { register_code(KC_SPC); unregister_code(KC_SPC); } lspace_emitted = true; } if (rspace_active) { if (!rspace_emitted) { register_code(KC_SPC); unregister_code(KC_SPC); } rspace_emitted = true; } } if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) { if (record->event.pressed) { unregister_code(KC_LALT); } else { register_code(KC_LALT); } } #endif switch (keycode) { #ifdef DOUBLESPACE_LAYER_ENABLE // double-space enter space layer case LSPACE: process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted); return false; break; case RSPACE: process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted); return false; break; #endif // handle greek layer shift case KC_LSFT: case KC_RSFT: ; if (layer == _GREEKU || layer == _GREEKL) { if (record->event.pressed) { layer_on(_GREEKU); layer_off(_GREEKL); } else { if (lshift ^ rshift) { // if only one shift was pressed layer_on(_GREEKL); layer_off(_GREEKU); } } } return true; break; // press both ctrls to activate SYS layer case KC_LCTL: case KC_RCTL: ; bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL); bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL); if (record->event.pressed) { if (lctrl ^ rctrl) { // if only one ctrl was pressed layer_on(_SYS); } } else { layer_off(_SYS); } return true; break; // QWERTZ style comma and dot: semicolon and colon when shifted case KC_COMM: if (record->event.pressed) { if (lshift || rshift) { if (lshift) unregister_code(KC_LSFT); if (rshift) unregister_code(KC_RSFT); register_code(KC_SCLN); unregister_code(KC_SCLN); if (lshift) register_code(KC_LSFT); if (rshift) register_code(KC_RSFT); } else { register_code(KC_COMM); unregister_code(KC_COMM); } } return false; break; case KC_DOT: if (record->event.pressed) { if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) { register_code(KC_SCLN); unregister_code(KC_SCLN); } else { register_code(KC_DOT); unregister_code(KC_DOT); } } return false; break; // layout switchers case QWERTY: if (record->event.pressed) { persistent_default_layer_set(1UL<<_QWERTY); } return false; break; #ifdef LAYOUT_DVORAK case DVORAK: if (record->event.pressed) { persistent_default_layer_set(1UL<<_DVORAK); } return false; break; #endif #ifdef LAYOUT_COLEMAK case COLEMAK: if (record->event.pressed) { persistent_default_layer_set(1UL<<_COLEMAK); } return false; break; #endif #ifdef LAYOUT_WORKMAN case WORKMAN: if (record->event.pressed) { persistent_default_layer_set(1UL<<_WORKMAN); } return false; break; #endif #ifdef LAYOUT_NORMAN case NORMAN: if (record->event.pressed) { persistent_default_layer_set(1UL<<_NORMAN); } return false; break; #endif // only process Fnumber on key release, and only when layer switcher is still pressed. // this is to avoid accidental presses on potentially destructive keys case KC_F1 ... KC_F12: case KC_PAUS: case KC_PSCR: case KC_INS: if (!record->event.pressed && layer == _FUN) { // key released and still in FUN layer register_code(keycode); unregister_code(keycode); } return false; break; // layer switcher // case GREEK: if (record->event.pressed) { if (lshift || rshift) { layer_on(_GREEKU); layer_off(_GREEKL); } else { layer_on(_GREEKL); layer_off(_GREEKU); } } else { layer_off(_GREEKU); layer_off(_GREEKL); } return false; break; // OS switchers case LINUX: set_unicode_input_mode(UC_LNX); #ifdef RGBSPS_ENABLE led_set_unicode_input_mode(); #endif return false; break; case WIN: set_unicode_input_mode(UC_WINC); #ifdef RGBSPS_ENABLE led_set_unicode_input_mode(); #endif return false; break; case OSX: set_unicode_input_mode(UC_OSX); #ifdef RGBSPS_ENABLE led_set_unicode_input_mode(); #endif return false; break; // glow mode changer #ifdef RGBSPS_ENABLE case GLOW: if (record->event.pressed) { glow_mode++; if (glow_mode > GLOW_FULL) { glow_mode = GLOW_NONE; } led_reset(); rgbsps_send(); } return false; break; #endif // faux clicky indicator #ifdef FAUXCLICKY_ENABLE case FC_TOG: #ifdef RGBSPS_ENABLE if (fauxclicky_enabled) { rgbsps_set(LED_IND_AUDIO, THEME_COLOR_AUDIO); } else { rgbsps_set(LED_IND_AUDIO, COLOR_BLANK); } rgbsps_send(); #endif return true; break; #endif #ifdef RGBSPS_DEMO_ENABLE case RGBDEMO: led_demo(); return false; break; #endif } return true; }
//------------------------------------------------- void led_clearActive_step() { led_reset(led_currentStepLed); };
void led_init(uint16_t *led) { _leds = led; led_reset(); }