00001 #ifndef __CPHIDGETSPATIAL
00002 #define __CPHIDGETSPATIAL
00003 #include "cphidget.h"
00004
00011 DPHANDLE(Spatial)
00012 CHDRSTANDARD(Spatial)
00013
00017 typedef struct _CPhidgetSpatial_SpatialEventData
00018 {
00019 double acceleration[3];
00020 double angularRate[3];
00021 double magneticField[3];
00022 CPhidget_Timestamp timestamp;
00023 } CPhidgetSpatial_SpatialEventData, *CPhidgetSpatial_SpatialEventDataHandle;
00024
00030 CHDRGET(Spatial,AccelerationAxisCount,int *count)
00036 CHDRGET(Spatial,GyroAxisCount,int *count)
00042 CHDRGET(Spatial,CompassAxisCount,int *count)
00043
00044
00050 CHDRGETINDEX(Spatial,Acceleration,double *acceleration)
00057 CHDRGETINDEX(Spatial,AccelerationMax,double *max)
00064 CHDRGETINDEX(Spatial,AccelerationMin,double *min)
00065
00066
00072 CHDRGETINDEX(Spatial,AngularRate,double *angularRate)
00079 CHDRGETINDEX(Spatial,AngularRateMax,double *max)
00086 CHDRGETINDEX(Spatial,AngularRateMin,double *min)
00087
00088
00094 CHDRGETINDEX(Spatial,MagneticField,double *magneticField)
00101 CHDRGETINDEX(Spatial,MagneticFieldMax,double *max)
00108 CHDRGETINDEX(Spatial,MagneticFieldMin,double *min)
00109
00110
00115 PHIDGET21_API int CCONV CPhidgetSpatial_zeroGyro(CPhidgetSpatialHandle phid);
00116
00122 CHDRGET(Spatial, DataRate, int *milliseconds)
00128 CHDRSET(Spatial, DataRate, int milliseconds)
00134 CHDRGET(Spatial, DataRateMax, int *max)
00140 CHDRGET(Spatial, DataRateMin, int *min)
00141
00142
00159 CHDRSET(Spatial, CompassCorrectionParameters, double magField, double offset0, double offset1, double offset2, double gain0, double gain1, double gain2, double T0, double T1, double T2, double T3, double T4, double T5)
00164 PHIDGET21_API int CCONV CPhidgetSpatial_resetCompassCorrectionParameters(CPhidgetSpatialHandle phid);
00165
00173 CHDREVENT(Spatial,SpatialData,CPhidgetSpatial_SpatialEventDataHandle *data, int dataCount)
00174
00175
00176 #if !defined(EXTERNALPROTO) || defined(DEBUG)
00177
00178 #define SPATIAL_ANALOG_AND_DIGITAL 0x00
00179 #define SPATIAL_ANALOG 0x01
00180 #define SPATIAL_DIGITAL 0x02
00181
00182 typedef enum {
00183 PHIDGET_SPATIAL_ANALOG_AND_DIGITAL = 0,
00184 PHIDGET_SPATIAL_ANALOG,
00185 PHIDGET_SPATIAL_DIGITAL,
00186 } CPhidgetSpatial_AnalogDigitalMode;
00187
00188 CHDRSET(Spatial, AnalogDigitalMode, CPhidgetSpatial_AnalogDigitalMode mode)
00189 PHIDGET21_API int CCONV CPhidgetSpatial_unZeroGyro(CPhidgetSpatialHandle phid);
00190 PHIDGET21_API int CCONV CPhidgetSpatial_setDigitalGyroCalibrationValues(CPhidgetSpatialHandle phid,
00191 double gainPositive[3], double gainNegative[3], double offset[3], double factor1[3], double factor2[3]);
00192 PHIDGET21_API int CCONV CPhidgetSpatial_setAnalogGyroCalibrationValues(CPhidgetSpatialHandle phid,
00193 double gainPositive[3], double gainNegative[3], double offset[3], double factor1[3], double factor2[3]);
00194 PHIDGET21_API int CCONV CPhidgetSpatial_setDigitalAccelCalibrationValues(CPhidgetSpatialHandle phid,
00195 double gainPositive[3], double gainNegative[3], double offset[3], double factor1[3], double factor2[3]);
00196 PHIDGET21_API int CCONV CPhidgetSpatial_setAnalogAccelCalibrationValues(CPhidgetSpatialHandle phid,
00197 double gainPositive[3], double gainNegative[3], double offset[3], double factor1[3], double factor2[3]);
00198
00199 #endif
00200
00201 #ifndef EXTERNALPROTO
00202
00203 #define SPATIAL_MAX_ACCELAXES 3
00204 #define SPATIAL_MAX_GYROAXES 3
00205 #define SPATIAL_MAX_COMPASSAXES 3
00206
00207
00208 #define SPATIAL_MAX_DATA_RATE 1
00209
00210 #define SPATIAL_MIN_DATA_RATE 1000
00211
00212 #define SPATIAL_DATA_BUFFER_SIZE ((SPATIAL_MIN_DATA_RATE * 2 + 200)/SPATIAL_MAX_DATA_RATE)
00213
00214 #define SPATIAL_ZERO_GYRO_TIME 2000
00215
00216
00217
00218 #define SPATIAL_PACKET_DATA 0x00
00219 #define SPATIAL_PACKET_CALIB 0x80
00220
00221 #define SPATIAL_READCALIB 0x01
00222 #define SPATIAL_SET_POLLING_TYPE 0x02
00223 #define SPATIAL_ZERO_GYRO 0x03
00224 #define SPATIAL_UNZERO_GYRO 0x04
00225
00226
00227 #define SPATIAL_DIGITAL_ACCEL_CALIB_TABLE_INDEX 0
00228 #define SPATIAL_ANALOG_ACCEL_CALIB_TABLE_INDEX 1
00229 #define SPATIAL_DIGITAL_GYRO_CALIB_TABLE_INDEX 2
00230 #define SPATIAL_ANALOG_GYRO_CALIB_TABLE_INDEX 3
00231 #define SPATIAL_COMPASS_CALIB_TABLE_INDEX 4
00232 #define SPATIAL_COMPASS_TEMP_CALIB_TABLE_INDEX 5
00233
00234 #define SPATIAL_ACCEL_GYRO_CALIB_TABLE_LENGTH 64
00235 #define SPATIAL_COMPASS_CALIB_TABLE_LENGTH 56
00236
00237 #define SPATIAL_GyroCalibTable_ID 1000
00238 #define SPATIAL_AccelCalibTable_ID 1001
00239
00258 #define SPATIAL_VOLTAGE_REF 3.3
00259 #define SPATIAL_AD7689_BITS_PER_VOLT (0x10000 / SPATIAL_VOLTAGE_REF)
00260
00261 #define SPATIAL_LPR410AL_VOLTS_PER_DPS 0.0025
00262 #define SPATIAL_LRP410AL_w_AD7689_BITS_PER_DPS (SPATIAL_LPR410AL_VOLTS_PER_DPS * SPATIAL_AD7689_BITS_PER_VOLT)
00263
00264 #define SPATIAL_LY330ALH_VOLTS_PER_DPS 0.003752
00265 #define SPATIAL_LY330ALH_w_AD7689_BITS_PER_DPS (SPATIAL_LY330ALH_VOLTS_PER_DPS * SPATIAL_AD7689_BITS_PER_VOLT)
00266
00267 #define SPATIAL_L3GD20_DPS_PER_BIT 0.07
00268 #define SPATIAL_L3GD20_BITS_PER_DPS (1 / SPATIAL_L3GD20_DPS_PER_BIT)
00269
00270 #define SPATIAL_KXR94_2050_VOLTS_PER_G 0.660
00271 #define SPATIAL_KXR94_2050_w_AD7689_BITS_PER_G (SPATIAL_KXR94_2050_VOLTS_PER_G * SPATIAL_AD7689_BITS_PER_VOLT)
00272
00273 #define SPATIAL_MMA8451Q_BITS_PER_G 1024
00274
00275 #define SPATIAL_HMC5883L_GAUSS_PER_BIT 0.00303
00276 #define SPATIAL_HMC5883L_BITS_PER_GAUSS (1 / SPATIAL_HMC5883L_GAUSS_PER_BIT)
00277
00278
00279 struct _CPhidgetSpatial {
00280 CPhidget phid;
00281 int (CCONV *fptrSpatialData)(CPhidgetSpatialHandle, void *, CPhidgetSpatial_SpatialEventDataHandle *, int);
00282 void *fptrSpatialDataptr;
00283
00284 double accelAxis[SPATIAL_MAX_ACCELAXES];
00285 double gyroAxis[SPATIAL_MAX_GYROAXES];
00286 double compassAxis[SPATIAL_MAX_COMPASSAXES];
00287
00288 double gryoCorrection[SPATIAL_MAX_GYROAXES];
00289 unsigned char doZeroGyro;
00290 int gyroZeroReadPtr;
00291
00292 CPhidgetSpatial_SpatialEventData dataBuffer[SPATIAL_DATA_BUFFER_SIZE];
00293 int bufferReadPtr, bufferWritePtr;
00294
00295 double accelerationMax, accelerationMin;
00296 double angularRateMax, angularRateMin;
00297 double magneticFieldMax, magneticFieldMin;
00298
00299 unsigned char calDataValid;
00300
00301 double accelGain1[SPATIAL_MAX_ACCELAXES];
00302 double accelGain2[SPATIAL_MAX_ACCELAXES];
00303 double accelOffset[SPATIAL_MAX_ACCELAXES];
00304 double accelFactor1[SPATIAL_MAX_ACCELAXES];
00305 double accelFactor2[SPATIAL_MAX_ACCELAXES];
00306
00307 double gyroGain1[SPATIAL_MAX_GYROAXES];
00308 double gyroGain2[SPATIAL_MAX_GYROAXES];
00309 double gyroOffset[SPATIAL_MAX_GYROAXES];
00310 double gyroFactor1[SPATIAL_MAX_GYROAXES];
00311 double gyroFactor2[SPATIAL_MAX_GYROAXES];
00312
00313 int compassGain[SPATIAL_MAX_COMPASSAXES];
00314 int compassOffset[SPATIAL_MAX_COMPASSAXES];
00315
00316 double userMagField;
00317 double userCompassGain[SPATIAL_MAX_COMPASSAXES];
00318 double userCompassOffset[SPATIAL_MAX_COMPASSAXES];
00319 double userCompassTransform[SPATIAL_MAX_COMPASSAXES*(SPATIAL_MAX_COMPASSAXES-1)];
00320
00321 CPhidget_Timestamp timestamp, lastEventTime, latestDataTime;
00322
00323 unsigned char lastTimeCounterValid;
00324 int lastTimeCounter;
00325 int flip;
00326
00327 char *compassCorrectionParamsString;
00328 unsigned char spatialDataNetwork;
00329
00330 int dataRate, interruptRate;
00331 int dataRateMax, dataRateMin;
00332
00333 } typedef CPhidgetSpatialInfo;
00334 #endif
00335
00338 #endif