123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- ////////////////////////////////////////////////////////////////////////////////
- //
- // Copyright 2016 RWS Inc, All Rights Reserved
- //
- // This program is free software; you can redistribute it and/or modify
- // it under the terms of version 2 of the GNU General Public License as published by
- // the Free Software Foundation
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License along
- // with this program; if not, write to the Free Software Foundation, Inc.,
- // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- //
- //
- // joy.cpp
- //
- // History:
- // 04/22/95 JMI Started.
- //
- // 10/10/97 JMI Added temporarily directly to Postal but want to make
- // this part of RSPiX soon (need to add event driven
- // stuff for rspGetNextInpuEvent() ).
- //
- //////////////////////////////////////////////////////////////////////////////
- //
- // Handles all Windows specific joystick stuff.
- //
- //////////////////////////////////////////////////////////////////////////////
- #include "BLUE/win32/win.h"
- #include <mmsystem.h>
- #include "bjoy.h" // For typedefs and macros.
- #include "Blue.h"
- //////////////////////////////////////////////////////////////////////////////
- // Macros.
- //////////////////////////////////////////////////////////////////////////////
- #define NUM_JOYSTICKS 2
- #define MID_THRESHOLD_PERCENT ((float)20) // In % (e.g., 25 would be 25%).
- //////////////////////////////////////////////////////////////////////////////
- // Module specific (static) variables.
- //////////////////////////////////////////////////////////////////////////////
- static JOYCAPS ms_ajoycaps[NUM_JOYSTICKS]; // Capabilities of each joy.
- static USHORT ms_ausXmids[NUM_JOYSTICKS]; // Middle positions for x.
- static USHORT ms_ausYmids[NUM_JOYSTICKS]; // Middle positions for y.
- static USHORT ms_ausZmids[NUM_JOYSTICKS]; // Middle positions for z.
- static USHORT ms_ausXThresh[NUM_JOYSTICKS]; // Center thresholds for x.
- static USHORT ms_ausYThresh[NUM_JOYSTICKS]; // Center thresholds for y.
- static USHORT ms_ausZThresh[NUM_JOYSTICKS]; // Center thresholds for z.
- static JOYINFO ms_ajiCurr[NUM_JOYSTICKS]; // Current joystick info.
- static JOYINFO ms_ajiPrev[NUM_JOYSTICKS]; // Previous joystick info.
- static JOYSTATE ms_ajsCurr[NUM_JOYSTICKS]; // Current joystick state.
- static JOYSTATE ms_ajsPrev[NUM_JOYSTICKS]; // Previous joystick state.
- //////////////////////////////////////////////////////////////////////////////
- // Externally callable functions.
- //////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////
- //
- // To be called by the Blue library itself, only.
- // Initializes the joystick module. NOTE: May fail if no joysticks attached.
- // Returns nothing in order to remind us that even if the init fails the app
- // should still be called.
- //
- //////////////////////////////////////////////////////////////////////////////
- extern void Joy_Init(void)
- {
- short sNum = (short)joyGetNumDevs();
- USHORT usRangeX, usRangeY, usRangeZ;
- for (short i = 0; i < sNum && i < NUM_JOYSTICKS; i++)
- {
- switch (joyGetDevCaps((i == 0 ? JOYSTICKID1 : JOYSTICKID2),
- &(ms_ajoycaps[i]),
- sizeof(ms_ajoycaps[i])
- )
- )
- {
- case JOYERR_NOERROR:
- // Calculate ranges.
- usRangeX = (ms_ajoycaps[i].wXmax - ms_ajoycaps[i].wXmin);
- usRangeY = (ms_ajoycaps[i].wYmax - ms_ajoycaps[i].wYmin);
- usRangeZ = (ms_ajoycaps[i].wZmax - ms_ajoycaps[i].wZmin);
- // Calculate middle.
- ms_ausXmids[i] = ms_ajoycaps[i].wXmin + usRangeX / 2;
- ms_ausYmids[i] = ms_ajoycaps[i].wYmin + usRangeY / 2;
- ms_ausZmids[i] = ms_ajoycaps[i].wZmin + usRangeZ / 2;
- ms_ausXThresh[i] = (float)usRangeX * (float)((float)MID_THRESHOLD_PERCENT / 100.0F);
- ms_ausYThresh[i] = (float)usRangeY * (float)((float)MID_THRESHOLD_PERCENT / 100.0F);
- ms_ausZThresh[i] = (float)usRangeZ * (float)((float)MID_THRESHOLD_PERCENT / 100.0F);
- #if 0
- TRACE("wMid:\t0x%04X\n"
- "wPid:\t0x%04X\n"
- "szPname:\t%s\n"
- "wXmin:\t%u\n"
- "wXmax:\t%u\n"
- "wYmin:\t%u\n"
- "wYmax:\t%u\n"
- "wZmin:\t%u\n"
- "wZmax:\t%u\n"
- "wNumButtons:\t%u\n"
- "wPeriodMin:\t%u\n"
- "wPeriodMax:\t%u\n",
- ms_ajoycaps[i].wMid,
- ms_ajoycaps[i].wPid,
- ms_ajoycaps[i].szPname,
- ms_ajoycaps[i].wXmin,
- ms_ajoycaps[i].wXmax,
- ms_ajoycaps[i].wYmin,
- ms_ajoycaps[i].wYmax,
- ms_ajoycaps[i].wZmin,
- ms_ajoycaps[i].wZmax,
- ms_ajoycaps[i].wNumButtons,
- ms_ajoycaps[i].wPeriodMin,
- ms_ajoycaps[i].wPeriodMax);
- #endif
- // Success.
- break;
- case MMSYSERR_NODRIVER:
- TRACE("BLUE:Joy_Init(): The joystick driver is not present.\n");
- break;
- case MMSYSERR_INVALPARAM:
- TRACE("BLUE:Joy_Init(): An invalid parameter was passed.\n");
- break;
- }
- }
- }
- //////////////////////////////////////////////////////////////////////////////
- //
- // Updates joystick sJoy's current state and makes the current state the
- // previous.
- // Returns 0 on success.
- //
- //////////////////////////////////////////////////////////////////////////////
- extern short Blu_UpdateJoy(short sJoy)
- {
- short sRes = 0; // Assume success.
- ASSERT(sJoy == 0 || sJoy == 1);
- // Get the joystick info. Only update our variables, if successful.
- JOYINFO jiTemp;
- switch (joyGetPos( (sJoy == 0) ? JOYSTICKID1 : JOYSTICKID2, &jiTemp) )
- {
- case JOYERR_NOERROR:
- // Success. Set values.
- // Set previous joyinfo to current.
- ms_ajiPrev[sJoy] = ms_ajiCurr[sJoy];
- // Set the current to the temp.
- ms_ajiCurr[sJoy] = jiTemp;
-
- // Set previous joy state to current.
- ms_ajsPrev[sJoy] = ms_ajsCurr[sJoy];
- // Fill in new state fields.
- ms_ajsCurr[sJoy].button1 = (((jiTemp.wButtons & JOY_BUTTON1) != 0) ? 1 : 0);
- ms_ajsCurr[sJoy].button2 = (((jiTemp.wButtons & JOY_BUTTON2) != 0) ? 1 : 0);
- ms_ajsCurr[sJoy].button3 = (((jiTemp.wButtons & JOY_BUTTON3) != 0) ? 1 : 0);
- ms_ajsCurr[sJoy].button4 = (((jiTemp.wButtons & JOY_BUTTON4) != 0) ? 1 : 0);
- ms_ajsCurr[sJoy].left = (jiTemp.wXpos < (USHORT)(ms_ausXmids[sJoy] - ms_ausXThresh[sJoy]));
- ms_ajsCurr[sJoy].right = (jiTemp.wXpos > (USHORT)(ms_ausXmids[sJoy] + ms_ausXThresh[sJoy]));
- ms_ajsCurr[sJoy].up = (jiTemp.wYpos < (USHORT)(ms_ausYmids[sJoy] - ms_ausYThresh[sJoy]));
- ms_ajsCurr[sJoy].down = (jiTemp.wYpos > (USHORT)(ms_ausYmids[sJoy] + ms_ausYThresh[sJoy]));
- ms_ajsCurr[sJoy].toward = (jiTemp.wZpos < (USHORT)(ms_ausZmids[sJoy] - ms_ausZThresh[sJoy]));
- ms_ajsCurr[sJoy].away = (jiTemp.wZpos > (USHORT)(ms_ausZmids[sJoy] + ms_ausZThresh[sJoy]));
- break;
- }
- return sRes;
- }
- //////////////////////////////////////////////////////////////////////////////
- //
- // Puts the coordinates of joystick sJoy's position in your longs.
- // Returns nothing.
- //
- //////////////////////////////////////////////////////////////////////////////
- extern void Blu_GetJoyPos(short sJoy, long *px, long *py, long *pz)
- {
- ASSERT(sJoy == 0 || sJoy == 1);
- // Copy the coordinates.
- *px = (long)ms_ajiCurr[sJoy].wXpos;
- *py = (long)ms_ajiCurr[sJoy].wYpos;
- *pz = (long)ms_ajiCurr[sJoy].wZpos;
- }
- //////////////////////////////////////////////////////////////////////////////
- //
- // Puts the coordinates of the previous joystick sJoy's position in your longs.
- // Returns nothing.
- //
- //////////////////////////////////////////////////////////////////////////////
- extern void Blu_GetJoyPrevPos(short sJoy, long *px, long *py, long *pz)
- {
- ASSERT(sJoy == 0 || sJoy == 1);
- // Copy the coordinates.
- *px = (long)ms_ajiPrev[sJoy].wXpos;
- *py = (long)ms_ajiPrev[sJoy].wYpos;
- *pz = (long)ms_ajiPrev[sJoy].wZpos;
- }
- //////////////////////////////////////////////////////////////////////////////
- //
- // Returns the current joystick sJoy's state.
- //
- //////////////////////////////////////////////////////////////////////////////
- extern USHORT Blu_GetJoyState(short sJoy)
- {
- ASSERT(sJoy == 0 || sJoy == 1);
- return ms_ajsCurr[sJoy].us;
- }
- //////////////////////////////////////////////////////////////////////////////
- //
- // Returns the previous joystick sJoy's state.
- //
- //////////////////////////////////////////////////////////////////////////////
- extern USHORT Blu_GetJoyPrevState(short sJoy)
- {
- ASSERT(sJoy == 0 || sJoy == 1);
- return ms_ajsPrev[sJoy].us;
- }
- //////////////////////////////////////////////////////////////////////////////
- //
- // Places the current joystick sJoy's state.
- //
- //////////////////////////////////////////////////////////////////////////////
- extern void Blu_GetJoyState(short sJoy, PJOYSTATE pjs)
- {
- ASSERT(sJoy == 0 || sJoy == 1);
- *pjs = ms_ajsCurr[sJoy];
- }
- //////////////////////////////////////////////////////////////////////////////
- //
- // Places the previous joystick sJoy's state.
- //
- //////////////////////////////////////////////////////////////////////////////
- extern void Blu_GetJoyPrevState(short sJoy, PJOYSTATE pjs)
- {
- ASSERT(sJoy == 0 || sJoy == 1);
- *pjs = ms_ajsPrev[sJoy];
- }
- //////////////////////////////////////////////////////////////////////////////
- // EOF
- //////////////////////////////////////////////////////////////////////////////
|