From e55ba9e02bb5d4eef685bb1f781e48841cda71e3 Mon Sep 17 00:00:00 2001 From: jean-marcharvengt Date: Tue, 3 Nov 2020 15:43:05 +0100 Subject: [PATCH] add USB mouse support to UAE --- MCUME_teensy41/teensyuae41/emuapi.cpp | 272 ++++++++++++++------------ MCUME_teensy41/teensyuae41/emuapi.h | 3 + MCUME_teensy41/teensyuae41/uae.cpp | 30 ++- 3 files changed, 181 insertions(+), 124 deletions(-) diff --git a/MCUME_teensy41/teensyuae41/emuapi.cpp b/MCUME_teensy41/teensyuae41/emuapi.cpp index cf35f78..4d94669 100644 --- a/MCUME_teensy41/teensyuae41/emuapi.cpp +++ b/MCUME_teensy41/teensyuae41/emuapi.cpp @@ -34,8 +34,13 @@ static const uint16_t * logo = deflogo; #ifdef HAS_USBKEY #include "USBHost_t36.h" // Read this header first for key info USBHost myusb; +//USBHub hub1(myusb); KeyboardController keyboard1(myusb); +USBHIDParser hid1(myusb); +MouseController mouse1(myusb); #endif +static bool mouseDetected = false; +static bool keyboardDetected = false; static uint8_t usbnavpad=0; #ifdef USE_SDFS @@ -927,6 +932,152 @@ char * menuSelection(void) +int emu_GetMouse(int *x, int *y, int *buts) { +#ifdef HAS_USBKEY + if (mouse1.available()) { + *buts = mouse1.getButtons(); + *x = mouse1.getMouseX(); + *y = mouse1.getMouseY(); + mouse1.mouseDataClear(); + mouseDetected = true; + return 1; + } +#endif + return 0; +} + +#ifdef HAS_USBKEY +void OnPress(auto key) +{ + keyboardDetected = true; + uint8_t keymodifier = keyboard1.getModifiers(); + + if(keymodifier == 0x40){ + // ALTGR Key modifier FR Keyboard + switch (key) { +#ifdef LAYOUT_FRENCH + case 233 : key = '~' ; break; + case 34 : key = '#' ; break; + case 39 : key = '{' ; break; + case 40 : key = '[' ; break; + case 45 : key = '|' ; break; + case 232 : key = '`' ; break; + case 95 : key = 92 ; break; + case 231 : key = '^' ; break; + case 224 : key = '@' ; break; + case 41 : key = ']' ; break; + case 61 : key = '}' ; break; +#endif +#ifdef LAYOUT_FRENCH_BELGIAN + case 38 : key = '|' ; break; //1 + case 233 : key = '@' ; break; //2 + case 34 : key = '#' ; break; //3 + case 167 : key = '^' ; break; //6 + case 231 : key = '{' ; break; //9 + case 224 : key = '}' ; break; //0 + case 36 : key = ']' ; break; //$ + case 61 : key = '~' ; break; //= +#endif + } + } + + if (menuActive()) + { + switch (key) + { + case 217: + usbnavpad |= MASK_JOY2_DOWN; + break; + case 218: + usbnavpad |= MASK_JOY2_UP; + break; + case 216: + usbnavpad |= MASK_JOY2_LEFT; + break; + case 215: + usbnavpad |= MASK_JOY2_RIGHT; + break; + case 10: + usbnavpad |= MASK_JOY2_BTN; + break; + } + } + else + { + emu_KeyboardOnDown(keymodifier, key); + } +} + +void OnRelease(int key) +{ + keyboardDetected = true; + uint8_t keymodifier = keyboard1.getModifiers(); + + if(keymodifier == 0x40){ + // ALTGR Key modifier FR Keyboard + switch (key) { +#ifdef LAYOUT_FRENCH + case 233 : key = '~' ; break; + case 34 : key = '#' ; break; + case 39 : key = '{' ; break; + case 40 : key = '[' ; break; + case 45 : key = '|' ; break; + case 232 : key = '`' ; break; + case 95 : key = 92 ; break; + case 231 : key = '^' ; break; + case 224 : key = '@' ; break; + case 41 : key = ']' ; break; + case 61 : key = '}' ; break; +#endif +#ifdef LAYOUT_FRENCH_BELGIAN + case 38 : key = '|' ; break; //1 + case 233 : key = '@' ; break; //2 + case 34 : key = '#' ; break; //3 + case 167 : key = '^' ; break; //6 + case 231 : key = '{' ; break; //9 + case 224 : key = '}' ; break; //0 + case 36 : key = ']' ; break; //$ + case 61 : key = '~' ; break; //= +#endif + } + } + + if (menuActive()) + { + switch (key) + { + case 217: + usbnavpad &= ~MASK_JOY2_DOWN; + break; + case 218: + usbnavpad &= ~MASK_JOY2_UP; + break; + case 216: + usbnavpad &= ~MASK_JOY2_LEFT; + break; + case 215: + usbnavpad &= ~MASK_JOY2_RIGHT; + break; + case 10: + usbnavpad &= ~MASK_JOY2_BTN; + break; + } + } + else + { + emu_KeyboardOnUp(keymodifier, key); + } +} +#endif + +int emu_MouseDetected(void) { + return (mouseDetected?1:0); +} + +int emu_KeyboardDetected(void) { + return (keyboardDetected?1:0); +} + static void callibrationInit(void) { callibrationOn=true; @@ -1387,127 +1538,6 @@ void emu_FileTempWrite(int addr, unsigned char val) #endif } -#ifdef HAS_USBKEY -void OnPress(auto key) -{ - uint8_t keymodifier = keyboard1.getModifiers(); - - if(keymodifier == 0x40){ - // ALTGR Key modifier FR Keyboard - switch (key) { -#ifdef LAYOUT_FRENCH - case 233 : key = '~' ; break; - case 34 : key = '#' ; break; - case 39 : key = '{' ; break; - case 40 : key = '[' ; break; - case 45 : key = '|' ; break; - case 232 : key = '`' ; break; - case 95 : key = 92 ; break; - case 231 : key = '^' ; break; - case 224 : key = '@' ; break; - case 41 : key = ']' ; break; - case 61 : key = '}' ; break; -#endif -#ifdef LAYOUT_FRENCH_BELGIAN - case 38 : key = '|' ; break; //1 - case 233 : key = '@' ; break; //2 - case 34 : key = '#' ; break; //3 - case 167 : key = '^' ; break; //6 - case 231 : key = '{' ; break; //9 - case 224 : key = '}' ; break; //0 - case 36 : key = ']' ; break; //$ - case 61 : key = '~' ; break; //= -#endif - } - } - - if (menuActive()) - { - switch (key) - { - case 217: - usbnavpad |= MASK_JOY2_DOWN; - break; - case 218: - usbnavpad |= MASK_JOY2_UP; - break; - case 216: - usbnavpad |= MASK_JOY2_LEFT; - break; - case 215: - usbnavpad |= MASK_JOY2_RIGHT; - break; - case 10: - usbnavpad |= MASK_JOY2_BTN; - break; - } - } - else - { - emu_KeyboardOnDown(keymodifier, key); - } -} - -void OnRelease(int key) -{ - uint8_t keymodifier = keyboard1.getModifiers(); - - if(keymodifier == 0x40){ - // ALTGR Key modifier FR Keyboard - switch (key) { -#ifdef LAYOUT_FRENCH - case 233 : key = '~' ; break; - case 34 : key = '#' ; break; - case 39 : key = '{' ; break; - case 40 : key = '[' ; break; - case 45 : key = '|' ; break; - case 232 : key = '`' ; break; - case 95 : key = 92 ; break; - case 231 : key = '^' ; break; - case 224 : key = '@' ; break; - case 41 : key = ']' ; break; - case 61 : key = '}' ; break; -#endif -#ifdef LAYOUT_FRENCH_BELGIAN - case 38 : key = '|' ; break; //1 - case 233 : key = '@' ; break; //2 - case 34 : key = '#' ; break; //3 - case 167 : key = '^' ; break; //6 - case 231 : key = '{' ; break; //9 - case 224 : key = '}' ; break; //0 - case 36 : key = ']' ; break; //$ - case 61 : key = '~' ; break; //= -#endif - } - } - - if (menuActive()) - { - switch (key) - { - case 217: - usbnavpad &= ~MASK_JOY2_DOWN; - break; - case 218: - usbnavpad &= ~MASK_JOY2_UP; - break; - case 216: - usbnavpad &= ~MASK_JOY2_LEFT; - break; - case 215: - usbnavpad &= ~MASK_JOY2_RIGHT; - break; - case 10: - usbnavpad &= ~MASK_JOY2_BTN; - break; - } - } - else - { - emu_KeyboardOnUp(keymodifier, key); - } -} -#endif void emu_init(void) { diff --git a/MCUME_teensy41/teensyuae41/emuapi.h b/MCUME_teensy41/teensyuae41/emuapi.h index e5b7bb5..b22cbcd 100644 --- a/MCUME_teensy41/teensyuae41/emuapi.h +++ b/MCUME_teensy41/teensyuae41/emuapi.h @@ -144,6 +144,9 @@ extern int emu_SwapJoysticks(int statusOnly); extern unsigned short emu_DebounceLocalKeys(void); extern int emu_ReadKeys(void); extern int emu_GetPad(void); +extern int emu_GetMouse(int *x, int *y, int *buts); +extern int emu_MouseDetected(void); +extern int emu_KeyboardDetected(void); extern int emu_ReadAnalogJoyX(int min, int max); extern int emu_ReadAnalogJoyY(int min, int max); extern int emu_ReadI2CKeyboard(void); diff --git a/MCUME_teensy41/teensyuae41/uae.cpp b/MCUME_teensy41/teensyuae41/uae.cpp index 9439fe7..10aa6d4 100644 --- a/MCUME_teensy41/teensyuae41/uae.cpp +++ b/MCUME_teensy41/teensyuae41/uae.cpp @@ -293,9 +293,12 @@ const int i2ckeyConv[] = void uae_Input(int bClick) { + buttonstate[0] = 0; + buttonstate[2] = 0; + hk = emu_ReadI2CKeyboard(); k = emu_ReadKeys(); - + // Toggle keymap + mouse/joystick if (bClick & MASK_KEY_USER2) { if (isMouse) isMouse = false; @@ -305,6 +308,29 @@ void uae_Input(int bClick) { #endif } + // force joystick mode if mouse detected + if (emu_MouseDetected() ) isMouse = false; + int buts,dx,dy; + int mouseEvent = emu_GetMouse(&dx,&dy,&buts); + if (mouseEvent){ + lastmx += dx; + if ( lastmx > 640 ) { + lastmx = 639; + } + else if ( lastmx < 0 ) { + lastmx = 0; + } + lastmy += dy; + if ( lastmy > 480 ) { + lastmy = 399; + } + else if ( lastmy < 0 ) { + lastmy = 0; + } + if (buts & 0x1) buttonstate[0] = 1; + if (buts & 0x2) buttonstate[2] = 1; + } + // Diskswap in joystick mode if (bClick & MASK_KEY_USER1) { if (!isMouse) disk_swap(df0,df1); @@ -351,8 +377,6 @@ void uae_Input(int bClick) { } } - buttonstate[0] = 0; - buttonstate[2] = 0; if ( (k & MASK_JOY1_BTN)|| ( k & MASK_JOY2_BTN)) buttonstate[0] = 1; if (k & MASK_KEY_USER1) buttonstate[2] = 1; }