]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
[Keyboard] Adding LED support to the plaid default keycap (#6109)
authorbrickbots <rich@brickbots.com>
Tue, 11 Jun 2019 16:01:59 +0000 (09:01 -0700)
committerDrashna Jaelre <drashna@live.com>
Tue, 11 Jun 2019 16:01:59 +0000 (09:01 -0700)
* Adding led support for Plaid

* Adding led support for Plaid

keyboards/plaid/keymaps/default/keymap.c
keyboards/plaid/keymaps/default/readme.md
keyboards/plaid/plaid.h

index f27abb0aa5646b6adc6364db271db59ca1408f18..35c22b4983193653ecfb396341059323d7abbe68 100644 (file)
@@ -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;
 }
index 6f68e46af4ef8ddf31293fa0335494c4d86fe7da..2f491e36753b53d2781f086bf3af9ca7547d433b 100644 (file)
@@ -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
index e680c077c2a4849bb0790c31c66ef999c7de9176..d791cf7c0056a26c1b90e37d1abfe6ef470d20bd 100644 (file)
@@ -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