#include #include #ifdef dobogusinclude #include #endif #include #include byte klavesa = 0; class KbdRptParser : public KeyboardReportParser { void PrintKey(uint8_t mod, uint8_t key); protected: void OnControlKeysChanged(uint8_t before, uint8_t after); void OnKeyDown (uint8_t mod, uint8_t key); void OnKeyUp (uint8_t mod, uint8_t key); void OnKeyPressed(uint8_t key); }; //kód stisknuté funkční klávesy převedeme na hex kód a odešleme void KbdRptParser::PrintKey(uint8_t m, uint8_t key) { MODIFIERKEYS mod; *((uint8_t*)&mod) = m; if(key==41) //Esc { klavesa = 0x91; } else if(key==40) //Enter { klavesa = 0x90; } else if(key==83) //Num lock { klavesa = 0x92; } else if(key==71) //Scroll lock { klavesa = 0x93; } else if(key==72) //Pause { klavesa = 0x94; } else if(key==73) //Insert { klavesa = 0x95; } else if(key==80) //šipka vlevo { klavesa = 0x96; } else if(key==79) //šipka vpravo { klavesa = 0x97; } else if(key==81) //šipka dolu { klavesa = 0x98; } else if(key==82) //šipka nahoru { klavesa = 0x99; } else if(key==70) //Print screen { klavesa = 0x9A; } else if(key==101) //menu { klavesa = 0x9B; } else if(key==42) //Backspace { klavesa = 0x9C; } else if(key==43) //Tab { klavesa = 0x9D; } else if(key==76) //Delete { klavesa = 0x9E; } else if(key==58) //F1 { klavesa = 0x9F; } else if(key==59) //F2 { klavesa = 0xA0; } else if(key==60) //F3 { klavesa = 0xA1; } else if(key==61) //F4 { klavesa = 0xA2; } else if(key==62) //F5 { klavesa = 0xA3; } else if(key==63) //F6 { klavesa = 0xA4; } else if(key==64) //F7 { klavesa = 0xA5; } else if(key==65) //F8 { klavesa = 0xA6; } else if(key==66) //F9 { klavesa = 0xA7; } else if(key==67) //F10 { klavesa = 0xA8; } else if(key==74) //Home { klavesa = 0xA9; } else if(key==75) //Page up { klavesa = 0xAA; } else if(key==78) //Page down { klavesa = 0xAB; } else if(key==77) //End { klavesa = 0xAC; } else if(key==100) //klávesa <>| { klavesa = 0xB2; } }; void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key) { PrintKey(mod, key); uint8_t c = OemToAscii(mod, key); if (c) OnKeyPressed(c); } //kód stisknuté kontrolní klávesy převedeme na hex kód a odešleme void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after) { MODIFIERKEYS beforeMod; *((uint8_t*)&beforeMod) = before; MODIFIERKEYS afterMod; *((uint8_t*)&afterMod) = after; if (beforeMod.bmLeftCtrl < afterMod.bmLeftCtrl) //levý Ctrl { klavesa = 0xAD; } if (beforeMod.bmLeftAlt < afterMod.bmLeftAlt) //levý Alt { klavesa = 0xAE; } if (beforeMod.bmLeftGUI < afterMod.bmLeftGUI) //levý win { klavesa = 0xB0; } if (beforeMod.bmRightAlt < afterMod.bmRightAlt) //pravý Alt Gr { klavesa = 0xAF; } if (beforeMod.bmRightGUI < afterMod.bmRightGUI) //pravý win { klavesa = 0xB1; } } void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key) //puštěná klávesa { } //kód stisknuté znakové klávesy převedeme na ASCII kód a odešleme void KbdRptParser::OnKeyPressed(uint8_t key) { if(key == 121) //prohození z y, y z, Z Y , Y Z - česká klávesnice { klavesa = 'z'; } else if(key == 89) { klavesa = 'Z'; } else if(key == 122) { klavesa = 'y'; } else if(key == 90) { klavesa = 'Y'; } else { klavesa = (char)key; } }; USB Usb; HIDBoot HidKeyboard(&Usb); KbdRptParser Prs; #define RU 4 //pin na reset napájení USB void setup() { Wire.begin(0x01); //adresa I2C Wire.onRequest(requestEvent); pinMode(RU,OUTPUT); digitalWrite(RU,HIGH); //zapni USB #if !defined(__MIPSEL__) while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection #endif if (Usb.Init() == -1) delay( 200 ); HidKeyboard.SetReportParser(0, &Prs); delay(5000); //počkej digitalWrite(RU,LOW); //vypni USB delay(5000); //počkej digitalWrite(RU,HIGH); //zapni USB } void loop() { Usb.Task(); } void requestEvent() { Wire.write(klavesa); klavesa=0; }