a32u4_marauder.ino 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. #include <hidboot.h>
  2. #include <usbhub.h>
  3. #include "Keyboard.h"
  4. #define Serial Serial1
  5. // Satisfy the IDE, which needs to see the include statment in the ino too.
  6. #ifdef dobogusinclude
  7. #include <spi4teensy3.h>
  8. #include <SPI.h>
  9. #endif
  10. #include <SPI.h>
  11. #include <SD.h>
  12. #define CAPS_LOCK 0x39
  13. #define NUM_LOCK 0x53
  14. #define SCROLL_LOCK 0x47
  15. #define PRINT_SCREEN 0x46
  16. #define NUM_1 0x59
  17. #define NUM_2 0x5A
  18. #define NUM_3 0x5B
  19. #define NUM_4 0x5C
  20. #define NUM_5 0x5D
  21. #define NUM_6 0x5E
  22. #define NUM_7 0x5F
  23. #define NUM_8 0x60
  24. #define NUM_9 0x61
  25. #define NUM_0 0x62
  26. #define KEY_CAPS_LOCK 0x01
  27. #define KEY_NUM_LOCK 0x02
  28. #define KEY_SCROLL_LOCK 0x04
  29. #define KEY_PRINT_SCREEN 0x05
  30. #define KEY_NUM_1 0x31
  31. #define KEY_NUM_2 0x32
  32. #define KEY_NUM_3 0x33
  33. #define KEY_NUM_4 0x34
  34. #define KEY_NUM_5 0x35
  35. #define KEY_NUM_6 0x36
  36. #define KEY_NUM_7 0x37
  37. #define KEY_NUM_8 0x38
  38. #define KEY_NUM_9 0x39
  39. #define KEY_NUM_0 0x30
  40. String bufferStr = "";
  41. String last = "";
  42. int defaultDelay = 0;
  43. bool shift = false;
  44. bool num_lock = false; // false is working half way
  45. USB Usb;
  46. HIDBoot<USB_HID_PROTOCOL_KEYBOARD> HidKeyboard(&Usb);
  47. uint32_t next_time;
  48. class KbdRptParser : public KeyboardReportParser{
  49. public:
  50. uint8_t _parse(uint8_t key);
  51. String _getChar(uint8_t key);
  52. protected:
  53. void OnControlKeysChanged(uint8_t before, uint8_t after);
  54. void OnKeyDown (uint8_t mod, uint8_t key);
  55. void OnKeyUp (uint8_t mod, uint8_t key);
  56. void OnKeyPressed(uint8_t key);
  57. void _press(uint8_t key);
  58. void _release(uint8_t key);
  59. };
  60. void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key){
  61. digitalWrite(LED_BUILTIN, HIGH);
  62. int parsedKey = _parse(key);
  63. if(parsedKey == key){
  64. uint8_t c = OemToAscii(mod, key);
  65. OnKeyPressed(c);
  66. if(c != 0x20 && c != 0x00) _press(c);
  67. else _press(key);
  68. }else _press(parsedKey);
  69. digitalWrite(LED_BUILTIN, LOW);
  70. }
  71. void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key){
  72. int parsedKey = _parse(key);
  73. if(parsedKey == key){
  74. uint8_t c = OemToAscii(mod, key);
  75. OnKeyPressed(c);
  76. if(c != 0x20 && c != 0x00){
  77. _release(c);
  78. Serial.print((char)c);
  79. }
  80. else{
  81. _release(key);
  82. Serial.print("0x");
  83. Serial.print(key, HEX);
  84. }
  85. }else{
  86. _release(parsedKey);
  87. Serial.print(_getChar(key));
  88. }
  89. }
  90. void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after) {
  91. MODIFIERKEYS beforeMod;
  92. *((uint8_t*)&beforeMod) = before;
  93. MODIFIERKEYS afterMod;
  94. *((uint8_t*)&afterMod) = after;
  95. //left
  96. if(beforeMod.bmLeftCtrl != afterMod.bmLeftCtrl){
  97. if(afterMod.bmLeftCtrl) Keyboard.press(KEY_LEFT_CTRL);
  98. else Keyboard.release(KEY_LEFT_CTRL);
  99. Serial.print("<ctrl "+(String)afterMod.bmLeftCtrl+">");
  100. }
  101. if(beforeMod.bmLeftShift != afterMod.bmLeftShift){
  102. if(afterMod.bmLeftShift) Keyboard.press(KEY_LEFT_SHIFT);
  103. else Keyboard.release(KEY_LEFT_SHIFT);
  104. shift = afterMod.bmLeftShift;
  105. //Serial.print("<shift "+(String)afterMod.bmLeftShift+">");
  106. }
  107. if(beforeMod.bmLeftAlt != afterMod.bmLeftAlt){
  108. if(afterMod.bmLeftAlt) Keyboard.press(KEY_LEFT_ALT);
  109. else Keyboard.release(KEY_LEFT_ALT);
  110. Serial.print("<alt "+(String)afterMod.bmLeftAlt+">");
  111. }
  112. if(beforeMod.bmLeftGUI != afterMod.bmLeftGUI){
  113. if(afterMod.bmLeftGUI) Keyboard.press(KEY_LEFT_GUI);
  114. else Keyboard.release(KEY_LEFT_GUI);
  115. Serial.print("<gui "+(String)afterMod.bmLeftGUI+">");
  116. }
  117. //right
  118. if(beforeMod.bmRightCtrl != afterMod.bmRightCtrl){
  119. if(afterMod.bmRightCtrl) Keyboard.press(KEY_RIGHT_CTRL);
  120. else Keyboard.release(KEY_RIGHT_CTRL);
  121. Serial.print("<ctrl "+(String)afterMod.bmRightCtrl+">");
  122. }
  123. if(beforeMod.bmRightShift != afterMod.bmRightShift){
  124. if(afterMod.bmRightShift) Keyboard.press(KEY_RIGHT_SHIFT);
  125. else Keyboard.release(KEY_RIGHT_SHIFT);
  126. shift = afterMod.bmLeftShift;
  127. //Serial.print("<shift "+(String)afterMod.bmRightShift+">");
  128. }
  129. if(beforeMod.bmRightAlt != afterMod.bmRightAlt){
  130. if(afterMod.bmRightAlt) Keyboard.press(KEY_RIGHT_ALT);
  131. else Keyboard.release(KEY_RIGHT_ALT);
  132. Serial.print("<alt "+(String)afterMod.bmRightAlt+">");
  133. }
  134. if(beforeMod.bmRightGUI != afterMod.bmRightGUI){
  135. if(afterMod.bmRightGUI) Keyboard.press(KEY_RIGHT_GUI);
  136. else Keyboard.release(KEY_RIGHT_GUI);
  137. Serial.print("<gui "+(String)afterMod.bmRightGUI+">");
  138. }
  139. }
  140. void KbdRptParser::OnKeyPressed(uint8_t key){
  141. /*Serial.print("ASCII: \"");
  142. Serial.print((char)key);
  143. Serial.print("\" = 0x");
  144. Serial.print(key, HEX);
  145. Serial.print("; ");*/
  146. };
  147. uint8_t KbdRptParser::_parse(uint8_t key){
  148. /*
  149. Serial.print("0x");
  150. Serial.print(key, HEX);
  151. Serial.print(" = ");*/
  152. switch(key){
  153. case CAPS_LOCK: return KEY_CAPS_LOCK; break; // CAPS
  154. case NUM_LOCK: return KEY_NUM_LOCK; break; // NUM LOCK
  155. case SCROLL_LOCK: return KEY_SCROLL_LOCK; break; // SCROLL LOCK
  156. case PRINT_SCREEN: return KEY_PRINT_SCREEN; break; // PRINT SCREEN
  157. case NUM_1 : if (!num_lock) return KEY_NUM_1; break;
  158. case NUM_2 : if (!num_lock) return KEY_NUM_2; break;
  159. case NUM_3 : if (!num_lock) return KEY_NUM_3; break;
  160. case NUM_4 : if (!num_lock) return KEY_NUM_4; break;
  161. case NUM_5 : if (!num_lock) return KEY_NUM_5; break;
  162. case NUM_6 : if (!num_lock) return KEY_NUM_6; break;
  163. case NUM_7 : if (!num_lock) return KEY_NUM_7; break;
  164. case NUM_8 : if (!num_lock) return KEY_NUM_8; break;
  165. case NUM_9 : if (!num_lock) return KEY_NUM_9; break;
  166. case NUM_0 : if (!num_lock) return KEY_NUM_0; break;
  167. case 0x2C: return 0x20; break; // SPACE
  168. case 40: return KEY_RETURN; break;
  169. case 41: return KEY_ESC; break;
  170. case 42: return KEY_BACKSPACE; break;
  171. case 43: return KEY_TAB; break;
  172. case 58: return KEY_F1; break;
  173. case 59: return KEY_F2; break;
  174. case 60: return KEY_F3; break;
  175. case 61: return KEY_F4; break;
  176. case 62: return KEY_F5; break;
  177. case 63: return KEY_F6; break;
  178. case 64: return KEY_F7; break;
  179. case 65: return KEY_F8; break;
  180. case 66: return KEY_F9; break;
  181. case 67: return KEY_F10; break;
  182. case 68: return KEY_F11; break;
  183. case 69: return KEY_F12; break;
  184. case 73: return KEY_INSERT; break;
  185. case 74: return KEY_HOME; break;
  186. case 75: return KEY_PAGE_UP; break;
  187. case 76: return KEY_DELETE; break;
  188. case 77: return KEY_END; break;
  189. case 78: return KEY_PAGE_DOWN; break;
  190. case 79: return KEY_RIGHT_ARROW; break;
  191. case 80: return KEY_LEFT_ARROW; break;
  192. case 81: return KEY_DOWN_ARROW; break;
  193. case 82: return KEY_UP_ARROW; break;
  194. case 88: return KEY_RETURN; break;
  195. //=====[DE-Keyboard]=====//
  196. case 0x64: return 236; break; // <
  197. case 0x32: return 92; break; // #
  198. //======================//
  199. default: {
  200. //Serial.print(" N/A ");
  201. return key;
  202. }
  203. }
  204. }
  205. String KbdRptParser::_getChar(uint8_t key){
  206. switch(key){
  207. case CAPS_LOCK: return "<CAPS_LOCK>"; break; // CAPS
  208. case NUM_LOCK: return "<NUM_LOCK>"; break; // NUM LOCK
  209. case SCROLL_LOCK: return "<SCROLL_LOCK>"; break; // SCROLL LOCK
  210. case PRINT_SCREEN: return "<PRINT_SCREEN>"; break; // PRINT SCREEN
  211. //case NUM_1 : if (num_lock) return "<NUM_1>"; break;
  212. //case NUM_2 : if (num_lock) return "<NUM_2>"; break;
  213. //case NUM_3 : if (num_lock) return "<NUM_3>"; break;
  214. //case NUM_4 : if (num_lock) return "<NUM_4>"; break;
  215. //case NUM_5 : if (num_lock) return "<NUM_5>"; break;
  216. //case NUM_6 : if (num_lock) return "<NUM_6>"; break;
  217. //case NUM_7 : if (num_lock) return "<NUM_7>"; break;
  218. //case NUM_8 : if (num_lock) return "<NUM_8>"; break;
  219. //case NUM_9 : if (num_lock) return "<NUM_9>"; break;
  220. //case NUM_0 : if (num_lock) return "<NUM_0>"; break;
  221. case 0x2C: return " "; break;
  222. case 40: return "<RETURN>\n"; break;
  223. case 41: return "<ESC>\n"; break;
  224. case 42: return "<BACKSPCAE>"; break;
  225. case 43: return "<TAB>\n"; break;
  226. case 58: return "<F1>\n"; break;
  227. case 59: return "<F2>\n"; break;
  228. case 60: return "<F3>\n"; break;
  229. case 61: return "<F4>\n"; break;
  230. case 62: return "<F5>\n"; break;
  231. case 63: return "<F6>\n"; break;
  232. case 64: return "<F7>\n"; break;
  233. case 65: return "<F8>\n"; break;
  234. case 66: return "<F9>\n"; break;
  235. case 67: return "<F10>\n"; break;
  236. case 68: return "<F11>\n"; break;
  237. case 69: return "<F12>\n"; break;
  238. case 73: return "<INSERT>"; break;
  239. case 74: return "<HOME>\n"; break;
  240. case 75: return "<PAGE_UP>\n"; break;
  241. case 76: return "<DELETE>"; break;
  242. case 77: return "<END>\n"; break;
  243. case 78: return "<PAGE_DOWN>\n"; break;
  244. case 79: return "<RIGHT_ARROW>\n"; break;
  245. case 80: return "<LEFT_ARROW>\n"; break;
  246. case 81: return "<DOWN_ARROW>\n"; break;
  247. case 82: return "<UP_ARROW>\n"; break;
  248. case 88: return "<RETURN>\n"; break;
  249. //=====[DE-Keyboard]=====//
  250. case 0x64: {
  251. if(shift) return "<";
  252. else return ">";
  253. break;
  254. }
  255. case 0x32:{
  256. if(shift) return "'";
  257. else return "#";
  258. break;
  259. }
  260. //======================//
  261. default: {
  262. return "";
  263. }
  264. }
  265. }
  266. void KbdRptParser::_press(uint8_t key){
  267. /*Serial.print("0x");
  268. Serial.print(key, HEX);
  269. Serial.println(" DOWN");*/
  270. Keyboard.press(key);
  271. }
  272. void KbdRptParser::_release(uint8_t key){
  273. /*Serial.print("0x");
  274. Serial.print(key, HEX);
  275. Serial.println(" UP");
  276. Serial.println();*/
  277. Keyboard.release(key);
  278. }
  279. KbdRptParser parser;
  280. void Line(String _line)
  281. {
  282. int firstSpace = _line.indexOf(" ");
  283. if(firstSpace == -1) Press(_line);
  284. else if(_line.substring(0,firstSpace) == "STRING"){
  285. for(int i=firstSpace+1;i<_line.length();i++) Keyboard.write(_line[i]);
  286. }
  287. else if(_line.substring(0,firstSpace) == "DELAY"){
  288. int delaytime = _line.substring(firstSpace + 1).toInt();
  289. delay(delaytime);
  290. }
  291. else if(_line.substring(0,firstSpace) == "DEFAULTDELAY") defaultDelay = _line.substring(firstSpace + 1).toInt();
  292. else if(_line.substring(0,firstSpace) == "REM"){} //nothing :/
  293. else if(_line.substring(0,firstSpace) == "REPLAY") {
  294. int replaynum = _line.substring(firstSpace + 1).toInt();
  295. while(replaynum)
  296. {
  297. Line(last);
  298. --replaynum;
  299. }
  300. } else{
  301. String remain = _line;
  302. while(remain.length() > 0){
  303. int latest_space = remain.indexOf(" ");
  304. if (latest_space == -1){
  305. Press(remain);
  306. remain = "";
  307. }
  308. else{
  309. Press(remain.substring(0, latest_space));
  310. remain = remain.substring(latest_space + 1);
  311. }
  312. delay(5);
  313. }
  314. }
  315. Keyboard.releaseAll();
  316. delay(defaultDelay);
  317. }
  318. void Press(String b){
  319. if(b.length() == 1) Keyboard.press(char(b[0]));
  320. else if (b.equals("ENTER")) Keyboard.press(KEY_RETURN);
  321. else if (b.equals("CTRL")) Keyboard.press(KEY_LEFT_CTRL);
  322. else if (b.equals("SHIFT")) Keyboard.press(KEY_LEFT_SHIFT);
  323. else if (b.equals("ALT")) Keyboard.press(KEY_LEFT_ALT);
  324. else if (b.equals("GUI")) Keyboard.press(KEY_LEFT_GUI);
  325. else if (b.equals("UP") || b.equals("UPARROW")) Keyboard.press(KEY_UP_ARROW);
  326. else if (b.equals("DOWN") || b.equals("DOWNARROW")) Keyboard.press(KEY_DOWN_ARROW);
  327. else if (b.equals("LEFT") || b.equals("LEFTARROW")) Keyboard.press(KEY_LEFT_ARROW);
  328. else if (b.equals("RIGHT") || b.equals("RIGHTARROW")) Keyboard.press(KEY_RIGHT_ARROW);
  329. else if (b.equals("DELETE")) Keyboard.press(KEY_DELETE);
  330. else if (b.equals("PAGEUP")) Keyboard.press(KEY_PAGE_UP);
  331. else if (b.equals("PAGEDOWN")) Keyboard.press(KEY_PAGE_DOWN);
  332. else if (b.equals("HOME")) Keyboard.press(KEY_HOME);
  333. else if (b.equals("ESC")) Keyboard.press(KEY_ESC);
  334. else if (b.equals("BACKSPACE")) Keyboard.press(KEY_BACKSPACE);
  335. else if (b.equals("INSERT")) Keyboard.press(KEY_INSERT);
  336. else if (b.equals("TAB")) Keyboard.press(KEY_TAB);
  337. else if (b.equals("END")) Keyboard.press(KEY_END);
  338. else if (b.equals("CAPSLOCK")) Keyboard.press(KEY_CAPS_LOCK);
  339. else if (b.equals("F1")) Keyboard.press(KEY_F1);
  340. else if (b.equals("F2")) Keyboard.press(KEY_F2);
  341. else if (b.equals("F3")) Keyboard.press(KEY_F3);
  342. else if (b.equals("F4")) Keyboard.press(KEY_F4);
  343. else if (b.equals("F5")) Keyboard.press(KEY_F5);
  344. else if (b.equals("F6")) Keyboard.press(KEY_F6);
  345. else if (b.equals("F7")) Keyboard.press(KEY_F7);
  346. else if (b.equals("F8")) Keyboard.press(KEY_F8);
  347. else if (b.equals("F9")) Keyboard.press(KEY_F9);
  348. else if (b.equals("F10")) Keyboard.press(KEY_F10);
  349. else if (b.equals("F11")) Keyboard.press(KEY_F11);
  350. else if (b.equals("F12")) Keyboard.press(KEY_F12);
  351. else if (b.equals("SPACE")) Keyboard.press(' ');
  352. //else Serial.println("not found :'"+b+"'("+String(b.length())+")");
  353. }
  354. void setup()
  355. {
  356. Serial.begin(115200);
  357. //Serial1.begin(115200);
  358. Keyboard.begin();
  359. delay(2000);
  360. pinMode(LED_BUILTIN, OUTPUT);
  361. // Turn signal LED off
  362. digitalWrite(LED_BUILTIN, LOW);
  363. //Serial1.println("\n\nLogging keys...\n");
  364. /*
  365. for(int i=0;i<256;i++){
  366. int key = parser._parse(i);
  367. if(key == i){
  368. Keyboard.print((String)i+" ");
  369. Keyboard.write(i);
  370. delay(200);
  371. Keyboard.write(KEY_RETURN);
  372. }
  373. }*/
  374. if(Usb.Init() == -1) Serial.println("OSC did not start.");
  375. delay(200);
  376. next_time = millis() + 5000;
  377. HidKeyboard.SetReportParser(0, &parser);
  378. }
  379. void loop(){
  380. Usb.Task();
  381. if(Serial.available()) {
  382. bufferStr = Serial.readStringUntil("END");
  383. //Serial.println(bufferStr);
  384. }
  385. if(bufferStr.length() > 0){
  386. bufferStr.replace("\r","\n");
  387. bufferStr.replace("\n\n","\n");
  388. while(bufferStr.length() > 0){
  389. int latest_return = bufferStr.indexOf("\n");
  390. if(latest_return == -1){
  391. //Serial.println("run: "+bufferStr);
  392. Line(bufferStr);
  393. bufferStr = "";
  394. } else{
  395. //Serial.println("run: '"+bufferStr.substring(0, latest_return)+"'");
  396. Line(bufferStr.substring(0, latest_return));
  397. last=bufferStr.substring(0, latest_return);
  398. bufferStr = bufferStr.substring(latest_return + 1);
  399. }
  400. }
  401. bufferStr = "";
  402. Serial.write(0x99);
  403. //Serial.println("done");
  404. }
  405. }