|
|
@@ -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;
|
|
|
+}
|