Sodele. Alles Mögliche durchprobiert.
Kein Hex Code geht für die blöde Win/Menü Taste.
Das nervt jetzt gewaltig. Alles geht, nur der Affengriff Reset nicht. ![]()
Beiträge von CypherXG im Thema „Arduino Leonardo->A500 Tastatur Problem. Wer kann helfen?“
-
-
0x80 ist die rechte Windows Taste, aber nicht rmenu.
Es bleibt mir wohl keine andere Wahl als alle Hex Nummern durchzumachen. -
Hallo
Ich arbeite gerade an der kleinen Bastelei eine A500 Tastatur über einen Arduino als HID Keyboard zu benutzen.
Leider habe ich ein kleines Problem.
Ich finde einfach den Hex Code nicht für die rechte Windows Taste.
Es geht eigentlich darum. Ich möchte gerne die Tastatur über den Arduino an einem Emulator laufen lassen.
Wie ja vielen bekannt ist machen die Emulatoren wie Winuae oder UAE4Arm usw. einen Reset über
Linke STRG, linke Windowstaste und rechte Windowstaste(Menü)
Nun genau diese Menütaste geht nicht auf der Amiga Tastatur da mir der passende Hex Code zum ansprechen fehlt.
Auf der Amiga Tastatur wäre es die rechte Amiga Taste.Hier habt ihr mal den Code für den Arduino:
Code
Alles anzeigen#include <Keyboard.h> #define BITMASK_A500CLK 0b00010000 // IO 8 #define BITMASK_A500SP 0b00100000 // IO 9 #define BITMASK_A500RES 0b01000000 // IO 10 #define SYNCH_HI 0 #define SYNCH_LO 1 #define HANDSHAKE 2 #define READ 3 #define WAIT_LO 4 #define WAIT_RES 5 #define HID_SendReport(id,data,len) HID().SendReport(id,data,len) // IDE 1.6.9 KeyReport _keyReport; uint32_t counter = 0; uint8_t Joy, MemoJoy1, MemoJoy2, state, bitn, key, fn,keydown, ktab[0x68]={ // Tilde, 1-9, 0, sz, Accent, backslash, Num 0 (00 - 0F) 0x35, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x2D, 0x2E, 0x31, 0, 0x62, // Q bis +, -, Num 1, Num 2, Num3 (10 - 1F) 0x14, 0x1A, 0x08, 0x15, 0x17, 0x1C, 0x18, 0x0C, 0x12, 0x13, 0x2F, 0x30, 0 , 0x59, 0x5A, 0x5B, // A-#, -, Num 4, Num 5, Num 6 (20 - 2F) 0x04, 0x16, 0x07, 0x09, 0x0A, 0x0B, 0x0D, 0x0E, 0x0F, 0x33, 0x34, 0x32, 0, 0x5C, 0x5D, 0x5E, // <>,Y- -, -, Num . , Num 7, Num 8, Num 9 (30 - 3F) 0x64, 0x1D, 0x1B, 0x06, 0x19, 0x05, 0x11, 0x10, 0x36, 0x37, 0x38, 0, 0x63, 0x5F, 0x60, 0x61, // Space, BS, Tab, Enter, Return, ESC, Del, -, -, -, Num -, -, up, down, right, left (40 - 4F) 0x2C, 0x2A, 0x2B, 0x58, 0x28, 0x29, 0x4C, 0, 0, 0, 0x56, 0, 0x52, 0x51, 0x4F, 0x50, // F1-F10, -, -, Num /, Num *, Num +, - (50 - 5F) 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0, 0, 0x54, 0x55, 0x57, 0, // modifiers: Shift left, Shift right, -, Win left, Ctrl left, Ctrl right, Alt left, Alt right 0x02, //SHIFT-LINKS 0x20, //SHIFT-RECHTS 0x00, 0x01, //LINKS-CTRL 0x04, //RECHTS-ALT 0x40, //LINKS-AMIGA 0x08, //LINKS-ALT 0x10, //Sollte die Menü Taste sein. Geht aber nicht }; void setup() { // Keyboard (Port B) DDRD = ~(BITMASK_A500CLK | BITMASK_A500SP | BITMASK_A500RES); // direction INPUT } void loop() { // Keyboard if (((PINB & BITMASK_A500RES)==0) && state!=WAIT_RES) { // Reset interrupts(); keystroke(0x4C,05); // CTRL+ALT+DEL fn=0; state=WAIT_RES; } else if (state==WAIT_RES) { // Waiting for reset end if ((PINB & BITMASK_A500RES)!=0) state=SYNCH_HI; } else if (state==SYNCH_HI) { // Sync-Pulse HI if ((PINB & BITMASK_A500CLK)==0) state=SYNCH_LO; } else if (state==SYNCH_LO) { // Sync-Pulse LOW if ((PINB & BITMASK_A500CLK)!=0) state=HANDSHAKE; } else if (state==HANDSHAKE) { // Handshake if (counter==0) { DDRB |= BITMASK_A500SP; // set IO direction to OUTPUT PORTB &= ~BITMASK_A500SP; // set OUTPUT to LOW counter=millis(); } else if (millis()-counter>10) { counter=0; DDRB &= ~BITMASK_A500SP; // set IO direction to INPUT state=WAIT_LO; key=0; bitn=7; } } else if (state==READ) { // read key message (8 bits) if ((PINB & BITMASK_A500CLK)!=0) { if (bitn--){ key+=((PINB & BITMASK_A500SP)==0)<<(bitn); // key code (add bits 0...6) state=WAIT_LO; } else { // read last bit (key down) keydown=((PINB & BITMASK_A500SP)!=0); // true if key down interrupts(); state=HANDSHAKE; if (key==0x5F) fn=keydown; // "Help" key: special function on/off else if (key==0x62) keystroke(0x39,0x00); // CapsLock else { if (keydown){ // keydown message received if (fn) { // special function with "Help" key if (key==0x50) keystroke(0x44,0); // F11 else if (key==0x51) keystroke(0x45,0); // F12 else if (key==0x5A) keystroke(0x53,0); // NumLock else if (key==0x5B) keystroke(0x47,0); // ScrollLock else if (key==0x02) keystroke(0x14,0x40); // @ else if (key==0x04) keystroke(0x35,0x02); // ° } else { if ((key==0x2B) && (_keyReport.modifiers & 0x22)) keystroke(0x35,0x00); // ^ (with shift) else if (key==0x00) if (_keyReport.modifiers & 0x22) keystroke(0x30,0x40); else keystroke(0x35,0x20); // ~,` else if (key==0x0D) if (_keyReport.modifiers & 0x22) keystroke(0x64,0x40); else keystroke(0x2D,0x40); // |,\ else if (key==0x5A) if (_keyReport.modifiers & 0x22) keystroke(0x24,0x40); else keystroke(0x25,0x40); // {,[ else if (key==0x5B) if (_keyReport.modifiers & 0x22) keystroke(0x27,0x40); else keystroke(0x26,0x40); // },] else if (key < 0x68) keypress(key); // Code table } } else { // keyrelease message received if (key < 0x68) keyrelease(key); // Code table } } } } } else if (state==WAIT_LO) { // waiting for the next bit if ((PINB & BITMASK_A500CLK)==0) { noInterrupts(); state=READ; } } } void keypress(uint8_t k) { if (k > 0x5f) _keyReport.modifiers |= ktab[key]; // modifier else { for (uint8_t i=0; i<6; i++) { if (_keyReport.keys[i] == 0) { _keyReport.keys[i] = ktab[key]; break; } } } HID_SendReport(2,&_keyReport,8); } void keyrelease(uint8_t k) { if (k > 0x5f) _keyReport.modifiers &= ~ktab[key]; // modifier else { for (uint8_t i=0; i<6; i++) { if (_keyReport.keys[i] == ktab[key]) _keyReport.keys[i] = 0; } } HID_SendReport(2,&_keyReport,8); } void keystroke(uint8_t k, uint8_t m) { unsigned short memomodifiers = _keyReport.modifiers; // save last modifier state for (uint8_t i=0; i<6; i++) { if (_keyReport.keys[i] == 0) { _keyReport.keys[i] = k; _keyReport.modifiers = m; HID_SendReport(2,&_keyReport,8); _keyReport.keys[i] = 0; _keyReport.modifiers = memomodifiers; // recover modifier state HID_SendReport(2,&_keyReport,8); break; } } }Ab Zeile 18 werden dann die einzelnen Tasten per Hexzahl der Amiga Tastatur zugewiesen.
Ansonsten funktioniert alles halt soweit ganz ordentlich.
Vieleicht kennt sich da jemand gut aus und kann mir helfen.Gruß Markus