|
SpacePoint Fusion plugin 1.0
|
00001 //################################################################################### 00002 //# Definition Of Class Fusion # 00003 //# Used To Handle a SpacePoint Fusion device # 00004 //# Author : # 00005 //# Aymeric SUTEAU # 00006 //# LISA - ANGERS # 00007 //################################################################################### 00008 00009 00010 // Standard libraries 00011 #include <math.h> 00012 #include <iostream> 00013 #include <windows.h> 00014 #include <conio.h> 00015 00016 // WDK libraries for USB HID devices 00017 extern "C" 00018 { 00019 #include "../hid/hidsdi.h" 00020 #include <setupapi.h> 00021 #include <dbt.h> 00022 } 00023 00024 00025 // Threading library 00026 #include "..\lib\ou_thread.h" 00027 00028 // Namespaces 00029 using namespace std; 00030 using namespace openutils; 00031 00032 // SpacePoint Fusion product and vendor IDs 00033 #define FUSION_VID 0x20ff 00034 #define FUSION_PID 0x0100 00035 00036 // SpacePoint Fusion available modes 00037 #define RAW_DATA 0 00038 #define ORIENTATION_DATA 1 00039 00040 // Class to handle Quaternions 00041 class Quaternion 00042 { 00043 public: 00044 Quaternion() 00045 { 00046 w = 1.0f; 00047 x = 0.0f; 00048 y = 0.0f; 00049 z = 0.0f; 00050 } 00051 00052 Quaternion(float ww, float xx, float yy, float zz) 00053 { 00054 w = ww; 00055 x = xx; 00056 y = yy; 00057 z = zz; 00058 } 00059 00060 //----------------------------------------------------------------------- 00061 Quaternion Quaternion::operator+ (const Quaternion& rkQ) const 00062 { 00063 return Quaternion(w+rkQ.w,x+rkQ.x,y+rkQ.y,z+rkQ.z); 00064 } 00065 //----------------------------------------------------------------------- 00066 Quaternion Quaternion::operator- (const Quaternion& rkQ) const 00067 { 00068 return Quaternion(w-rkQ.w,x-rkQ.x,y-rkQ.y,z-rkQ.z); 00069 } 00070 //----------------------------------------------------------------------- 00071 Quaternion Quaternion::operator* (const Quaternion& rkQ) const 00072 { 00073 // NOTE: Multiplication is not generally commutative, so in most cases p*q != q*p 00074 return Quaternion 00075 ( 00076 w * rkQ.w - x * rkQ.x - y * rkQ.y - z * rkQ.z, 00077 w * rkQ.x + x * rkQ.w + y * rkQ.z - z * rkQ.y, 00078 w * rkQ.y + y * rkQ.w + z * rkQ.x - x * rkQ.z, 00079 w * rkQ.z + z * rkQ.w + x * rkQ.y - y * rkQ.x 00080 ); 00081 } 00082 00083 Quaternion Quaternion::Inverse () const 00084 { 00085 float fNorm = w*w+x*x+y*y+z*z; 00086 if (fNorm > 0.0) 00087 { 00088 float fInvNorm = 1.0f/fNorm; 00089 return Quaternion(w*fInvNorm,-x*fInvNorm,-y*fInvNorm,-z*fInvNorm); 00090 } 00091 else 00092 { 00093 // return an invalid result to flag the error 00094 return Quaternion(); 00095 } 00096 } 00097 00098 protected: 00099 private: 00100 00101 public: 00102 float x; 00103 float y; 00104 float z; 00105 float w; 00106 protected: 00107 private: 00108 }; 00109 00110 // SpacePoint Fusion object 00111 class MyThread; 00112 class Fusion : public Thread 00113 { 00114 public: 00115 // Public attributes 00116 int* iRawAxes; // Raw has 9 axes, buttons, PNI byte 00117 float* fAcceleration; // Acceleration values (0=X, 1=Y and 2=Z) 00118 Quaternion fQuaternion; // Quaternion values 00119 int* iButton; // Button status (0=Left, 1=Right) 00120 00121 // Constructor and destructor 00122 Fusion(); 00123 ~Fusion(); 00124 00125 // Getters and setters 00126 bool GetConnected(); 00127 int GetNbSamples(); 00128 int GetVID(); 00129 int GetPID(); 00130 float* GetAccelerationValues(); 00131 float* GetQuaternionValues(); 00132 int* GetButtonValues(); 00133 int GetDataType(); 00134 00135 void SetConnected(bool); 00136 void SetNbSamples(int); 00137 void SetVID(int); 00138 void SetPID(int); 00139 void SetAccelerationValues(float*); 00140 void SetQuaternionValues(float*); 00141 void SetButtonValues(int*); 00142 void SetDataType(int); 00143 00144 // Other methods 00145 bool OpenDevice(int); 00146 void CloseDevice(); 00147 bool ParseData(); // Parse data read from Fusion device into acceleration and quaternion values 00148 00149 // USB HID methods 00150 bool FindHID(unsigned int, unsigned int, unsigned int); 00151 void RegisterForDeviceNotifications(); 00152 void GetDeviceCapabilities(); 00153 int ReadDataFromHID(); 00154 00155 // Thread Handling 00156 void run(); 00157 bool isRunning; 00158 00159 private: 00160 // Private attributes 00161 bool bConnected; 00162 int iNbSamples; 00163 int iVID; 00164 int iPID; 00165 bool bStatus; 00166 int iDataType; 00167 };
1.7.3