diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index 498614dd26..c1cdd5d886 100644 --- a/builddefs/common_features.mk +++ b/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 diff --git a/data/constants/keycodes/keycodes_0.0.5_connection.hjson b/data/constants/keycodes/keycodes_0.0.5_connection.hjson new file mode 100644 index 0000000000..9a1a750f1a --- /dev/null +++ b/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" + ] + }, + } +} diff --git a/data/constants/keycodes/keycodes_0.0.5_quantum.hjson b/data/constants/keycodes/keycodes_0.0.5_quantum.hjson new file mode 100644 index 0000000000..814cd66a5b --- /dev/null +++ b/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 + } +} diff --git a/docs/features/bluetooth.md b/docs/features/bluetooth.md index 1dbf15f4e1..d3634498be 100644 --- a/docs/features/bluetooth.md +++ b/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 | diff --git a/docs/keycodes.md b/docs/keycodes.md index 9038c2b6d7..9107ca5eb8 100644 --- a/docs/keycodes.md +++ b/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} diff --git a/quantum/keycodes.h b/quantum/keycodes.h index f461e4a586..38127bb6da 100644 --- a/quantum/keycodes.h +++ b/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 diff --git a/quantum/process_keycode/process_connection.c b/quantum/process_keycode/process_connection.c new file mode 100644 index 0000000000..b0e230d680 --- /dev/null +++ b/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; +} diff --git a/quantum/process_keycode/process_connection.h b/quantum/process_keycode/process_connection.h new file mode 100644 index 0000000000..cc58011bb7 --- /dev/null +++ b/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 +#include +#include "action.h" + +bool process_connection(uint16_t keycode, keyrecord_t *record); diff --git a/quantum/quantum.c b/quantum/quantum.c index b21d6f1a3d..db323e31c9 100644 --- a/quantum/quantum.c +++ b/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(); diff --git a/quantum/quantum_keycodes_legacy.h b/quantum/quantum_keycodes_legacy.h index e1562077e5..21aec90675 100644 --- a/quantum/quantum_keycodes_legacy.h +++ b/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 diff --git a/tests/test_common/keycode_table.cpp b/tests/test_common/keycode_table.cpp index 4c28ab4d20..e4d445de82 100644 --- a/tests/test_common/keycode_table.cpp +++ b/tests/test_common/keycode_table.cpp @@ -562,6 +562,20 @@ std::map 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 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"},