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