Browse Source

Add new connection keycodes for Bluetooth, 2.4GHz. (#24251)

Nick Brassel 1 year ago
parent
commit
70cbf08b67

+ 1 - 1
builddefs/common_features.mk

@@ -881,7 +881,7 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
     OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]'))
     NO_USB_STARTUP_CHECK := yes
     COMMON_VPATH += $(DRIVER_PATH)/bluetooth
-    SRC += outputselect.c
+    SRC += outputselect.c process_connection.c
 
     ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le)
         SPI_DRIVER_REQUIRED = yes

+ 109 - 0
data/constants/keycodes/keycodes_0.0.5_connection.hjson

@@ -0,0 +1,109 @@
+{
+    "ranges": {
+        "0x7780/0x003F": {
+            "define": "QK_CONNECTION"
+        }
+    }
+    "keycodes": {
+        "0x7780": {
+            "group": "connection",
+            "key": "QK_OUTPUT_NEXT",
+            "aliases": [
+                "OU_NEXT",
+                "OU_AUTO"
+            ]
+        },
+        "0x7781": {
+            "group": "connection",
+            "key": "QK_OUTPUT_PREV",
+            "aliases": [
+                "OU_PREV"
+            ]
+        },
+        "0x7782": {
+            "group": "connection",
+            "key": "QK_OUTPUT_NONE",
+            "aliases": [
+                "OU_NONE"
+            ]
+        },
+        "0x7783": {
+            "group": "connection",
+            "key": "QK_OUTPUT_USB",
+            "aliases": [
+                "OU_USB"
+            ]
+        },
+        "0x7784": {
+            "group": "connection",
+            "key": "QK_OUTPUT_2P4GHZ",
+            "aliases": [
+                "OU_2P4G"
+            ]
+        },
+        "0x7785": {
+            "group": "connection",
+            "key": "QK_OUTPUT_BLUETOOTH",
+            "aliases": [
+                "OU_BT"
+            ]
+        },
+
+        "0x7790": {
+            "group": "connection",
+            "key": "QK_BLUETOOTH_PROFILE_NEXT",
+            "aliases": [
+                "BT_NEXT"
+            ]
+        },
+        "0x7791": {
+            "group": "connection",
+            "key": "QK_BLUETOOTH_PROFILE_PREV",
+            "aliases": [
+                "BT_PREV"
+            ]
+        },
+        "0x7792": {
+            "group": "connection",
+            "key": "QK_BLUETOOTH_UNPAIR",
+            "aliases": [
+                "BT_UNPR"
+            ]
+        }
+        "0x7793": {
+            "group": "connection",
+            "key": "QK_BLUETOOTH_PROFILE1",
+            "aliases": [
+                "BT_PRF1"
+            ]
+        },
+        "0x7794": {
+            "group": "connection",
+            "key": "QK_BLUETOOTH_PROFILE2",
+            "aliases": [
+                "BT_PRF2"
+            ]
+        },
+        "0x7795": {
+            "group": "connection",
+            "key": "QK_BLUETOOTH_PROFILE3",
+            "aliases": [
+                "BT_PRF3"
+            ]
+        },
+        "0x7796": {
+            "group": "connection",
+            "key": "QK_BLUETOOTH_PROFILE4",
+            "aliases": [
+                "BT_PRF4"
+            ]
+        },
+        "0x7797": {
+            "group": "connection",
+            "key": "QK_BLUETOOTH_PROFILE5",
+            "aliases": [
+                "BT_PRF5"
+            ]
+        },
+    }
+}

+ 7 - 0
data/constants/keycodes/keycodes_0.0.5_quantum.hjson

@@ -0,0 +1,7 @@
+{
+    "keycodes": {
+        "0x7C20": "!delete!", // old QK_OUTPUT_AUTO
+        "0x7C21": "!delete!", // old QK_OUTPUT_USB
+        "0x7C22": "!delete!", // old QK_OUTPUT_BLUETOOTH
+    }
+}

+ 5 - 5
docs/features/bluetooth.md

@@ -39,8 +39,8 @@ BLUETOOTH_DRIVER = bluefruit_le # or rn42
 
 This is used when multiple keyboard outputs can be selected. Currently this only allows for switching between USB and Bluetooth on keyboards that support both.
 
-|Key                  |Aliases  |Description                                   |
-|---------------------|---------|----------------------------------------------|
-|`QK_OUTPUT_AUTO`     |`OU_AUTO`|Automatically switch between USB and Bluetooth|
-|`QK_OUTPUT_USB`      |`OU_USB` |USB only                                      |
-|`QK_OUTPUT_BLUETOOTH`|`OU_BT`  |Bluetooth only                                |
+| Key                   | Aliases              | Description                                    |
+|-----------------------|----------------------|------------------------------------------------|
+| `QK_OUTPUT_NEXT`      | `OU_NEXT`, `OU_AUTO` | Automatically switch between USB and Bluetooth |
+| `QK_OUTPUT_USB`       | `OU_USB`             | USB only                                       |
+| `QK_OUTPUT_BLUETOOTH` | `OU_BT`              | Bluetooth only                                 |

+ 5 - 5
docs/keycodes.md

@@ -294,11 +294,11 @@ See also: [Backlighting](features/backlight)
 
 See also: [Bluetooth](features/bluetooth)
 
-|Key                  |Aliases  |Description                                   |
-|---------------------|---------|----------------------------------------------|
-|`QK_OUTPUT_AUTO`     |`OU_AUTO`|Automatically switch between USB and Bluetooth|
-|`QK_OUTPUT_USB`      |`OU_USB` |USB only                                      |
-|`QK_OUTPUT_BLUETOOTH`|`OU_BT`  |Bluetooth only                                |
+| Key                   | Aliases              | Description                                    |
+|-----------------------|----------------------|------------------------------------------------|
+| `QK_OUTPUT_NEXT`      | `OU_NEXT`, `OU_AUTO` | Automatically switch between USB and Bluetooth |
+| `QK_OUTPUT_USB`       | `OU_USB`             | USB only                                       |
+| `QK_OUTPUT_BLUETOOTH` | `OU_BT`              | Bluetooth only                                 |
 
 ## Caps Word {#caps-word}
 

+ 34 - 6
quantum/keycodes.h

@@ -72,6 +72,8 @@ enum qk_keycode_ranges {
     QK_STENO_MAX                   = 0x74FF,
     QK_MACRO                       = 0x7700,
     QK_MACRO_MAX                   = 0x777F,
+    QK_CONNECTION                  = 0x7780,
+    QK_CONNECTION_MAX              = 0x77BF,
     QK_LIGHTING                    = 0x7800,
     QK_LIGHTING_MAX                = 0x78FF,
     QK_QUANTUM                     = 0x7C00,
@@ -620,6 +622,20 @@ enum qk_keycode_defines {
     QK_MACRO_29 = 0x771D,
     QK_MACRO_30 = 0x771E,
     QK_MACRO_31 = 0x771F,
+    QK_OUTPUT_NEXT = 0x7780,
+    QK_OUTPUT_PREV = 0x7781,
+    QK_OUTPUT_NONE = 0x7782,
+    QK_OUTPUT_USB = 0x7783,
+    QK_OUTPUT_2P4GHZ = 0x7784,
+    QK_OUTPUT_BLUETOOTH = 0x7785,
+    QK_BLUETOOTH_PROFILE_NEXT = 0x7790,
+    QK_BLUETOOTH_PROFILE_PREV = 0x7791,
+    QK_BLUETOOTH_UNPAIR = 0x7792,
+    QK_BLUETOOTH_PROFILE1 = 0x7793,
+    QK_BLUETOOTH_PROFILE2 = 0x7794,
+    QK_BLUETOOTH_PROFILE3 = 0x7795,
+    QK_BLUETOOTH_PROFILE4 = 0x7796,
+    QK_BLUETOOTH_PROFILE5 = 0x7797,
     QK_BACKLIGHT_ON = 0x7800,
     QK_BACKLIGHT_OFF = 0x7801,
     QK_BACKLIGHT_TOGGLE = 0x7802,
@@ -690,9 +706,6 @@ enum qk_keycode_defines {
     QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN = 0x7C1C,
     QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE = 0x7C1D,
     QK_SPACE_CADET_RIGHT_SHIFT_ENTER = 0x7C1E,
-    QK_OUTPUT_AUTO = 0x7C20,
-    QK_OUTPUT_USB = 0x7C21,
-    QK_OUTPUT_BLUETOOTH = 0x7C22,
     QK_UNICODE_MODE_NEXT = 0x7C30,
     QK_UNICODE_MODE_PREVIOUS = 0x7C31,
     QK_UNICODE_MODE_MACOS = 0x7C32,
@@ -1296,6 +1309,21 @@ enum qk_keycode_defines {
     MC_29      = QK_MACRO_29,
     MC_30      = QK_MACRO_30,
     MC_31      = QK_MACRO_31,
+    OU_NEXT    = QK_OUTPUT_NEXT,
+    OU_AUTO    = QK_OUTPUT_NEXT,
+    OU_PREV    = QK_OUTPUT_PREV,
+    OU_NONE    = QK_OUTPUT_NONE,
+    OU_USB     = QK_OUTPUT_USB,
+    OU_2P4G    = QK_OUTPUT_2P4GHZ,
+    OU_BT      = QK_OUTPUT_BLUETOOTH,
+    BT_NEXT    = QK_BLUETOOTH_PROFILE_NEXT,
+    BT_PREV    = QK_BLUETOOTH_PROFILE_PREV,
+    BT_UNPR    = QK_BLUETOOTH_UNPAIR,
+    BT_PRF1    = QK_BLUETOOTH_PROFILE1,
+    BT_PRF2    = QK_BLUETOOTH_PROFILE2,
+    BT_PRF3    = QK_BLUETOOTH_PROFILE3,
+    BT_PRF4    = QK_BLUETOOTH_PROFILE4,
+    BT_PRF5    = QK_BLUETOOTH_PROFILE5,
     BL_ON      = QK_BACKLIGHT_ON,
     BL_OFF     = QK_BACKLIGHT_OFF,
     BL_TOGG    = QK_BACKLIGHT_TOGGLE,
@@ -1365,9 +1393,6 @@ enum qk_keycode_defines {
     SC_LAPO    = QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN,
     SC_RAPC    = QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE,
     SC_SENT    = QK_SPACE_CADET_RIGHT_SHIFT_ENTER,
-    OU_AUTO    = QK_OUTPUT_AUTO,
-    OU_USB     = QK_OUTPUT_USB,
-    OU_BT      = QK_OUTPUT_BLUETOOTH,
     UC_NEXT    = QK_UNICODE_MODE_NEXT,
     UC_PREV    = QK_UNICODE_MODE_PREVIOUS,
     UC_MAC     = QK_UNICODE_MODE_MACOS,
@@ -1444,6 +1469,7 @@ enum qk_keycode_defines {
 #define IS_QK_AUDIO(code) ((code) >= QK_AUDIO && (code) <= QK_AUDIO_MAX)
 #define IS_QK_STENO(code) ((code) >= QK_STENO && (code) <= QK_STENO_MAX)
 #define IS_QK_MACRO(code) ((code) >= QK_MACRO && (code) <= QK_MACRO_MAX)
+#define IS_QK_CONNECTION(code) ((code) >= QK_CONNECTION && (code) <= QK_CONNECTION_MAX)
 #define IS_QK_LIGHTING(code) ((code) >= QK_LIGHTING && (code) <= QK_LIGHTING_MAX)
 #define IS_QK_QUANTUM(code) ((code) >= QK_QUANTUM && (code) <= QK_QUANTUM_MAX)
 #define IS_QK_KB(code) ((code) >= QK_KB && (code) <= QK_KB_MAX)
@@ -1468,6 +1494,7 @@ enum qk_keycode_defines {
 #define IS_AUDIO_KEYCODE(code) ((code) >= QK_AUDIO_ON && (code) <= QK_AUDIO_VOICE_PREVIOUS)
 #define IS_STENO_KEYCODE(code) ((code) >= QK_STENO_BOLT && (code) <= QK_STENO_COMB_MAX)
 #define IS_MACRO_KEYCODE(code) ((code) >= QK_MACRO_0 && (code) <= QK_MACRO_31)
+#define IS_CONNECTION_KEYCODE(code) ((code) >= QK_OUTPUT_NEXT && (code) <= QK_BLUETOOTH_PROFILE5)
 #define IS_BACKLIGHT_KEYCODE(code) ((code) >= QK_BACKLIGHT_ON && (code) <= QK_BACKLIGHT_TOGGLE_BREATHING)
 #define IS_LED_MATRIX_KEYCODE(code) ((code) >= QK_LED_MATRIX_ON && (code) <= QK_LED_MATRIX_SPEED_DOWN)
 #define IS_UNDERGLOW_KEYCODE(code) ((code) >= QK_UNDERGLOW_TOGGLE && (code) <= QK_UNDERGLOW_SPEED_DOWN)
@@ -1493,6 +1520,7 @@ enum qk_keycode_defines {
 #define AUDIO_KEYCODE_RANGE                 QK_AUDIO_ON ... QK_AUDIO_VOICE_PREVIOUS
 #define STENO_KEYCODE_RANGE                 QK_STENO_BOLT ... QK_STENO_COMB_MAX
 #define MACRO_KEYCODE_RANGE                 QK_MACRO_0 ... QK_MACRO_31
+#define CONNECTION_KEYCODE_RANGE            QK_OUTPUT_NEXT ... QK_BLUETOOTH_PROFILE5
 #define BACKLIGHT_KEYCODE_RANGE             QK_BACKLIGHT_ON ... QK_BACKLIGHT_TOGGLE_BREATHING
 #define LED_MATRIX_KEYCODE_RANGE            QK_LED_MATRIX_ON ... QK_LED_MATRIX_SPEED_DOWN
 #define UNDERGLOW_KEYCODE_RANGE             QK_UNDERGLOW_TOGGLE ... QK_UNDERGLOW_SPEED_DOWN

+ 36 - 0
quantum/process_keycode/process_connection.c

@@ -0,0 +1,36 @@
+// Copyright 2024 Nick Brassel (@tzarc)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include "outputselect.h"
+#include "process_connection.h"
+
+bool process_connection(uint16_t keycode, keyrecord_t *record) {
+    if (record->event.pressed) {
+        switch (keycode) {
+            case QK_OUTPUT_NEXT:
+                set_output(OUTPUT_AUTO); // This should cycle through the outputs going forward. Ensure `docs/keycodes.md`, `docs/features/bluetooth.md` are updated when it does.
+                return false;
+            case QK_OUTPUT_USB:
+                set_output(OUTPUT_USB);
+                return false;
+            case QK_OUTPUT_BLUETOOTH:
+                set_output(OUTPUT_BLUETOOTH);
+                return false;
+
+            case QK_OUTPUT_PREV:
+            case QK_OUTPUT_NONE:
+            case QK_OUTPUT_2P4GHZ:
+            case QK_BLUETOOTH_PROFILE_NEXT:
+            case QK_BLUETOOTH_PROFILE_PREV:
+            case QK_BLUETOOTH_UNPAIR:
+            case QK_BLUETOOTH_PROFILE1:
+            case QK_BLUETOOTH_PROFILE2:
+            case QK_BLUETOOTH_PROFILE3:
+            case QK_BLUETOOTH_PROFILE4:
+            case QK_BLUETOOTH_PROFILE5:
+                // As-yet unimplemented.
+                // When implementation is done, ensure `docs/keycodes.md`, `docs/features/bluetooth.md` are updated accordingly.
+                return false;
+        }
+    }
+    return true;
+}

+ 9 - 0
quantum/process_keycode/process_connection.h

@@ -0,0 +1,9 @@
+// Copyright 2024 Nick Brassel (@tzarc)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "action.h"
+
+bool process_connection(uint16_t keycode, keyrecord_t *record);

+ 4 - 12
quantum/quantum.c

@@ -21,7 +21,7 @@
 #endif
 
 #ifdef BLUETOOTH_ENABLE
-#    include "outputselect.h"
+#    include "process_connection.h"
 #endif
 
 #ifdef GRAVE_ESC_ENABLE
@@ -392,6 +392,9 @@ bool process_record_quantum(keyrecord_t *record) {
 #endif
 #ifdef TRI_LAYER_ENABLE
             process_tri_layer(keycode, record) &&
+#endif
+#ifdef BLUETOOTH_ENABLE
+            process_connection(keycode, record) &&
 #endif
             true)) {
         return false;
@@ -430,17 +433,6 @@ bool process_record_quantum(keyrecord_t *record) {
                 velocikey_toggle();
                 return false;
 #endif
-#ifdef BLUETOOTH_ENABLE
-            case QK_OUTPUT_AUTO:
-                set_output(OUTPUT_AUTO);
-                return false;
-            case QK_OUTPUT_USB:
-                set_output(OUTPUT_USB);
-                return false;
-            case QK_OUTPUT_BLUETOOTH:
-                set_output(OUTPUT_BLUETOOTH);
-                return false;
-#endif
 #ifndef NO_ACTION_ONESHOT
             case QK_ONE_SHOT_TOGGLE:
                 oneshot_toggle();

+ 2 - 0
quantum/quantum_keycodes_legacy.h

@@ -55,3 +55,5 @@
 #define KC_ACL1 QK_MOUSE_ACCELERATION_1
 #define KC_MS_ACCEL2 QK_MOUSE_ACCELERATION_2
 #define KC_ACL2 QK_MOUSE_ACCELERATION_2
+
+#define QK_OUTPUT_AUTO OU_AUTO

+ 14 - 3
tests/test_common/keycode_table.cpp

@@ -562,6 +562,20 @@ std::map<uint16_t, std::string> KEYCODE_ID_TABLE = {
     {QK_MACRO_29, "QK_MACRO_29"},
     {QK_MACRO_30, "QK_MACRO_30"},
     {QK_MACRO_31, "QK_MACRO_31"},
+    {QK_OUTPUT_NEXT, "QK_OUTPUT_NEXT"},
+    {QK_OUTPUT_PREV, "QK_OUTPUT_PREV"},
+    {QK_OUTPUT_NONE, "QK_OUTPUT_NONE"},
+    {QK_OUTPUT_USB, "QK_OUTPUT_USB"},
+    {QK_OUTPUT_2P4GHZ, "QK_OUTPUT_2P4GHZ"},
+    {QK_OUTPUT_BLUETOOTH, "QK_OUTPUT_BLUETOOTH"},
+    {QK_BLUETOOTH_PROFILE_NEXT, "QK_BLUETOOTH_PROFILE_NEXT"},
+    {QK_BLUETOOTH_PROFILE_PREV, "QK_BLUETOOTH_PROFILE_PREV"},
+    {QK_BLUETOOTH_UNPAIR, "QK_BLUETOOTH_UNPAIR"},
+    {QK_BLUETOOTH_PROFILE1, "QK_BLUETOOTH_PROFILE1"},
+    {QK_BLUETOOTH_PROFILE2, "QK_BLUETOOTH_PROFILE2"},
+    {QK_BLUETOOTH_PROFILE3, "QK_BLUETOOTH_PROFILE3"},
+    {QK_BLUETOOTH_PROFILE4, "QK_BLUETOOTH_PROFILE4"},
+    {QK_BLUETOOTH_PROFILE5, "QK_BLUETOOTH_PROFILE5"},
     {QK_BACKLIGHT_ON, "QK_BACKLIGHT_ON"},
     {QK_BACKLIGHT_OFF, "QK_BACKLIGHT_OFF"},
     {QK_BACKLIGHT_TOGGLE, "QK_BACKLIGHT_TOGGLE"},
@@ -632,9 +646,6 @@ std::map<uint16_t, std::string> KEYCODE_ID_TABLE = {
     {QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN, "QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN"},
     {QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE, "QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE"},
     {QK_SPACE_CADET_RIGHT_SHIFT_ENTER, "QK_SPACE_CADET_RIGHT_SHIFT_ENTER"},
-    {QK_OUTPUT_AUTO, "QK_OUTPUT_AUTO"},
-    {QK_OUTPUT_USB, "QK_OUTPUT_USB"},
-    {QK_OUTPUT_BLUETOOTH, "QK_OUTPUT_BLUETOOTH"},
     {QK_UNICODE_MODE_NEXT, "QK_UNICODE_MODE_NEXT"},
     {QK_UNICODE_MODE_PREVIOUS, "QK_UNICODE_MODE_PREVIOUS"},
     {QK_UNICODE_MODE_MACOS, "QK_UNICODE_MODE_MACOS"},