mirror of
https://github.com/qmk/qmk_firmware
synced 2024-11-10 22:19:29 +00:00
[Keyboard] Adding LED support to the plaid default keycap (#6109)
* Adding led support for Plaid * Adding led support for Plaid
This commit is contained in:
parent
d0c29f25c9
commit
8c22d641ee
3 changed files with 226 additions and 4 deletions
|
@ -33,12 +33,44 @@ enum plaid_keycodes {
|
|||
COLEMAK,
|
||||
DVORAK,
|
||||
PLOVER,
|
||||
EXT_PLV
|
||||
EXT_PLV,
|
||||
LED_1,
|
||||
LED_2,
|
||||
LED_3,
|
||||
LED_4,
|
||||
LED_5,
|
||||
LED_6,
|
||||
LED_7,
|
||||
LED_8,
|
||||
LED_9,
|
||||
LED_0
|
||||
};
|
||||
|
||||
#define LOWER MO(_LOWER)
|
||||
#define RAISE MO(_RAISE)
|
||||
|
||||
// array of keys considered modifiers for led purposes
|
||||
const uint16_t modifiers[] = {
|
||||
KC_LCTL,
|
||||
KC_RCTL,
|
||||
KC_LALT,
|
||||
KC_RALT,
|
||||
KC_LSFT,
|
||||
KC_RSFT,
|
||||
KC_LGUI,
|
||||
KC_RGUI,
|
||||
LOWER,
|
||||
RAISE
|
||||
};
|
||||
|
||||
//Setup consts for LED modes
|
||||
#define LEDMODE_ON 1 //always on
|
||||
#define LEDMODE_OFF 0 //always off
|
||||
#define LEDMODE_MODS 2 //On with modifiers
|
||||
#define LEDMODE_BLINKIN 3 //blinkinlights - % chance toggle on keypress
|
||||
#define LEDMODE_KEY 4 //On with any keypress, off with key release
|
||||
#define LEDMODE_ENTER 5 // On with enter key
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
/* Qwerty
|
||||
|
@ -152,7 +184,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||
|
||||
/* Adjust (Lower + Raise)
|
||||
* ,-----------------------------------------------------------------------------------.
|
||||
* | | Reset| | | | | | | | | | Del |
|
||||
* |Reset | | | | | | | | | | | Del |
|
||||
* |------+------+------+------+------+-------------+------+------+------+------+------|
|
||||
* | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| |
|
||||
* |------+------+------+------+------+------|------+------+------+------+------+------|
|
||||
|
@ -162,7 +194,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||
* `-----------------------------------------------------------------------------------'
|
||||
*/
|
||||
[_ADJUST] = LAYOUT_plaid_grid(
|
||||
_______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL ,
|
||||
RESET,LED_1, LED_2, LED_3, LED_4, LED_5,LED_6, LED_7, LED_8, LED_9, LED_0,KC_DEL ,
|
||||
_______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______,
|
||||
_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
|
||||
|
@ -171,11 +203,100 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||
|
||||
};
|
||||
|
||||
//Setup config struct for LED
|
||||
typedef union {
|
||||
uint32_t raw;
|
||||
struct {
|
||||
uint8_t red_mode :8;
|
||||
uint8_t green_mode :8;
|
||||
};
|
||||
} led_config_t;
|
||||
led_config_t led_config;
|
||||
|
||||
//Set leds to saved state during powerup
|
||||
void keyboard_post_init_user(void) {
|
||||
// Call the post init code.
|
||||
led_config.raw = eeconfig_read_user();
|
||||
|
||||
if(led_config.red_mode == LEDMODE_ON) {
|
||||
writePinHigh(LED_RED);
|
||||
}
|
||||
|
||||
if(led_config.green_mode == LEDMODE_ON) {
|
||||
writePinHigh(LED_GREEN);
|
||||
}
|
||||
}
|
||||
|
||||
void eeconfig_init_user(void) { // EEPROM is getting reset!
|
||||
led_config.raw = 0;
|
||||
led_config.red_mode = LEDMODE_ON;
|
||||
led_config.green_mode = LEDMODE_MODS;
|
||||
eeconfig_update_user(led_config.raw);
|
||||
eeconfig_update_user(led_config.raw);
|
||||
}
|
||||
|
||||
uint32_t layer_state_set_user(uint32_t state) {
|
||||
return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
|
||||
}
|
||||
|
||||
void led_keypress_update(uint8_t led, uint8_t led_mode, uint16_t keycode, keyrecord_t *record) {
|
||||
switch (led_mode) {
|
||||
case LEDMODE_MODS:
|
||||
for (int i=0;i<sizeof(modifiers) / sizeof(modifiers[0]);i++) {
|
||||
if(keycode==modifiers[i]) {
|
||||
if (record->event.pressed) {
|
||||
writePinHigh(led);
|
||||
}
|
||||
else {
|
||||
writePinLow(led);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case LEDMODE_BLINKIN:
|
||||
if (record->event.pressed) {
|
||||
if(rand() % 2 == 1) {
|
||||
if(rand() % 2 == 0) {
|
||||
writePinLow(led);
|
||||
}
|
||||
else {
|
||||
writePinHigh(led);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case LEDMODE_KEY:
|
||||
if (record->event.pressed) {
|
||||
writePinHigh(led);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
writePinLow(led);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case LEDMODE_ENTER:
|
||||
if (keycode==KC_ENT) {
|
||||
writePinHigh(led);
|
||||
}
|
||||
else {
|
||||
writePinLow(led);
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
/* If the either led mode is keypressed based, call the led updater
|
||||
then let it fall through the keypress handlers. Just to keep
|
||||
the logic out of this procedure */
|
||||
if (led_config.red_mode >= LEDMODE_MODS && led_config.red_mode <= LEDMODE_ENTER) {
|
||||
led_keypress_update(LED_RED, led_config.red_mode, keycode, record);
|
||||
}
|
||||
if (led_config.green_mode >= LEDMODE_MODS && led_config.green_mode <= LEDMODE_ENTER) {
|
||||
led_keypress_update(LED_GREEN, led_config.green_mode, keycode, record);
|
||||
}
|
||||
switch (keycode) {
|
||||
case QWERTY:
|
||||
if (record->event.pressed) {
|
||||
|
@ -217,6 +338,74 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||
}
|
||||
return false;
|
||||
break;
|
||||
case LED_1:
|
||||
if (record->event.pressed) {
|
||||
if (led_config.red_mode==LEDMODE_ON) {
|
||||
led_config.red_mode=LEDMODE_OFF;
|
||||
writePinLow(LED_RED);
|
||||
}
|
||||
else {
|
||||
led_config.red_mode=LEDMODE_ON;
|
||||
writePinHigh(LED_RED);
|
||||
}
|
||||
}
|
||||
eeconfig_update_user(led_config.raw);
|
||||
return false;
|
||||
break;
|
||||
case LED_2:
|
||||
if (record->event.pressed) {
|
||||
if (led_config.green_mode==LEDMODE_ON) {
|
||||
led_config.green_mode=LEDMODE_OFF;
|
||||
writePinLow(LED_GREEN);
|
||||
}
|
||||
else {
|
||||
led_config.green_mode=LEDMODE_ON;
|
||||
writePinHigh(LED_GREEN);
|
||||
}
|
||||
}
|
||||
eeconfig_update_user(led_config.raw);
|
||||
return false;
|
||||
break;
|
||||
case LED_3:
|
||||
led_config.red_mode=LEDMODE_MODS;
|
||||
eeconfig_update_user(led_config.raw);
|
||||
return false;
|
||||
break;
|
||||
case LED_4:
|
||||
led_config.green_mode=LEDMODE_MODS;
|
||||
eeconfig_update_user(led_config.raw);
|
||||
return false;
|
||||
break;
|
||||
case LED_5:
|
||||
led_config.red_mode=LEDMODE_BLINKIN;
|
||||
eeconfig_update_user(led_config.raw);
|
||||
return false;
|
||||
break;
|
||||
case LED_6:
|
||||
led_config.green_mode=LEDMODE_BLINKIN;
|
||||
eeconfig_update_user(led_config.raw);
|
||||
return false;
|
||||
break;
|
||||
case LED_7:
|
||||
led_config.red_mode=LEDMODE_KEY;
|
||||
eeconfig_update_user(led_config.raw);
|
||||
return false;
|
||||
break;
|
||||
case LED_8:
|
||||
led_config.green_mode=LEDMODE_KEY;
|
||||
eeconfig_update_user(led_config.raw);
|
||||
return false;
|
||||
break;
|
||||
case LED_9:
|
||||
led_config.red_mode=LEDMODE_ENTER;
|
||||
eeconfig_update_user(led_config.raw);
|
||||
return false;
|
||||
break;
|
||||
case LED_0:
|
||||
led_config.green_mode=LEDMODE_ENTER;
|
||||
eeconfig_update_user(led_config.raw);
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1,2 +1,32 @@
|
|||
# The default keymap for plaid
|
||||
folk from planck
|
||||
Original copyright 2019 Takuya Urakawa (dm9records.com)
|
||||
LED Support added by Richard Sutherland (rich@brickbots.com)
|
||||
|
||||
This layout is based on the Planck layout, and includes an adjust layer (6)
|
||||
accessible by holding the lower and raise modifiers (MO3 and MO4) together.
|
||||
The adjustment layer is used to set the behavior of the two LEDs:
|
||||
|
||||
Modifier Mode:
|
||||
|
||||
Activates when any modifier (shift, alt, os, MO) key is held
|
||||
down. LED turns off when key is release
|
||||
|
||||
Blinkinlights Mode:
|
||||
Random chance of state change on each keystroke.
|
||||
|
||||
Keypress Mode:
|
||||
On for any keypress as long as the key is pressed
|
||||
|
||||
Carriage Mode:
|
||||
Turns on when enter is pressed, turns off when any next key is pressed
|
||||
|
||||
q = Toggle Red LED state, deactivates any other modes
|
||||
w = Toggle Green LED state, deactivates any other modes
|
||||
e = Set RED LED to modifier mode
|
||||
r = Set GREEN LED to modifier mode
|
||||
t = Set RED LED to Blinkinlights mode
|
||||
y = set GREEN LED to Blinkinlights mode
|
||||
u = set RED LED to Keypress mode
|
||||
i = set GREEN LED to Keypress mode
|
||||
o = set RED LED to Carriage mode
|
||||
p = set GREEN LED to Carriage mode
|
||||
|
|
|
@ -63,3 +63,6 @@
|
|||
#define LAYOUT_planck_mit LAYOUT_plaid_mit
|
||||
#define LAYOUT_kc_ortho_4x12 KC_KEYMAP
|
||||
#define KC_LAYOUT_ortho_4x12 KC_KEYMAP
|
||||
|
||||
#define LED_RED C5
|
||||
#define LED_GREEN C4
|
||||
|
|
Loading…
Reference in a new issue