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:
#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;
}
}
}
Alles anzeigen
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