blob: 14bae5729a7e5c5de8f88c783e44662f3240b10d [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////
//
// This file is part of RTIMULib
//
// Copyright (c) 2014-2015, richards-tech, LLC
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
// Software, and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// The MPU-9250 and SPI driver code is based on code generously supplied by
// staslock@gmail.com (www.clickdrive.io)
#ifndef _RTIMUSETTINGS_H
#define _RTIMUSETTINGS_H
#include "RTMath.h"
#include "RTIMUHal.h"
// Settings keys
#define RTIMULIB_IMU_TYPE "IMUType"
#define RTIMULIB_FUSION_TYPE "FusionType"
#define RTIMULIB_BUS_IS_I2C "BusIsI2C"
#define RTIMULIB_I2C_SLAVEADDRESS "I2CSlaveAddress"
#define RTIMULIB_I2C_BUS "I2CBus"
#define RTIMULIB_SPI_BUS "SPIBus"
#define RTIMULIB_SPI_SELECT "SPISelect"
#define RTIMULIB_SPI_SPEED "SPISpeed"
#define RTIMULIB_AXIS_ROTATION "AxisRotation"
#define RTIMULIB_PRESSURE_TYPE "PressureType"
#define RTIMULIB_I2C_PRESSUREADDRESS "I2CPressureAddress"
#define RTIMULIB_HUMIDITY_TYPE "HumidityType"
#define RTIMULIB_I2C_HUMIDITYADDRESS "I2CHumidityAddress"
// MPU9150 settings keys
#define RTIMULIB_MPU9150_GYROACCEL_SAMPLERATE "MPU9150GyroAccelSampleRate"
#define RTIMULIB_MPU9150_COMPASS_SAMPLERATE "MPU9150CompassSampleRate"
#define RTIMULIB_MPU9150_GYROACCEL_LPF "MPU9150GyroAccelLpf"
#define RTIMULIB_MPU9150_GYRO_FSR "MPU9150GyroFSR"
#define RTIMULIB_MPU9150_ACCEL_FSR "MPU9150AccelFSR"
// MPU9250 settings keys
#define RTIMULIB_MPU9250_GYROACCEL_SAMPLERATE "MPU9250GyroAccelSampleRate"
#define RTIMULIB_MPU9250_COMPASS_SAMPLERATE "MPU9250CompassSampleRate"
#define RTIMULIB_MPU9250_GYRO_LPF "MPU9250GyroLpf"
#define RTIMULIB_MPU9250_ACCEL_LPF "MPU9250AccelLpf"
#define RTIMULIB_MPU9250_GYRO_FSR "MPU9250GyroFSR"
#define RTIMULIB_MPU9250_ACCEL_FSR "MPU9250AccelFSR"
// GD20HM303D settings keys
#define RTIMULIB_GD20HM303D_GYRO_SAMPLERATE "GD20HM303DGyroSampleRate"
#define RTIMULIB_GD20HM303D_GYRO_BW "GD20HM303DGyroBW"
#define RTIMULIB_GD20HM303D_GYRO_HPF "GD20HM303DGyroHpf"
#define RTIMULIB_GD20HM303D_GYRO_FSR "GD20HM303DGyroFsr"
#define RTIMULIB_GD20HM303D_ACCEL_SAMPLERATE "GD20HM303DAccelSampleRate"
#define RTIMULIB_GD20HM303D_ACCEL_FSR "GD20HM303DAccelFsr"
#define RTIMULIB_GD20HM303D_ACCEL_LPF "GD20HM303DAccelLpf"
#define RTIMULIB_GD20HM303D_COMPASS_SAMPLERATE "GD20HM303DCompassSampleRate"
#define RTIMULIB_GD20HM303D_COMPASS_FSR "GD20HM303DCompassFsr"
// GD20M303DLHC settings keys
#define RTIMULIB_GD20M303DLHC_GYRO_SAMPLERATE "GD20M303DLHCGyroSampleRate"
#define RTIMULIB_GD20M303DLHC_GYRO_BW "GD20M303DLHCGyroBW"
#define RTIMULIB_GD20M303DLHC_GYRO_HPF "GD20M303DLHCGyroHpf"
#define RTIMULIB_GD20M303DLHC_GYRO_FSR "GD20M303DLHCGyroFsr"
#define RTIMULIB_GD20M303DLHC_ACCEL_SAMPLERATE "GD20M303DLHCAccelSampleRate"
#define RTIMULIB_GD20M303DLHC_ACCEL_FSR "GD20M303DLHCAccelFsr"
#define RTIMULIB_GD20M303DLHC_COMPASS_SAMPLERATE "GD20M303DLHCCompassSampleRate"
#define RTIMULIB_GD20M303DLHC_COMPASS_FSR "GD20M303DLHCCompassFsr"
// GD20HM303DLHC settings keys
#define RTIMULIB_GD20HM303DLHC_GYRO_SAMPLERATE "GD20HM303DLHCGyroSampleRate"
#define RTIMULIB_GD20HM303DLHC_GYRO_BW "GD20HM303DLHCGyroBW"
#define RTIMULIB_GD20HM303DLHC_GYRO_HPF "GD20HM303DLHCGyroHpf"
#define RTIMULIB_GD20HM303DLHC_GYRO_FSR "GD20HM303DLHCGyroFsr"
#define RTIMULIB_GD20HM303DLHC_ACCEL_SAMPLERATE "GD20HM303DLHCAccelSampleRate"
#define RTIMULIB_GD20HM303DLHC_ACCEL_FSR "GD20HM303DLHCAccelFsr"
#define RTIMULIB_GD20HM303DLHC_COMPASS_SAMPLERATE "GD20HM303DLHCCompassSampleRate"
#define RTIMULIB_GD20HM303DLHC_COMPASS_FSR "GD20HM303DLHCCompassFsr"
// LSM9DS0 settings keys
#define RTIMULIB_LSM9DS0_GYRO_SAMPLERATE "LSM9DS0GyroSampleRate"
#define RTIMULIB_LSM9DS0_GYRO_BW "LSM9DS0GyroBW"
#define RTIMULIB_LSM9DS0_GYRO_HPF "LSM9DS0GyroHpf"
#define RTIMULIB_LSM9DS0_GYRO_FSR "LSM9DS0GyroFsr"
#define RTIMULIB_LSM9DS0_ACCEL_SAMPLERATE "LSM9DS0AccelSampleRate"
#define RTIMULIB_LSM9DS0_ACCEL_FSR "LSM9DS0AccelFsr"
#define RTIMULIB_LSM9DS0_ACCEL_LPF "LSM9DS0AccelLpf"
#define RTIMULIB_LSM9DS0_COMPASS_SAMPLERATE "LSM9DS0CompassSampleRate"
#define RTIMULIB_LSM9DS0_COMPASS_FSR "LSM9DS0CompassFsr"
// LSM9DS1 settings keys
#define RTIMULIB_LSM9DS1_GYRO_SAMPLERATE "LSM9DS1GyroSampleRate"
#define RTIMULIB_LSM9DS1_GYRO_BW "LSM9DS1GyroBW"
#define RTIMULIB_LSM9DS1_GYRO_HPF "LSM9DS1GyroHpf"
#define RTIMULIB_LSM9DS1_GYRO_FSR "LSM9DS1GyroFsr"
#define RTIMULIB_LSM9DS1_ACCEL_SAMPLERATE "LSM9DS1AccelSampleRate"
#define RTIMULIB_LSM9DS1_ACCEL_FSR "LSM9DS1AccelFsr"
#define RTIMULIB_LSM9DS1_ACCEL_LPF "LSM9DS1AccelLpf"
#define RTIMULIB_LSM9DS1_COMPASS_SAMPLERATE "LSM9DS1CompassSampleRate"
#define RTIMULIB_LSM9DS1_COMPASS_FSR "LSM9DS1CompassFsr"
// BMX055 settings keys
#define RTIMULIB_BMX055_GYRO_SAMPLERATE "BMX055GyroSampleRate"
#define RTIMULIB_BMX055_GYRO_FSR "BMX055GyroFsr"
#define RTIMULIB_BMX055_ACCEL_SAMPLERATE "BMX055AccelSampleRate"
#define RTIMULIB_BMX055_ACCEL_FSR "BMX055AccelFsr"
#define RTIMULIB_BMX055_MAG_PRESET "BMX055MagPreset"
// Gyro bias keys
#define RTIMULIB_GYRO_BIAS_VALID "GyroBiasValid"
#define RTIMULIB_GYRO_BIAS_X "GyroBiasX"
#define RTIMULIB_GYRO_BIAS_Y "GyroBiasY"
#define RTIMULIB_GYRO_BIAS_Z "GyroBiasZ"
// Compass calibration and adjustment settings keys
#define RTIMULIB_COMPASSCAL_VALID "CompassCalValid"
#define RTIMULIB_COMPASSCAL_MINX "CompassCalMinX"
#define RTIMULIB_COMPASSCAL_MAXX "CompassCalMaxX"
#define RTIMULIB_COMPASSCAL_MINY "CompassCalMinY"
#define RTIMULIB_COMPASSCAL_MAXY "CompassCalMaxY"
#define RTIMULIB_COMPASSCAL_MINZ "CompassCalMinZ"
#define RTIMULIB_COMPASSCAL_MAXZ "CompassCalMaxZ"
#define RTIMULIB_COMPASSCAL_ELLIPSOID_VALID "compassCalEllipsoidValid"
#define RTIMULIB_COMPASSCAL_OFFSET_X "compassCalOffsetX"
#define RTIMULIB_COMPASSCAL_OFFSET_Y "compassCalOffsetY"
#define RTIMULIB_COMPASSCAL_OFFSET_Z "compassCalOffsetZ"
#define RTIMULIB_COMPASSCAL_CORR11 "compassCalCorr11"
#define RTIMULIB_COMPASSCAL_CORR12 "compassCalCorr12"
#define RTIMULIB_COMPASSCAL_CORR13 "compassCalCorr13"
#define RTIMULIB_COMPASSCAL_CORR21 "compassCalCorr21"
#define RTIMULIB_COMPASSCAL_CORR22 "compassCalCorr22"
#define RTIMULIB_COMPASSCAL_CORR23 "compassCalCorr23"
#define RTIMULIB_COMPASSCAL_CORR31 "compassCalCorr31"
#define RTIMULIB_COMPASSCAL_CORR32 "compassCalCorr32"
#define RTIMULIB_COMPASSCAL_CORR33 "compassCalCorr33"
#define RTIMULIB_COMPASSADJ_DECLINATION "compassAdjDeclination"
// Accel calibration settings keys
#define RTIMULIB_ACCELCAL_VALID "AccelCalValid"
#define RTIMULIB_ACCELCAL_MINX "AccelCalMinX"
#define RTIMULIB_ACCELCAL_MAXX "AccelCalMaxX"
#define RTIMULIB_ACCELCAL_MINY "AccelCalMinY"
#define RTIMULIB_ACCELCAL_MAXY "AccelCalMaxY"
#define RTIMULIB_ACCELCAL_MINZ "AccelCalMinZ"
#define RTIMULIB_ACCELCAL_MAXZ "AccelCalMaxZ"
class RTIMUSettings : public RTIMUHal
{
public:
// Standard constructor sets up for ini file in working directory
RTIMUSettings(const char *productType = "RTIMULib");
// Alternate constructor allow ini file to be in any directory
RTIMUSettings(const char *settingsDirectory, const char *productType);
// This function tries to find an IMU. It stops at the first valid one
// and returns true or else false
bool discoverIMU(int& imuType, bool& busIsI2C, unsigned char& slaveAddress);
// This function tries to find a pressure sensor. It stops at the first valid one
// and returns true or else false
bool discoverPressure(int& pressureType, unsigned char& pressureAddress);
// This function tries to find a humidity sensor. It stops at the first valid one
// and returns true or else false
bool discoverHumidity(int& humidityType, unsigned char& humidityAddress);
// This function sets the settings to default values.
void setDefaults();
// This function loads the local variables from the settings file or uses defaults
virtual bool loadSettings();
// This function saves the local variables to the settings file
virtual bool saveSettings();
// These are the local variables
int m_imuType; // type code of imu in use
int m_fusionType; // fusion algorithm type code
unsigned char m_I2CSlaveAddress; // I2C slave address of the imu
int m_axisRotation; // axis rotation code
int m_pressureType; // type code of pressure sensor in use
unsigned char m_I2CPressureAddress; // I2C slave address of the pressure sensor
int m_humidityType; // type code of humidity sensor in use
unsigned char m_I2CHumidityAddress; // I2C slave address of the humidity sensor
bool m_compassCalValid; // true if there is valid compass calibration data
RTVector3 m_compassCalMin; // the minimum values
RTVector3 m_compassCalMax; // the maximum values
bool m_compassCalEllipsoidValid; // true if the ellipsoid calibration data is valid
RTVector3 m_compassCalEllipsoidOffset; // the ellipsoid offset
float m_compassCalEllipsoidCorr[3][3]; // the correction matrix
float m_compassAdjDeclination; // magnetic declination adjustment - subtracted from measured
bool m_accelCalValid; // true if there is valid accel calibration data
RTVector3 m_accelCalMin; // the minimum values
RTVector3 m_accelCalMax; // the maximum values
bool m_gyroBiasValid; // true if the recorded gyro bias is valid
RTVector3 m_gyroBias; // the recorded gyro bias
// IMU-specific vars
// MPU9150
int m_MPU9150GyroAccelSampleRate; // the sample rate (samples per second) for gyro and accel
int m_MPU9150CompassSampleRate; // same for the compass
int m_MPU9150GyroAccelLpf; // low pass filter code for the gyro and accel
int m_MPU9150GyroFsr; // FSR code for the gyro
int m_MPU9150AccelFsr; // FSR code for the accel
// MPU9250
int m_MPU9250GyroAccelSampleRate; // the sample rate (samples per second) for gyro and accel
int m_MPU9250CompassSampleRate; // same for the compass
int m_MPU9250GyroLpf; // low pass filter code for the gyro
int m_MPU9250AccelLpf; // low pass filter code for the accel
int m_MPU9250GyroFsr; // FSR code for the gyro
int m_MPU9250AccelFsr; // FSR code for the accel
// GD20HM303D
int m_GD20HM303DGyroSampleRate; // the gyro sample rate
int m_GD20HM303DGyroBW; // the gyro bandwidth code
int m_GD20HM303DGyroHpf; // the gyro high pass filter cutoff code
int m_GD20HM303DGyroFsr; // the gyro full scale range
int m_GD20HM303DAccelSampleRate; // the accel sample rate
int m_GD20HM303DAccelFsr; // the accel full scale range
int m_GD20HM303DAccelLpf; // the accel low pass filter
int m_GD20HM303DCompassSampleRate; // the compass sample rate
int m_GD20HM303DCompassFsr; // the compass full scale range
// GD20M303DLHC
int m_GD20M303DLHCGyroSampleRate; // the gyro sample rate
int m_GD20M303DLHCGyroBW; // the gyro bandwidth code
int m_GD20M303DLHCGyroHpf; // the gyro high pass filter cutoff code
int m_GD20M303DLHCGyroFsr; // the gyro full scale range
int m_GD20M303DLHCAccelSampleRate; // the accel sample rate
int m_GD20M303DLHCAccelFsr; // the accel full scale range
int m_GD20M303DLHCCompassSampleRate; // the compass sample rate
int m_GD20M303DLHCCompassFsr; // the compass full scale range
// GD20HM303DLHC
int m_GD20HM303DLHCGyroSampleRate; // the gyro sample rate
int m_GD20HM303DLHCGyroBW; // the gyro bandwidth code
int m_GD20HM303DLHCGyroHpf; // the gyro high pass filter cutoff code
int m_GD20HM303DLHCGyroFsr; // the gyro full scale range
int m_GD20HM303DLHCAccelSampleRate; // the accel sample rate
int m_GD20HM303DLHCAccelFsr; // the accel full scale range
int m_GD20HM303DLHCCompassSampleRate; // the compass sample rate
int m_GD20HM303DLHCCompassFsr; // the compass full scale range
// LSM9DS0
int m_LSM9DS0GyroSampleRate; // the gyro sample rate
int m_LSM9DS0GyroBW; // the gyro bandwidth code
int m_LSM9DS0GyroHpf; // the gyro high pass filter cutoff code
int m_LSM9DS0GyroFsr; // the gyro full scale range
int m_LSM9DS0AccelSampleRate; // the accel sample rate
int m_LSM9DS0AccelFsr; // the accel full scale range
int m_LSM9DS0AccelLpf; // the accel low pass filter
int m_LSM9DS0CompassSampleRate; // the compass sample rate
int m_LSM9DS0CompassFsr; // the compass full scale range
// LSM9DS1
int m_LSM9DS1GyroSampleRate; // the gyro sample rate
int m_LSM9DS1GyroBW; // the gyro bandwidth code
int m_LSM9DS1GyroHpf; // the gyro high pass filter cutoff code
int m_LSM9DS1GyroFsr; // the gyro full scale range
int m_LSM9DS1AccelSampleRate; // the accel sample rate
int m_LSM9DS1AccelFsr; // the accel full scale range
int m_LSM9DS1AccelLpf; // the accel low pass filter
int m_LSM9DS1CompassSampleRate; // the compass sample rate
int m_LSM9DS1CompassFsr; // the compass full scale range
// BMX055
int m_BMX055GyroSampleRate; // the gyro sample rate
int m_BMX055GyroFsr; // the gyro full scale range
int m_BMX055AccelSampleRate; // the accel sample rate
int m_BMX055AccelFsr; // the accel full scale range
int m_BMX055MagPreset; // the mag preset code
private:
void setBlank();
void setComment(const char *comment);
void setValue(const char *key, const bool val);
void setValue(const char *key, const int val);
void setValue(const char *key, const RTFLOAT val);
char m_filename[256]; // the settings file name
FILE *m_fd;
};
#endif // _RTIMUSETTINGS_H