1
+ /* ********************************************************************
2
+ Adafruit invests time and resources providing this open source code,
3
+ please support Adafruit and open-source hardware by purchasing
4
+ products from Adafruit!
5
+
6
+ MIT license, check LICENSE for more information
7
+ Copyright (c) 2019 Ha Thach for Adafruit Industries
8
+ All text above, and the splash screen below must be included in
9
+ any redistribution
10
+ *********************************************************************/
11
+
12
+ #include " Adafruit_TinyUSB.h"
13
+
14
+ /* This sketch demonstrates multiple USB HID interfaces. Pressing the button will
15
+ * - mouse toward bottom right of monitor
16
+ * - send 'a' key
17
+ *
18
+ * Depending on the board, the button pin
19
+ * and its active state (when pressed) are different
20
+ */
21
+ #if defined(ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS) || defined(ARDUINO_NRF52840_CIRCUITPLAY)
22
+ const int pin = 4 ; // Left Button
23
+ bool activeState = true ;
24
+
25
+ #elif defined(ARDUINO_FUNHOUSE_ESP32S2)
26
+ const int pin = BUTTON_DOWN;
27
+ bool activeState = true ;
28
+
29
+ #elif defined PIN_BUTTON1
30
+ const int pin = PIN_BUTTON1;
31
+ bool activeState = false ;
32
+
33
+ #elif defined PIN_BUTTON
34
+ const int pin = PIN_BUTTON;
35
+ bool activeState = false ;
36
+
37
+ #else
38
+ const int pin = 12 ;
39
+ bool activeState = false ;
40
+ #endif
41
+
42
+ // HID report descriptor using TinyUSB's template
43
+ uint8_t const desc_keyboard_report[] =
44
+ {
45
+ TUD_HID_REPORT_DESC_KEYBOARD ()
46
+ };
47
+
48
+ uint8_t const desc_mouse_report[] =
49
+ {
50
+ TUD_HID_REPORT_DESC_MOUSE ()
51
+ };
52
+
53
+ // USB HID object. For ESP32 these values cannot be changed after this declaration
54
+ // desc report, desc len, protocol, interval, use out endpoint
55
+ Adafruit_USBD_HID usb_keyboard (desc_keyboard_report, sizeof (desc_keyboard_report), HID_ITF_PROTOCOL_KEYBOARD, 2, false);
56
+ Adafruit_USBD_HID usb_mouse (desc_mouse_report, sizeof (desc_mouse_report), HID_ITF_PROTOCOL_MOUSE, 2, false);
57
+
58
+ // the setup function runs once when you press reset or power the board
59
+ void setup ()
60
+ {
61
+ // Notes: following commented-out functions has no affect on ESP32
62
+ // usb_keyboard.setPollInterval(2);
63
+ // usb_keyboard.setReportDescriptor();
64
+ // usb_keyboard.setStringDescriptor("TinyUSB HID Composite");
65
+
66
+ usb_keyboard.begin ();
67
+ usb_mouse.begin ();
68
+
69
+ // Set up button, pullup opposite to active state
70
+ pinMode (pin, activeState ? INPUT_PULLDOWN : INPUT_PULLUP);
71
+
72
+ Serial.begin (115200 );
73
+
74
+ // wait until device mounted
75
+ // while( !TinyUSBDevice.mounted() ) delay(1);
76
+ Serial.println (" Adafruit TinyUSB HID Composite example" );
77
+ }
78
+
79
+ void loop ()
80
+ {
81
+ // poll gpio once each 10 ms
82
+ delay (10 );
83
+
84
+ // Whether button is pressed
85
+ bool btn_pressed = (digitalRead (pin) == activeState);
86
+
87
+ // Remote wakeup
88
+ if ( TinyUSBDevice.suspended () && btn_pressed )
89
+ {
90
+ // Wake up host if we are in suspend mode
91
+ // and REMOTE_WAKEUP feature is enabled by host
92
+ TinyUSBDevice.remoteWakeup ();
93
+ }
94
+
95
+ /* ------------- Mouse -------------*/
96
+ if (usb_mouse.ready () && btn_pressed )
97
+ {
98
+ int8_t const delta = 5 ;
99
+ usb_mouse.mouseMove (0 , delta, delta); // right + down
100
+ }
101
+
102
+ /* ------------- Keyboard -------------*/
103
+ if ( usb_keyboard.ready () )
104
+ {
105
+ // use to send key release report
106
+ static bool has_key = false ;
107
+
108
+ if ( btn_pressed )
109
+ {
110
+ uint8_t keycode[6 ] = { 0 };
111
+ keycode[0 ] = HID_KEY_A;
112
+
113
+ usb_keyboard.keyboardReport (0 , 0 , keycode);
114
+
115
+ has_key = true ;
116
+ }else
117
+ {
118
+ // send empty key report if previously has key pressed
119
+ if (has_key) usb_keyboard.keyboardRelease (0 );
120
+ has_key = false ;
121
+ }
122
+ }
123
+ }
0 commit comments