Просмотр исходного кода

Merge remote-tracking branch 'origin/develop' into xap

QMK Bot 9 месяцев назад
Родитель
Сommit
e4463611e7
3 измененных файлов с 49 добавлено и 2 удалено
  1. 4 0
      quantum/keyboard.c
  2. 42 2
      tmk_core/protocol/host.c
  3. 3 0
      tmk_core/protocol/host.h

+ 4 - 0
quantum/keyboard.c

@@ -29,6 +29,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "debug.h"
 #include "command.h"
 #include "util.h"
+#include "host.h"
 #include "sendchar.h"
 #include "eeconfig.h"
 #include "action_layer.h"
@@ -471,6 +472,7 @@ void keyboard_init(void) {
 #ifdef CONNECTION_ENABLE
     connection_init();
 #endif
+    host_init();
     led_init_ports();
 #ifdef BACKLIGHT_ENABLE
     backlight_init_ports();
@@ -699,6 +701,8 @@ void quantum_task(void) {
 #ifdef LAYER_LOCK_ENABLE
     layer_lock_task();
 #endif
+
+    host_task();
 }
 
 /** \brief Main task that is repeatedly called as fast as possible. */

+ 42 - 2
tmk_core/protocol/host.c

@@ -18,6 +18,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include <stdint.h>
 #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();

+ 3 - 0
tmk_core/protocol/host.h

@@ -27,6 +27,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 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);