diff --git a/keyboards/svalboard/config.h b/keyboards/svalboard/config.h index 31def5f2814..204e9070e4e 100644 --- a/keyboards/svalboard/config.h +++ b/keyboards/svalboard/config.h @@ -29,7 +29,8 @@ along with this program. If not, see . #define FORCE_NKRO #define EE_HANDS //#define DEBUG_MATRIX_SCAN_RATE -#define EECONFIG_KB_DATA_SIZE 5 +// Data size is 5 + (16 * 3), to include layer colors in HSV struct. +#define EECONFIG_KB_DATA_SIZE 53 #define FLASH_LEN (16 * 1024 * 1024) @@ -94,6 +95,7 @@ along with this program. If not, see . #define RGBLIGHT_VAL_STEP 10 #define RGBLIGHT_LED_COUNT 2 +#define SPLIT_TRANSACTION_IDS_KB KEYBOARD_SYNC_A #define PERMISSIVE_HOLD #define ACHORDION_STREAK diff --git a/keyboards/svalboard/keymaps/vial/keymap.c b/keyboards/svalboard/keymaps/vial/keymap.c index 53047f66557..4deb40b59f7 100644 --- a/keyboards/svalboard/keymaps/vial/keymap.c +++ b/keyboards/svalboard/keymaps/vial/keymap.c @@ -23,42 +23,13 @@ along with this program. If not, see . #include #include "svalboard.h" -#define LAYER_COLOR(name, color) rgblight_segment_t const (name)[] = RGBLIGHT_LAYER_SEGMENTS({0, 2, color}) - -LAYER_COLOR(layer0_colors, HSV_GREEN); // NORMAL -LAYER_COLOR(layer1_colors, HSV_ORANGE); // FUNC -LAYER_COLOR(layer2_colors, HSV_AZURE); // NAS -LAYER_COLOR(layer3_colors, HSV_CORAL); // FKEYS -LAYER_COLOR(layer4_colors, HSV_YELLOW); // use for NORMAL hold? -LAYER_COLOR(layer5_colors, HSV_TEAL); // use for FUNC hold? -LAYER_COLOR(layer6_colors, HSV_RED); // use for NAS hold -LAYER_COLOR(layer7_colors, HSV_RED); -LAYER_COLOR(layer8_colors, HSV_PINK); -LAYER_COLOR(layer9_colors, HSV_PURPLE); -LAYER_COLOR(layer10_colors, HSV_CORAL); -LAYER_COLOR(layer11_colors, HSV_SPRINGGREEN); -LAYER_COLOR(layer12_colors, HSV_TEAL); -LAYER_COLOR(layer13_colors, HSV_TURQUOISE); -LAYER_COLOR(layer14_colors, HSV_YELLOW); -LAYER_COLOR(layer15_colors, HSV_MAGENTA); // MBO -#undef LAYER_COLOR - -const rgblight_segment_t* const __attribute((weak))sval_rgb_layers[] = RGBLIGHT_LAYERS_LIST( - layer0_colors, layer1_colors, layer2_colors, layer3_colors, - layer4_colors, layer5_colors, layer6_colors, layer7_colors, - layer8_colors, layer9_colors, layer10_colors, layer11_colors, - layer12_colors, layer13_colors, layer14_colors, layer15_colors -); - layer_state_t default_layer_state_set_user(layer_state_t state) { - rgblight_set_layer_state(0, layer_state_cmp(state, 0)); + sval_set_active_layer(0, false); return state; } layer_state_t layer_state_set_user(layer_state_t state) { - for (int i = 0; i < RGBLIGHT_LAYERS; ++i) { - rgblight_set_layer_state(i, layer_state_cmp(state, i)); - } + sval_set_active_layer(get_highest_layer(state), false); return state; } @@ -179,7 +150,6 @@ void keyboard_post_init_user(void) { //debug_matrix=true; //debug_keyboard=true; //debug_mouse=true; - rgblight_layers = sval_rgb_layers; #if __has_include("keymap_all.h") if (fresh_install) { diff --git a/keyboards/svalboard/rules.mk b/keyboards/svalboard/rules.mk index ccd17ab36f8..cb86a3728a6 100644 --- a/keyboards/svalboard/rules.mk +++ b/keyboards/svalboard/rules.mk @@ -5,6 +5,7 @@ BOARD = GENERIC_RP_RP2040 # we want some pretty lights RGBLIGHT_ENABLE = yes +RGBLIGHT_SPLIT = yes RGBLIGHT_DRIVER = ws2812 WS2812_DRIVER = vendor diff --git a/keyboards/svalboard/svalboard.c b/keyboards/svalboard/svalboard.c index 9cc3511e6fc..f9b37dc7316 100644 --- a/keyboards/svalboard/svalboard.c +++ b/keyboards/svalboard/svalboard.c @@ -1,9 +1,12 @@ #include "svalboard.h" #include "eeconfig.h" #include "version.h" +#include "split_common/transactions.h" saved_values_t global_saved_values; const int16_t mh_timer_choices[4] = { 300, 500, 800, -1 }; // -1 is infinite. + +uint8_t sval_active_layer = 0; bool fresh_install = false; void write_eeprom_kb(void) { @@ -24,10 +27,33 @@ void read_eeprom_kb(void) { global_saved_values.mh_timer_index = 1; modified = true; } + if (global_saved_values.version < 3) { + global_saved_values.version = 3; +#define HSV(c) (struct layer_hsv) { (c >> 16) & 0xFF, (c >> 8) & 0xFF, c & 0xFF} + // Colors from chatgpt. + global_saved_values.layer_colors[0] = HSV(0x55FFFF); // Green + global_saved_values.layer_colors[1] = HSV(0x15FFFF); // Orange + global_saved_values.layer_colors[2] = HSV(0x95FFFF); // Azure + global_saved_values.layer_colors[3] = HSV(0x0BB0FF); // Coral + global_saved_values.layer_colors[4] = HSV(0x2BFFFF); // Yellow + global_saved_values.layer_colors[5] = HSV(0x80FF80); // Teal + global_saved_values.layer_colors[6] = HSV(0x00FFFF); // Red + global_saved_values.layer_colors[7] = HSV(0x00FFFF); // Red + global_saved_values.layer_colors[8] = HSV(0xEAFFFF); // Pink + global_saved_values.layer_colors[9] = HSV(0xBFFF80); // Purple + global_saved_values.layer_colors[10] = HSV(0x0BB0FF); // Coral + global_saved_values.layer_colors[11] = HSV(0x6AFFFF); // Spring Green + global_saved_values.layer_colors[12] = HSV(0x80FF80); // Teal + global_saved_values.layer_colors[13] = HSV(0x80FFFF); // Turquoise + global_saved_values.layer_colors[14] = HSV(0x2BFFFF); // Yellow + global_saved_values.layer_colors[15] = HSV(0xD5FFFF); // Magenta + modified = true; + } // As we add versions, just append here. if (modified) { write_eeprom_kb(); } + sval_active_layer = 0; } static const char YES[] = "yes"; @@ -106,6 +132,9 @@ void set_dpi_from_eeprom(void) { set_right_dpi(global_saved_values.right_dpi_index); } +void kb_sync_listener(uint8_t in_buflen, const void* in_data, uint8_t out_buflen, void* out_data) { + // Just a ping-pong, no need to do anything. +} // Called from via_init, we can check here if we're a fresh // installation. void via_init_kb(void) { @@ -116,6 +145,92 @@ void keyboard_post_init_kb(void) { read_eeprom_kb(); set_dpi_from_eeprom(); keyboard_post_init_user(); + transaction_register_rpc(KEYBOARD_SYNC_A, kb_sync_listener); + if (is_keyboard_master()) { + sval_set_active_layer(sval_active_layer, false); + } +} + +bool is_connected = false; + +void housekeeping_task_kb(void) { + if (is_keyboard_master()) { + static uint32_t last_ping = 0; + if (timer_elapsed(last_ping) > 500) { + presence_rpc_t rpcout = {0}; + presence_rpc_t rpcin = {0}; + if (transaction_rpc_exec(KEYBOARD_SYNC_A, sizeof(presence_rpc_t), &rpcout, sizeof(presence_rpc_t), &rpcin)) { + if (!is_connected) { + is_connected = true; + sval_on_reconnect(); + } + } else { + is_connected = false; + } + last_ping = timer_read32(); + } + } +} + +void raw_hid_receive_kb(uint8_t *data, uint8_t length) { + // raw_hid_receive_kb uses data for both input and output. + // If a command code is unknown, it is simply echoed back. + struct layer_hsv *cols; + uint8_t layer; + if (data[0] != SVAL_VIA_PREFIX) return; + switch (data[1]) { + case sval_id_get_protocol_version: + data[0] = 's'; + data[1] = 'v'; + data[2] = 'a'; + data[3] = 'l'; + data[4] = SVAL_PROTO_VERSION & 0xFF; + data[5] = (SVAL_PROTO_VERSION >> 8) & 0xFF; + data[6] = (SVAL_PROTO_VERSION >> 16) & 0xFF; + data[7] = (SVAL_PROTO_VERSION >> 24) & 0xFF; + break; + case sval_id_get_firmware_version: + snprintf((char *) data, length, "%s", QMK_VERSION); + break; + case sval_id_get_layer_hsv: + layer = data[2]; + if (layer > 15) layer = 15; + cols = &global_saved_values.layer_colors[layer]; + data[0] = cols->hue; + data[1] = cols->sat; + data[2] = cols->val; + break; + case sval_id_set_layer_hsv: + // Parameters start at data[2]. + layer = data[2]; + if (layer > 15) layer = 15; + cols = &global_saved_values.layer_colors[layer]; + if (cols->hue != data[3] || cols->sat != data[4] || cols->val != data[5]) { + cols->hue = data[3]; + cols->sat = data[4]; + cols->val = data[5]; + write_eeprom_kb(); + } + sval_set_active_layer(sval_active_layer, false); + break; + } +} + +void sval_on_reconnect(void) { + // Reset colors, or it won't communicate the right color. + rgblight_sethsv_noeeprom(0, 0, 0); + sval_set_active_layer(sval_active_layer, true); +} + +void sval_set_active_layer(uint32_t layer, bool save) { + if (layer > 15) layer = 15; + sval_active_layer = layer; + struct layer_hsv cols = global_saved_values.layer_colors[layer]; + if (save) { + rgblight_sethsv(cols.hue, cols.sat, cols.val); + } else { + rgblight_sethsv_noeeprom(cols.hue, cols.sat, cols.val); + } } #ifndef SVALBOARD_REENABLE_BOOTMAGIC_LITE diff --git a/keyboards/svalboard/svalboard.h b/keyboards/svalboard/svalboard.h index 752e5ff1b39..7b79ff621fa 100644 --- a/keyboards/svalboard/svalboard.h +++ b/keyboards/svalboard/svalboard.h @@ -21,6 +21,12 @@ along with this program. If not, see . extern const int16_t mh_timer_choices[4]; extern bool fresh_install; +struct layer_hsv { + uint8_t hue; + uint8_t sat; + uint8_t val; +}; + struct saved_values { uint8_t version; // Currently at 1, We assume all new data will be zeroed. bool left_scroll :1; @@ -30,8 +36,26 @@ struct saved_values { uint8_t left_dpi_index; uint8_t right_dpi_index; uint8_t mh_timer_index; + struct layer_hsv layer_colors[DYNAMIC_KEYMAP_LAYER_COUNT]; }; +#define SVAL_PROTO_VERSION 3 + +#define SVAL_VIA_PREFIX 0xEE + +enum sval_command_ids { + sval_id_get_protocol_version = 0x01, + sval_id_get_firmware_version = 0x02, + // Layer HSVs + sval_id_get_layer_hsv = 0x10, + sval_id_set_layer_hsv = 0x11, +}; + +// Just for ping pong, do we want anything else for it? +typedef struct _presence_rpc_t { + int presence; +} presence_rpc_t; + typedef struct saved_values saved_values_t; extern saved_values_t global_saved_values; @@ -44,3 +68,5 @@ void set_left_dpi(uint8_t index); void set_right_dpi(uint8_t index); void write_eeprom_kb(void); void recalibrate_pointer(void); +void sval_set_active_layer(uint32_t layer, bool save); +void sval_on_reconnect(void);