diff --git a/keyboards/fjlabs/vanguard65/keymaps/via/keymap.c b/keyboards/fjlabs/vanguard65/keymaps/via/keymap.c index 933ac9d33d8..952555edeba 100644 --- a/keyboards/fjlabs/vanguard65/keymaps/via/keymap.c +++ b/keyboards/fjlabs/vanguard65/keymaps/via/keymap.c @@ -30,6 +30,32 @@ enum custom_keycodeas { }; +// Set up EEPROM. Mostly boilerplate from QMK docs +typedef union { + uint32_t raw; + struct { + uint8_t slider_func_state : 8; // Hold only the slider function state. Will be a low value integer, so 8 bits will be used to store. + }; +} user_config_t; +user_config_t user_config; +uint8_t slider_func = 0; + +// On keyboard initialization, pull the EEPROM values +void keyboard_post_init_user(void) { + // Call the keymap level matrix init. + + user_config.raw = eeconfig_read_user(); + + slider_func = user_config.slider_func_state; +}; + +// When the EEPROM gets forcefully reset, set the initialization value +void eeconfig_init_user(void) { + user_config.raw = 0; + user_config.slider_func_state = 0; + eeconfig_update_user(user_config.raw); +} + #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { [_LAYER1] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, @@ -97,8 +123,88 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { }; } +// ====== Process VIA Custom UI ====== +// enum for the Value ID of the slider control +enum via_slider_control { + id_slider_func = 1 +}; + +// Define the function to set the slider value +void slider_func_set_value ( uint8_t *data ) { + // data = [ value_id, value_data ] + uint8_t *value_id = &(data[0]); + uint8_t *value_data = &(data[1]); + + switch ( *value_id ) + { + case id_slider_func: + { + slider_func = *value_data; + user_config.slider_func_state = *value_data; + eeconfig_update_user(user_config.raw); // Going to set it here instead of separately in the VIA save function. No point since this value is not being toggled very often + break; + } + } +} + +// Define the function to read the slider value [so that VIA UI knows what to display] +void slider_func_get_value( uint8_t *data ) { + // data = [ value_id, value_data ] + uint8_t *value_id = &(data[0]); + uint8_t *value_data = &(data[1]); + + switch ( *value_id ) + { + case id_slider_func: + { + *value_data = slider_func; + break; + } + } +} + +// Boilerplate from VIA Custom UI Documentation. Listen on the custom command channel, +void via_custom_value_command_kb(uint8_t *data, uint8_t length) { + // data = [ command_id, channel_id, value_id, value_data ] + uint8_t *command_id = &(data[0]); + uint8_t *channel_id = &(data[1]); + uint8_t *value_id_and_data = &(data[2]); + + if ( *channel_id == id_custom_channel ) { + switch ( *command_id ) + { + case id_custom_set_value: + { + slider_func_set_value(value_id_and_data); + break; + } + case id_custom_get_value: + { + slider_func_get_value(value_id_and_data); + break; + } + case id_custom_save: + { + //buttglow_config_save(); // Not doing this + break; + } + default: + { + // Unhandled message. + *command_id = id_unhandled; + break; + } + } + return; + } + + // Return the unhandled state + *command_id = id_unhandled; + + // DO NOT call raw_hid_send(data,length) here, let caller do this +} + /* MIDI Slider controls */ -uint16_t denoise_level = 16; uint8_t last_val = 0; uint8_t rgb_hue = 0; uint8_t rgb_sat = 0; @@ -108,9 +214,37 @@ void slider(void) { uint8_t current_val = analogReadPin(SLIDER_PINA) >>3; if ( last_val - current_val < -1 || last_val - current_val > 1 ) { - rgb_hue = rgblight_get_hue(); // Pull current hue and saturation values since we're just adjusting brightness - rgb_sat = rgblight_get_sat(); - rgblight_sethsv(rgb_hue, rgb_sat, current_val * 2); + + // Underglow RGB Brightness + if ( slider_func == 0 ) { + uint8_t rounded_val = 0; + rgb_hue = rgblight_get_hue(); // Pull current hue and saturation values since we're just adjusting brightness + rgb_sat = rgblight_get_sat(); + + // Since the lower end range of the slider can be a little bit noisy, it's going to make the zero-value a little hard to hit when it bounces around between 0-1-2. Better off to round any super low values to zero so the lights will affirmatively turn off at lower values. + if ( current_val < 3 ) { + rounded_val = 0; + } else { + rounded_val = current_val; + } + + rgblight_sethsv(rgb_hue, rgb_sat, rounded_val * 2); // At 8 bits, it's going to be 0-128, so double to get full range. + } + + // MIDI CC 90 + else if ( slider_func == 1 ) { + midi_send_cc(&midi_device, 0, 90, current_val ); // (&midi_device, chan, message, highest control value - (current pin reading) >>resolution) + } + + // Layer shift between layers 1 - 4 + else if ( slider_func == 2 ) { + layer_move(current_val >>5); + } + + else { + return; + } + last_val = current_val; } }