|
|
1.1 ! root 1: /* ! 2: Hatari ! 3: ! 4: Joystick routines ! 5: ! 6: NOTE Also the ST uses the joystick port 1 as the default controller ! 7: - so we allocate our joysticks with index 1 and then 0 so these match. ! 8: */ ! 9: ! 10: #include <SDL.h> ! 11: ! 12: #include "main.h" ! 13: #include "configuration.h" ! 14: #include "debug.h" ! 15: #include "dialog.h" ! 16: #include "errlog.h" ! 17: #include "joy.h" ! 18: #include "screen.h" ! 19: ! 20: #define REVERSE_ID(id) ((id)^1) /* ST joystick 1(default) is first PC joystick found */ ! 21: ! 22: BOOL bJoystickWorking[2] = { FALSE,FALSE }; /* Is joystick plugged in and working? */ ! 23: int WindowsJoystickID[2]; /* Windows Joystick ID of above joysticks */ ! 24: int JoystickSpaceBar = FALSE; /* State of space-bar on joystick button 2 */ ! 25: int cursorJoyEmu; /* set in view.c */ ! 26: ! 27: ! 28: /*-----------------------------------------------------------------------*/ ! 29: /* ! 30: Initialise joysticks, try to use DirectInput or, if this fails, standard Windows calls ! 31: */ ! 32: void Joy_Init(void) ! 33: { ! 34: /* First, try for DirectInput(this sets bAllowDirectInput)*/ ! 35: // DJoy_Init(); ! 36: /* Also try standard Windows joystick functions */ ! 37: Joy_InitWindows(); ! 38: ! 39: /* OK, do we have any working joysticks? */ ! 40: if (!bJoystickWorking[1]) { ! 41: /* No, so if first time install need to set cursor emulation */ ! 42: //FIXME if (bFirstTimeInstall) ! 43: //FIXME ConfigureParams.Joysticks.Joy[1].bCursorEmulation = TRUE; ! 44: } ! 45: /* Make sure we only have one in cursor emulation mode */ ! 46: Joy_PreventBothUsingCursorEmulation(); ! 47: ! 48: JoystickSpaceBar = FALSE; ! 49: } ! 50: ! 51: //----------------------------------------------------------------------- ! 52: /* ! 53: Initialise connected joysticks using Windows library calls ! 54: */ ! 55: void Joy_InitWindows(void) ! 56: { ! 57: //FIXME ! 58: /* ! 59: JOYINFO JoyInfo; ! 60: int i,nPadsConnected,JoyID=1; // Store in ST joystick slot 1 then 0 ! 61: ! 62: // Scan joystick connection array for first two working joysticks ! 63: nPadsConnected = joyGetNumDevs(); ! 64: for(i=0; (i<nPadsConnected) && (JoyID>=0); i++) { ! 65: // Is pad ok? ! 66: if (joyGetPos(i,&JoyInfo)==JOYERR_NOERROR) { ! 67: // Set as working(NOTE we assign ST joysticks 1 first), and store Windows ID ! 68: ErrLog_File("Joystick: %d found\n",JoyID); ! 69: bJoystickWorking[JoyID] = TRUE; ! 70: WindowsJoystickID[JoyID] = i; ! 71: JoyID--; ! 72: } ! 73: } ! 74: */ ! 75: } ! 76: ! 77: //----------------------------------------------------------------------- ! 78: /* ! 79: Make sure only one joystick is assigned as cursor emulation mode ! 80: */ ! 81: void Joy_PreventBothUsingCursorEmulation(void) ! 82: { ! 83: /* Make sure we cannot have both joysticks assigned as cursor emulation */ ! 84: if (ConfigureParams.Joysticks.Joy[0].bCursorEmulation && ConfigureParams.Joysticks.Joy[0].bCursorEmulation) { ! 85: ConfigureParams.Joysticks.Joy[0].bCursorEmulation = FALSE; ! 86: ConfigureParams.Joysticks.Joy[1].bCursorEmulation = TRUE; ! 87: } ! 88: } ! 89: ! 90: //----------------------------------------------------------------------- ! 91: /* ! 92: Read details from joystick using Windows calls ! 93: NOTE ID is that of ST(ie 1 is default) ! 94: */ ! 95: BOOL Joy_ReadJoystick(int JoystickID,JOYREADING *pJoyReading) ! 96: { ! 97: //FIXME ! 98: /* ! 99: JOYINFO JoyInfo; ! 100: ! 101: // Joystick is OK, read position ! 102: if (joyGetPos(WindowsJoystickID[JoystickID],&JoyInfo)==JOYERR_NOERROR) { ! 103: // Copy details ! 104: pJoyReading->XPos = JoyInfo.wXpos; ! 105: pJoyReading->YPos = JoyInfo.wYpos; ! 106: pJoyReading->Buttons = JoyInfo.wButtons; ! 107: ! 108: return(TRUE); ! 109: } ! 110: */ ! 111: return(FALSE); ! 112: } ! 113: ! 114: //----------------------------------------------------------------------- ! 115: /* ! 116: Read PC joystick and return ST format byte, ie lower 4 bits direction and top bit fire ! 117: NOTE : ID 0 is Joystick 0/Mouse and ID 1 is Joystick 1(default) ! 118: */ ! 119: unsigned char Joy_GetStickData(unsigned int JoystickID) ! 120: { ! 121: unsigned char Data = 0; ! 122: ! 123: //FIXME JOYREADING JoyReading; ! 124: ! 125: /* Are we emulating the joystick via the cursor key? */ ! 126: if (ConfigureParams.Joysticks.Joy[JoystickID].bCursorEmulation) { ! 127: /* If holding 'SHIFT' we actually want cursor key movement, so ignore any of this */ ! 128: if ( !(SDL_GetModState()&(KMOD_LSHIFT|KMOD_RSHIFT)) ) ! 129: { ! 130: Data = cursorJoyEmu; /* cursorJoyEmu is set in view.c */ ! 131: } ! 132: } ! 133: /* ! 134: else if (bJoystickWorking[JoystickID]) { ! 135: // Read joystick information from DirectInput or Windows calls into standard format ! 136: if (!DJoy_ReadJoystick(JoystickID,&JoyReading)) { ! 137: if (!Joy_ReadJoystick(JoystickID,&JoyReading)) { ! 138: // Something is wrong, we cannot read the joystick ! 139: bJoystickWorking[JoystickID] = FALSE; ! 140: } ! 141: } ! 142: ! 143: // So, did read joysyick OK? ! 144: if (bJoystickWorking[JoystickID]) { ! 145: // Directions ! 146: if (JoyReading.YPos<=JOYRANGE_UP_VALUE) ! 147: Data |= 0x01; ! 148: if (JoyReading.YPos>=JOYRANGE_DOWN_VALUE) ! 149: Data |= 0x02; ! 150: if (JoyReading.XPos<=JOYRANGE_LEFT_VALUE) ! 151: Data |= 0x04; ! 152: if (JoyReading.XPos>=JOYRANGE_RIGHT_VALUE) ! 153: Data |= 0x08; ! 154: ! 155: // Buttons - I've made fire button 2 to simulate the pressing of the space bar(for Xenon II etc...) ! 156: #ifdef USE_FIREBUTTON_2_AS_SPACE ! 157: // PC Joystick button 1 is set as ST joystick button and PC button 2 is the space bar ! 158: if (JoyReading.Buttons&JOY_BUTTON1) ! 159: Data |= 0x80; ! 160: if (JoyReading.Buttons&JOY_BUTTON2) { ! 161: // Only press 'space bar' if not in NULL state ! 162: if (!JoystickSpaceBar) { ! 163: // Press, ikbd will send packets and de-press ! 164: JoystickSpaceBar = JOYSTICK_SPACE_DOWN; ! 165: } ! 166: } ! 167: #else //USE_FIREBUTTON_2_AS_SPACE ! 168: // PC Joystick buttons 1+2 are set as ST joystick button ! 169: if ( (JoyReading.Buttons&JOY_BUTTON1) || (JoyReading.Buttons&JOY_BUTTON2) ) ! 170: Data |= 0x80; ! 171: #endif //USE_FIREBUTTON_2_AS_SPACE ! 172: } ! 173: } ! 174: ! 175: // Ignore fire button every 8 frames if enabled autofire(for both cursor emulation and joystick) ! 176: if (ConfigureParams.Joysticks.Joy[JoystickID].bEnableAutoFire) { ! 177: if ((VBLCounter&0x7)<4) ! 178: Data &= 0x7f; // Remove top bit! ! 179: } ! 180: */ ! 181: return(Data); ! 182: } ! 183: ! 184: //----------------------------------------------------------------------- ! 185: /* ! 186: Toggle cursor emulation ! 187: */ ! 188: void Joy_ToggleCursorEmulation(void) ! 189: { ! 190: // Toggle joystick 1 cursor emulation ! 191: ConfigureParams.Joysticks.Joy[1].bCursorEmulation ^= TRUE; ! 192: // Prevent both having emulation ! 193: Joy_PreventBothUsingCursorEmulation(); ! 194: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.