|
| 1 | +#ifndef ESP32_BLE_COMBO_KEYBOARD_H |
| 2 | +#define ESP32_BLE_COMBO_KEYBOARD_H |
| 3 | +#include "sdkconfig.h" |
| 4 | +#if defined(CONFIG_BT_ENABLED) |
| 5 | + |
| 6 | +#include "BleConnectionStatus.h" |
| 7 | +#include "BLEHIDDevice.h" |
| 8 | +#include "BLECharacteristic.h" |
| 9 | +#include "Print.h" |
| 10 | + |
| 11 | + |
| 12 | +const uint8_t KEY_LEFT_CTRL = 0x80; |
| 13 | +const uint8_t KEY_LEFT_SHIFT = 0x81; |
| 14 | +const uint8_t KEY_LEFT_ALT = 0x82; |
| 15 | +const uint8_t KEY_LEFT_GUI = 0x83; |
| 16 | +const uint8_t KEY_RIGHT_CTRL = 0x84; |
| 17 | +const uint8_t KEY_RIGHT_SHIFT = 0x85; |
| 18 | +const uint8_t KEY_RIGHT_ALT = 0x86; |
| 19 | +const uint8_t KEY_RIGHT_GUI = 0x87; |
| 20 | + |
| 21 | +const uint8_t KEY_UP_ARROW = 0xDA; |
| 22 | +const uint8_t KEY_DOWN_ARROW = 0xD9; |
| 23 | +const uint8_t KEY_LEFT_ARROW = 0xD8; |
| 24 | +const uint8_t KEY_RIGHT_ARROW = 0xD7; |
| 25 | +const uint8_t KEY_BACKSPACE = 0xB2; |
| 26 | +const uint8_t KEY_TAB = 0xB3; |
| 27 | +const uint8_t KEY_RETURN = 0xB0; |
| 28 | +const uint8_t KEY_ESC = 0xB1; |
| 29 | +const uint8_t KEY_INSERT = 0xD1; |
| 30 | +const uint8_t KEY_DELETE = 0xD4; |
| 31 | +const uint8_t KEY_PAGE_UP = 0xD3; |
| 32 | +const uint8_t KEY_PAGE_DOWN = 0xD6; |
| 33 | +const uint8_t KEY_HOME = 0xD2; |
| 34 | +const uint8_t KEY_HOME1 = 0x0004; |
| 35 | +const uint8_t KEY_END = 0xD5; |
| 36 | +const uint8_t KEY_CAPS_LOCK = 0xC1; |
| 37 | +const uint8_t KEY_F1 = 0xC2; |
| 38 | +const uint8_t KEY_F2 = 0xC3; |
| 39 | +const uint8_t KEY_F3 = 0xC4; |
| 40 | +const uint8_t KEY_F4 = 0xC5; |
| 41 | +const uint8_t KEY_F5 = 0xC6; |
| 42 | +const uint8_t KEY_F6 = 0xC7; |
| 43 | +const uint8_t KEY_F7 = 0xC8; |
| 44 | +const uint8_t KEY_F8 = 0xC9; |
| 45 | +const uint8_t KEY_F9 = 0xCA; |
| 46 | +const uint8_t KEY_F10 = 0xCB; |
| 47 | +const uint8_t KEY_F11 = 0xCC; |
| 48 | +const uint8_t KEY_F12 = 0xCD; |
| 49 | +const uint8_t KEY_F13 = 0xF0; |
| 50 | +const uint8_t KEY_F14 = 0xF1; |
| 51 | +const uint8_t KEY_F15 = 0xF2; |
| 52 | +const uint8_t KEY_F16 = 0xF3; |
| 53 | +const uint8_t KEY_F17 = 0xF4; |
| 54 | +const uint8_t KEY_F18 = 0xF5; |
| 55 | +const uint8_t KEY_F19 = 0xF6; |
| 56 | +const uint8_t KEY_F20 = 0xF7; |
| 57 | +const uint8_t KEY_F21 = 0xF8; |
| 58 | +const uint8_t KEY_F22 = 0xF9; |
| 59 | +const uint8_t KEY_F23 = 0xFA; |
| 60 | +const uint8_t KEY_F24 = 0xFB; |
| 61 | + |
| 62 | +typedef uint8_t MediaKeyReport[2]; |
| 63 | + |
| 64 | +const MediaKeyReport KEY_MEDIA_NEXT_TRACK = {1, 0}; |
| 65 | +const MediaKeyReport KEY_MEDIA_PREVIOUS_TRACK = {2, 0}; |
| 66 | +const MediaKeyReport KEY_MEDIA_STOP = {4, 0}; |
| 67 | +const MediaKeyReport KEY_MEDIA_PLAY_PAUSE = {8, 0}; |
| 68 | +const MediaKeyReport KEY_MEDIA_MUTE = {16, 0}; |
| 69 | +const MediaKeyReport KEY_MEDIA_VOLUME_UP = {32, 0}; |
| 70 | +const MediaKeyReport KEY_MEDIA_VOLUME_DOWN = {64, 0}; |
| 71 | +const MediaKeyReport KEY_MEDIA_WWW_HOME = {128, 0}; |
| 72 | +const MediaKeyReport KEY_MEDIA_LOCAL_MACHINE_BROWSER = {0, 1}; // Opens "My Computer" on Windows |
| 73 | +const MediaKeyReport KEY_MEDIA_CALCULATOR = {0, 2}; |
| 74 | +const MediaKeyReport KEY_MEDIA_WWW_BOOKMARKS = {0, 4}; |
| 75 | +const MediaKeyReport KEY_MEDIA_WWW_SEARCH = {0, 8}; |
| 76 | +const MediaKeyReport KEY_MEDIA_WWW_STOP = {0, 16}; |
| 77 | +const MediaKeyReport KEY_MEDIA_WWW_BACK = {0, 32}; |
| 78 | +const MediaKeyReport KEY_MEDIA_CONSUMER_CONTROL_CONFIGURATION = {0, 64}; // Media Selection |
| 79 | +const MediaKeyReport KEY_MEDIA_EMAIL_READER = {0, 128}; |
| 80 | + |
| 81 | + |
| 82 | +// Low level key report: up to 6 keys and shift, ctrl etc at once |
| 83 | +typedef struct |
| 84 | +{ |
| 85 | + uint8_t modifiers; |
| 86 | + uint8_t reserved; |
| 87 | + uint8_t keys[6]; |
| 88 | +} KeyReport; |
| 89 | +extern BLECharacteristicCallbacks* globalCallbacks; |
| 90 | +class BleComboKeyboard : public Print |
| 91 | +{ |
| 92 | +private: |
| 93 | + BleConnectionStatus* connectionStatus; |
| 94 | + BLEHIDDevice* hid; |
| 95 | + BLECharacteristic* inputKeyboard; |
| 96 | + BLECharacteristic* outputKeyboard; |
| 97 | + BLECharacteristic* inputMediaKeys; |
| 98 | + |
| 99 | + KeyReport _keyReport; |
| 100 | + MediaKeyReport _mediaKeyReport; |
| 101 | + static void taskServer(void* pvParameter); |
| 102 | + |
| 103 | +public: |
| 104 | + BleComboKeyboard(std::string deviceName = "coco-ble-hid", std::string deviceManufacturer = "Espressif", uint8_t batteryLevel = 100); |
| 105 | + void begin(void); |
| 106 | + void end(void); |
| 107 | + void sendReport(KeyReport* keys); |
| 108 | + void sendReport(MediaKeyReport* keys); |
| 109 | + size_t press(uint8_t k); |
| 110 | + size_t press(const MediaKeyReport k); |
| 111 | + size_t release(uint8_t k); |
| 112 | + size_t release(const MediaKeyReport k); |
| 113 | + size_t write(uint8_t c); |
| 114 | + size_t write(const MediaKeyReport c); |
| 115 | + size_t write(const uint8_t *buffer, size_t size); |
| 116 | + void setCallbacks(BLECharacteristicCallbacks *callbacks); |
| 117 | + |
| 118 | + void releaseAll(void); |
| 119 | + bool isConnected(void); |
| 120 | + void setBatteryLevel(uint8_t level); |
| 121 | + uint8_t batteryLevel; |
| 122 | + std::string deviceManufacturer; |
| 123 | + std::string deviceName; |
| 124 | + |
| 125 | + BLECharacteristic* inputMouse; |
| 126 | + |
| 127 | +}; |
| 128 | + |
| 129 | +#endif // CONFIG_BT_ENABLED |
| 130 | +#endif // ESP32_BLE_COMBO_KEYBOARD_H |
0 commit comments