23#define CALIBRATION_STORAGE_SIZE_BYTES 256
24#define CALIBRATION_BUF_MAGNETIC_START 0
25#define CALIBRATION_BUF_MAGNETIC_HDR_SIZE 4
26#define CALIBRATION_BUF_MAGNETIC_HDR_MAGIC 0x12345678
27#define CALIBRATION_BUF_MAGNETIC_VAL_SIZE 64
28#define CALIBRATION_BUF_MAGNETIC_TOT_SIZE (CALIBRATION_BUF_MAGNETIC_HDR_SIZE + CALIBRATION_BUF_MAGNETIC_VAL_SIZE)
29#define CALIBRATION_BUF_GYRO_START (CALIBRATION_BUF_MAGNETIC_TOT_SIZE)
30#define CALIBRATION_BUF_GYRO_HDR_SIZE 4
31#define CALIBRATION_BUF_GYRO_HDR_MAGIC 0x12345678
32#define CALIBRATION_BUF_GYRO_VAL_SIZE 12
33#define CALIBRATION_BUF_GYRO_TOT_SIZE (CALIBRATION_BUF_GYRO_HDR_SIZE + CALIBRATION_BUF_GYRO_VAL_SIZE)
34#define CALIBRATION_BUF_ACCEL_START (CALIBRATION_BUF_MAGNETIC_TOT_SIZE + CALIBRATION_BUF_GYRO_TOT_SIZE)
35#define CALIBRATION_BUF_ACCEL_HDR_SIZE 4
36#define CALIBRATION_BUF_ACCEL_HDR_MAGIC 0x12345678
37#define CALIBRATION_BUF_ACCEL_VAL_SIZE 84
38#define CALIBRATION_BUF_ACCEL_TOT_SIZE (CALIBRATION_BUF_ACCEL_HDR_SIZE + CALIBRATION_BUF_ACCEL_VAL_SIZE)
39#define CALIBRATION_NO_MAGIC 0xdeadbeef
40#if CALIBRATION_STORAGE_SIZE_BYTES < (CALIBRATION_BUF_MAGNETIC_TOT_SIZE + CALIBRATION_BUF_GYRO_TOT_SIZE + CALIBRATION_BUF_ACCEL_TOT_SIZE)
41 #error insufficient space allocated for calibration buffer
47void EepromReadBytes(
int start_loc,
void *buffer,
int num_bytes);
48void EepromReadBytes(
int start_loc,
void *buffer,
int num_bytes) {
49 uint8_t *ptr = (uint8_t *)buffer;
50 for (
int i = 0; i < num_bytes; i++) {
51 ptr[i] = EEPROM.read(i + start_loc);
59bool GetMagCalibrationFromNVM(
float *cal_values ) {
60 if( NULL == cal_values ) {
67 CALIBRATION_STORAGE_SIZE_BYTES);
69 uint8_t buf_magic[CALIBRATION_BUF_MAGNETIC_HDR_SIZE];
71 EepromReadBytes(CALIBRATION_BUF_MAGNETIC_START, buf_magic,
72 CALIBRATION_BUF_MAGNETIC_HDR_SIZE);
75 EEPROM.readBytes(CALIBRATION_BUF_MAGNETIC_START, buf_magic,
76 CALIBRATION_BUF_MAGNETIC_HDR_SIZE);
78 uint32_t magic_value = CALIBRATION_BUF_MAGNETIC_HDR_MAGIC;
79 uint8_t *pSrc = (uint8_t *)&magic_value;
80 for (
int i = 0; i < CALIBRATION_BUF_MAGNETIC_HDR_SIZE; i++) {
81 if( *pSrc != buf_magic[i] ) {
89 CALIBRATION_BUF_MAGNETIC_START + CALIBRATION_BUF_MAGNETIC_HDR_SIZE,
90 cal_values, CALIBRATION_BUF_MAGNETIC_VAL_SIZE);
94 CALIBRATION_BUF_MAGNETIC_START + CALIBRATION_BUF_MAGNETIC_HDR_SIZE,
95 cal_values, CALIBRATION_BUF_MAGNETIC_VAL_SIZE);
103bool GetGyroCalibrationFromNVM(
float *cal_values ) {
104 if( NULL == cal_values ) {
111 CALIBRATION_STORAGE_SIZE_BYTES);
113 uint8_t buf_magic[CALIBRATION_BUF_GYRO_HDR_SIZE];
115 EepromReadBytes(CALIBRATION_BUF_GYRO_START, buf_magic,
116 CALIBRATION_BUF_GYRO_HDR_SIZE);
119 EEPROM.readBytes(CALIBRATION_BUF_GYRO_START, buf_magic,
120 CALIBRATION_BUF_GYRO_HDR_SIZE);
122 uint32_t magic_value = CALIBRATION_BUF_GYRO_HDR_MAGIC;
123 uint8_t *pSrc = (uint8_t *)&magic_value;
124 for (
int i = 0; i < CALIBRATION_BUF_GYRO_HDR_SIZE; i++) {
125 if( *pSrc != buf_magic[i] ) {
132 EepromReadBytes(CALIBRATION_BUF_GYRO_START + CALIBRATION_BUF_GYRO_HDR_SIZE,
133 cal_values, CALIBRATION_BUF_GYRO_VAL_SIZE);
136 EEPROM.readBytes(CALIBRATION_BUF_GYRO_START + CALIBRATION_BUF_GYRO_HDR_SIZE,
137 cal_values, CALIBRATION_BUF_GYRO_VAL_SIZE);
145bool GetAccelCalibrationFromNVM(
float *cal_values ) {
146 if( NULL == cal_values ) {
153 CALIBRATION_STORAGE_SIZE_BYTES);
156 uint8_t buf_magic[CALIBRATION_BUF_ACCEL_HDR_SIZE];
158 EepromReadBytes(CALIBRATION_BUF_ACCEL_START, buf_magic,
159 CALIBRATION_BUF_ACCEL_HDR_SIZE);
162 EEPROM.readBytes(CALIBRATION_BUF_ACCEL_START, buf_magic,
163 CALIBRATION_BUF_ACCEL_HDR_SIZE);
165 uint32_t magic_value = CALIBRATION_BUF_ACCEL_HDR_MAGIC;
166 uint8_t *pSrc = (uint8_t *)&magic_value;
167 for (
int i = 0; i < CALIBRATION_BUF_ACCEL_HDR_SIZE; i++) {
168 if( *pSrc != buf_magic[i] ) {
176 CALIBRATION_BUF_ACCEL_START + CALIBRATION_BUF_ACCEL_HDR_SIZE,
177 cal_values, CALIBRATION_BUF_ACCEL_VAL_SIZE);
181 CALIBRATION_BUF_ACCEL_START + CALIBRATION_BUF_ACCEL_HDR_SIZE,
182 cal_values, CALIBRATION_BUF_ACCEL_VAL_SIZE);
194 uint8_t *pSrc, *pDst;
195 uint8_t *buf_NVM = NULL;
198 CALIBRATION_STORAGE_SIZE_BYTES);
199 buf_NVM = EEPROM.getDataPtr();
202 pDst = buf_NVM + CALIBRATION_BUF_MAGNETIC_START;
206 uint32_t itmp32 = CALIBRATION_BUF_MAGNETIC_HDR_MAGIC;
207 pSrc = (uint8_t *)&itmp32;
208 for (
int i = 0; i < CALIBRATION_BUF_MAGNETIC_HDR_SIZE; i++) {
214 pSrc = (uint8_t *)&(sfg->
MagCal);
215 for (
int i = 0; i < CALIBRATION_BUF_MAGNETIC_VAL_SIZE; i++) {
221 if( ! EEPROM.commit() ) {
222 debug_log(
"EEPROM write mag cal failed\n");
231#if F_USING_GYRO && (F_9DOF_GBY_KALMAN || F_6DOF_GY_KALMAN)
232 uint8_t *pSrc, *pDst;
233 uint8_t *buf_NVM = NULL;
236 CALIBRATION_STORAGE_SIZE_BYTES);
237 buf_NVM = EEPROM.getDataPtr();
240 pDst = buf_NVM + CALIBRATION_BUF_GYRO_START;
244 uint32_t itmp32 = CALIBRATION_BUF_GYRO_HDR_MAGIC;
245 pSrc = (uint8_t *)&itmp32;
246 for (
int i = 0; i < CALIBRATION_BUF_GYRO_HDR_SIZE; i++) {
253 pSrc = (uint8_t *) sfg->SV_9DOF_GBY_KALMAN.fbPl;
254#elif F_6DOF_GY_KALMAN
255 pSrc = (uint8 *) sfg->SV_6DOF_GY_KALMAN.fbPl;
257 pSrc = (uint8_t *)&(sfg->
MagCal);
258 for (
int i = 0; i < CALIBRATION_BUF_GYRO_VAL_SIZE; i++) {
264 if( ! EEPROM.commit() ) {
265 debug_log(
"EEPROM write gyro cal failed\n");
275 uint8_t *pSrc, *pDst;
276 uint8_t *buf_NVM = NULL;
279 CALIBRATION_STORAGE_SIZE_BYTES);
280 buf_NVM = EEPROM.getDataPtr();
283 pDst = buf_NVM + CALIBRATION_BUF_ACCEL_START;
287 uint32_t itmp32 = CALIBRATION_BUF_ACCEL_HDR_MAGIC;
288 pSrc = (uint8_t *)&itmp32;
289 for (
int i = 0; i < CALIBRATION_BUF_ACCEL_HDR_SIZE; i++) {
295 pSrc = (uint8_t *) &(sfg->AccelCal);
296 for (
int i = 0; i < CALIBRATION_BUF_ACCEL_VAL_SIZE; i++) {
302 if( ! EEPROM.commit() ) {
303 debug_log(
"EEPROM write accel cal failed\n");
310void EraseMagCalibrationFromNVM(
void)
312 uint8_t *pSrc, *pDst;
313 uint8_t *buf_NVM = NULL;
316 CALIBRATION_STORAGE_SIZE_BYTES);
317 buf_NVM = EEPROM.getDataPtr();
319 pDst = buf_NVM + CALIBRATION_BUF_MAGNETIC_START;
321 uint32_t itmp32 = CALIBRATION_NO_MAGIC;
322 pSrc = (uint8_t *)&itmp32;
323 for (
int i = 0; i < CALIBRATION_BUF_MAGNETIC_HDR_SIZE; i++) {
329 if( ! EEPROM.commit() ) {
330 debug_log(
"EEPROM clear magnetic cal failed\n");
337void EraseGyroCalibrationFromNVM(
void)
339 uint8_t *pSrc, *pDst;
340 uint8_t *buf_NVM = NULL;
343 CALIBRATION_STORAGE_SIZE_BYTES);
344 buf_NVM = EEPROM.getDataPtr();
346 pDst = buf_NVM + CALIBRATION_BUF_GYRO_START;
348 uint32_t itmp32 = CALIBRATION_NO_MAGIC;
349 pSrc = (uint8_t *)&itmp32;
350 for (
int i = 0; i < CALIBRATION_BUF_GYRO_HDR_SIZE; i++) {
356 if( ! EEPROM.commit() ) {
357 debug_log(
"EEPROM clear gyro cal failed\n");
364void EraseAccelCalibrationFromNVM(
void)
366 uint8_t *pSrc, *pDst;
367 uint8_t *buf_NVM = NULL;
370 CALIBRATION_STORAGE_SIZE_BYTES);
371 buf_NVM = EEPROM.getDataPtr();
373 pDst = buf_NVM + CALIBRATION_BUF_ACCEL_START;
375 uint32_t itmp32 = CALIBRATION_NO_MAGIC;
376 pSrc = (uint8_t *)&itmp32;
377 for (
int i = 0; i < CALIBRATION_BUF_ACCEL_HDR_SIZE; i++) {
383 if( ! EEPROM.commit() ) {
384 debug_log(
"EEPROM clear magnetic cal failed\n");
Provides functions to store calibration to NVM, which on ESP devices is provided by EEPROM.
defines function debug_print() that outputs to serial port Can disable these prints by compiling with...
The sensor_fusion.h file implements the top level programming interface.
The top level fusion structure.
struct MagCalibration MagCal
mag cal storage