2003-04-15 08:08:53 +00:00
|
|
|
// ******************************************************************
|
|
|
|
// *
|
|
|
|
// * .,-::::: .,:: .::::::::. .,:: .:
|
|
|
|
// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;;
|
|
|
|
// * [[[ '[[,,[[' [[[__[[\. '[[,,[['
|
|
|
|
// * $$$ Y$$$P $$""""Y$$ Y$$$P
|
|
|
|
// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo,
|
|
|
|
// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm,
|
|
|
|
// *
|
|
|
|
// * Cxbx->Win32->Cxbx->XBController.h
|
|
|
|
// *
|
|
|
|
// * This file is part of the Cxbx project.
|
|
|
|
// *
|
|
|
|
// * Cxbx and Cxbe are free software; you can redistribute them
|
|
|
|
// * and/or modify them under the terms of the GNU General Public
|
|
|
|
// * License as published by the Free Software Foundation; either
|
|
|
|
// * version 2 of the license, or (at your option) any later version.
|
|
|
|
// *
|
|
|
|
// * 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 recieved a copy of the GNU General Public License
|
|
|
|
// * along with this program; see the file COPYING.
|
|
|
|
// * If not, write to the Free Software Foundation, Inc.,
|
|
|
|
// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA.
|
|
|
|
// *
|
|
|
|
// * (c) 2002-2003 Aaron Robinson <caustik@caustik.com>
|
|
|
|
// *
|
|
|
|
// * All rights reserved
|
|
|
|
// *
|
|
|
|
// ******************************************************************
|
|
|
|
#ifndef XBCONTROLLER_H
|
|
|
|
#define XBCONTROLLER_H
|
|
|
|
|
|
|
|
#include "Cxbx.h"
|
|
|
|
#include "Error.h"
|
|
|
|
#include "Mutex.h"
|
|
|
|
|
2003-07-02 20:14:15 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <windows.h>
|
2003-04-15 08:08:53 +00:00
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * prevent name collisions
|
|
|
|
// ******************************************************************
|
2003-07-02 20:14:15 +00:00
|
|
|
namespace XTL
|
2003-04-15 08:08:53 +00:00
|
|
|
{
|
2003-07-02 20:14:15 +00:00
|
|
|
#include "EmuXTL.h"
|
2003-04-15 08:08:53 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * Xbox Controller Object IDs
|
|
|
|
// ******************************************************************
|
|
|
|
enum XBCtrlObject
|
|
|
|
{
|
|
|
|
// ******************************************************************
|
|
|
|
// * Analog Axis
|
|
|
|
// ******************************************************************
|
|
|
|
XBCTRL_OBJECT_LTHUMBPOSX = 0,
|
|
|
|
XBCTRL_OBJECT_LTHUMBNEGX,
|
|
|
|
XBCTRL_OBJECT_LTHUMBPOSY,
|
|
|
|
XBCTRL_OBJECT_LTHUMBNEGY,
|
|
|
|
XBCTRL_OBJECT_RTHUMBPOSX,
|
|
|
|
XBCTRL_OBJECT_RTHUMBNEGX,
|
|
|
|
XBCTRL_OBJECT_RTHUMBPOSY,
|
|
|
|
XBCTRL_OBJECT_RTHUMBNEGY,
|
|
|
|
// ******************************************************************
|
|
|
|
// * Analog Buttons
|
|
|
|
// ******************************************************************
|
|
|
|
XBCTRL_OBJECT_A,
|
|
|
|
XBCTRL_OBJECT_B,
|
2003-04-22 00:01:37 +00:00
|
|
|
XBCTRL_OBJECT_X,
|
|
|
|
XBCTRL_OBJECT_Y,
|
2003-04-15 08:08:53 +00:00
|
|
|
XBCTRL_OBJECT_BLACK,
|
2003-04-22 00:01:37 +00:00
|
|
|
XBCTRL_OBJECT_WHITE,
|
2003-04-15 08:08:53 +00:00
|
|
|
XBCTRL_OBJECT_LTRIGGER,
|
|
|
|
XBCTRL_OBJECT_RTRIGGER,
|
|
|
|
// ******************************************************************
|
|
|
|
// * Digital Buttons
|
|
|
|
// ******************************************************************
|
|
|
|
XBCTRL_OBJECT_DPADUP,
|
|
|
|
XBCTRL_OBJECT_DPADDOWN,
|
|
|
|
XBCTRL_OBJECT_DPADLEFT,
|
|
|
|
XBCTRL_OBJECT_DPADRIGHT,
|
|
|
|
XBCTRL_OBJECT_BACK,
|
|
|
|
XBCTRL_OBJECT_START,
|
|
|
|
XBCTRL_OBJECT_LTHUMB,
|
|
|
|
XBCTRL_OBJECT_RTHUMB,
|
|
|
|
// ******************************************************************
|
|
|
|
// * Total number of components
|
|
|
|
// ******************************************************************
|
|
|
|
XBCTRL_OBJECT_COUNT
|
|
|
|
};
|
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * Maximum number of devices allowed
|
|
|
|
// ******************************************************************
|
|
|
|
#define XBCTRL_MAX_DEVICES XBCTRL_OBJECT_COUNT
|
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * Xbox Controller Object Config
|
|
|
|
// ******************************************************************
|
|
|
|
struct XBCtrlObjectCfg
|
|
|
|
{
|
2003-04-17 01:32:51 +00:00
|
|
|
int dwDevice; // offset into m_InputDevice
|
2003-04-15 08:08:53 +00:00
|
|
|
int dwInfo; // extended information, depending on dwFlags
|
|
|
|
int dwFlags; // flags explaining the data format
|
|
|
|
};
|
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * class: XBController
|
|
|
|
// ******************************************************************
|
2003-04-16 19:06:20 +00:00
|
|
|
class XBController : public Error
|
2003-04-15 08:08:53 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
// ******************************************************************
|
|
|
|
// * Initialization
|
|
|
|
// ******************************************************************
|
|
|
|
XBController();
|
2003-04-16 19:06:20 +00:00
|
|
|
~XBController();
|
2003-04-15 08:08:53 +00:00
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * Registry Load/Save
|
|
|
|
// ******************************************************************
|
|
|
|
void Load(const char *szRegistryKey);
|
|
|
|
void Save(const char *szRegistryKey);
|
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * Configuration
|
|
|
|
// ******************************************************************
|
|
|
|
void ConfigBegin(HWND hwnd, XBCtrlObject object);
|
|
|
|
bool ConfigPoll(char *szStatus); // true if polling detected a change
|
|
|
|
void ConfigEnd();
|
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * Listening
|
|
|
|
// ******************************************************************
|
2003-04-16 19:06:20 +00:00
|
|
|
void ListenBegin(HWND hwnd);
|
2003-07-02 20:14:15 +00:00
|
|
|
void ListenPoll(XTL::XINPUT_STATE *Controller);
|
2003-04-16 19:06:20 +00:00
|
|
|
void ListenEnd();
|
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * DirectInput Init / Cleanup
|
|
|
|
// ******************************************************************
|
|
|
|
void DInputInit(HWND hwnd);
|
|
|
|
void DInputCleanup();
|
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * Check if a device is currently in the configuration
|
|
|
|
// ******************************************************************
|
|
|
|
bool DeviceIsUsed(const char *szDeviceName);
|
2003-04-15 08:08:53 +00:00
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * Input Device Name Lookup Table
|
|
|
|
// ******************************************************************
|
|
|
|
static const char *m_DeviceNameLookup[XBCTRL_OBJECT_COUNT];
|
|
|
|
|
|
|
|
private:
|
|
|
|
// ******************************************************************
|
|
|
|
// * Object Mapping
|
|
|
|
// ******************************************************************
|
|
|
|
void Map(XBCtrlObject object, const char *szDeviceName, int dwInfo, int dwFlags);
|
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * Find the look-up value for a DeviceName (creating if needed)
|
|
|
|
// ******************************************************************
|
|
|
|
int Insert(const char *szDeviceName);
|
|
|
|
|
2003-04-17 01:32:51 +00:00
|
|
|
// ******************************************************************
|
|
|
|
// * Update the object lookup offsets for a device
|
|
|
|
// ******************************************************************
|
|
|
|
void ReorderObjects(const char *szDeviceName, int pos);
|
|
|
|
|
2003-04-15 08:08:53 +00:00
|
|
|
// ******************************************************************
|
|
|
|
// * Controller and Objects Enumeration
|
|
|
|
// ******************************************************************
|
2003-07-02 20:14:15 +00:00
|
|
|
BOOL EnumGameCtrlCallback(XTL::LPCDIDEVICEINSTANCE lpddi);
|
|
|
|
BOOL EnumObjectsCallback(XTL::LPCDIDEVICEOBJECTINSTANCE lpddoi);
|
2003-04-15 08:08:53 +00:00
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * Wrapper Function for Enumeration
|
|
|
|
// ******************************************************************
|
2003-07-02 20:14:15 +00:00
|
|
|
friend BOOL CALLBACK WrapEnumGameCtrlCallback(XTL::LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef);
|
|
|
|
friend BOOL CALLBACK WrapEnumObjectsCallback(XTL::LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef);
|
2003-04-15 08:08:53 +00:00
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * Device Names
|
|
|
|
// ******************************************************************
|
|
|
|
char m_DeviceName[XBCTRL_MAX_DEVICES][260];
|
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * Object Configuration
|
|
|
|
// ******************************************************************
|
|
|
|
XBCtrlObjectCfg m_ObjectConfig[XBCTRL_OBJECT_COUNT];
|
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * DirectInput
|
|
|
|
// ******************************************************************
|
2003-07-02 20:14:15 +00:00
|
|
|
XTL::LPDIRECTINPUT8 m_pDirectInput8;
|
2003-04-15 08:08:53 +00:00
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * DirectInput Devices
|
|
|
|
// ******************************************************************
|
|
|
|
struct InputDevice
|
|
|
|
{
|
2003-07-02 20:14:15 +00:00
|
|
|
XTL::LPDIRECTINPUTDEVICE8 m_Device;
|
|
|
|
int m_Flags;
|
2003-04-15 08:08:53 +00:00
|
|
|
}
|
|
|
|
m_InputDevice[XBCTRL_MAX_DEVICES];
|
|
|
|
|
2003-04-16 19:06:20 +00:00
|
|
|
// ******************************************************************
|
|
|
|
// * Current State
|
|
|
|
// ******************************************************************
|
2003-04-18 05:55:30 +00:00
|
|
|
enum XBCtrlState m_CurrentState;
|
2003-04-16 19:06:20 +00:00
|
|
|
|
2003-04-15 08:08:53 +00:00
|
|
|
// ******************************************************************
|
|
|
|
// * Config State Variables
|
|
|
|
// ******************************************************************
|
2003-04-16 19:06:20 +00:00
|
|
|
LONG lPrevMouseX, lPrevMouseY, lPrevMouseZ;
|
2003-04-15 08:08:53 +00:00
|
|
|
XBCtrlObject CurConfigObject;
|
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * Etc State Variables
|
|
|
|
// ******************************************************************
|
|
|
|
int m_dwInputDeviceCount;
|
|
|
|
int m_dwCurObject;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * Device Flags
|
|
|
|
// ******************************************************************
|
|
|
|
#define DEVICE_FLAG_JOYSTICK (1 << 0)
|
|
|
|
#define DEVICE_FLAG_KEYBOARD (1 << 1)
|
|
|
|
#define DEVICE_FLAG_MOUSE (1 << 2)
|
|
|
|
#define DEVICE_FLAG_AXIS (1 << 3)
|
2003-04-18 23:44:36 +00:00
|
|
|
#define DEVICE_FLAG_BUTTON (1 << 4)
|
|
|
|
#define DEVICE_FLAG_POSITIVE (1 << 5)
|
|
|
|
#define DEVICE_FLAG_NEGATIVE (1 << 6)
|
|
|
|
#define DEVICE_FLAG_MOUSE_CLICK (1 << 7)
|
|
|
|
#define DEVICE_FLAG_MOUSE_LX (1 << 8)
|
|
|
|
#define DEVICE_FLAG_MOUSE_LY (1 << 9)
|
|
|
|
#define DEVICE_FLAG_MOUSE_LZ (1 << 10)
|
2003-04-15 08:08:53 +00:00
|
|
|
|
|
|
|
// ******************************************************************
|
|
|
|
// * Detection Sensitivity
|
|
|
|
// ******************************************************************
|
|
|
|
#define DETECT_SENSITIVITY_JOYSTICK 25000
|
|
|
|
#define DETECT_SENSITIVITY_BUTTON 0
|
2003-05-30 02:08:25 +00:00
|
|
|
#define DETECT_SENSITIVITY_MOUSE 5
|
2003-04-15 08:08:53 +00:00
|
|
|
#define DETECT_SENSITIVITY_POV 50000
|
|
|
|
|
2003-04-18 05:55:30 +00:00
|
|
|
// ******************************************************************
|
|
|
|
// * DirectInput Enumeration Types
|
|
|
|
// ******************************************************************
|
|
|
|
enum XBCtrlState
|
|
|
|
{
|
|
|
|
XBCTRL_STATE_NONE = 0,
|
|
|
|
XBCTRL_STATE_CONFIG,
|
|
|
|
XBCTRL_STATE_LISTEN
|
|
|
|
};
|
|
|
|
|
2003-04-15 08:08:53 +00:00
|
|
|
#endif
|