From fd44341cbf63787e1e0d8224a8dcb5143b029d2a Mon Sep 17 00:00:00 2001 From: Batuhan Baserdem <19315586+bbaserdem@users.noreply.github.com> Date: Sat, 2 Jul 2022 11:09:04 +0000 Subject: Userspace and keymap update for user bbaserdem. (#14484) --- users/bbaserdem/bbaserdem.c | 915 ++++++++++++++++---------------------------- 1 file changed, 321 insertions(+), 594 deletions(-) (limited to 'users/bbaserdem/bbaserdem.c') diff --git a/users/bbaserdem/bbaserdem.c b/users/bbaserdem/bbaserdem.c index cdacda12ee..08346c3d64 100644 --- a/users/bbaserdem/bbaserdem.c +++ b/users/bbaserdem/bbaserdem.c @@ -1,633 +1,360 @@ -#include "bbaserdem.h" - -/*---------------*\ -|*-----MOUSE-----*| -\*---------------*/ -#ifdef MOUSEKEY_ENABLE -#include "mousekey.h" -#endif - -/*-------------*\ -|*-----RGB-----*| -\*-------------*/ -#ifdef RGBLIGHT_ENABLE -#include "rgblight.h" -#endif - -/*-------------*\ -|*---UNICODE---*| -\*-------------*/ -#ifdef UNICODE_ENABLE -#endif - -/*-----------------*\ -|*-----SECRETS-----*| -\*-----------------*/ -// Enabled by adding a non-tracked secrets.h to this dir. -#if (__has_include("secrets.h")) -#include "secrets.h" -#endif - -/*---------------*\ -|*-----MUSIC-----*| -\*---------------*/ -#ifdef AUDIO_ENABLE -float tone_game[][2] = SONG(ZELDA_PUZZLE); -float tone_return[][2] = SONG(ZELDA_TREASURE); -float tone_linux[][2] = SONG(UNICODE_LINUX); -float tone_windows[][2] = SONG(UNICODE_WINDOWS); -#endif - -/*-------------------*\ -|*-----TAP-DANCE-----*| -\*-------------------*/ -#ifdef TAP_DANCE_ENABLE -qk_tap_dance_action_t tap_dance_actions[] = { - // Shift on double tap of semicolon - [SCL] = ACTION_TAP_DANCE_DOUBLE( KC_SCLN, KC_COLN ) -}; -#endif - -/* In keymaps, instead of writing _user functions, write _keymap functions - * The __attribute__((weak)) allows for empty definitions here, and during - * compilation, if these functions are defined elsewhere, they are written - * over. This allows to include custom code from keymaps in the generic code - * in this file. +/* Copyright 2021 Batuhan Başerdem + * @bbaserdem + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ -__attribute__ ((weak)) void matrix_init_keymap(void) { } -__attribute__ ((weak)) void matrix_scan_keymap(void) { } -__attribute__ ((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { - return true; + +#include "bbaserdem.h" +// Language imports +#include +// Need memcpy and memcmp from string.h along with transfer stuff +#ifdef SPLIT_KEYBOARD +#include "transactions.h" +#include +#endif // SPLIT_KEYBOARD + +/*-------------------------*\ +|*-----KEYBOARD CONFIG-----*| +\*-------------------------*/ +userspace_config_t userspace_config; +userspace_runtime_t userspace_runtime; + +/*---------------------------------*\ +|*----SPLIT KEYBOARD TRANSPORT-----*| +\*---------------------------------*/ +#ifdef SPLIT_KEYBOARD +userspace_config_t transport_userspace_config; +userspace_runtime_t transport_userspace_runtime; + +// Translate the RPC data to the local variable +void userspace_config_sync(uint8_t in_buflen, const void* in_data, uint8_t out_buflen, void* out_data) { + // Copy incoming data to local variable + if (in_buflen == sizeof(transport_userspace_config)) { + memcpy(&transport_userspace_config, in_data, in_buflen); + } + // There is no data to send back; so no output handling } -__attribute__ ((weak)) uint32_t layer_state_set_keymap (uint32_t state) { - return state; +void userspace_runtime_sync(uint8_t in_buflen, const void* in_data, uint8_t out_buflen, void* out_data) { + // Copy incoming data to local variable + if (in_buflen == sizeof(transport_userspace_runtime)) { + memcpy(&transport_userspace_runtime, in_data, in_buflen); + } + // There is no data to send back; so no output handling } -__attribute__ ((weak)) void led_set_keymap(uint8_t usb_led) { } -/* ----------------------- *\ - * -----RGB Functions----- * -\* ----------------------- */ -#ifdef RGBLIGHT_ENABLE -// Storage variables -extern rgblight_config_t rgblight_config; -bool base_sta; // Keeps track if in saveable state -bool base_tog; // Whether base state is active or not -int base_hue; // Hue value of base state -int base_sat; // Saturation value of base state -int base_val; // Brightness value of base state -uint8_t base_mod; // Animation mode of the base state - -// Save the current state of the rgb mode -void rgblight_saveBase(void) { - base_hue = rgblight_config.hue; - base_sat = rgblight_config.sat; - base_val = rgblight_config.val; - base_mod = rgblight_config.mode; - base_tog = rgblight_config.enable; - base_sta = false; // If saving, that means base layer is being left +// Either send or receive the correct data +void userspace_transport_update(void) { + if (is_keyboard_master()) { + // If we are the main device; we want to send info. + transport_userspace_config.raw = userspace_config.raw; + transport_userspace_runtime.raw = userspace_runtime.raw; + } else { + // If we are the secondary device; we want to receive info, and save to eeprom. + userspace_config.raw = transport_userspace_config.raw; + userspace_runtime.raw = transport_userspace_runtime.raw; + } } -// Load the base state back -void rgblight_loadBase(void) { - // Don't do anything if not enabled - if ( !base_sta ) { - if ( base_tog ) { - rgblight_enable(); - rgblight_mode( base_mod ); - rgblight_sethsv( base_hue, base_sat, base_val ); - } else { - rgblight_disable(); +// Initiate the protocol on sync +void userspace_transport_sync(bool force_sync) { + if (is_keyboard_master()) { + // Keep track of the last state + static userspace_config_t last_userspace_config; + static userspace_runtime_t last_userspace_runtime; + bool needs_sync = false; + + // Check if the config values are different + if (memcmp(&transport_userspace_config, &last_userspace_config, sizeof(transport_userspace_config))) { + needs_sync = true; + memcpy(&last_userspace_config, &transport_userspace_config, sizeof(transport_userspace_config)); + } + // Perform the sync if requested + if (needs_sync || force_sync) { + transaction_rpc_send(RPC_ID_CONFIG_SYNC, sizeof(transport_userspace_config), &transport_userspace_config); + needs_sync = false; } - } - // Mark that base is loaded, and to be saved before leaving - base_sta = true; -} -// Set to plain HSV color -void rgblight_colorStatic( int hu, int sa, int va ) { - // First, it must be enabled or color change is not written - rgblight_enable(); - rgblight_mode(1); - rgblight_sethsv(hu,sa,va); -} -/* HSV values - * white ( 0, 0, 255) - * red ( 0, 255, 255) - * coral ( 16, 176, 255) - * orange ( 39, 255, 255) - * goldenrod ( 43, 218, 218) - * gold ( 51, 255, 255) - * yellow ( 60, 255, 255) - * chartreuse ( 90, 255, 255) - * green (120, 255, 255) - * springgreen (150, 255, 255) - * turquoise (174, 90, 112) - * teal (180, 255, 128) - * cyan (180, 255, 255) - * azure (186, 102, 255) - * blue (240, 255, 255) - * purple (270, 255, 255) - * magenta (300, 255, 255) - * pink (330, 128, 255) - */ + // Check if the runtime values are different + if (memcmp(&transport_userspace_runtime, &last_userspace_runtime, sizeof(transport_userspace_runtime))) { + needs_sync = true; + memcpy(&last_userspace_runtime, &transport_userspace_runtime, sizeof(transport_userspace_runtime)); + } -// Set RGBLIGHT state depending on layer -void rgblight_change( uint8_t this_layer ) { - // Save state, if saving is requested - if ( base_sta ) { - rgblight_saveBase(); - } - // Change RGB light - switch ( this_layer ) { - case _DV: - // Load base layer - rgblight_loadBase(); - break; - case _AL: - // Do yellow for alternate - rgblight_colorStatic( 60,255,255); - break; - case _GA: - // Do purple for game - rgblight_colorStatic(285,255,255); - break; - case _NU: - // Do azure for number - rgblight_colorStatic(186,200,255); - break; - case _SE: - // Do red for settings - rgblight_colorStatic( 16,255,255); - break; - case _MO: - // Do green for mouse - rgblight_colorStatic(120,255,255); - break; - case _MU: - // Do orange for music - rgblight_colorStatic( 39,255,255); - break; - default: - // Something went wrong - rgblight_colorStatic( 0,255,255); - break; + // Perform the sync if requested + if (needs_sync || force_sync) { + transaction_rpc_send(RPC_ID_RUNTIME_SYNC, sizeof(transport_userspace_runtime), &transport_userspace_runtime); + needs_sync = false; + } } } +#endif // SPLIT_KEYBOARD -#endif +/*---------------------------*\ +|*-----KEYBOARD PRE INIT-----*| +\*---------------------------*/ +/* This code runs before anything is started. + * Good for early hardware setup + */ +__attribute__ ((weak)) void keyboard_pre_init_keymap(void) {} +__attribute__ ((weak)) void keyboard_pre_init_user(void) { + // Keymap specific stuff + keyboard_pre_init_keymap(); +} /*---------------------*\ |*-----MATRIX INIT-----*| \*---------------------*/ +/* This code runs once midway thru the firmware process. + * So far, sets the base layer and fixes unicode mode + */ +__attribute__ ((weak)) void matrix_init_keymap(void) {} void matrix_init_user (void) { - - // Keymap specific things, do it first thing to allow for delays etc + // Keymap specific things matrix_init_keymap(); +} + +/*----------------------------*\ +|*-----KEYBOARD POST INIT-----*| +\*----------------------------*/ +/* This code runs after anything is started. + * Good for late hardware setup, like setting up layer specifications + */ +__attribute__ ((weak)) void keyboard_post_init_keymap(void) {} +__attribute__ ((weak)) void keyboard_post_init_user(void) { + // Fix beginning base layer, in case some other firmware was flashed + // set_single_persistent_default_layer(_BASE); - // Correct unicode -#ifdef UNICODE_ENABLE + // Unicode mode +# ifdef UNICODEMAP_ENABLE set_unicode_input_mode(UC_LNX); -#endif +# endif // UNICODEMAP_ENABLE + + // Split keyboard halves communication +# ifdef SPLIT_KEYBOARD + // Register the transactions + transaction_register_rpc( RPC_ID_CONFIG_SYNC, userspace_config_sync ); + transaction_register_rpc(RPC_ID_RUNTIME_SYNC, userspace_runtime_sync); + // Load default config values + if (is_keyboard_master()) { + // If we are main; load from eeconfig + userspace_config.raw = eeconfig_read_user(); + // And update the transport variable + userspace_transport_update(); + // Do one forced transfer to sync halves + userspace_transport_sync(true); + } else { + // Just sync the data received + userspace_transport_update(); + } +# else // SPLIT_KEYBOARD + // If we are not split; just load from eeprom + userspace_config.raw = eeconfig_read_user(); +# endif // SPLIT_KEYBOARD + + // Backlight LED +# ifdef BACKLIGHT_ENABLE + keyboard_post_init_backlight(); +# endif // BACKLIGHT_ENABLE + + // RGB underglow +# ifdef RGBLIGHT_ENABLE + keyboard_post_init_underglow(); +# endif // RGBLIGHT_ENABLE + + // Keymap specific stuff + keyboard_post_init_keymap(); +} - // Make beginning layer DVORAK - set_single_persistent_default_layer(_DV); +/*---------------------------*\ +|*-----HOUSEKEEPING TASK-----*| +\*---------------------------*/ +/* I have no idea what this does + */ +__attribute__ ((weak)) void housekeeping_task_keymap(void) {} +void housekeeping_task_user(void) { + // Check eeprom every now and then + static userspace_config_t prev_userspace_config; + static fast_timer_t throttle_timer = 0; + static bool init_flag = true; + + // Read this if we never read it before + if (init_flag) { + init_flag = false; + prev_userspace_config.raw = eeconfig_read_user(); + } -//--RGB light initialize base layer -#ifdef RGBLIGHT_ENABLE - // Base hue is white, and RGB disabled - base_hue = 100; - base_sat = 0; - base_val = 255; - base_mod = 2; - base_tog = false; - rgblight_enable(); - rgblight_mode(base_mod); - rgblight_sethsv(base_hue,base_sat,base_val); - rgblight_disable(); - rgblight_loadBase(); -#endif + // Throttled tasks here + if (timer_elapsed_fast(throttle_timer) >= HOUSEKEEPING_THROTTLE_INTERVAL_MS) { + // Refresh timer + throttle_timer = timer_read_fast(); + // Check userspace config for eeprom updates + if (memcmp(&prev_userspace_config, &userspace_config, sizeof(userspace_config))) { + memcpy(&prev_userspace_config, &userspace_config, sizeof(userspace_config)); + eeconfig_update_user(userspace_config.raw); + } + } + + // Do transport stuff +# ifdef SPLIT_KEYBOARD + userspace_transport_update(); + userspace_transport_sync(false); +# endif // SPLIT_KEYBOARD + // Hook to keymap code + housekeeping_task_keymap(); +} + +/*-----------------------*\ +|*-----EECONFIG INIT-----*| +\*-----------------------*/ +/* Default values to send to the eeprom + */ +void eeconfig_init_user(void) { + // Set everything to default + userspace_config.raw = 0; + // Set encoder states to sane defaults if enabled +# ifdef ENCODER_ENABLE + reset_encoder_state(); +# endif // ENCODER_ENABLE +} + +/*------------------------*\ +|*-----PROCESS RECORD-----*| +\*------------------------*/ +/* Process record: custom keycodes to process here + * Allow also the following codes to hook here as well; + * Macro definitions + * Audio hooks + */ +__attribute__ ((weak)) +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + return true; +} +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + // Return after running through all individual hooks + return + process_record_keymap(keycode, record) && +# ifdef AUDIO_ENABLE + process_record_audio(keycode, record) && +# endif // AUDIO_ENABLE +# ifdef ENCODER_ENABLE + process_record_encoder(keycode, record) && +# endif // ENCODER_ENABLE + process_record_macro(keycode, record); } /*---------------------*\ |*-----MATRIX SCAN-----*| \*---------------------*/ +/* This code runs every frame + * I used to check for layer switching here, but layer state is better used. + * Try to not put anything here; as it runs hundreds time per second-ish + */ +__attribute__ ((weak)) void matrix_scan_keymap(void) { } void matrix_scan_user (void) { - // Keymap specific, do it first + // Keymap specific scan function matrix_scan_keymap(); } -/*------------------*\ -|*-----KEYCODES-----*| -\*------------------*/ -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - - // Shift check - bool is_capital = ( keyboard_report->mods & (MOD_BIT(KC_LSFT)|MOD_BIT(KC_RSFT)) ); - static bool lock_flag = false; - uint8_t layer = biton32 (layer_state); - - switch (keycode) { - // Secrets implementation -#if (__has_include("secrets.h")) - case SECRET1: - if( !record->event.pressed ) { - send_string_P( secret[ keycode - SECRET1 ] ); - } - return false; - break; - case SECRET2: - if( !record->event.pressed ) { - send_string_P( secret[ keycode - SECRET2 ] ); - } - return false; - break; - case SECRET3: - if( !record->event.pressed ) { - send_string_P( secret[ keycode - SECRET3 ] ); - } - return false; - break; -#endif - - // If these keys are pressed, load base layer config, and mark saving -#ifdef RGBLIGHT_ENABLE - case RGB_TOG: - case RGB_MOD: - case RGB_VAI: - case RGB_VAD: - case RGB_SAI: - case RGB_SAD: - case RGB_HUI: - case RGB_HUD: - if ( !base_sta ) { - rgblight_loadBase(); - } - return true; - break; -#endif - - // Lock functionality: These layers are locked if the LOCKED buttons are - // pressed. Otherwise, they are momentary toggles - case K_LOCK: - if (record->event.pressed) { - lock_flag = !lock_flag; - } - return false; - break; - case K_MOUSE: - if (record->event.pressed) { - layer_on(_MO); - lock_flag = false; - } else { - if ( lock_flag ) { - lock_flag = false; - } else { - layer_off(_MO); - } - } - return false; - break; - case K_NUMBR: - if (record->event.pressed) { - layer_on(_NU); - lock_flag = false; - } else { - if ( lock_flag ) { - lock_flag = false; - } else { - layer_off(_NU); - } - } - return false; - break; - - // Layer switches with sound - case K_GAMES: - if (record->event.pressed) { - // On press, turn off layer if active - if ( layer == _GA ) { -#ifdef AUDIO_ENABLE - stop_all_notes(); - PLAY_SONG(tone_return); -#endif - layer_off(_GA); - } - } else { - // After click, turn on layer if accessed from setting - if ( layer == _SE ) { -#ifdef AUDIO_ENABLE - stop_all_notes(); - PLAY_SONG(tone_game); -#endif - layer_on(_GA); - layer_off(_SE); - } - } - return false; - break; - case MU_TOG: - if (record->event.pressed) { - // On press, turn off layer if active - if ( layer == _SE ) { - layer_off(_SE); - layer_on(_MU); - } else { - layer_off(_MU); - } - } - return true; - break; - -//------UNICODE - // Unicode switches with sound -#ifdef UNICODE_ENABLE - case UNI_LI: - if (record->event.pressed) { -#ifdef AUDIO_ENABLE - stop_all_notes(); - PLAY_SONG(tone_linux); -#endif - set_unicode_input_mode(UC_LNX); - } - return false; - break; - case UNI_WN: - if (record->event.pressed) { -#ifdef AUDIO_ENABLE - stop_all_notes(); - PLAY_SONG(tone_windows); -#endif - set_unicode_input_mode(UC_WIN); - } - return false; - break; - - // Turkish letters, with capital functionality - case TUR_A: - if (record->event.pressed) { - if ( is_capital ) { - unicode_input_start(); - register_hex(0x00c2); - unicode_input_finish(); - } else { - unicode_input_start(); - register_hex(0x00e2); - unicode_input_finish(); - } - } - return false; - break; - case TUR_O: - if (record->event.pressed) { - if ( is_capital ) { - unicode_input_start(); - register_hex(0x00d6); - unicode_input_finish(); - } else { - unicode_input_start(); - register_hex(0x00f6); - unicode_input_finish(); - } - } - return false; - break; - case TUR_U: - if (record->event.pressed) { - if ( is_capital ) { - unicode_input_start(); - register_hex(0x00dc); - unicode_input_finish(); - } else { - unicode_input_start(); - register_hex(0x00fc); - unicode_input_finish(); - } - } - return false; - break; - case TUR_I: - if (record->event.pressed) { - if ( is_capital ) { - unicode_input_start(); - register_hex(0x0130); - unicode_input_finish(); - } else { - unicode_input_start(); - register_hex(0x0131); - unicode_input_finish(); - } - } - return false; - break; - case TUR_G: - if (record->event.pressed) { - if ( is_capital ) { - unicode_input_start(); - register_hex(0x011e); - unicode_input_finish(); - } else { - unicode_input_start(); - register_hex(0x011f); - unicode_input_finish(); - } - } - return false; - break; - case TUR_C: - if (record->event.pressed) { - if ( is_capital ) { - unicode_input_start(); - register_hex(0x00c7); - unicode_input_finish(); - } else { - unicode_input_start(); - register_hex(0x00e7); - unicode_input_finish(); - } - } - return false; - break; - case TUR_S: - if (record->event.pressed) { - if ( is_capital ) { - unicode_input_start(); - register_hex(0x015e); - unicode_input_finish(); - } else { - unicode_input_start(); - register_hex(0x015f); - unicode_input_finish(); - } - } - return false; - break; -#endif +/*---------------------*\ +|*-----LAYER STATE-----*| +\*---------------------*/ +/* This code runs after every layer change + * State represents the new layer state. + */ +__attribute__ ((weak)) +layer_state_t layer_state_set_keymap (layer_state_t state) { + return state; +} +layer_state_t layer_state_set_user(layer_state_t state) { + // Keymap layer state setting + state = layer_state_set_keymap(state); + // For underglow stuff +# ifdef RGBLIGHT_ENABLE + state = layer_state_set_underglow(state); +# endif // RGBLIGHT_ENABLE + // Audio playback +# ifdef AUDIO_ENABLE + state = layer_state_set_audio(state); +# endif // AUDIO_ENABLE -//-------Diagonal mouse movements -#ifdef MOUSEKEY_ENABLE - case MO_NE: - if( record->event.pressed ) { - mousekey_on(MO_N); - mousekey_on(MO_E); - mousekey_send(); - } else { - mousekey_off(MO_N); - mousekey_off(MO_E); - mousekey_send(); - } - return false; - break; - case MO_NW: - if( record->event.pressed ) { - mousekey_on(MO_N); - mousekey_on(MO_W); - mousekey_send(); - } else { - mousekey_off(MO_N); - mousekey_off(MO_W); - mousekey_send(); - } - return false; - break; - case MO_SE: - if( record->event.pressed ) { - mousekey_on(MO_S); - mousekey_on(MO_E); - mousekey_send(); - } else { - mousekey_off(MO_S); - mousekey_off(MO_E); - mousekey_send(); - } - return false; - break; - case MO_SW: - if( record->event.pressed ) { - mousekey_on(MO_S); - mousekey_on(MO_W); - mousekey_send(); - } else { - mousekey_off(MO_S); - mousekey_off(MO_W); - mousekey_send(); - } - return false; - break; - case MO_S_NE: - if( record->event.pressed ) { - mousekey_on(MO_S_N); - mousekey_on(MO_S_E); - mousekey_send(); - } else { - mousekey_off(MO_S_N); - mousekey_off(MO_S_E); - mousekey_send(); - } - return false; - break; - case MO_S_NW: - if( record->event.pressed ) { - mousekey_on(MO_S_N); - mousekey_on(MO_S_W); - mousekey_send(); - } else { - mousekey_off(MO_S_N); - mousekey_off(MO_S_W); - mousekey_send(); - } - return false; - break; - case MO_S_SE: - if( record->event.pressed ) { - mousekey_on(MO_S_S); - mousekey_on(MO_S_E); - mousekey_send(); - } else { - mousekey_off(MO_S_S); - mousekey_off(MO_S_E); - mousekey_send(); - } - return false; - break; - case MO_S_SW: - if( record->event.pressed ) { - mousekey_on(MO_S_S); - mousekey_on(MO_S_W); - mousekey_send(); - } else { - mousekey_off(MO_S_S); - mousekey_off(MO_S_W); - mousekey_send(); - } - return false; - break; -#endif + return state; +} -//------DOUBLE PRESS, with added left navigation - case DBL_SPC: - if( record->event.pressed ) { - SEND_STRING(" "SS_TAP(X_LEFT)); - } - return false; - break; - case DBL_ANG: - if( record->event.pressed ) { - SEND_STRING("<>"SS_TAP(X_LEFT)); - } - return false; - break; - case DBL_PAR: - if( record->event.pressed ) { - SEND_STRING("()"SS_TAP(X_LEFT)); - } - return false; - break; - case DBL_SQR: - if( record->event.pressed ) { - SEND_STRING("[]"SS_TAP(X_LEFT)); - } - return false; - break; - case DBL_BRC: - if( record->event.pressed ) { - SEND_STRING("{}"SS_TAP(X_LEFT)); - } - return false; - break; - case DBL_QUO: - if( record->event.pressed ) { - SEND_STRING("\'\'"SS_TAP(X_LEFT)); - } - return false; - break; - case DBL_DQT: - if( record->event.pressed ) { - SEND_STRING("\"\""SS_TAP(X_LEFT)); - } - return false; - break; - case DBL_GRV: - if( record->event.pressed ) { - SEND_STRING("``"SS_TAP(X_LEFT)); - } - return false; - break; -// END OF KEYCODES - } - return process_record_keymap(keycode, record); +/*-----------------------------*\ +|*-----DEFAULT LAYER STATE-----*| +\*-----------------------------*/ +/* This code runs after every time default base layer is changed + */ +__attribute__ ((weak)) +layer_state_t default_layer_state_set_keymap (layer_state_t state) { + return state; +} +layer_state_t default_layer_state_set_user(layer_state_t state) { + // Keymap level code + state = default_layer_state_set_keymap(state); + return state; } -/*----------------------*\ -|*-----LAYER CHANGE-----*| -\*----------------------*/ +/*------------------------*\ +|*-----LED SET KEYMAP-----*| +\*------------------------*/ +/* Code for LED indicators + * I'm not sure when exactly does this code run + */ +__attribute__ ((weak)) void led_set_keymap(uint8_t usb_led) {} +void led_set_user(uint8_t usb_led) { + led_set_keymap(usb_led); +} -layer_state_t layer_state_set_user(layer_state_t state) { +/*-----------------*\ +|*-----SUSPEND-----*| +\*-----------------*/ +/* Suspend stuff here, mostly for the rgb lighting. + */ +__attribute__ ((weak)) void suspend_power_down_keymap (void) { } +void suspend_power_down_user(void) { + suspend_power_down_keymap(); + // RGB matrix sleep hook +# ifdef RGB_MATRIX_ENABLE + suspend_power_down_rgb(); +# endif // RGB_MATRIX_ENABLE +} +__attribute__ ((weak)) void suspend_wakeup_init_keymap (void) { } +void suspend_wakeup_init_user(void) { + suspend_wakeup_init_keymap(); + // RGB matrix sleep hook +# ifdef RGB_MATRIX_ENABLE + suspend_wakeup_init_rgb(); +# endif // RGB_MATRIX_ENABLE +} - state = layer_state_set_keymap (state); -#ifdef RGBLIGHT_ENABLE - // Change RGB lighting depending on the last layer activated - rgblight_change( biton32(state) ); -#endif - return state; +/*------------------*\ +|*-----SHUTDOWN-----*| +\*------------------*/ +/* Shutdown stuff here; for when entering bootmode. + */ +__attribute__ ((weak)) void shutdown_keymap (void) { } +void shutdown_user(void) { + // Underglow LED hook on boot +# ifdef RGBLIGHT_ENABLE + shutdown_underglow(); +# endif // RGBLIGHT_ENABLE + // Perkey led hook on boot +# ifdef RGB_MATRIX_ENABLE + shutdown_rgb(); +# endif // RGB_MATRIX_ENABLE + // Keymap hooks + shutdown_keymap(); } -- cgit v1.2.3