// uncomment the following line to use NimBLE library //#define USE_NIMBLE #ifndef ESP32_BLE_KEYBOARD_H #define ESP32_BLE_KEYBOARD_H #include "sdkconfig.h" #if defined(CONFIG_BT_ENABLED) #if defined(USE_NIMBLE) #include "NimBLECharacteristic.h" #include "NimBLEHIDDevice.h" #define BLEDevice NimBLEDevice #define BLEServerCallbacks NimBLEServerCallbacks #define BLECharacteristicCallbacks NimBLECharacteristicCallbacks #define BLEHIDDevice NimBLEHIDDevice #define BLECharacteristic NimBLECharacteristic #define BLEAdvertising NimBLEAdvertising #define BLEServer NimBLEServer #else #include "BLEHIDDevice.h" #include "BLECharacteristic.h" #endif // USE_NIMBLE #include "Print.h" #define BLE_KEYBOARD_VERSION "0.0.4" #define BLE_KEYBOARD_VERSION_MAJOR 0 #define BLE_KEYBOARD_VERSION_MINOR 0 #define BLE_KEYBOARD_VERSION_REVISION 4 const uint8_t KEY_LEFT_CTRL = 0x80; const uint8_t KEY_LEFT_SHIFT = 0x81; const uint8_t KEY_LEFT_ALT = 0x82; const uint8_t KEY_LEFT_GUI = 0x83; const uint8_t KEY_RIGHT_CTRL = 0x84; const uint8_t KEY_RIGHT_SHIFT = 0x85; const uint8_t KEY_RIGHT_ALT = 0x86; const uint8_t KEY_RIGHT_GUI = 0x87; const uint8_t KEY_UP_ARROW = 0xDA; const uint8_t KEY_DOWN_ARROW = 0xD9; const uint8_t KEY_LEFT_ARROW = 0xD8; const uint8_t KEY_RIGHT_ARROW = 0xD7; const uint8_t KEY_BACKSPACE = 0xB2; const uint8_t KEY_TAB = 0xB3; const uint8_t KEY_RETURN = 0xB0; const uint8_t KEY_ESC = 0xB1; const uint8_t KEY_INSERT = 0xD1; const uint8_t KEY_PRTSC = 0xCE; const uint8_t KEY_DELETE = 0xD4; const uint8_t KEY_PAGE_UP = 0xD3; const uint8_t KEY_PAGE_DOWN = 0xD6; const uint8_t KEY_HOME = 0xD2; const uint8_t KEY_END = 0xD5; const uint8_t KEY_CAPS_LOCK = 0xC1; const uint8_t KEY_F1 = 0xC2; const uint8_t KEY_F2 = 0xC3; const uint8_t KEY_F3 = 0xC4; const uint8_t KEY_F4 = 0xC5; const uint8_t KEY_F5 = 0xC6; const uint8_t KEY_F6 = 0xC7; const uint8_t KEY_F7 = 0xC8; const uint8_t KEY_F8 = 0xC9; const uint8_t KEY_F9 = 0xCA; const uint8_t KEY_F10 = 0xCB; const uint8_t KEY_F11 = 0xCC; const uint8_t KEY_F12 = 0xCD; const uint8_t KEY_F13 = 0xF0; const uint8_t KEY_F14 = 0xF1; const uint8_t KEY_F15 = 0xF2; const uint8_t KEY_F16 = 0xF3; const uint8_t KEY_F17 = 0xF4; const uint8_t KEY_F18 = 0xF5; const uint8_t KEY_F19 = 0xF6; const uint8_t KEY_F20 = 0xF7; const uint8_t KEY_F21 = 0xF8; const uint8_t KEY_F22 = 0xF9; const uint8_t KEY_F23 = 0xFA; const uint8_t KEY_F24 = 0xFB; const uint8_t KEY_NUM_0 = 0xEA; const uint8_t KEY_NUM_1 = 0xE1; const uint8_t KEY_NUM_2 = 0xE2; const uint8_t KEY_NUM_3 = 0xE3; const uint8_t KEY_NUM_4 = 0xE4; const uint8_t KEY_NUM_5 = 0xE5; const uint8_t KEY_NUM_6 = 0xE6; const uint8_t KEY_NUM_7 = 0xE7; const uint8_t KEY_NUM_8 = 0xE8; const uint8_t KEY_NUM_9 = 0xE9; const uint8_t KEY_NUM_SLASH = 0xDC; const uint8_t KEY_NUM_ASTERISK = 0xDD; const uint8_t KEY_NUM_MINUS = 0xDE; const uint8_t KEY_NUM_PLUS = 0xDF; const uint8_t KEY_NUM_ENTER = 0xE0; const uint8_t KEY_NUM_PERIOD = 0xEB; typedef uint8_t MediaKeyReport[2]; const MediaKeyReport KEY_MEDIA_NEXT_TRACK = {1, 0}; const MediaKeyReport KEY_MEDIA_PREVIOUS_TRACK = {2, 0}; const MediaKeyReport KEY_MEDIA_STOP = {4, 0}; const MediaKeyReport KEY_MEDIA_PLAY_PAUSE = {8, 0}; const MediaKeyReport KEY_MEDIA_MUTE = {16, 0}; const MediaKeyReport KEY_MEDIA_VOLUME_UP = {32, 0}; const MediaKeyReport KEY_MEDIA_VOLUME_DOWN = {64, 0}; const MediaKeyReport KEY_MEDIA_WWW_HOME = {128, 0}; const MediaKeyReport KEY_MEDIA_LOCAL_MACHINE_BROWSER = {0, 1}; // Opens "My Computer" on Windows // original from BLE-Keyboard // const MediaKeyReport KEY_MEDIA_CALCULATOR = {0, 2}; // changed for usage in OMOTE const MediaKeyReport KEY_MEDIA_FASTFORWARD = {0, 2}; const MediaKeyReport KEY_MEDIA_WWW_BOOKMARKS = {0, 4}; const MediaKeyReport KEY_MEDIA_WWW_SEARCH = {0, 8}; const MediaKeyReport KEY_MEDIA_WWW_STOP = {0, 16}; const MediaKeyReport KEY_MEDIA_WWW_BACK = {0, 32}; const MediaKeyReport KEY_MEDIA_CONSUMER_CONTROL_CONFIGURATION = {0, 64}; // Media Selection // original from BLE-Keyboard // const MediaKeyReport KEY_MEDIA_EMAIL_READER = {0, 128}; // changed for usage in OMOTE const MediaKeyReport KEY_MEDIA_REWIND = {0, 128}; // Low level key report: up to 6 keys and shift, ctrl etc at once typedef struct { uint8_t modifiers; uint8_t reserved; uint8_t keys[6]; } KeyReport; class BleKeyboard : public Print, public BLEServerCallbacks, public BLECharacteristicCallbacks { private: BLEHIDDevice* hid; BLECharacteristic* inputKeyboard; BLECharacteristic* outputKeyboard; BLECharacteristic* inputMediaKeys; BLEAdvertising* advertising; KeyReport _keyReport; MediaKeyReport _mediaKeyReport; std::string deviceName; std::string deviceManufacturer; uint8_t batteryLevel; bool connected = false; uint32_t _delay_ms = 7; void delay_ms(uint64_t ms); uint16_t vid = 0x05ac; uint16_t pid = 0x820a; uint16_t version = 0x0210; public: BleKeyboard(std::string deviceName = "ESP32 Keyboard", std::string deviceManufacturer = "Espressif", uint8_t batteryLevel = 100); void begin(void); void end(void); void sendReport(KeyReport* keys); void sendReport(MediaKeyReport* keys); size_t press(uint8_t k); size_t press(const MediaKeyReport k); size_t release(uint8_t k); size_t release(const MediaKeyReport k); size_t write(uint8_t c); size_t write(const MediaKeyReport c); size_t write(const uint8_t *buffer, size_t size); void releaseAll(void); bool isConnected(void); void setBatteryLevel(uint8_t level); void setName(std::string deviceName); void setDelay(uint32_t ms); void set_vendor_id(uint16_t vid); void set_product_id(uint16_t pid); void set_version(uint16_t version); protected: virtual void onStarted(BLEServer *pServer) { }; virtual void onConnect(BLEServer* pServer) override; virtual void onDisconnect(BLEServer* pServer) override; virtual void onWrite(BLECharacteristic* me) override; }; #endif // CONFIG_BT_ENABLED #endif // ESP32_BLE_KEYBOARD_H