From fdc144d215b59a5bc3f3283b159895ec42ccba0b Mon Sep 17 00:00:00 2001 From: Lucas Moreira Date: Tue, 7 Jan 2020 20:28:06 -0500 Subject: [PATCH] [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 --- keyboards/crkbd/keymaps/kidbrazil/README.md | 17 +++- keyboards/crkbd/keymaps/kidbrazil/keymap.c | 104 +++++++++++++------- 2 files changed, 83 insertions(+), 38 deletions(-) diff --git a/keyboards/crkbd/keymaps/kidbrazil/README.md b/keyboards/crkbd/keymaps/kidbrazil/README.md index 28414860c..a7995a4f6 100644 --- a/keyboards/crkbd/keymaps/kidbrazil/README.md +++ b/keyboards/crkbd/keymaps/kidbrazil/README.md @@ -1,6 +1,6 @@ # 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 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 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 -- 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 layers and animations diff --git a/keyboards/crkbd/keymaps/kidbrazil/keymap.c b/keyboards/crkbd/keymaps/kidbrazil/keymap.c index 1086cce3a..44142d4f2 100644 --- a/keyboards/crkbd/keymaps/kidbrazil/keymap.c +++ b/keyboards/crkbd/keymaps/kidbrazil/keymap.c @@ -4,8 +4,10 @@ extern uint8_t is_master; // Oled timer similar to Drashna's 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] -------------------------------------------------------// 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] ------------------------------------------------------// 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] ------------------------------------------------------// @@ -180,35 +202,47 @@ void render_master_oled(void) { } } -// lave OLED scren (Right Hand) +// Slave OLED scren (Right Hand) void render_slave_oled(void) { render_logo(); } // {OLED Task} -----------------------------------------------// 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