// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later #include "connection.h" #include "eeconfig.h" #include "usb_util.h" #include "util.h" #ifdef BLUETOOTH_ENABLE # include "bluetooth.h" #endif // ======== DEPRECATED DEFINES - DO NOT USE ======== #ifdef OUTPUT_DEFAULT # undef CONNECTION_HOST_DEFAULT # define CONNECTION_HOST_DEFAULT OUTPUT_DEFAULT #endif __attribute__((weak)) void set_output_user(uint8_t output) {} // ======== #define CONNECTION_HOST_INVALID 0xFF #ifndef CONNECTION_HOST_DEFAULT # define CONNECTION_HOST_DEFAULT CONNECTION_HOST_AUTO #endif static const connection_host_t host_candidates[] = { CONNECTION_HOST_AUTO, CONNECTION_HOST_USB, #ifdef BLUETOOTH_ENABLE CONNECTION_HOST_BLUETOOTH, #endif #if 0 CONNECTION_HOST_2P4GHZ, #endif }; #define HOST_CANDIDATES_COUNT ARRAY_SIZE(host_candidates) static connection_config_t config = {.desired_host = CONNECTION_HOST_INVALID}; void eeconfig_update_connection_default(void) { config.desired_host = CONNECTION_HOST_DEFAULT; eeconfig_update_connection(&config); } void connection_init(void) { eeconfig_read_connection(&config); if (config.desired_host == CONNECTION_HOST_INVALID) { eeconfig_update_connection_default(); } } __attribute__((weak)) void connection_host_changed_user(connection_host_t host) {} __attribute__((weak)) void connection_host_changed_kb(connection_host_t host) {} static void handle_host_changed(void) { connection_host_changed_user(config.desired_host); connection_host_changed_kb(config.desired_host); // TODO: Remove deprecated callback set_output_user(config.desired_host); } void connection_set_host_noeeprom(connection_host_t host) { if (config.desired_host == host) { return; } config.desired_host = host; handle_host_changed(); } void connection_set_host(connection_host_t host) { connection_set_host_noeeprom(host); eeconfig_update_connection(&config); } void connection_next_host_noeeprom(void) { uint8_t next = 0; for (uint8_t i = 0; i < HOST_CANDIDATES_COUNT; i++) { if (host_candidates[i] == config.desired_host) { next = i == HOST_CANDIDATES_COUNT - 1 ? 0 : i + 1; break; } } connection_set_host_noeeprom(host_candidates[next]); } void connection_next_host(void) { connection_next_host_noeeprom(); eeconfig_update_connection(&config); } void connection_prev_host_noeeprom(void) { uint8_t next = 0; for (uint8_t i = 0; i < HOST_CANDIDATES_COUNT; i++) { if (host_candidates[i] == config.desired_host) { next = i == 0 ? HOST_CANDIDATES_COUNT - 1 : i - 1; break; } } connection_set_host_noeeprom(host_candidates[next]); } void connection_prev_host(void) { connection_prev_host_noeeprom(); eeconfig_update_connection(&config); } connection_host_t connection_get_host_raw(void) { return config.desired_host; } connection_host_t connection_auto_detect_host(void) { if (usb_connected_state()) { return CONNECTION_HOST_USB; } #ifdef BLUETOOTH_ENABLE if (bluetooth_is_connected()) { return CONNECTION_HOST_BLUETOOTH; } #endif return CONNECTION_HOST_NONE; } connection_host_t connection_get_host(void) { if (config.desired_host == CONNECTION_HOST_AUTO) { return connection_auto_detect_host(); } return config.desired_host; }