SpacePoint Fusion plugin 1.0

src/Fusion.h

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 };