Просмотр исходного кода

[Keymap] Improvements to KidBrazil keymap to better handle OLED/LED Matrix timeout. (#7688)

* Added KidBrazil custom keymap for CRKBD
-Custom Font
-Custom OLED output

* Added missing readme

* Oled Timeout Update for KidBrazil Keymap (#1)

* Setup Oled timeout based on simple timer

* Cleaned up comments and added timeout for LEDs

* Fixed some small errors

* Updated oled timout with matrix scan

* Updated oled timout with matrix scan

* Update withou eeprom

* Update timer code

* Use process user instead of keymap

* Added ifdef to protect oledtimer

* Updated with half timeout state for logo

* Removed middle tier timer

* Final cleanup of unused files

* Updated code as per suggestions & requests

* Second round of revisions

* Updated keymap to better handle LED timeout
- Added boolean to hold LED state
- Added init function to set rgb to known state
- Modified RGB_TOG to work with noeeprom commands

* Finished adding the timeout for OLED and testing on CRKBD

* Updated documentation

* fixed the timeout logic so it works as intended

* Update keyboards/crkbd/keymaps/kidbrazil/README.md
Lucas Moreira 6 лет назад
Родитель
Сommit
fdc144d215
2 измененных файлов с 83 добавлено и 38 удалено
  1. 14 3
      keyboards/crkbd/keymaps/kidbrazil/README.md
  2. 69 35
      keyboards/crkbd/keymaps/kidbrazil/keymap.c

+ 14 - 3
keyboards/crkbd/keymaps/kidbrazil/README.md

@@ -1,6 +1,6 @@
 # KidBrazil's custom CRKBD Layout
 # KidBrazil's custom CRKBD Layout
 
 
-![Crkbd](https://user-images.githubusercontent.com/736191/40575636-6fba63a4-6123-11e8-9ca0-3f990f1f9f4c.jpg)
+![Loose Transistor Crkbd](https://user-images.githubusercontent.com/4823043/71268460-0862c000-231b-11ea-8f32-2fe8da4d348a.jpg)
 
 
 This is a simple layout that I use for both programming and gaming. It is very
 This is a simple layout that I use for both programming and gaming. It is very
 closely based on the original CRKBD layout with some modifications to the
 closely based on the original CRKBD layout with some modifications to the
@@ -45,8 +45,19 @@ customize this with showing layer and USB information. I also tried my best to
 get a dormant / sleep state going but it is hit or miss and often only works on
 get a dormant / sleep state going but it is hit or miss and often only works on
 the master hand.
 the master hand.
 
 
+## OLED & RGB Matrix timeout
+This keymap will set a automated timeout system for the OLED screen and the RGB
+matrix. After 3 minutes or so the LED screen will display the logo on both
+halves and 5 minutes after that both the LED and the Matrix will be switched
+off.
+
+Once a user hits the keys again, the LED matrix will turn back on unless the
+user has disabled it via RGB_TOG.
+
+## Flashing
+To flash this on your CRKBD simply use the `make crkbd:kidbrazil:flash`
+command.
+
 ### TODO
 ### TODO
-- Fix OLED and Backlight so they turn off when the computer sleeps, currently
-  only the left hand does that and the LEDs still stay on.
 - Wait for Spit_common to be implemented in CRKBD and revisit the special color
 - Wait for Spit_common to be implemented in CRKBD and revisit the special color
   layers and animations
   layers and animations

+ 69 - 35
keyboards/crkbd/keymaps/kidbrazil/keymap.c

@@ -4,8 +4,10 @@
 extern uint8_t is_master;
 extern uint8_t is_master;
 // Oled timer similar to Drashna's
 // Oled timer similar to Drashna's
 static uint32_t oled_timer = 0;
 static uint32_t oled_timer = 0;
-// Boolean to store
-bool eeprom_oled_enabled = false;
+// Boolean to store LED state
+bool user_led_enabled = true;
+// Boolean to store the master LED clear so it only runs once.
+bool master_oled_cleared = false;
 
 
 // [CRKBD layers Init] -------------------------------------------------------//
 // [CRKBD layers Init] -------------------------------------------------------//
 enum crkbd_layers {
 enum crkbd_layers {
@@ -54,19 +56,39 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     )
     )
 };
 };
 
 
-//int RGB_current_mode;
+// [Post Init] --------------------------------------------------------------//
+void keyboard_post_init_user(void) {
+    // Set RGB to known state
+    rgb_matrix_enable_noeeprom();
+    rgb_matrix_set_color_all(RGB_GREEN);
+    user_led_enabled = true;
 
 
+}
 // [Process User Input] ------------------------------------------------------//
 // [Process User Input] ------------------------------------------------------//
 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
-    // Use process_record_keymap to reset timer on keypress
-    if (record->event.pressed) {
-        #ifdef OLED_DRIVER_ENABLE
-            oled_timer = timer_read32();
-        #endif
-        // Restore LEDs if they are enabled in eeprom
-        rgb_matrix_enable_noeeprom();
+    switch (keycode) {
+      case RGB_TOG:
+        if (record->event.pressed) {
+            // Toggle matrix on key press
+            user_led_enabled ? rgb_matrix_disable_noeeprom() : rgb_matrix_enable_noeeprom();
+        } else {
+            // Flip User_led_enabled variable on key release
+            user_led_enabled = !user_led_enabled;
+        }
+        return false; // Skip all further processing of this key
+      default:
+          // Use process_record_keymap to reset timer on all other keypresses
+          if (record->event.pressed) {
+              #ifdef OLED_DRIVER_ENABLE
+                  oled_timer = timer_read32();
+              #endif
+              // Restore LEDs if they are enabled by user
+              if (user_led_enabled) {
+                  rgb_matrix_enable_noeeprom();
+              }
+          }
+          return true;
     }
     }
-    return true;
 }
 }
 
 
 // [OLED Configuration] ------------------------------------------------------//
 // [OLED Configuration] ------------------------------------------------------//
@@ -180,35 +202,47 @@ void render_master_oled(void) {
     }
     }
 }
 }
 
 
-// lave OLED scren (Right Hand)
+// Slave OLED scren (Right Hand)
 void render_slave_oled(void) {
 void render_slave_oled(void) {
     render_logo();
     render_logo();
 }
 }
 
 
 // {OLED Task} -----------------------------------------------//
 // {OLED Task} -----------------------------------------------//
 void oled_task_user(void) {
 void oled_task_user(void) {
-      // Drashna style timeout for LED and OLED Roughly 8mins
-      if (timer_elapsed32(oled_timer) > 480000) {
-          oled_off();
-          rgb_matrix_disable_noeeprom();
-          return;
-      }
-      else {
-          oled_on();
-      }
-      // Show logo when USB dormant
-      switch (USB_DeviceState) {
-          case DEVICE_STATE_Unattached:
-          case DEVICE_STATE_Powered:
-          case DEVICE_STATE_Suspended:
-            render_logo();
-            break;
-          default:
-            if (is_master) {
-                render_master_oled();
-            } else {
-                render_slave_oled();
-            }
-      }
+    if (timer_elapsed32(oled_timer) > 80000 && timer_elapsed32(oled_timer) < 479999) {
+        // Render logo on both halves before full timeout
+        if (is_master && !master_oled_cleared) {
+            // Clear master OLED once so the logo renders properly
+            oled_clear();
+            master_oled_cleared = true;
+        }
+        render_logo();
+        return;
+    }
+    // Drashna style timeout for LED and OLED Roughly 8mins
+    else if (timer_elapsed32(oled_timer) > 480000) {
+        oled_off();
+        rgb_matrix_disable_noeeprom();
+        return;
+    }
+    else {
+        oled_on();
+        // Reset OLED Clear flag
+        master_oled_cleared = false;
+        // Show logo when USB dormant
+        switch (USB_DeviceState) {
+            case DEVICE_STATE_Unattached:
+            case DEVICE_STATE_Powered:
+            case DEVICE_STATE_Suspended:
+                render_logo();
+                break;
+            default:
+                if (is_master) {
+                    render_master_oled();
+                } else {
+                    render_slave_oled();
+                }
+        }
+    }
 }
 }
 #endif
 #endif