Home | History | Annotate | Download | only in WiiMote
      1 #include "OISConfig.h"
      2 #ifdef OIS_WIN32_WIIMOTE_SUPPORT
      3 //cWiimote 0.2 by Kevin Forbes (http://simulatedcomicproduct.com)
      4 //This code is public domain, and comes with no warranty. The user takes full responsibility for anything that happens as a result from using this code.
      5 
      6 #ifndef WIIMOTE_H
      7 #define WIIMOTE_H
      8 
      9 #include "hiddevice.h"
     10 
     11 
     12 
     13 class cWiiMote
     14 {
     15 public:
     16 	cWiiMote();
     17 	~cWiiMote();
     18 
     19 	//connection management
     20 	bool ConnectToDevice(int index = 0);
     21 	bool Disconnect();
     22 	bool IsConnected() const {return mHIDDevice.IsConnected();}
     23 
     24 
     25 	bool StartDataStream();
     26 	bool StopDataStream();
     27 
     28 	bool IsNunChuckAttached() { return mNunchuckAttached; }
     29 
     30 
     31 	//this is the wiimote message pump. It should probably be called in loop from a thread
     32 	bool HeartBeat(int timeout = 1);
     33 	bool SetVibration(bool vib_on);
     34 	bool SetLEDs(bool led1, bool led2, bool led3, bool led4);
     35 
     36 
     37 
     38 	//Querying functions and structures:
     39 	void GetCalibratedAcceleration(float & x, float & y, float &z) const;
     40 	void GetCalibratedChuckAcceleration(float & x, float & y, float &z) const;
     41 	void GetCalibratedChuckStick(float & x, float & y) const;
     42 	bool GetIRP1(float &x, float &y) const;
     43 	bool GetIRP2(float &x, float &y) const;
     44 
     45 
     46 	struct tExpansionReport
     47 	{
     48 		bool mAttachmentPluggedIn;
     49 		bool mIREnabled;
     50 		bool mSpeakerEnabled;
     51 		bool mLED1On;
     52 		bool mLED2On;
     53 		bool mLED3On;
     54 		bool mLED4On;
     55 		unsigned char mBatteryLevel;
     56 
     57 		void Init()
     58 		{
     59 			mAttachmentPluggedIn = false;
     60 			mIREnabled = false;
     61 			mSpeakerEnabled = false;
     62 			mLED1On = false;
     63 			mLED2On = false;
     64 			mLED3On = false;
     65 			mLED4On = false;
     66 			mBatteryLevel = 0;
     67 		}
     68 	};
     69 	struct tButtonStatus
     70 	{
     71 		bool mA;
     72 		bool mB;
     73 		bool m1;
     74 		bool m2;
     75 		bool mPlus;
     76 		bool mMinus;
     77 		bool mHome;
     78 		bool mUp;
     79 		bool mDown;
     80 		bool mLeft;
     81 		bool mRight;
     82 
     83 		void Init()
     84 		{
     85 			mA = mB = m1 = m2 = mPlus = mMinus = mHome = mUp = mDown = mLeft = mRight = false;
     86 		}
     87 	};
     88 	struct tMotionReport
     89 	{
     90 		unsigned char mX;
     91 		unsigned char mY;
     92 		unsigned char mZ;
     93 
     94 		void Init()
     95 		{
     96 			mX = mY = mZ = 0;
     97 		}
     98 	};
     99 
    100 	struct tChuckReport
    101 	{
    102 		unsigned char mStickX;
    103 		unsigned char mStickY;
    104 		unsigned char mAccelX;
    105 		unsigned char mAccelY;
    106 		unsigned char mAccelZ;
    107 		bool	mButtonC;
    108 		bool	mButtonZ;
    109 		void Init()
    110 		{
    111 			mStickX=mStickY=mAccelX=mAccelY=mAccelZ=0;
    112 			mButtonC = mButtonZ = false;
    113 		};
    114 	};
    115 
    116 	struct tIRReport
    117 	{
    118 		unsigned short mP1X;
    119 		unsigned short mP1Y;
    120 
    121 		unsigned short mP2X;
    122 		unsigned short mP2Y;
    123 
    124 		unsigned char mP1Size;
    125 		unsigned char mP2Size;
    126 
    127 		bool mP1Found;
    128 		bool mP2Found;
    129 
    130 		void Init()
    131 		{
    132 			mP1X = mP1Y = mP2X = mP2Y = mP1Size = mP2Size = 0;
    133 			mP1Found = mP2Found = false;
    134 		}
    135 
    136 
    137 	};
    138 	const tButtonStatus & GetLastButtonStatus() const {return mLastButtonStatus;}
    139 	const tChuckReport & GetLastChuckReport() const {return mLastChuckReport;}
    140 	const tMotionReport & GetLastMotionReport() const { return mLastMotionReport;}
    141 	const tExpansionReport & GetLastExpansionReport() const { return mLastExpansionReport;}
    142 	const tIRReport & GetLastIRReport() const { return mLastIRReport;}
    143 
    144 
    145 	//debugging functions:
    146 	void PrintStatus() const;
    147 
    148 private:
    149 
    150 	//parsing functions for input reports
    151 	void ParseExpansionReport(const unsigned char * data);
    152 	void ParseButtonReport(const unsigned char * data);
    153 	void ParseMotionReport(const unsigned char * data);
    154 	void ParseReadData(const unsigned char * data);
    155 	void ParseChuckReport(const unsigned char * data);
    156 	void ParseIRReport(const unsigned char * data);
    157 
    158 
    159 	//tell the wiimote how to send data
    160 	enum eReportMode
    161 	{
    162 		REPORT_MODE_EVENT_BUTTONS,
    163 		REPORT_MODE_MOTION,
    164 		REPORT_MODE_MOTION_CHUCK,
    165 		REPORT_MODE_MOTION_IR,
    166 		REPORT_MODE_MOTION_CHUCK_IR
    167 	};
    168 	bool SetReportMode(eReportMode mode);
    169 
    170 
    171 	//housekeeping functions
    172 	void Init();
    173 	void ClearBuffer();
    174 
    175 	//low level tasks
    176 	bool SelectInputChannel(bool continuous, unsigned char channel);
    177 	bool UpdateOutput();
    178 	bool ReadMemory(unsigned int address, unsigned short size, unsigned char * buffer) const;
    179 	bool WriteMemory(unsigned int address, unsigned char size, const unsigned char * buffer);
    180 
    181 	bool ReadData(unsigned int address, unsigned short size, unsigned char * buffer);
    182 	bool IssueReadRequest(unsigned int address, unsigned short size, unsigned char * buffer);
    183 	bool ReadCalibrationData();
    184 	bool SendReportMode();
    185 
    186 	bool InitNunchuck();
    187 	bool EnableIR();
    188 	bool DisableIR();
    189 
    190 	static inline unsigned char NunChuckByte(unsigned char in) {return (in ^ 0x17)+0x17;}
    191 	//flash reading vars
    192 	struct tMemReadInfo
    193 	{
    194 		enum eReadStatus
    195 		{
    196 			READ_PENDING,
    197 			READ_NONE,
    198 			READ_COMPLETE,
    199 			READ_ERROR
    200 		} mReadStatus;
    201 
    202 		unsigned char * mReadBuffer;
    203 		unsigned short mTotalBytesToRead;
    204 		unsigned short mBytesRead;
    205 		unsigned short mBaseAddress;
    206 		void Init()
    207 		{
    208 			mReadStatus = READ_NONE;
    209 			mReadBuffer = NULL;
    210 			mTotalBytesToRead = 0;
    211 			mBytesRead = 0;
    212 			mBaseAddress = 0;
    213 		}
    214 	} mReadInfo;
    215 
    216 	//calibration data for the wiimote
    217 	struct tAccelCalibrationData
    218 	{
    219 		unsigned char mXZero;
    220 		unsigned char mYZero;
    221 		unsigned char mZZero;
    222 		unsigned char mXG;
    223 		unsigned char mYG;
    224 		unsigned char mZG;
    225 		void Init()
    226 		{
    227 			mXZero = mYZero = mZZero = mXG = mYG = mZG= 0;
    228 		}
    229 	} ;
    230 
    231 	struct tStickCalibrationData
    232 	{
    233 		unsigned char mXmin;
    234 		unsigned char mXmid;
    235 		unsigned char mXmax;
    236 		unsigned char mYmin;
    237 		unsigned char mYmid;
    238 		unsigned char mYmax;
    239 
    240 		void Init()
    241 		{
    242 			mXmax = mYmax = mXmin = mYmin = mXmid = mYmid =0;
    243 		}
    244 	};
    245 
    246 	tAccelCalibrationData mAccelCalibrationData;
    247 	tAccelCalibrationData mNunchuckAccelCalibrationData;
    248 	tStickCalibrationData mNunchuckStickCalibrationData;
    249 
    250 	//output requests
    251 	struct tOutputControls
    252 	{
    253 		bool mVibration;
    254 		bool mLED1;
    255 		bool mLED2;
    256 		bool mLED3;
    257 		bool mLED4;
    258 
    259 		void Init()
    260 		{
    261 			mVibration = mLED1 = mLED2= mLED3= mLED4 = false;
    262 		}
    263 	};
    264 
    265 
    266 	//input states
    267 	tExpansionReport mLastExpansionReport;
    268 	tButtonStatus mLastButtonStatus;
    269 	tMotionReport mLastMotionReport;
    270 	tChuckReport mLastChuckReport;
    271 	tIRReport mLastIRReport;
    272 
    273 	//output states
    274 	tOutputControls mOutputControls;
    275 	eReportMode	mReportMode;
    276 
    277 	//our communications device
    278 	cHIDDevice mHIDDevice;
    279 
    280 	bool mNunchuckAttached;
    281 	bool mIRRunning;
    282 	bool mDataStreamRunning;
    283 
    284 	//buffers for input/output
    285 	static const int mOutputBufferSize = 22;
    286 	unsigned char mOutputBuffer[mOutputBufferSize];
    287 	static const int mInputBufferSize = 22;
    288 	unsigned char mInputBuffer[mInputBufferSize];
    289 };
    290 #endif
    291 #endif
    292