qmk_firmware/quantum/connection/connection.c
2025-05-05 04:05:04 +01:00

142 lines
3.4 KiB
C

// 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;
}