24
24
#if CONFIG_TINYUSB_HID_ENABLED
25
25
26
26
#include " USBHIDKeyboard.h"
27
+ #include " keyboardLayout/KeyboardLayout.h"
27
28
28
29
ESP_EVENT_DEFINE_BASE (ARDUINO_USB_HID_KEYBOARD_EVENTS);
29
30
esp_err_t arduino_usb_event_post (esp_event_base_t event_base, int32_t event_id, void *event_data, size_t event_data_size, TickType_t ticks_to_wait);
30
31
esp_err_t arduino_usb_event_handler_register_with (esp_event_base_t event_base, int32_t event_id, esp_event_handler_t event_handler, void *event_handler_arg);
31
32
32
33
static const uint8_t report_descriptor[] = {TUD_HID_REPORT_DESC_KEYBOARD (HID_REPORT_ID (HID_REPORT_ID_KEYBOARD))};
33
34
34
- USBHIDKeyboard::USBHIDKeyboard () : hid(HID_ITF_PROTOCOL_KEYBOARD), shiftKeyReports(true ) {
35
+ USBHIDKeyboard::USBHIDKeyboard () : hid(HID_ITF_PROTOCOL_KEYBOARD), _asciimap(KeyboardLayout_en_US), shiftKeyReports(false ) {
35
36
static bool initialized = false ;
36
37
if (!initialized) {
37
38
initialized = true ;
@@ -45,7 +46,8 @@ uint16_t USBHIDKeyboard::_onGetDescriptor(uint8_t *dst) {
45
46
return sizeof (report_descriptor);
46
47
}
47
48
48
- void USBHIDKeyboard::begin () {
49
+ void USBHIDKeyboard::begin (const uint8_t *layout) {
50
+ _asciimap = layout;
49
51
hid.begin ();
50
52
}
51
53
@@ -80,139 +82,6 @@ void USBHIDKeyboard::setShiftKeyReports(bool set) {
80
82
shiftKeyReports = set;
81
83
}
82
84
83
- #define SHIFT 0x80
84
- const uint8_t _asciimap[128 ] = {
85
- 0x00 , // NUL
86
- 0x00 , // SOH
87
- 0x00 , // STX
88
- 0x00 , // ETX
89
- 0x00 , // EOT
90
- 0x00 , // ENQ
91
- 0x00 , // ACK
92
- 0x00 , // BEL
93
- 0x2a , // BS Backspace
94
- 0x2b , // TAB Tab
95
- 0x28 , // LF Enter
96
- 0x00 , // VT
97
- 0x00 , // FF
98
- 0x00 , // CR
99
- 0x00 , // SO
100
- 0x00 , // SI
101
- 0x00 , // DEL
102
- 0x00 , // DC1
103
- 0x00 , // DC2
104
- 0x00 , // DC3
105
- 0x00 , // DC4
106
- 0x00 , // NAK
107
- 0x00 , // SYN
108
- 0x00 , // ETB
109
- 0x00 , // CAN
110
- 0x00 , // EM
111
- 0x00 , // SUB
112
- 0x00 , // ESC
113
- 0x00 , // FS
114
- 0x00 , // GS
115
- 0x00 , // RS
116
- 0x00 , // US
117
-
118
- 0x2c , // ' '
119
- 0x1e | SHIFT, // !
120
- 0x34 | SHIFT, // "
121
- 0x20 | SHIFT, // #
122
- 0x21 | SHIFT, // $
123
- 0x22 | SHIFT, // %
124
- 0x24 | SHIFT, // &
125
- 0x34 , // '
126
- 0x26 | SHIFT, // (
127
- 0x27 | SHIFT, // )
128
- 0x25 | SHIFT, // *
129
- 0x2e | SHIFT, // +
130
- 0x36 , // ,
131
- 0x2d , // -
132
- 0x37 , // .
133
- 0x38 , // /
134
- 0x27 , // 0
135
- 0x1e , // 1
136
- 0x1f , // 2
137
- 0x20 , // 3
138
- 0x21 , // 4
139
- 0x22 , // 5
140
- 0x23 , // 6
141
- 0x24 , // 7
142
- 0x25 , // 8
143
- 0x26 , // 9
144
- 0x33 | SHIFT, // :
145
- 0x33 , // ;
146
- 0x36 | SHIFT, // <
147
- 0x2e , // =
148
- 0x37 | SHIFT, // >
149
- 0x38 | SHIFT, // ?
150
- 0x1f | SHIFT, // @
151
- 0x04 | SHIFT, // A
152
- 0x05 | SHIFT, // B
153
- 0x06 | SHIFT, // C
154
- 0x07 | SHIFT, // D
155
- 0x08 | SHIFT, // E
156
- 0x09 | SHIFT, // F
157
- 0x0a | SHIFT, // G
158
- 0x0b | SHIFT, // H
159
- 0x0c | SHIFT, // I
160
- 0x0d | SHIFT, // J
161
- 0x0e | SHIFT, // K
162
- 0x0f | SHIFT, // L
163
- 0x10 | SHIFT, // M
164
- 0x11 | SHIFT, // N
165
- 0x12 | SHIFT, // O
166
- 0x13 | SHIFT, // P
167
- 0x14 | SHIFT, // Q
168
- 0x15 | SHIFT, // R
169
- 0x16 | SHIFT, // S
170
- 0x17 | SHIFT, // T
171
- 0x18 | SHIFT, // U
172
- 0x19 | SHIFT, // V
173
- 0x1a | SHIFT, // W
174
- 0x1b | SHIFT, // X
175
- 0x1c | SHIFT, // Y
176
- 0x1d | SHIFT, // Z
177
- 0x2f , // [
178
- 0x31 , // bslash
179
- 0x30 , // ]
180
- 0x23 | SHIFT, // ^
181
- 0x2d | SHIFT, // _
182
- 0x35 , // `
183
- 0x04 , // a
184
- 0x05 , // b
185
- 0x06 , // c
186
- 0x07 , // d
187
- 0x08 , // e
188
- 0x09 , // f
189
- 0x0a , // g
190
- 0x0b , // h
191
- 0x0c , // i
192
- 0x0d , // j
193
- 0x0e , // k
194
- 0x0f , // l
195
- 0x10 , // m
196
- 0x11 , // n
197
- 0x12 , // o
198
- 0x13 , // p
199
- 0x14 , // q
200
- 0x15 , // r
201
- 0x16 , // s
202
- 0x17 , // t
203
- 0x18 , // u
204
- 0x19 , // v
205
- 0x1a , // w
206
- 0x1b , // x
207
- 0x1c , // y
208
- 0x1d , // z
209
- 0x2f | SHIFT, // {
210
- 0x31 | SHIFT, // |
211
- 0x30 | SHIFT, // }
212
- 0x35 | SHIFT, // ~
213
- 0 // DEL
214
- };
215
-
216
85
size_t USBHIDKeyboard::pressRaw (uint8_t k) {
217
86
uint8_t i;
218
87
if (k >= 0xE0 && k < 0xE8 ) {
@@ -234,7 +103,7 @@ size_t USBHIDKeyboard::pressRaw(uint8_t k) {
234
103
return 0 ;
235
104
}
236
105
}
237
- } else {
106
+ } else if (_keyReport. modifiers == 0 ) {
238
107
// not a modifier and not a key
239
108
return 0 ;
240
109
}
@@ -255,11 +124,8 @@ size_t USBHIDKeyboard::releaseRaw(uint8_t k) {
255
124
_keyReport.keys [i] = 0x00 ;
256
125
}
257
126
}
258
- } else {
259
- // not a modifier and not a key
260
- return 0 ;
261
127
}
262
-
128
+ // Allowing for the release of a modifier key without a corresponding press
263
129
sendReport (&_keyReport);
264
130
return 1 ;
265
131
}
@@ -274,19 +140,26 @@ size_t USBHIDKeyboard::press(uint8_t k) {
274
140
} else if (k >= 0x80 ) { // it's a modifier key
275
141
_keyReport.modifiers |= (1 << (k - 0x80 ));
276
142
k = 0 ;
277
- } else { // it's a printing key
143
+ } else { // it's a printing key (k is a ASCII 0..127)
278
144
k = _asciimap[k];
279
145
if (!k) {
280
146
return 0 ;
281
147
}
282
- if (k & 0x80 ) { // it's a capital letter or other character reached with shift
148
+ if (( k & SHIFT) == SHIFT ) { // it's a capital letter or other character reached with shift
283
149
// At boot, some PCs need a separate report with the shift key down like a real keyboard.
284
150
if (shiftKeyReports) {
285
151
pressRaw (HID_KEY_SHIFT_LEFT);
286
152
} else {
287
153
_keyReport.modifiers |= 0x02 ; // the left shift modifier
288
154
}
289
- k &= 0x7F ;
155
+ k &= ~SHIFT;
156
+ }
157
+ if ((k & ALT_GR) == ALT_GR) {
158
+ _keyReport.modifiers |= 0x40 ; // AltGr = right Alt
159
+ k &= ~ALT_GR;
160
+ }
161
+ if (k == ISO_REPLACEMENT) {
162
+ k = ISO_KEY;
290
163
}
291
164
}
292
165
return pressRaw (k);
@@ -306,15 +179,22 @@ size_t USBHIDKeyboard::release(uint8_t k) {
306
179
if (!k) {
307
180
return 0 ;
308
181
}
309
- if (k & 0x80 ) { // it's a capital letter or other character reached with shift
182
+ if (( k & SHIFT) == SHIFT ) { // it's a capital letter or other character reached with shift
310
183
if (shiftKeyReports) {
311
184
releaseRaw (k & 0x7F ); // Release key without shift modifier
312
185
k = HID_KEY_SHIFT_LEFT; // Below, release shift modifier
313
186
} else {
314
187
_keyReport.modifiers &= ~(0x02 ); // the left shift modifier
315
- k &= 0x7F ;
188
+ k &= ~SHIFT ;
316
189
}
317
190
}
191
+ if ((k & ALT_GR) == ALT_GR) {
192
+ _keyReport.modifiers &= ~(0x40 ); // AltGr = right Alt
193
+ k &= ~ALT_GR;
194
+ }
195
+ if (k == ISO_REPLACEMENT) {
196
+ k = ISO_KEY;
197
+ }
318
198
}
319
199
return releaseRaw (k);
320
200
}
0 commit comments