Implement connection keycode logic (#25176)
This commit is contained in:
parent
ec324af22e
commit
c7cb7ba976
15 changed files with 347 additions and 99 deletions
147
quantum/connection/connection.c
Normal file
147
quantum/connection/connection.c
Normal file
|
|
@ -0,0 +1,147 @@
|
|||
// Copyright 2025 QMK
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
#include "connection.h"
|
||||
#include "eeconfig.h"
|
||||
#include "usb_util.h"
|
||||
#include "util.h"
|
||||
|
||||
// ======== 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) {}
|
||||
// ========
|
||||
|
||||
#ifdef BLUETOOTH_ENABLE
|
||||
# ifdef BLUETOOTH_BLUEFRUIT_LE
|
||||
# include "bluefruit_le.h"
|
||||
# define bluetooth_is_connected() bluefruit_le_is_connected()
|
||||
# else
|
||||
// TODO: drivers should check if BT is connected here
|
||||
# define bluetooth_is_connected() true
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue