# HG changeset patch # User Paul Boddie # Date 1381769439 0 # Node ID dc85b7ea00568c7e37600304ad811d17cf7c1164 # Parent c169fa933f1265d04c4224a35892d891f99e3892 Added support for reading magnetometer calibration data from a file. Added a special signal handler for the calibration program to produce usable data for such a settings file when the program is interrupted. diff -r c169fa933f12 -r dc85b7ea0056 calibrate.c --- a/calibrate.c Mon Oct 14 16:22:35 2013 +0000 +++ b/calibrate.c Mon Oct 14 16:50:39 2013 +0000 @@ -18,14 +18,22 @@ #include "shutdown.h" #include "geo.h" +vectorf vmin = {{0, 0, 0}}, + vmax = {{0, 0, 0}}; + +void calibrate_shutdown(int signum) +{ + printf("\n%-6.1f %-6.1f %-6.1f %-6.1f %-6.1f %-6.1f\n", + vmin.x, vmin.y, vmin.z, vmax.x, vmax.y, vmax.z); + init_shutdown(signum); +} + /* Main program. */ int main(int argc, char *argv[]) { uint8_t result[6]; vectorf value, - vmin = {{1, 1, 1}}, - vmax = {{-1, -1, -1}}, valueB[IMU_ACCEL_BUFFER_SIZE]; int argno = 1, vindex = 0; bool gyroscope = false, accelerometer = false, magnetometer = false, @@ -64,7 +72,7 @@ normalised = true; } - signal(SIGINT, init_shutdown); + signal(SIGINT, calibrate_shutdown); /* Access the 8:10 port. */ diff -r c169fa933f12 -r dc85b7ea0056 imu.h --- a/imu.h Mon Oct 14 16:22:35 2013 +0000 +++ b/imu.h Mon Oct 14 16:50:39 2013 +0000 @@ -201,6 +201,7 @@ #define IMU_UGAUSS_FACTOR IMU_4_0G_UNIT #define IMU_MAGNET_SCALE IMU_MAGNET_CRB_REG_4_0G #define IMU_MAGNET_FREQ IMU_MAGNET_CRA_REG_30HZ +#define IMU_MAGNET_SETTINGS_FILE "imu-magnet.cfg" #define ACCEL_G 9.81 /* ms**-2 */ diff -r c169fa933f12 -r dc85b7ea0056 measure.c --- a/measure.c Mon Oct 14 16:22:35 2013 +0000 +++ b/measure.c Mon Oct 14 16:50:39 2013 +0000 @@ -12,6 +12,8 @@ * (at your option) any later version. */ +#include +#include #include #include #include @@ -30,6 +32,10 @@ void ui_calibrate(bool using_filter, int (*print)(const char *, ...), void (*flush)()) { vectorf tmpB[1]; + FILE *magnetcfg; + char fieldmins[3][8], fieldmaxs[3][8], *endptr; + double value; + int i; print("Calibrating...\n"); flush(); @@ -53,6 +59,33 @@ print("Calibrated using (%.4f, %.4f, %.4f).\n", acceleration0.x, acceleration0.y, acceleration0.z); flush(); + + /* Read magnetometer settings, if possible. */ + + magnetcfg = fopen(IMU_MAGNET_SETTINGS_FILE, "r"); + + if (magnetcfg != NULL) + { + fscanf(magnetcfg, "%7s %7s %7s %7s %7s %7s", + fieldmins[0], fieldmins[1], fieldmins[2], + fieldmaxs[0], fieldmaxs[1], fieldmaxs[2]); + + for (i = 0; i < 3; i++) + { + value = strtod(fieldmins[i], &endptr); + if (endptr != fieldmins[i]) + fieldmin.axis[i] = value; + value = strtod(fieldmaxs[i], &endptr); + if (endptr != fieldmaxs[i]) + fieldmax.axis[i] = value; + } + + print("Calibrated using (%.1f, %.1f, %.1f), (%.1f, %.1f, %.1f).\n", + fieldmin.x, fieldmin.y, fieldmin.z, + fieldmax.x, fieldmax.y, fieldmax.z); + + fclose(magnetcfg); + } } void *get_measurements(void *arg)