From 01952bf39aadc42a70221f91d8cc0536ad458b04 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 6 Nov 2025 23:34:23 +0000 Subject: Implement minimal connection update logic (#25334) --- tmk_core/protocol/host.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- tmk_core/protocol/host.h | 3 +++ 2 files changed, 45 insertions(+), 2 deletions(-) (limited to 'tmk_core') diff --git a/tmk_core/protocol/host.c b/tmk_core/protocol/host.c index 4874d7c1d3..f4fa9064e0 100644 --- a/tmk_core/protocol/host.c +++ b/tmk_core/protocol/host.c @@ -18,6 +18,7 @@ along with this program. If not, see . #include #include "keyboard.h" #include "keycode.h" +#include "action.h" #include "host.h" #include "util.h" #include "debug.h" @@ -78,9 +79,48 @@ host_driver_t *host_get_driver(void) { return driver; } +#ifdef CONNECTION_ENABLE +static connection_host_t active_host = CONNECTION_HOST_NONE; + +__attribute__((weak)) void host_disconnect_active_driver_user(connection_host_t host) {} +__attribute__((weak)) void host_disconnect_active_driver_kb(connection_host_t host) {} + +__attribute__((weak)) void host_connect_active_driver_user(connection_host_t host) {} +__attribute__((weak)) void host_connect_active_driver_kb(connection_host_t host) {} + +// TODO: Additionally have host_driver_t handle swap +static void host_update_active_driver(connection_host_t current, connection_host_t next) { + host_disconnect_active_driver_user(current); + host_disconnect_active_driver_kb(current); + + if (current != CONNECTION_HOST_NONE) { + clear_keyboard(); + } + + host_connect_active_driver_user(next); + host_connect_active_driver_kb(next); +} + +#endif + +void host_init(void) { + // currently do nothing +} + +void host_task(void) { +#ifdef CONNECTION_ENABLE + connection_host_t next_host = connection_get_host(); + if (next_host != active_host) { + host_update_active_driver(active_host, next_host); + + active_host = next_host; + } +#endif +} + static host_driver_t *host_get_active_driver(void) { #ifdef CONNECTION_ENABLE - switch (connection_get_host()) { + switch (active_host) { # ifdef BLUETOOTH_ENABLE case CONNECTION_HOST_BLUETOOTH: return &bt_driver; @@ -96,7 +136,7 @@ static host_driver_t *host_get_active_driver(void) { bool host_can_send_nkro(void) { #ifdef CONNECTION_ENABLE - switch (connection_get_host()) { + switch (active_host) { # ifdef BLUETOOTH_ENABLE case CONNECTION_HOST_BLUETOOTH: return bluetooth_can_send_nkro(); diff --git a/tmk_core/protocol/host.h b/tmk_core/protocol/host.h index a0b1e73dcc..7ff6d0df08 100644 --- a/tmk_core/protocol/host.h +++ b/tmk_core/protocol/host.h @@ -27,6 +27,9 @@ along with this program. If not, see . extern "C" { #endif +void host_init(void); +void host_task(void); + /* host driver */ void host_set_driver(host_driver_t *driver); host_driver_t *host_get_driver(void); -- cgit v1.2.3