42 #define MAXPACKETRATEHZ 40    43 #define RATERESOLUTION 1000    64                     uint16_t iBytesToCopy)
    69     for (i = 0; i < iBytesToCopy; i++)
    75                 pDest[(*pIndex)++] = 0x7D;
    76                 pDest[(*pIndex)++] = 0x5E;
    81                 pDest[(*pIndex)++] = 0x7D;
    82                 pDest[(*pIndex)++] = 0x5D;
    87                 pDest[(*pIndex)++] = pSource[i];
    97     int16_t scratch16 = 0;
    99     for (i=0; i<numZeros; i++) {
   110                  uint16_t *isystick) {
   115     *iPhi = (int16_t) (10.0F * data->
fPhi);
   116     *iThe = (int16_t) (10.0F * data->
fThe);
   117     *iRho = (int16_t) (10.0F * data->
fRho);
   118     *isystick = (uint16_t) (data->
systick / 20);
   125     static int32 iThrottle = 0;
   152     static uint32_t iTimeStamp = 0;     
   165     uint8_t         AngularVelocityPacketOn,
   168     int8_t          AccelCalPacketOn;
   169     static uint8_t  iPacketNumber = 0;  
   174 #if (MAXPACKETRATEHZ < FUSION_HZ)   176     if (skip_packet) 
return;  
   212     sUARTOutputBuffer[iIndex++] = 0x7E;
   223     sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &iTimeStamp, 4);
   228         switch (quaternionPacketType)
   236                 scratch32 = (sfg->Accel.iGc[
CHX] * 8192) / sfg->Accel.iCountsPerg;
   237                 if (scratch32 > 32767) scratch32 = 32767;
   238                 if (scratch32 < -32768) scratch32 = -32768;
   239                 scratch16 = (int16_t) (scratch32);
   240                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   242                 scratch32 = (sfg->Accel.iGc[
CHY] * 8192) / sfg->Accel.iCountsPerg;
   243                 if (scratch32 > 32767) scratch32 = 32767;
   244                 if (scratch32 < -32768) scratch32 = -32768;
   245                 scratch16 = (int16_t) (scratch32);
   246                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   248                 scratch32 = (sfg->Accel.iGc[
CHZ] * 8192) / sfg->Accel.iCountsPerg;
   249                 if (scratch32 > 32767) scratch32 = 32767;
   250                 if (scratch32 < -32768) scratch32 = -32768;
   251                 scratch16 = (int16_t) (scratch32);
   252                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   254 #endif // F_USING_ACCEL   269         switch (quaternionPacketType)
   277                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   279                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   281                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   302         switch (quaternionPacketType)
   310                 scratch16 = (int16_t) ((sfg->Gyro.iYs[
CHX] * 20) / sfg->Gyro.iCountsPerDegPerSec);
   311                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   312                 scratch16 = (int16_t) ((sfg->Gyro.iYs[
CHY] * 20) / sfg->Gyro.iCountsPerDegPerSec);
   313                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   314                 scratch16 = (int16_t) ((sfg->Gyro.iYs[
CHZ] * 20) / sfg->Gyro.iCountsPerDegPerSec);
   315                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   335     fq.
q1 = fq.
q2 = fq.
q3 = 0.0F;
   337     iOmega[
CHX] = iOmega[
CHY] = iOmega[
CHZ] = 0;
   338     iPhi = iThe = iRho = iDelta = 0;
   353     switch (quaternionPacketType)
   360                 readCommon((
SV_ptr)&sfg->SV_3DOF_G_BASIC, &fq, &iPhi, &iThe, &iRho, iOmega, &isystick);
   369                 readCommon((
SV_ptr)&sfg->SV_3DOF_B_BASIC, &fq, &iPhi, &iThe, &iRho, iOmega, &isystick);
   378                 readCommon((
SV_ptr)&sfg->SV_3DOF_Y_BASIC, &fq, &iPhi, &iThe, &iRho, iOmega, &isystick);
   387                 iDelta = (int16_t) (10.0F * sfg->SV_6DOF_GB_BASIC.fLPDelta);
   388                 readCommon((
SV_ptr)&sfg->SV_6DOF_GB_BASIC, &fq, &iPhi, &iThe, &iRho, iOmega, &isystick);
   397                 readCommon((
SV_ptr)&sfg->SV_6DOF_GY_KALMAN, &fq, &iPhi, &iThe, &iRho, iOmega, &isystick);
   401 #if F_9DOF_GBY_KALMAN   406                 iDelta = (int16_t) (10.0F * sfg->SV_9DOF_GBY_KALMAN.fDeltaPl);
   407                 readCommon((
SV_ptr)&sfg->SV_9DOF_GBY_KALMAN, &fq, &iPhi, &iThe, &iRho, iOmega, &isystick);
   417     scratch16 = (int16_t) (fq.
q0 * 30000.0F);
   418     sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   419     scratch16 = (int16_t) (fq.
q1 * 30000.0F);
   420     sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   421     scratch16 = (int16_t) (fq.
q2 * 30000.0F);
   422     sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   423     scratch16 = (int16_t) (fq.
q3 * 30000.0F);
   424     sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   427 #if THISCOORDSYSTEM == ANDROID   430 #elif THISCOORDSYSTEM == WIN8   433 #endif // THISCOORDSYSTEM   443     sUARTOutputBuffer[iIndex++] = 0x7E;
   452         sUARTOutputBuffer[iIndex++] = 0x7E;
   464         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   467         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &isystick, 2);
   470         sUARTOutputBuffer[iIndex++] = 0x7E;
   477     if (AngularVelocityPacketOn)
   480         sUARTOutputBuffer[iIndex++] = 0x7E;
   491         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &iTimeStamp, 4);
   499         sUARTOutputBuffer[iIndex++] = 0x7E;
   509         sUARTOutputBuffer[iIndex++] = 0x7E;
   520         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &iTimeStamp, 4);
   528         sUARTOutputBuffer[iIndex++] = 0x7E;
   541             sUARTOutputBuffer[iIndex++] = 0x7E;
   552             sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &iTimeStamp,
   556             scratch32 = (
int32_t) (sfg->SV_1DOF_P_BASIC.fLPH * 1000.0F);
   557             sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch32, 4);
   560             scratch16 = (int16_t) (sfg->SV_1DOF_P_BASIC.fLPT * 100.0F);
   561             sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   564             sUARTOutputBuffer[iIndex++] = 0x7E;
   575     static int16_t  MagneticPacketID = 0;   
   579         sUARTOutputBuffer[iIndex++] = 0x7E;
   598         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   601         scratch16 = (int16_t) (sfg->
MagCal.
fB * 10.0F);
   602         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   605         k = MagneticPacketID - 10;
   614         if ((MagneticPacketID >= 10) && (sfg->
MagBuffer.
index[i][j] == -1))
   617             scratch16 = -MagneticPacketID;
   618             sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   623             scratch16 = MagneticPacketID;
   624             sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   630         switch (MagneticPacketID)
   635                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   639                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   643                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   648                 scratch16 = (int16_t) (sfg->
MagCal.
fV[
CHX] * 10.0F);
   649                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   650                 scratch16 = (int16_t) (sfg->
MagCal.
fV[
CHY] * 10.0F);
   651                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   652                 scratch16 = (int16_t) (sfg->
MagCal.
fV[
CHZ] * 10.0F);
   653                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   659                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   661                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   663                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   668                 scratch16 = (int16_t) (sfg->
MagCal.
finvW[CHX][CHY] * 1000.0F);
   669                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   670                 scratch16 = (int16_t) (sfg->
MagCal.
finvW[CHX][CHZ] * 1000.0F);
   671                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   672                 scratch16 = (int16_t) (sfg->
MagCal.
finvW[CHY][CHZ] * 1000.0F);
   673                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   699         if (MagneticPacketID >= (10 + MAGBUFFSIZEX * 
MAGBUFFSIZEY))
   700             MagneticPacketID = 0;
   703         sUARTOutputBuffer[iIndex++] = 0x7E;
   716     kalman = six_axis_kalman;
   718 #if F_9DOF_GBY_KALMAN   720     kalman = kalman | nine_axis_kalman;
   722 #if F_6DOF_GY_KALMAN || F_9DOF_GBY_KALMAN   725         if ((quaternionPacketType == 
Q6AG) || (quaternionPacketType == 
Q9))
   728             sUARTOutputBuffer[iIndex++] = 0x7E;
   741             for (i = 
CHX; i <= 
CHZ; i++)
   744                 if (six_axis_kalman)    scratch16 = (int16_t) (sfg->SV_6DOF_GY_KALMAN.fZErr[i] * 30000.0F);
   746 #if F_9DOF_GBY_KALMAN   747                 if (nine_axis_kalman)   scratch16 = (int16_t) (sfg->SV_9DOF_GBY_KALMAN.fZErr[i] * 30000.0F);
   749                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16,2);
   755             for (i = 
CHX; i <= 
CHZ; i++)
   758                 if (six_axis_kalman)    scratch16 = (int16_t) (sfg->SV_6DOF_GY_KALMAN.fqgErrPl[i] * 30000.0F);
   760 #if F_9DOF_GBY_KALMAN   761                 if (nine_axis_kalman)   scratch16 = (int16_t) (sfg->SV_9DOF_GBY_KALMAN.fqgErrPl[i] * 30000.0F);
   763                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16,2);
   769             for (i = 
CHX; i <= 
CHZ; i++)
   772                 if (six_axis_kalman)    scratch16 = 0;
   774 #if F_9DOF_GBY_KALMAN   775                 if (nine_axis_kalman)   scratch16 = (int16_t) (sfg->SV_9DOF_GBY_KALMAN.fZErr[i + 3] * 30000.0F);
   777                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   783             for (i = 
CHX; i <= 
CHZ; i++)
   786                 if (six_axis_kalman)    scratch16 = 0;
   788 #if F_9DOF_GBY_KALMAN   789                 if (nine_axis_kalman)   scratch16 = (int16_t) (sfg->SV_9DOF_GBY_KALMAN.fqmErrPl[i] * 30000.0F);
   791                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   797             for (i = 
CHX; i <= 
CHZ; i++)
   800                 if (six_axis_kalman)    scratch16 = (int16_t) (sfg->SV_6DOF_GY_KALMAN.fbPl[i] * 1000.0F);
   802 #if F_9DOF_GBY_KALMAN   803                 if (nine_axis_kalman)   scratch16 = (int16_t) (sfg->SV_9DOF_GBY_KALMAN.fbPl[i] * 1000.0F);
   805                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   810 #if F_9DOF_GBY_KALMAN   811             if (nine_axis_kalman)       scratch16 = (int16_t) (sfg->SV_9DOF_GBY_KALMAN.fDeltaPl * 100.0F);
   813             sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   818             for (i = 
CHX; i <= 
CHZ; i++)
   823                 if (six_axis_kalman)    ftmp = sfg->SV_6DOF_GY_KALMAN.fAccGl[i] * 8192.0F;
   825 #if F_9DOF_GBY_KALMAN   826                 if (nine_axis_kalman)   ftmp = sfg->SV_9DOF_GBY_KALMAN.fAccGl[i] * 8192.0F;
   830                 if (ftmp > 32767.0F)            scratch16 = 32767;
   831                 else if (ftmp < -32768.0F)      scratch16 = -32768;
   832                 else                            scratch16 = (int16_t) ftmp;
   833                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   839             for (i = 
CHX; i <= 
CHZ; i++)
   843 #if F_9DOF_GBY_KALMAN   844                 if (nine_axis_kalman)   ftmp = sfg->SV_9DOF_GBY_KALMAN.fDisGl[i] * 100.0F;
   848                 if (ftmp > 32767.0F)            scratch16 = 32767;
   849                 else if (ftmp < -32768.0F)      scratch16 = -32768;
   850                 else                            scratch16 = (int16_t) ftmp;
   851                 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   855             sUARTOutputBuffer[iIndex++] = 0x7E;
   866     if (AccelCalPacketOn != -1)
   869         sUARTOutputBuffer[iIndex++] = 0x7E;
   882                        (uint8_t *) &(AccelCalPacketOn), 1);
   885         if ((AccelCalPacketOn >= 0) &&
   888             scratch16 = (int16_t) (sfg->AccelBuffer.fGsStored[AccelCalPacketOn][
CHX] * 8192.0F);
   889             sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   890             scratch16 = (int16_t) (sfg->AccelBuffer.fGsStored[AccelCalPacketOn][
CHY] * 8192.0F);
   891             sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   892             scratch16 = (int16_t) (sfg->AccelBuffer.fGsStored[AccelCalPacketOn][
CHZ] * 8192.0F);
   893             sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   902         scratch16 = (int16_t) (sfg->AccelCal.fV[
CHX] * 32768.0F);
   903         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   904         scratch16 = (int16_t) (sfg->AccelCal.fV[
CHY] * 32768.0F);
   905         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   906         scratch16 = (int16_t) (sfg->AccelCal.fV[
CHZ] * 32768.0F);
   907         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   910         scratch16 = (int16_t) ((sfg->AccelCal.finvW[
CHX][
CHX] - 1.0F) * 10000.0F);
   911         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   912         scratch16 = (int16_t) ((sfg->AccelCal.finvW[
CHY][
CHY] - 1.0F) * 10000.0F);
   913         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   914         scratch16 = (int16_t) ((sfg->AccelCal.finvW[
CHZ][
CHZ] - 1.0F) * 10000.0F);
   915         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   918         scratch16 = (int16_t) (sfg->AccelCal.finvW[
CHX][
CHY] * 10000.0F);
   919         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   920         scratch16 = (int16_t) (sfg->AccelCal.finvW[
CHX][
CHZ] * 10000.0F);
   921         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   922         scratch16 = (int16_t) (sfg->AccelCal.finvW[CHY][CHZ] * 10000.0F);
   923         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   926         scratch16 = (int16_t) (sfg->AccelCal.fR0[
CHX][
CHX] * 10000.0F);
   927         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   928         scratch16 = (int16_t) (sfg->AccelCal.fR0[CHY][CHY] * 10000.0F);
   929         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   930         scratch16 = (int16_t) (sfg->AccelCal.fR0[CHZ][CHZ] * 10000.0F);
   931         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   934         scratch16 = (int16_t) (sfg->AccelCal.fR0[CHX][CHY] * 10000.0F);
   935         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   936         scratch16 = (int16_t) (sfg->AccelCal.fR0[CHX][CHZ] * 10000.0F);
   937         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   938         scratch16 = (int16_t) (sfg->AccelCal.fR0[CHY][CHX] * 10000.0F);
   939         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   940         scratch16 = (int16_t) (sfg->AccelCal.fR0[CHY][CHZ] * 10000.0F);
   941         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   942         scratch16 = (int16_t) (sfg->AccelCal.fR0[CHZ][CHX] * 10000.0F);
   943         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   944         scratch16 = (int16_t) (sfg->AccelCal.fR0[CHZ][CHY] * 10000.0F);
   945         sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
   948         sUARTOutputBuffer[iIndex++] = 0x7E;
   953 #endif  // F_USING_ACCEL enum quaternion quaternion_type
the quaternion type to be transmitted 
 
Quaternion derived from full 9-axis sensor fusion. 
 
volatile quaternion_type QuaternionPacketType
quaternion type transmitted over UART 
 
#define MAGBUFFSIZEX
x dimension in magnetometer buffer (12x24 equals 288 elements) 
 
#define F_USING_GYRO
nominally 0x0004 if a gyro is to be used, 0x0000 otherwise 
 
#define CHY
Used to access Y-channel entries in various data data structures. 
 
void readCommon(SV_ptr data, Quaternion *fq, int16_t *iPhi, int16_t *iThe, int16_t *iRho, int16_t iOmega[], uint16_t *isystick)
 
float fV[3]
current hard iron offset x, y, z, (uT) 
 
ApplyPerturbation function used to analyze dynamic performance. 
 
struct MagBuffer MagBuffer
mag cal constellation points 
 
int32_t systick
systick timer; 
 
Quaternion derived from 3-axis mag only (auto compass algorithm) 
 
uint8_t data[FXLS8962_DATA_SIZE]
 
float fOmega[3]
average angular velocity (deg/s) 
 
float q1
x vector component 
 
writePort_t * write
low level function to write a char buffer to the serial stream 
 
volatile uint8_t AltPacketOn
flag to enable altitude packet 
 
int16_t iBc[3]
averaged calibrated measurement (counts) 
 
Quaternion derived from 3-axis gyro only (rotation) 
 
Quaternion derived from 3-axis accel + 3 axis mag (eCompass) 
 
Quaternion derived from 3-axis accel + 3-axis gyro (gaming) 
 
volatile uint8_t AngularVelocityPacketOn
flag to enable angular velocity packet 
 
uint16_t throttle()
(OVERSAMPLE_RATIO * MAXPACKETRATEHZ) / SENSORFS 
 
#define THIS_BOARD
FRDM_K64F. 
 
The top level fusion structure. 
 
#define F_1DOF_P_BASIC
1DOF pressure (altitude) and temperature algorithm selector - 0x0100 to include, 0x0000 otherwise ...
 
#define F_9DOF_GBY_KALMAN
9DOF accel, mag and gyro algorithm selector - 0x4000 to include, 0x0000 otherwise ...
 
void sBufAppendItem(uint8_t *pDest, uint16_t *pIndex, uint8_t *pSource, uint16_t iBytesToCopy)
Utility function used to place data in output buffer about to be transmitted via UART. 
 
struct MagSensor Mag
magnetometer storage 
 
#define THISBUILD
define build number sent in debug packet for display purposes only 
 
#define F_6DOF_GY_KALMAN
6DOF accel and gyro (Kalman) algorithm selector - 0x2000 to include, 0x0000 otherwise ...
 
float fFitErrorpc
current fit error % 
 
The sensor_fusion.h file implements the top level programming interface. 
 
volatile uint8_t RPCPacketOn
flag to enable roll, pitch, compass packet 
 
#define F_3DOF_G_BASIC
3DOF accel tilt (accel) algorithm selector - 0x0200 to include, 0x0000 otherwise 
 
#define CHZ
Used to access Z-channel entries in various data data structures. 
 
int16_t iBs[3][MAGBUFFSIZEX][MAGBUFFSIZEY]
uncalibrated magnetometer readings 
 
uint8_t sUARTOutputBuffer[256]
main output buffer defined in control.c 
 
Quaternion fq
orientation quaternion 
 
void CreateAndSendPackets(SensorFusionGlobals *sfg, uint8_t *sUARTOutputBuffer)
 
float fB
current geomagnetic field magnitude (uT) 
 
int16_t iMagBufferCount
number of magnetometer readings 
 
#define CHX
Used to access X-channel entries in various data data structures. 
 
uint32_t iFlags
a bit-field of sensors and algorithms used 
 
int16_t iCountsPeruT
counts per uT 
 
float q2
y vector component 
 
quaternion structure definition 
 
struct MagCalibration MagCal
mag cal storage 
 
Quaternion derived from 3-axis accel (tilt) 
 
#define F_3DOF_Y_BASIC
3DOF gyro integration algorithm selector - 0x0800 to include, 0x0000 otherwise 
 
#define F_6DOF_GB_BASIC
6DOF accel and mag eCompass algorithm selector - 0x1000 to include, 0x0000 otherwise ...
 
#define MAX_ACCEL_CAL_ORIENTATIONS
number of stored precision accelerometer measurements 
 
#define FUSION_HZ
(int) actual rate of fusion algorithm execution and sensor FIFO reads 
 
Defines control sub-system. 
 
struct ControlSubsystem * pControlSubsystem
 
void sBufAppendZeros(uint8_t *pDest, uint16_t *pIndex, uint16_t numZeros)
 
#define F_USING_ACCEL
nominally 0x0001 if an accelerometer is to be used, 0x0000 otherwise 
 
float q3
z vector component 
 
#define MAGBUFFSIZEY
y dimension in magnetometer buffer (12x24 equals 288 elements) 
 
#define F_3DOF_B_BASIC
3DOF mag eCompass (vehicle/mag) algorithm selector - 0x0400 to include, 0x0000 otherwise ...
 
int32_t index[MAGBUFFSIZEX][MAGBUFFSIZEY]
array of time indices 
 
float finvW[3][3]
current inverse soft iron matrix 
 
volatile int8_t AccelCalPacketOn
variable used to coordinate accelerometer calibration 
 
volatile uint8_t DebugPacketOn
flag to enable debug packet