IR-PC-HID-Remote.ino 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883
  1. //------------------------------------------------------------------------------
  2. // Include the IRremote library header
  3. //
  4. #include <IRremote.h>
  5. #include <HID-Project.h> // HID-Project 2.8.2
  6. bool debug = false;
  7. bool useSerial = false;
  8. #define KEY_1 1
  9. #define KEY_2 2
  10. #define KEY_3 3
  11. #define KEY_4 4
  12. #define KEY_5 5
  13. #define KEY_6 6
  14. #define KEY_7 7
  15. #define KEY_8 8
  16. #define KEY_9 9
  17. #define KEY_0 10
  18. #define KEY_PLAY 11
  19. #define KEY_PAUSE 12
  20. #define KEY_STOP 13
  21. #define KEY_REC 14
  22. #define KEY_REWD 15
  23. #define KEY_FFWD 16
  24. #define KEY_PREV 17
  25. #define KEY_NEXT 18
  26. #define KEY_LEFT 20
  27. #define KEY_RIGHT 21
  28. #define KEY_UP 22
  29. #define KEY_DOWN 23
  30. #define KEY_OK 24
  31. #define KEY_BACK 25
  32. #define KEY_MENU 26
  33. #define KEY_HOME 26
  34. #define KEY_RED 30
  35. #define KEY_GREEN 31
  36. #define KEY_YELLOW 32
  37. #define KEY_BLUE 33
  38. #define KEY_STATUS 34
  39. #define KEY_RETURN 35
  40. #define KEY_SETUP 36
  41. #define KEY_GUIDE 37
  42. #define KEY_RADIO 38
  43. #define KEY_PREVCH 39
  44. #define KEY_CH_DOWN 40
  45. #define KEY_CH_UP 41
  46. #define KEY_VOL_DOWN 42
  47. #define KEY_VOL_UP 43
  48. #define KEY_MUTE 44
  49. #define KEY_POWER 45
  50. #define KEY_TV 46
  51. #define KEY_VIDEOS 47
  52. #define KEY_MUSIC 48
  53. #define KEY_PICTURES 49
  54. #define KEY_STAR 50
  55. #define KEY_HASH 51
  56. #define KEY_RED 52
  57. #define KEY_YELLOW 53
  58. #define KEY_GREEN 54
  59. #define KEY_BLUE 55
  60. #define KEY_DUMMY 255
  61. uint8_t lastRC5Pref;
  62. bool RC5RepeatLastKey = false;
  63. int repeatInterval = 150;
  64. unsigned long lastKeypressMillis = 0;;
  65. unsigned long ignoreMillis = 0;
  66. unsigned long powerButton_lastPressedMillis = 0;;
  67. int powerButton_countRepeats = 0;
  68. int powerButton_execAfter = 500;
  69. int ignoreTimeout = 300;
  70. //------------------------------------------------------------------------------
  71. // Tell IRremote which Arduino pin is connected to the IR Receiver (TSOP4838)
  72. //
  73. int recvPin = 2;
  74. IRrecv irrecv(recvPin);
  75. //+=============================================================================
  76. // Configure the Arduino
  77. //
  78. void setup ( )
  79. {
  80. if (useSerial) Serial.begin(115200);
  81. Keyboard.begin();
  82. Consumer.begin();
  83. System.begin();
  84. irrecv.enableIRIn(); // Start the receiver
  85. }
  86. //+=============================================================================
  87. // Display IR code
  88. //
  89. void ircode (decode_results *results)
  90. {
  91. if (useSerial) {
  92. // Panasonic has an Address
  93. if (results->decode_type == PANASONIC) {
  94. Serial.print(results->address, HEX);
  95. Serial.print(":");
  96. }
  97. // Print Code
  98. Serial.print(results->value, HEX);
  99. }
  100. }
  101. //+=============================================================================
  102. // Display encoding type
  103. //
  104. void encoding (decode_results *results)
  105. {
  106. if (useSerial) {
  107. switch (results->decode_type) {
  108. default:
  109. case UNKNOWN: Serial.print("UNKNOWN"); break ;
  110. case NEC: Serial.print("NEC"); break ;
  111. case SONY: Serial.print("SONY"); break ;
  112. case RC5: Serial.print("RC5"); break ;
  113. case RC6: Serial.print("RC6"); break ;
  114. case DISH: Serial.print("DISH"); break ;
  115. case SHARP: Serial.print("SHARP"); break ;
  116. case JVC: Serial.print("JVC"); break ;
  117. case SANYO: Serial.print("SANYO"); break ;
  118. case MITSUBISHI: Serial.print("MITSUBISHI"); break ;
  119. case SAMSUNG: Serial.print("SAMSUNG"); break ;
  120. case LG: Serial.print("LG"); break ;
  121. case WHYNTER: Serial.print("WHYNTER"); break ;
  122. case AIWA_RC_T501: Serial.print("AIWA_RC_T501"); break ;
  123. case PANASONIC: Serial.print("PANASONIC"); break ;
  124. case DENON: Serial.print("DENON"); break ;
  125. }
  126. }
  127. }
  128. void printKey() {
  129. if (useSerial) {
  130. Serial.print(F("KEY_"));
  131. }
  132. }
  133. void printMedia() {
  134. if (useSerial) {
  135. Serial.print(F("MEDIA_"));
  136. }
  137. }
  138. void printArrow() {
  139. if (useSerial) {
  140. Serial.print(F("ARROW_"));
  141. }
  142. }
  143. //+=============================================================================
  144. // Dump out the decode_results structure.
  145. //
  146. void dumpInfo (decode_results *results)
  147. {
  148. // Check if the buffer overflowed
  149. // if (results->overflow) {
  150. // Serial.println("IR code too long. Edit IRremoteInt.h and increase RAWLEN");
  151. // return;
  152. // }
  153. int resKey = 0;
  154. // Hauppauge Remote
  155. if (results->decode_type == RC5 && results->bits == 12) {
  156. // RC5 code
  157. // 3 bytes, start byte for this device is 0xF or 0x7 depending on toggle bit
  158. uint8_t currRC5Code = results->value ^ 0xF00;
  159. uint8_t currRC5Pref = ( currRC5Code ^ results->value ) >> 8;
  160. uint8_t RC5keyNum;
  161. // Serial.print("0x");
  162. // Serial.print(currRC5Pref, HEX);
  163. // Serial.print(" ");
  164. // Serial.print(currRC5Code, HEX);
  165. // Serial.println();
  166. if (lastRC5Pref != currRC5Pref || RC5RepeatLastKey) {
  167. lastRC5Pref = currRC5Pref;
  168. if (currRC5Code == 0xBD) { // POWER
  169. bool doit = false;
  170. if ((millis() - powerButton_lastPressedMillis) > repeatInterval) {
  171. powerButton_lastPressedMillis = millis();
  172. doit = true;
  173. }
  174. if (doit) {
  175. RC5RepeatLastKey = true;
  176. powerButton_countRepeats++;
  177. if (useSerial) {
  178. printKey();
  179. Serial.println(F("POWER"));
  180. Serial.print(F("REPEATS:"));
  181. Serial.println(powerButton_countRepeats);
  182. }
  183. //System.write(SYSTEM_WAKE_UP);
  184. if ( powerButton_countRepeats > 10) {
  185. if (useSerial) {
  186. Serial.println(F("POWER_LONG_PRESSED"));
  187. Serial.println("sending SYSTEM_POWER_DOWN");
  188. }
  189. RC5RepeatLastKey = false;
  190. powerButton_countRepeats = 0;
  191. System.write(SYSTEM_POWER_DOWN);
  192. }
  193. //System.write(SYSTEM_SLEEP);
  194. //Keyboard.press(KEY_LEFT_ALT);
  195. //Keyboard.press(KEY_F4);
  196. //delay(50);
  197. //Keyboard.releaseAll();
  198. resKey = KEY_POWER;
  199. //powerButton_lastPressedMillis
  200. //powerButton_countRepeats
  201. }
  202. }
  203. else if (currRC5Code == 0x90) { // VOL+
  204. bool doit = false;
  205. if ((millis() - lastKeypressMillis) > repeatInterval) {
  206. lastKeypressMillis = millis();
  207. doit = true;
  208. }
  209. if (doit) {
  210. RC5RepeatLastKey = true;
  211. if (useSerial) {
  212. printKey();
  213. printMedia();
  214. Serial.println(F("VOLUME_UP"));
  215. }
  216. Consumer.write(MEDIA_VOLUME_UP);
  217. resKey = KEY_VOL_UP;
  218. }
  219. }
  220. else if (currRC5Code == 0x91) { // VOL-
  221. bool doit = false;
  222. if ((millis() - lastKeypressMillis) > repeatInterval) {
  223. lastKeypressMillis = millis();
  224. doit = true;
  225. }
  226. if (doit) {
  227. RC5RepeatLastKey = true;
  228. if (useSerial) {
  229. printKey();
  230. printMedia();
  231. Serial.println(F("VOLUME_DOWN"));
  232. }
  233. Consumer.write(MEDIA_VOLUME_DOWN);
  234. resKey = KEY_VOL_DOWN;
  235. }
  236. }
  237. else if (currRC5Code == 0xB2) { // REWIND
  238. bool doit = false;
  239. if ((millis() - lastKeypressMillis) > repeatInterval) {
  240. lastKeypressMillis = millis();
  241. doit = true;
  242. }
  243. if (doit) {
  244. RC5RepeatLastKey = true;
  245. if (useSerial) {
  246. printKey();
  247. printMedia();
  248. Serial.println(F("REWIND"));
  249. }
  250. Consumer.write(MEDIA_REWIND);
  251. resKey = KEY_REWD;
  252. }
  253. }
  254. else if (currRC5Code == 0xB4) { // FAST_FORWARD
  255. bool doit = false;
  256. if ((millis() - lastKeypressMillis) > repeatInterval) {
  257. lastKeypressMillis = millis();
  258. doit = true;
  259. }
  260. if (doit) {
  261. RC5RepeatLastKey = true;
  262. if (useSerial) {
  263. printKey();
  264. printMedia();
  265. Serial.println(F("FAST_FORWARD"));
  266. }
  267. Consumer.write(MEDIA_FAST_FORWARD);
  268. resKey = KEY_FFWD;
  269. }
  270. }
  271. else if (currRC5Code == 0xA1) { // CH- used as page down
  272. RC5RepeatLastKey = false;
  273. if (useSerial) {
  274. printKey();
  275. Serial.println(F("CH_DOWN"));
  276. }
  277. Keyboard.write(KEY_PAGE_DOWN);
  278. resKey = KEY_CH_DOWN;
  279. }
  280. else if (currRC5Code == 0xA0) { // CH+ used as page up
  281. RC5RepeatLastKey = false;
  282. if (useSerial) {
  283. printKey();
  284. Serial.println(F("CH_UP"));
  285. }
  286. Keyboard.write(KEY_PAGE_UP);
  287. resKey = KEY_CH_UP;
  288. }
  289. else if (currRC5Code == 0x94) { // ARROW UP
  290. RC5RepeatLastKey = false;
  291. if (useSerial) {
  292. printKey();
  293. printArrow();
  294. Serial.println(F("UP"));
  295. }
  296. Keyboard.write(KEY_UP_ARROW);
  297. resKey = KEY_UP;
  298. }
  299. else if (currRC5Code == 0x95) { // ARROW DOWN
  300. RC5RepeatLastKey = false;
  301. if (useSerial) {
  302. printKey();
  303. printArrow();
  304. Serial.println(F("DOWN"));
  305. }
  306. Keyboard.write(KEY_DOWN_ARROW);
  307. resKey = KEY_DOWN;
  308. }
  309. else if (currRC5Code == 0x96) { // ARROW LEFT
  310. RC5RepeatLastKey = false;
  311. if (useSerial) {
  312. printKey();
  313. printArrow();
  314. Serial.println(F("LEFT"));
  315. }
  316. Keyboard.write(KEY_LEFT_ARROW);
  317. resKey = KEY_LEFT;
  318. }
  319. else if (currRC5Code == 0x97) { // ARROW RIGHT
  320. RC5RepeatLastKey = false;
  321. if (useSerial) {
  322. printKey();
  323. printArrow();
  324. Serial.println(F("RIGHT"));
  325. }
  326. Keyboard.write(KEY_RIGHT_ARROW);
  327. resKey = KEY_RIGHT;
  328. }
  329. else if (currRC5Code == 0xA5) { // OK
  330. RC5RepeatLastKey = false;
  331. if (useSerial) {
  332. printKey();
  333. Serial.println(F("OK_ENTER"));
  334. }
  335. Keyboard.write(KEY_ENTER);
  336. resKey = KEY_OK;
  337. }
  338. else if (currRC5Code == 0x9F) { // BACK/EXIT
  339. RC5RepeatLastKey = false;
  340. if (useSerial) {
  341. printKey();
  342. Serial.println(F("BACK_EXIT"));
  343. }
  344. Keyboard.write(KEY_BACKSPACE);
  345. resKey = KEY_BACK;
  346. }
  347. else if (currRC5Code == 0x8D) { // i/MENU
  348. RC5RepeatLastKey = false;
  349. if (useSerial) {
  350. printKey();
  351. Serial.println(F("MENU"));
  352. }
  353. Keyboard.write(KEY_ESC);
  354. resKey = KEY_MENU;
  355. }
  356. else if (currRC5Code == 0x92) { // PREV.CH
  357. RC5RepeatLastKey = false;
  358. if (useSerial) {
  359. printKey();
  360. Serial.println(F("PREV_CH"));
  361. }
  362. resKey = KEY_PREVCH;
  363. }
  364. else if (currRC5Code == 0x8F) { // MUTE
  365. RC5RepeatLastKey = false;
  366. if (useSerial) {
  367. printKey();
  368. printMedia();
  369. Serial.println(F("VOLUME_MUTE"));
  370. }
  371. Consumer.write(MEDIA_VOLUME_MUTE);
  372. resKey = KEY_MUTE;
  373. }
  374. else if (currRC5Code == 0xBB) { // HOME/GO
  375. RC5RepeatLastKey = false;
  376. if (useSerial) {
  377. printKey();
  378. Serial.println(F("HOME"));
  379. }
  380. Keyboard.write(KEY_LEFT_WINDOWS);
  381. resKey = KEY_HOME;
  382. }
  383. else if (currRC5Code == 0x9C) { // TV
  384. RC5RepeatLastKey = false;
  385. if (useSerial) {
  386. printKey();
  387. Serial.println(F("TV"));
  388. Serial.println(F("sending CTRL+ALT+WIN+F1"));
  389. }
  390. Keyboard.press(KEY_LEFT_CTRL);
  391. delay(2);
  392. Keyboard.press(KEY_LEFT_WINDOWS);
  393. delay(2);
  394. Keyboard.press(KEY_LEFT_ALT);
  395. delay(2);
  396. Keyboard.press(KEY_F1);
  397. delay(20);
  398. Keyboard.releaseAll();
  399. resKey = KEY_TV;
  400. }
  401. else if (currRC5Code == 0x98) { // VIDEOS
  402. RC5RepeatLastKey = false;
  403. if (useSerial) {
  404. printKey();
  405. Serial.println(F("VIDEOS"));
  406. Serial.println(F("sending CTRL+ALT+WIN+F2"));
  407. }
  408. Keyboard.press(KEY_LEFT_CTRL);
  409. delay(2);
  410. Keyboard.press(KEY_LEFT_ALT);
  411. delay(2);
  412. Keyboard.press(KEY_LEFT_WINDOWS);
  413. delay(2);
  414. Keyboard.press(KEY_F2);
  415. delay(20);
  416. Keyboard.releaseAll();
  417. resKey = KEY_VIDEOS;
  418. }
  419. else if (currRC5Code == 0x99) { // MUSIC
  420. RC5RepeatLastKey = false;
  421. if (useSerial) {
  422. printKey();
  423. Serial.println(F("MUSIC"));
  424. Serial.println(F("sending CTRL+ALT+WIN+F3"));
  425. }
  426. Keyboard.press(KEY_LEFT_CTRL);
  427. delay(2);
  428. Keyboard.press(KEY_LEFT_ALT);
  429. delay(2);
  430. Keyboard.press(KEY_LEFT_WINDOWS);
  431. delay(2);
  432. Keyboard.press(KEY_F3);
  433. delay(20);
  434. Keyboard.releaseAll();
  435. resKey = KEY_MUSIC;
  436. }
  437. else if (currRC5Code == 0x9A) { // PICTURES
  438. RC5RepeatLastKey = false;
  439. if (useSerial) {
  440. printKey();
  441. Serial.println(F("PICTURES"));
  442. Serial.println(F("sending CTRL+ALT+WIN+F4"));
  443. }
  444. Keyboard.press(KEY_LEFT_CTRL);
  445. delay(2);
  446. Keyboard.press(KEY_LEFT_WINDOWS);
  447. delay(2);
  448. Keyboard.press(KEY_LEFT_ALT);
  449. delay(2);
  450. Keyboard.press(KEY_F4);
  451. delay(20);
  452. Keyboard.releaseAll();
  453. resKey = KEY_PICTURES;
  454. }
  455. else if (currRC5Code == 0x9B) { // GUIDE
  456. RC5RepeatLastKey = false;
  457. if (useSerial) {
  458. printKey();
  459. Serial.println(F("GUIDE"));
  460. Serial.println(F("sending CTRL+ALT+WIN+F5"));
  461. }
  462. Keyboard.press(KEY_LEFT_CTRL);
  463. delay(2);
  464. Keyboard.press(KEY_LEFT_ALT);
  465. delay(2);
  466. Keyboard.press(KEY_LEFT_WINDOWS);
  467. delay(2);
  468. Keyboard.press(KEY_F5);
  469. delay(20);
  470. Keyboard.releaseAll();
  471. resKey = KEY_GUIDE;
  472. }
  473. else if (currRC5Code == 0x8C) { // RADIO
  474. RC5RepeatLastKey = false;
  475. if (useSerial) {
  476. printKey();
  477. Serial.println(F("RADIO"));
  478. Serial.println(F("sending CTRL+ALT+WIN+F6"));
  479. }
  480. Keyboard.press(KEY_LEFT_CTRL);
  481. delay(2);
  482. Keyboard.press(KEY_LEFT_ALT);
  483. delay(2);
  484. Keyboard.press(KEY_LEFT_WINDOWS);
  485. delay(2);
  486. Keyboard.press(KEY_F6);
  487. delay(20);
  488. Keyboard.releaseAll();
  489. resKey = KEY_RADIO;
  490. }
  491. else if (currRC5Code == 0xB7) { // REC
  492. RC5RepeatLastKey = false;
  493. if (useSerial) {
  494. printKey();
  495. printMedia();
  496. Serial.println(F("RECORD"));
  497. }
  498. resKey = KEY_REC;
  499. //Consumer.write(MEDIA_STOP);
  500. }
  501. else if (currRC5Code == 0xB6) { // STOP
  502. RC5RepeatLastKey = false;
  503. if (useSerial) {
  504. printKey();
  505. printMedia();
  506. Serial.println(F("STOP"));
  507. }
  508. resKey = KEY_STOP;
  509. Consumer.write(MEDIA_STOP);
  510. }
  511. else if (currRC5Code == 0xB5) { // PLAY
  512. RC5RepeatLastKey = false;
  513. if (useSerial) {
  514. printKey();
  515. printMedia();
  516. Serial.println(F("PLAY"));
  517. }
  518. resKey = KEY_PLAY;
  519. Consumer.write(MEDIA_PLAY_PAUSE);
  520. }
  521. else if (currRC5Code == 0xB0) { // PAUSE
  522. RC5RepeatLastKey = false;
  523. if (useSerial) {
  524. printKey();
  525. printMedia();
  526. Serial.println(F("PAUSE"));
  527. }
  528. resKey = KEY_PAUSE;
  529. Consumer.write(MEDIA_PLAY_PAUSE);
  530. }
  531. else if (currRC5Code == 0xA4) { // PREV
  532. RC5RepeatLastKey = false;
  533. if (useSerial) {
  534. printKey();
  535. printMedia();
  536. Serial.println(F("PREVIOUS"));
  537. }
  538. Consumer.write(MEDIA_PREVIOUS);
  539. resKey = KEY_PREV;
  540. }
  541. else if (currRC5Code == 0x9E) { // NEXT
  542. RC5RepeatLastKey = false;
  543. if (useSerial) {
  544. printKey();
  545. printMedia();
  546. Serial.println(F("NEXT"));
  547. }
  548. Consumer.write(MEDIA_NEXT);
  549. resKey = KEY_NEXT;
  550. }
  551. else if (currRC5Code == 0x81) { // 1
  552. RC5RepeatLastKey = false;
  553. Keyboard.write('1');
  554. if (useSerial) {
  555. printKey();
  556. Serial.println("1");
  557. }
  558. resKey = KEY_1;
  559. }
  560. else if (currRC5Code == 0x82) { // 2
  561. RC5RepeatLastKey = false;
  562. Keyboard.write('2');
  563. if (useSerial) {
  564. printKey();
  565. Serial.println("2");
  566. }
  567. resKey = KEY_2;
  568. }
  569. else if (currRC5Code == 0x83) { // 3
  570. RC5RepeatLastKey = false;
  571. Keyboard.write('3');
  572. if (useSerial) {
  573. printKey();
  574. Serial.println("3");
  575. }
  576. resKey = KEY_3;
  577. }
  578. else if (currRC5Code == 0x84) { // 4
  579. RC5RepeatLastKey = false;
  580. Keyboard.write('4');
  581. if (useSerial) {
  582. printKey();
  583. Serial.println("4");
  584. }
  585. resKey = KEY_4;
  586. }
  587. else if (currRC5Code == 0x85) { // 5
  588. RC5RepeatLastKey = false;
  589. Keyboard.write('5');
  590. if (useSerial) {
  591. printKey();
  592. Serial.println("5");
  593. }
  594. resKey = KEY_5;
  595. }
  596. else if (currRC5Code == 0x86) { // 6
  597. RC5RepeatLastKey = false;
  598. Keyboard.write('6');
  599. if (useSerial) {
  600. printKey();
  601. Serial.println("6");
  602. }
  603. resKey = KEY_6;
  604. }
  605. else if (currRC5Code == 0x87) { // 7
  606. RC5RepeatLastKey = false;
  607. Keyboard.write('7');
  608. if (useSerial) {
  609. printKey();
  610. Serial.println("7");
  611. }
  612. resKey = KEY_7;
  613. }
  614. else if (currRC5Code == 0x88) { // 8
  615. RC5RepeatLastKey = false;
  616. Keyboard.write('8');
  617. if (useSerial) {
  618. printKey();
  619. Serial.println("8");
  620. }
  621. resKey = KEY_8;
  622. }
  623. else if (currRC5Code == 0x89) { // 9
  624. RC5RepeatLastKey = false;
  625. Keyboard.write('9');
  626. if (useSerial) {
  627. printKey();
  628. Serial.println("9");
  629. }
  630. resKey = KEY_9;
  631. }
  632. else if (currRC5Code == 0x80) { // 0
  633. RC5RepeatLastKey = false;
  634. Keyboard.write('0');
  635. if (useSerial) {
  636. printKey();
  637. Serial.println("0");
  638. }
  639. resKey = KEY_0;
  640. }
  641. else if (currRC5Code == 0x8A) { // *
  642. RC5RepeatLastKey = false;
  643. if (useSerial) {
  644. printKey();
  645. Serial.println(F("STAR"));
  646. }
  647. resKey = KEY_STAR;
  648. }
  649. else if (currRC5Code == 0x8E) { // #
  650. RC5RepeatLastKey = false;
  651. if (useSerial) {
  652. printKey();
  653. Serial.println(F("HASH"));
  654. }
  655. resKey = KEY_HASH;
  656. }
  657. else if (currRC5Code == 0x8B) { // RED
  658. RC5RepeatLastKey = false;
  659. if (useSerial) {
  660. printKey();
  661. Serial.println(F("RED"));
  662. Serial.println("sending CTRL+ALT+WIN+F7");
  663. }
  664. Keyboard.press(KEY_LEFT_CTRL);
  665. Keyboard.press(KEY_LEFT_ALT);
  666. Keyboard.press(KEY_LEFT_WINDOWS);
  667. Keyboard.press(KEY_F7);
  668. delay(50);
  669. Keyboard.releaseAll();
  670. resKey = KEY_RED;
  671. }
  672. else if (currRC5Code == 0xAE) { // GREEN
  673. RC5RepeatLastKey = false;
  674. if (useSerial) {
  675. printKey();
  676. Serial.println(F("GREEN"));
  677. Serial.println(F("sending CTRL+ALT+WIN+F8"));
  678. }
  679. Keyboard.press(KEY_LEFT_CTRL);
  680. Keyboard.press(KEY_LEFT_ALT);
  681. Keyboard.press(KEY_LEFT_WINDOWS);
  682. Keyboard.press(KEY_F8);
  683. delay(50);
  684. Keyboard.releaseAll();
  685. resKey = KEY_GREEN;
  686. }
  687. else if (currRC5Code == 0xB8) { // YELLOW
  688. RC5RepeatLastKey = false;
  689. if (useSerial) {
  690. printKey();
  691. Serial.println(F("YELLOW"));
  692. Serial.println(F("sending CTRL+ALT+WIN+F9"));
  693. }
  694. Keyboard.press(KEY_LEFT_CTRL);
  695. Keyboard.press(KEY_LEFT_ALT);
  696. Keyboard.press(KEY_LEFT_WINDOWS);
  697. Keyboard.press(KEY_F9);
  698. delay(50);
  699. Keyboard.releaseAll();
  700. resKey = KEY_YELLOW;
  701. }
  702. else if (currRC5Code == 0xA9) { // BLUE
  703. //0xFA9 0x7A9
  704. RC5RepeatLastKey = false;
  705. if (useSerial) {
  706. printKey();
  707. Serial.println(F("BLUE"));
  708. Serial.println("sending CTRL+ALT+WIN+F10");
  709. }
  710. Keyboard.press(KEY_LEFT_CTRL);
  711. Keyboard.press(KEY_LEFT_ALT);
  712. Keyboard.press(KEY_LEFT_WINDOWS);
  713. Keyboard.press(KEY_F10);
  714. delay(50);
  715. Keyboard.releaseAll();
  716. resKey = KEY_BLUE;
  717. }
  718. }
  719. }
  720. // DENON RC-1014 REMOTE, Mode AUDIO/CD, MEDIA KEYS (set to SONY CD Player)
  721. else if (results->decode_type == SONY && results->bits == 12) {
  722. if (results->value == 0x9D1) { // PAUSE
  723. if (useSerial) {
  724. printKey();
  725. printMedia();
  726. Serial.println(F("PAUSE"));
  727. }
  728. resKey = KEY_PAUSE;
  729. Consumer.write(MEDIA_PLAY_PAUSE);
  730. ignoreMillis = millis(); // set to ignore input for a moment to avoid repetations
  731. }
  732. else if (results->value == 0xCD1) { // REWD
  733. if (useSerial) {
  734. printKey();
  735. printMedia();
  736. Serial.println(F("REWIND"));
  737. }
  738. Consumer.write(MEDIA_REWIND);
  739. resKey = KEY_REWD;
  740. ignoreMillis = millis(); // set to ignore input for a moment to avoid repetations
  741. }
  742. else if (results->value == 0x2D1) { // FFWD
  743. if (useSerial) {
  744. printKey();
  745. printMedia();
  746. Serial.println(F("FAST_FORWARD"));
  747. }
  748. Consumer.write(MEDIA_FAST_FORWARD);
  749. resKey = KEY_FFWD;
  750. ignoreMillis = millis(); // set to ignore input for a moment to avoid repetations
  751. }
  752. else if (results->value == 0xD1) { // PREV
  753. if (useSerial) {
  754. printKey();
  755. printMedia();
  756. Serial.println(F("PREVIOUS"));
  757. }
  758. Consumer.write(MEDIA_PREVIOUS);
  759. ignoreMillis = millis(); // set to ignore input for a moment to avoid repetations
  760. }
  761. else if (results->value == 0x8D1) { // NEXT
  762. if (useSerial) {
  763. printKey();
  764. printMedia();
  765. Serial.println(F("NEXT"));
  766. }
  767. Consumer.write(MEDIA_NEXT);
  768. resKey = KEY_NEXT;
  769. ignoreMillis = millis(); // set to ignore input for a moment to avoid repetations
  770. }
  771. else if (results->value == 0x4D1) { // PLAY
  772. if (useSerial) {
  773. printKey();
  774. printMedia();
  775. Serial.println(F("PLAY"));
  776. }
  777. resKey = KEY_PLAY;
  778. Consumer.write(MEDIA_PLAY_PAUSE);
  779. ignoreMillis = millis(); // set to ignore input for a moment to avoid repetations
  780. }
  781. else if (results->value == 0x1D1) { // STOP
  782. if (useSerial) {
  783. printKey();
  784. printMedia();
  785. Serial.println(F("STOP"));
  786. }
  787. resKey = KEY_STOP;
  788. Consumer.write(MEDIA_STOP);
  789. ignoreMillis = millis(); // set to ignore input for a moment to avoid repetations
  790. }
  791. }
  792. //if (resKey == 0 && results->decode_type != UNKNOWN) {
  793. if ((resKey == 0 && results->decode_type != UNKNOWN && results->bits > 0) && debug) {
  794. if (useSerial) {
  795. encoding(results);
  796. Serial.print(";0x");
  797. ircode(results);
  798. Serial.print(";");
  799. Serial.print(results->bits, DEC);
  800. Serial.println();
  801. Serial.println();
  802. }
  803. }
  804. }
  805. //+=============================================================================
  806. // The repeating section of the code
  807. //
  808. void loop ( )
  809. {
  810. decode_results results; // Somewhere to store the results
  811. if (irrecv.decode(&results)) { // Grab an IR code
  812. if ((millis() - ignoreMillis) > ignoreTimeout) dumpInfo(&results); // Output the results (if not in ignore time window)
  813. irrecv.resume(); // Prepare for the next value
  814. }
  815. // handle Power Button short press
  816. if (powerButton_countRepeats > 0 && (millis() - powerButton_lastPressedMillis) > powerButton_execAfter) {
  817. if (powerButton_countRepeats > 2) {
  818. if (useSerial) {
  819. Serial.println("POWER_SHORT_PRESSED");
  820. Serial.println("sending SYSTEM_SLEEP");
  821. }
  822. System.write(SYSTEM_SLEEP);
  823. }
  824. // else {
  825. // Serial.println("POWER_VERY_SHORT_PRESSED");
  826. // Serial.println("sending ALT+F4");
  827. // Keyboard.press(KEY_LEFT_ALT);
  828. // Keyboard.press(KEY_F4);
  829. // delay(50);
  830. // Keyboard.releaseAll();
  831. // }
  832. RC5RepeatLastKey = false;
  833. powerButton_countRepeats = 0;
  834. }
  835. }