Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 12 commits into from
Jan 8, 2020
17 changes: 14 additions & 3 deletions keyboards/crkbd/keymaps/kidbrazil/README.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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:avrdude`
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
104 changes: 69 additions & 35 deletions keyboards/crkbd/keymaps/kidbrazil/keymap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a logic bug here. Although the variable is named oled_timer, it's used to timeout both the RGB Matrix and the OLEDs. As it's written, disabling the OLEDs will break the RGB Matrix timeout because oled_timer will not be set.

To resolve it, I recommend renaming oled_timer to timeout_timer and remove the conditional ifdef here.

// Restore LEDs if they are enabled by user
if (user_led_enabled) {
rgb_matrix_enable_noeeprom();
}
}
return true;
}
return true;
}

// [OLED Configuration] ------------------------------------------------------//
Expand Down Expand Up @@ -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