-
Notifications
You must be signed in to change notification settings - Fork 0
/
Serial2Keyboard.ino
318 lines (312 loc) · 11.1 KB
/
Serial2Keyboard.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
// https://github.com/NicoHood/HID
#include "HID-Project.h"
#define VERSION "1.1"
#define KEYMAP_LEN 256
#define KEY_RELEASE_DELAYTIME 70 // キーをリリースするまでの待ち時間(msec)
#define KEY_SHIFT_ENABLE 0x100 // シフト入力有
byte pushingModificationKey = 0; // 押されている装飾キー
// {キーコード,SHIFTキーの有無(有=true)}
const uint16_t KEYMap[KEYMAP_LEN] =
{
KEY_ERROR_UNDEFINED, //0 0x00 NUL(null文字)
KEY_ERROR_UNDEFINED, //1 0x01 SOH(ヘッダ開始)
KEY_ERROR_UNDEFINED, //2 0x02 STX(テキスト開始)
KEY_ERROR_UNDEFINED, //3 0x03 ETX(テキスト終了)
KEY_ERROR_UNDEFINED, //4 0x04 EOT(転送終了)
KEY_ERROR_UNDEFINED, //5 0x05 ENQ(照会)
KEY_ERROR_UNDEFINED, //6 0x06 ACK(受信確認)
KEY_ERROR_UNDEFINED, //7 0x07 BEL(警告)
KEY_BACKSPACE, //8 0x08 BS(後退)
KEY_TAB, //9 0x09 HT(水平タブ)
KEY_ENTER, //10 0x0a LF(改行)
KEY_ERROR_UNDEFINED, //11 0x0b VT(垂直タブ)
KEY_ERROR_UNDEFINED, //12 0x0c FF(改頁)
KEY_ERROR_UNDEFINED, //13 0x0d CR(復帰)
KEY_ERROR_UNDEFINED, //14 0x0e SO(シフトアウト)
KEY_ERROR_UNDEFINED, //15 0x0f SI(シフトイン)
KEY_ERROR_UNDEFINED, //16 0x10 DLE(データリンクエスケープ)
KEY_ERROR_UNDEFINED, //17 0x11 DC1(装置制御1)
KEY_ERROR_UNDEFINED, //18 0x12 DC2(装置制御2)
KEY_ERROR_UNDEFINED, //19 0x13 DC3(装置制御3)
KEY_ERROR_UNDEFINED, //20 0x14 DC4(装置制御4)
KEY_ERROR_UNDEFINED, //21 0x15 NAK(受信失敗)
KEY_ERROR_UNDEFINED, //22 0x16 SYN(同期)
KEY_ERROR_UNDEFINED, //23 0x17 ETB(転送ブロック終了)
KEY_ERROR_UNDEFINED, //24 0x18 CAN(キャンセル)
KEY_ERROR_UNDEFINED, //25 0x19 EM(メディア終了)
KEY_ERROR_UNDEFINED, //26 0x1a SUB(置換)
KEY_ESC, //27 0x1b ESC(エスケープ)
KEY_ERROR_UNDEFINED, //28 0x1c FS(フォーム区切り)
KEY_ERROR_UNDEFINED, //29 0x1d GS(グループ区切り)
KEY_ERROR_UNDEFINED, //30 0x1e RS(レコード区切り)
KEY_ERROR_UNDEFINED, //31 0x1f US(ユニット区切り)
KEY_SPACE, //32 0x20 SPC(空白文字)
KEY_1 | KEY_SHIFT_ENABLE, //33 0x21 !
KEY_2 | KEY_SHIFT_ENABLE, //34 0x22 "
KEY_3 | KEY_SHIFT_ENABLE, //35 0x23 #
KEY_4 | KEY_SHIFT_ENABLE, //36 0x24 $
KEY_5 | KEY_SHIFT_ENABLE, //37 0x25 %
KEY_6 | KEY_SHIFT_ENABLE, //38 0x26 &
KEY_7 | KEY_SHIFT_ENABLE, //39 0x27 '
KEY_8 | KEY_SHIFT_ENABLE, //40 0x28 (
KEY_9 | KEY_SHIFT_ENABLE, //41 0x29 )
KEY_QUOTE | KEY_SHIFT_ENABLE, //42 0x2a *
KEY_SEMICOLON | KEY_SHIFT_ENABLE, //43 0x2b +
KEY_COMMA, //44 0x2c ,
KEY_MINUS, //45 0x2d -
KEY_PERIOD, //46 0x2e .
KEY_SLASH, //47 0x2f /
KEY_0, //48 0x30 0
KEY_1, //49 0x31 1
KEY_2, //50 0x32 2
KEY_3, //51 0x33 3
KEY_4, //52 0x34 4
KEY_5, //53 0x35 5
KEY_6, //54 0x36 6
KEY_7, //55 0x37 7
KEY_8, //56 0x38 8
KEY_9, //57 0x39 9
KEY_QUOTE, //58 0x3a :
KEY_SEMICOLON, //59 0x3b ;
KEY_COMMA | KEY_SHIFT_ENABLE, //60 0x3c <
KEY_MINUS | KEY_SHIFT_ENABLE, //61 0x3d =
KEY_PERIOD | KEY_SHIFT_ENABLE, //62 0x3e >
KEY_SLASH | KEY_SHIFT_ENABLE, //63 0x3f ?
KEY_LEFT_BRACE, //64 0x40 @
KEY_A | KEY_SHIFT_ENABLE, //65 0x41 A
KEY_B | KEY_SHIFT_ENABLE, //66 0x42 B
KEY_C | KEY_SHIFT_ENABLE, //67 0x43 C
KEY_D | KEY_SHIFT_ENABLE, //68 0x44 D
KEY_E | KEY_SHIFT_ENABLE, //69 0x45 E
KEY_F | KEY_SHIFT_ENABLE, //70 0x46 F
KEY_G | KEY_SHIFT_ENABLE, //71 0x47 G
KEY_H | KEY_SHIFT_ENABLE, //72 0x48 H
KEY_I | KEY_SHIFT_ENABLE, //73 0x49 I
KEY_J | KEY_SHIFT_ENABLE, //74 0x4a J
KEY_K | KEY_SHIFT_ENABLE, //75 0x4b K
KEY_L | KEY_SHIFT_ENABLE, //76 0x4c L
KEY_M | KEY_SHIFT_ENABLE, //77 0x4d M
KEY_N | KEY_SHIFT_ENABLE, //78 0x4e N
KEY_O | KEY_SHIFT_ENABLE, //79 0x4f O
KEY_P | KEY_SHIFT_ENABLE, //80 0x50 P
KEY_Q | KEY_SHIFT_ENABLE, //81 0x51 Q
KEY_R | KEY_SHIFT_ENABLE, //82 0x52 R
KEY_S | KEY_SHIFT_ENABLE, //83 0x53 S
KEY_T | KEY_SHIFT_ENABLE, //84 0x54 T
KEY_U | KEY_SHIFT_ENABLE, //85 0x55 U
KEY_V | KEY_SHIFT_ENABLE, //86 0x56 V
KEY_W | KEY_SHIFT_ENABLE, //87 0x57 W
KEY_X | KEY_SHIFT_ENABLE, //88 0x58 X
KEY_Y | KEY_SHIFT_ENABLE, //89 0x59 Y
KEY_Z | KEY_SHIFT_ENABLE, //90 0x5a Z
KEY_RIGHT_BRACE, //91 0x5b [
HID_KEYBOARD_INTERNATIONAL3, //92 0x5c バックスラッシュ
KEY_BACKSLASH, //93 0x5d ]
KEY_EQUAL, //94 0x5e ^
HID_KEYBOARD_INTERNATIONAL1 | KEY_SHIFT_ENABLE, //95 0x5f _
KEY_LEFT_BRACE& KEY_SHIFT_ENABLE, //96 0x60 `
KEY_A, //97 0x61 a
KEY_B, //98 0x62 b
KEY_C, //99 0x63 c
KEY_D, //100 0x64 d
KEY_E, //101 0x65 e
KEY_F, //102 0x66 f
KEY_G, //103 0x67 g
KEY_H, //104 0x68 h
KEY_I, //105 0x69 i
KEY_J, //106 0x6a j
KEY_K, //107 0x6b k
KEY_L, //108 0x6c l
KEY_M, //109 0x6d m
KEY_N, //110 0x6e n
KEY_O, //111 0x6f o
KEY_P, //112 0x70 p
KEY_Q, //113 0x71 q
KEY_R, //114 0x72 r
KEY_S, //115 0x73 s
KEY_T, //116 0x74 t
KEY_U, //117 0x75 u
KEY_V, //118 0x76 v
KEY_W, //119 0x77 w
KEY_X, //120 0x78 x
KEY_Y, //121 0x79 y
KEY_Z, //122 0x7a z
KEY_RIGHT_BRACE | KEY_SHIFT_ENABLE, //123 0x7b {
HID_KEYBOARD_INTERNATIONAL3 | KEY_SHIFT_ENABLE, //124 0x7c |
KEY_BACKSLASH | KEY_SHIFT_ENABLE, //125 0x7d }
KEY_EQUAL | KEY_SHIFT_ENABLE, //126 0x7e ~
KEY_DELETE, //127 0x7f DEL(削除)
KEY_ERROR_UNDEFINED, //128 0x80
KEY_ERROR_UNDEFINED, //129 0x81
KEY_ERROR_UNDEFINED, //130 0x82
KEY_ERROR_UNDEFINED, //131 0x83
KEY_ERROR_UNDEFINED, //132 0x84
KEY_ERROR_UNDEFINED, //133 0x85
KEY_ERROR_UNDEFINED, //134 0x86
KEY_ERROR_UNDEFINED, //135 0x87
KEY_ERROR_UNDEFINED, //136 0x88
KEY_ERROR_UNDEFINED, //137 0x89
KEY_ERROR_UNDEFINED, //138 0x8A
KEY_ERROR_UNDEFINED, //139 0x8B
KEY_ERROR_UNDEFINED, //140 0x8C
KEY_TILDE, //141 0x8D
KEY_ERROR_UNDEFINED, //142 0x8E
KEY_ERROR_UNDEFINED, //143 0x8F
KEY_ERROR_UNDEFINED, //144 0x90
KEY_CAPS_LOCK, //145 0x91
KEY_F1, //146 0x92
KEY_F2, //147 0x93
KEY_F3, //148 0x94
KEY_F4, //149 0x95
KEY_F5, //150 0x96
KEY_F6, //151 0x97
KEY_F7, //152 0x98
KEY_F8, //153 0x99
KEY_F9, //154 0x9A
KEY_F10, //155 0x9B
KEY_F11, //156 0x9C
KEY_F12, //157 0x9D
KEY_PRINTSCREEN, //158 0x9E
KEY_SCROLL_LOCK, //159 0x9F
KEY_PAUSE, //160 0xA0
KEY_INSERT, //161 0xA1
KEY_HOME, //162 0xA2
KEY_PAGE_UP, //163 0xA3
KEY_DELETE, //164 0xA4
KEY_END, //165 0xA5
KEY_PAGE_DOWN, //166 0xA6
KEY_RIGHT_ARROW, //167 0xA7
KEY_LEFT_ARROW, //168 0xA8
KEY_DOWN_ARROW, //169 0xA9
KEY_UP_ARROW, //170 0xAA
KEY_ERROR_UNDEFINED, //171 0xAB
KEY_ERROR_UNDEFINED, //172 0xAC
KEY_ERROR_UNDEFINED, //173 0xAD
KEY_ERROR_UNDEFINED, //174 0xAE
KEY_ERROR_UNDEFINED, //175 0xAF
KEY_ERROR_UNDEFINED, //176 0xB0
KEY_ERROR_UNDEFINED, //177 0xB1
KEY_ERROR_UNDEFINED, //178 0xB2
KEY_ERROR_UNDEFINED, //179 0xB3
KEY_ERROR_UNDEFINED, //180 0xB4
KEY_ERROR_UNDEFINED, //181 0xB5
KEY_ERROR_UNDEFINED, //182 0xB6
KEY_ERROR_UNDEFINED, //183 0xB7
KEY_ERROR_UNDEFINED, //184 0xB8
KEY_ERROR_UNDEFINED, //185 0xB9
KEY_ERROR_UNDEFINED, //186 0xBA
KEY_ERROR_UNDEFINED, //187 0xBB
KEY_ERROR_UNDEFINED, //188 0xBC
KEY_ERROR_UNDEFINED, //189 0xBD
KEY_ERROR_UNDEFINED, //190 0xBE
KEY_ERROR_UNDEFINED, //191 0xBF
KEY_ERROR_UNDEFINED, //192 0xC0
KEY_ERROR_UNDEFINED, //193 0xC1
KEY_ERROR_UNDEFINED, //194 0xC2
KEY_ERROR_UNDEFINED, //195 0xC3
KEY_ERROR_UNDEFINED, //196 0xC4
KEY_ERROR_UNDEFINED, //197 0xC5
KEY_ERROR_UNDEFINED, //198 0xC6
KEY_ERROR_UNDEFINED, //199 0xC7
KEY_ERROR_UNDEFINED, //200 0xC8
KEY_ERROR_UNDEFINED, //201 0xC9
KEY_ERROR_UNDEFINED, //202 0xCA
KEY_ERROR_UNDEFINED, //203 0xCB
KEY_ERROR_UNDEFINED, //204 0xCC
KEY_ERROR_UNDEFINED, //205 0xCD
KEY_ERROR_UNDEFINED, //206 0xCE
KEY_ERROR_UNDEFINED, //207 0xCF
KEY_ERROR_UNDEFINED, //208 0xD0
KEY_ERROR_UNDEFINED, //209 0xD1
KEY_ERROR_UNDEFINED, //210 0xD2
KEY_ERROR_UNDEFINED, //211 0xD3
KEY_ERROR_UNDEFINED, //212 0xD4
KEY_ERROR_UNDEFINED, //213 0xD5
KEY_ERROR_UNDEFINED, //214 0xD6
KEY_ERROR_UNDEFINED, //215 0xD7
KEY_ERROR_UNDEFINED, //216 0xD8
KEY_ERROR_UNDEFINED, //217 0xD9
KEY_ERROR_UNDEFINED, //218 0xDA
KEY_ERROR_UNDEFINED, //219 0xDB
KEY_ERROR_UNDEFINED, //220 0xDC
KEY_ERROR_UNDEFINED, //221 0xDD
KEY_ERROR_UNDEFINED, //222 0xDE
KEY_ERROR_UNDEFINED, //223 0xDF
KEY_INTERNATIONAL2, //224 0xE0
KEY_ERROR_UNDEFINED, //225 0xE1
KEY_INTERNATIONAL4, //226 0xE2
KEY_INTERNATIONAL5, //227 0xE3
KEY_ERROR_UNDEFINED, //228 0xE4
KEY_ERROR_UNDEFINED, //229 0xE5
KEY_ERROR_UNDEFINED, //230 0xE6
KEY_ERROR_UNDEFINED, //231 0xE7
KEY_ERROR_UNDEFINED, //232 0xE8
KEY_ERROR_UNDEFINED, //233 0xE9
KEY_ERROR_UNDEFINED, //234 0xEA
KEY_ERROR_UNDEFINED, //235 0xEB
KEY_ERROR_UNDEFINED, //236 0xEC
KEY_ERROR_UNDEFINED, //237 0xED
KEY_ERROR_UNDEFINED, //238 0xEE
KEY_ERROR_UNDEFINED, //239 0xEF
KEY_ERROR_UNDEFINED, //240 0xF0
KEY_ERROR_UNDEFINED, //241 0xF1
KEY_ERROR_UNDEFINED, //242 0xF2
KEY_ERROR_UNDEFINED, //243 0xF3
KEY_ERROR_UNDEFINED, //244 0xF4
KEY_ERROR_UNDEFINED, //245 0xF5
KEY_ERROR_UNDEFINED, //246 0xF6
KEY_ERROR_UNDEFINED, //247 0xF7
KEY_LEFT_CTRL, //248 0xF8
KEY_LEFT_SHIFT, //249 0xF9
KEY_LEFT_ALT, //250 0xFA
KEY_LEFT_GUI, //251 0xFB
KEY_RIGHT_CTRL, //252 0xFC
KEY_RIGHT_SHIFT, //253 0xFD
KEY_RIGHT_ALT, //254 0xFE
KEY_RIGHT_GUI, //255 0xFF
};
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
Serial1.begin(115200);
Keyboard.begin();
}
void loop() {
int len = Serial1.available(); // 受信データ長を確認
for (int count = 0; count < len; count++) {
byte inByte = Serial1.read();
KeyboardKeycode key = (KeyboardKeycode)(KEYMap[inByte] & 0xFF);
bool shiftEnable = (KEYMap[inByte] & KEY_SHIFT_ENABLE) != 0;
// 左シフト以降の修飾キー
if (inByte >= 0xF8) {
pushingModificationKey = pushingModificationKey | (0x01 << (0xFF - inByte)); // 装飾キーを保存
}
// 無効キーの入力
else if (key == KEY_ERROR_UNDEFINED) {
pushingModificationKey = 0; // 装飾キーを初期化
}
// 通常キー
else {
// 押されている装飾キーを入力(Ctrl+Shift+XXXのような多重入力にも対応)
for (int count = 0; count < 8; count++) {
if ((pushingModificationKey >> (7 - count) & 0x01) != 0) {
Keyboard.press((KeyboardKeycode)(KEYMap[0xF8 + count] & 0xFF));
}
}
// シフトが必要な入力の場合左シフト入力を行う
if (shiftEnable) {
Keyboard.press(KEY_LEFT_SHIFT);
}
// キー入力
Keyboard.press(key);
// ディレイ中LEDを点灯
digitalWrite(LED_BUILTIN, LOW);
delay(KEY_RELEASE_DELAYTIME);
digitalWrite(LED_BUILTIN, HIGH);
// リリースしつつ装飾キーを初期化
Keyboard.releaseAll();
Serial1.write(Serial1.available()); // 残り受信バッファサイズを送信
pushingModificationKey = 0;
}
}
}