feat: custom keycode and saved settings for indicator

This commit is contained in:
H3lli0n 2024-10-20 11:33:45 +02:00
parent 9bfde59fd7
commit b533b0ebe3
4 changed files with 70 additions and 15 deletions

View file

@ -15,14 +15,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
enum layers {
_BASE = 0,
_FN,
_MEDIA,
_GAME,
_MAC,
};
#include "poorkoi.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// main layer

View file

@ -1,6 +1,12 @@
{
"name": "PoorKoi",
"lighting": "qmk_rgblight",
"customKeycodes": [
{"name": "LAY_INDIC_RGB",
"title": "Layer indicator on capslock LED",
"shortName": "L_INDIC"
}
],
"matrix": {
"rows": 5,
"cols": 14

View file

@ -16,11 +16,43 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "poorkoi.h"
typedef union {
uint32_t raw;
struct {
bool rgb_layer_change :1;
};
} user_config_t;
/* User preference */
user_config_t user_config;
void eeconfig_init_user(void) { // EEPROM is getting reset!
user_config.raw = 0;
user_config.rgb_layer_change = false; // We want this enabled by default
eeconfig_update_user(user_config.raw); // Write default value to EEPROM now
// use the non noeeprom versions, to write these values to EEPROM too
rgblight_enable(); // Enable RGB by default
rgblight_sethsv(HSV_PURPLE); // Set it to PURPLE by default
rgblight_mode(1); // set to solid by default
}
void keyboard_pre_init_kb(void) {
rgblight_set_effect_range(0, 16);
keyboard_pre_init_user();
}
void keyboard_post_init_user(void) {
// Read the user config from EEPROM
user_config.raw = eeconfig_read_user();
// Set default layer, if enabled
if (user_config.rgb_layer_change) {
rgblight_enable_noeeprom();
rgblight_sethsv_at(HSV_OFF, 16);
}
}
/* Updating LED located under capslock */
bool led_update_kb(led_t led_state) {
bool res = led_update_user(led_state);
@ -30,14 +62,16 @@ bool led_update_kb(led_t led_state) {
if(led_state.caps_lock) {
rgblight_sethsv_at(CAPS_LOCK_COLOR, 16);
}
// Color of activated layer
else{
rgblight_sethsv_at(HSV_OFF, 16);
layer_state_set(layer_state);
}
}
return res;
}
/* Use capslock led for layer indicator */
layer_state_t layer_state_set_user(layer_state_t state) {
switch (get_highest_layer(state)) {
case _BASE:
@ -45,24 +79,42 @@ layer_state_t layer_state_set_user(layer_state_t state) {
rgblight_sethsv_at(CAPS_LOCK_COLOR, 16);
}
else{
rgblight_sethsv_at(HSV_OFF, 16);
if (user_config.rgb_layer_change) { rgblight_sethsv_at(HSV_OFF, 16);}
}
break;
case _FN:
rgblight_sethsv_at(LAYER_FN_COLOR, 16);
if (user_config.rgb_layer_change) { rgblight_sethsv_at(LAYER_FN_COLOR, 16); }
break;
case _MEDIA:
rgblight_sethsv_at(LAYER_MEDIA_COLOR, 16);
if (user_config.rgb_layer_change) { rgblight_sethsv_at(LAYER_MEDIA_COLOR, 16); }
break;
case _GAME:
rgblight_sethsv_at(LAYER_GAMING_COLOR, 16);
if (user_config.rgb_layer_change) { rgblight_sethsv_at(LAYER_GAMING_COLOR, 16); }
break;
case _MAC:
rgblight_sethsv_at(LAYER_MAC_COLOR, 16);
if (user_config.rgb_layer_change) { rgblight_sethsv_at(LAYER_MAC_COLOR, 16); }
break;
default: // for any other layers, or the default layer
rgblight_sethsv_at(HSV_OFF, 16);
break;
}
return state;
return state;
}
/* Update user preference on layer indicator*/
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case LAY_INDIC_RGB:
if (record->event.pressed) {
user_config.rgb_layer_change ^= 1; // Toggles the status
eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
if (user_config.rgb_layer_change) { // if layer state indication is enabled,
layer_state_set(layer_state); // then immediately update the layer color
}
}
return false; // Skip all further processing of this key
default:
return true; // Process all other keycodes normally
}
}

View file

@ -33,3 +33,7 @@ enum layers {
_GAME,
_MAC,
};
enum hlbKeycodes {
LAY_INDIC_RGB = QK_KB_0,
};