/* Keyboard.h Copyright (c) 2015, Arduino LLC Original code (pre-library): Copyright (c) 2011, Peter Barrett This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #pragma once #include "Print.h" #include "USBHID.h" #if CONFIG_TINYUSB_HID_ENABLED #include "esp_event.h" ESP_EVENT_DECLARE_BASE(ARDUINO_USB_HID_KEYBOARD_EVENTS); typedef enum { ARDUINO_USB_HID_KEYBOARD_ANY_EVENT = ESP_EVENT_ANY_ID, ARDUINO_USB_HID_KEYBOARD_LED_EVENT = 0, ARDUINO_USB_HID_KEYBOARD_MAX_EVENT, } arduino_usb_hid_keyboard_event_t; typedef union { struct { uint8_t numlock:1; uint8_t capslock:1; uint8_t scrolllock:1; uint8_t compose:1; uint8_t kana:1; uint8_t reserved:3; }; uint8_t leds; } arduino_usb_hid_keyboard_event_data_t; #define KEY_LEFT_CTRL 0x80 #define KEY_LEFT_SHIFT 0x81 #define KEY_LEFT_ALT 0x82 #define KEY_LEFT_GUI 0x83 #define KEY_RIGHT_CTRL 0x84 #define KEY_RIGHT_SHIFT 0x85 #define KEY_RIGHT_ALT 0x86 #define KEY_RIGHT_GUI 0x87 #define KEY_UP_ARROW 0xDA #define KEY_DOWN_ARROW 0xD9 #define KEY_LEFT_ARROW 0xD8 #define KEY_RIGHT_ARROW 0xD7 #define KEY_BACKSPACE 0xB2 #define KEY_TAB 0xB3 #define KEY_RETURN 0xB0 #define KEY_ESC 0xB1 #define KEY_INSERT 0xD1 #define KEY_DELETE 0xD4 #define KEY_PAGE_UP 0xD3 #define KEY_PAGE_DOWN 0xD6 #define KEY_HOME 0xD2 #define KEY_END 0xD5 #define KEY_CAPS_LOCK 0xC1 #define KEY_F1 0xC2 #define KEY_F2 0xC3 #define KEY_F3 0xC4 #define KEY_F4 0xC5 #define KEY_F5 0xC6 #define KEY_F6 0xC7 #define KEY_F7 0xC8 #define KEY_F8 0xC9 #define KEY_F9 0xCA #define KEY_F10 0xCB #define KEY_F11 0xCC #define KEY_F12 0xCD #define KEY_F13 0xF0 #define KEY_F14 0xF1 #define KEY_F15 0xF2 #define KEY_F16 0xF3 #define KEY_F17 0xF4 #define KEY_F18 0xF5 #define KEY_F19 0xF6 #define KEY_F20 0xF7 #define KEY_F21 0xF8 #define KEY_F22 0xF9 #define KEY_F23 0xFA #define KEY_F24 0xFB #define LED_NUMLOCK 0x01 #define LED_CAPSLOCK 0x02 #define LED_SCROLLLOCK 0x04 #define LED_COMPOSE 0x08 #define LED_KANA 0x10 // 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 USBHIDKeyboard: public USBHIDDevice, public Print { private: USBHID hid; KeyReport _keyReport; void sendReport(KeyReport* keys); public: USBHIDKeyboard(void); void begin(void); void end(void); size_t write(uint8_t k); size_t write(const uint8_t *buffer, size_t size); size_t press(uint8_t k); size_t release(uint8_t k); void releaseAll(void); //raw functions work with TinyUSB's HID_KEY_* macros size_t pressRaw(uint8_t k); size_t releaseRaw(uint8_t k); void onEvent(esp_event_handler_t callback); void onEvent(arduino_usb_hid_keyboard_event_t event, esp_event_handler_t callback); // internal use uint16_t _onGetDescriptor(uint8_t* buffer); void _onOutput(uint8_t report_id, const uint8_t* buffer, uint16_t len); }; #endif