QC Control software

Dependencies:   mbed

Fork of dgps by Colin Stearns

Committer:
krobertson
Date:
Thu Apr 03 17:18:58 2014 +0000
Revision:
17:323fc40376d5
added compass to project

Who changed what in which revision?

UserRevisionLine numberNew contents of line
krobertson 17:323fc40376d5 1 /**
krobertson 17:323fc40376d5 2 * \brief Adaptor for the LSM303 integrated compass and accelerometer
krobertson 17:323fc40376d5 3 **/
krobertson 17:323fc40376d5 4
krobertson 17:323fc40376d5 5 #ifndef _COMPASS_H_
krobertson 17:323fc40376d5 6 #define _COMPASS_H_
krobertson 17:323fc40376d5 7
krobertson 17:323fc40376d5 8 #include "mbed.h"
krobertson 17:323fc40376d5 9 #include <SPI.h>
krobertson 17:323fc40376d5 10 #include <stdint.h>
krobertson 17:323fc40376d5 11
krobertson 17:323fc40376d5 12 typedef unsigned char byte;
krobertson 17:323fc40376d5 13
krobertson 17:323fc40376d5 14 class Compass{
krobertson 17:323fc40376d5 15 public:
krobertson 17:323fc40376d5 16
krobertson 17:323fc40376d5 17 template <typename T> struct vector{
krobertson 17:323fc40376d5 18 T x, y, z;
krobertson 17:323fc40376d5 19 };
krobertson 17:323fc40376d5 20
krobertson 17:323fc40376d5 21 /**
krobertson 17:323fc40376d5 22 * \brief LSM303 devices
krobertson 17:323fc40376d5 23 **/
krobertson 17:323fc40376d5 24 enum deviceType { device_DLH, device_DLM, device_DLHC, device_D, device_auto };
krobertson 17:323fc40376d5 25
krobertson 17:323fc40376d5 26 /**
krobertson 17:323fc40376d5 27 * \brief register addresses
krobertson 17:323fc40376d5 28 **/
krobertson 17:323fc40376d5 29 enum regAddr{
krobertson 17:323fc40376d5 30 TEMP_OUT_L = 0x05, // D
krobertson 17:323fc40376d5 31 TEMP_OUT_H = 0x06, // D
krobertson 17:323fc40376d5 32
krobertson 17:323fc40376d5 33 STATUS_M = 0x07, // D
krobertson 17:323fc40376d5 34
krobertson 17:323fc40376d5 35 INT_CTRL_M = 0x12, // D
krobertson 17:323fc40376d5 36 INT_SRC_M = 0x13, // D
krobertson 17:323fc40376d5 37 INT_THS_L_M = 0x14, // D
krobertson 17:323fc40376d5 38 INT_THS_H_M = 0x15, // D
krobertson 17:323fc40376d5 39
krobertson 17:323fc40376d5 40 OFFSET_X_L_M = 0x16, // D
krobertson 17:323fc40376d5 41 OFFSET_X_H_M = 0x17, // D
krobertson 17:323fc40376d5 42 OFFSET_Y_L_M = 0x18, // D
krobertson 17:323fc40376d5 43 OFFSET_Y_H_M = 0x19, // D
krobertson 17:323fc40376d5 44 OFFSET_Z_L_M = 0x1A, // D
krobertson 17:323fc40376d5 45 OFFSET_Z_H_M = 0x1B, // D
krobertson 17:323fc40376d5 46 REFERENCE_X = 0x1C, // D
krobertson 17:323fc40376d5 47 REFERENCE_Y = 0x1D, // D
krobertson 17:323fc40376d5 48 REFERENCE_Z = 0x1E, // D
krobertson 17:323fc40376d5 49
krobertson 17:323fc40376d5 50 CTRL0 = 0x1F, // D
krobertson 17:323fc40376d5 51 CTRL1 = 0x20, // D
krobertson 17:323fc40376d5 52 CTRL_REG1_A = 0x20, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 53 CTRL2 = 0x21, // D
krobertson 17:323fc40376d5 54 CTRL_REG2_A = 0x21, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 55 CTRL3 = 0x22, // D
krobertson 17:323fc40376d5 56 CTRL_REG3_A = 0x22, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 57 CTRL4 = 0x23, // D
krobertson 17:323fc40376d5 58 CTRL_REG4_A = 0x23, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 59 CTRL5 = 0x24, // D
krobertson 17:323fc40376d5 60 CTRL_REG5_A = 0x24, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 61 CTRL6 = 0x25, // D
krobertson 17:323fc40376d5 62 CTRL_REG6_A = 0x25, // DLHC
krobertson 17:323fc40376d5 63 HP_FILTER_RESET_A = 0x25, // DLH, DLM
krobertson 17:323fc40376d5 64 CTRL7 = 0x26, // D
krobertson 17:323fc40376d5 65 REFERENCE_A = 0x26, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 66 STATUS_A = 0x27, // D
krobertson 17:323fc40376d5 67 STATUS_REG_A = 0x27, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 68
krobertson 17:323fc40376d5 69 OUT_X_L_A = 0x28,
krobertson 17:323fc40376d5 70 OUT_X_H_A = 0x29,
krobertson 17:323fc40376d5 71 OUT_Y_L_A = 0x2A,
krobertson 17:323fc40376d5 72 OUT_Y_H_A = 0x2B,
krobertson 17:323fc40376d5 73 OUT_Z_L_A = 0x2C,
krobertson 17:323fc40376d5 74 OUT_Z_H_A = 0x2D,
krobertson 17:323fc40376d5 75
krobertson 17:323fc40376d5 76 FIFO_CTRL = 0x2E, // D
krobertson 17:323fc40376d5 77 FIFO_CTRL_REG_A = 0x2E, // DLHC
krobertson 17:323fc40376d5 78 FIFO_SRC = 0x2F, // D
krobertson 17:323fc40376d5 79 FIFO_SRC_REG_A = 0x2F, // DLHC
krobertson 17:323fc40376d5 80
krobertson 17:323fc40376d5 81 IG_CFG1 = 0x30, // D
krobertson 17:323fc40376d5 82 INT1_CFG_A = 0x30, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 83 IG_SRC1 = 0x31, // D
krobertson 17:323fc40376d5 84 INT1_SRC_A = 0x31, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 85 IG_THS1 = 0x32, // D
krobertson 17:323fc40376d5 86 INT1_THS_A = 0x32, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 87 IG_DUR1 = 0x33, // D
krobertson 17:323fc40376d5 88 INT1_DURATION_A = 0x33, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 89 IG_CFG2 = 0x34, // D
krobertson 17:323fc40376d5 90 INT2_CFG_A = 0x34, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 91 IG_SRC2 = 0x35, // D
krobertson 17:323fc40376d5 92 INT2_SRC_A = 0x35, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 93 IG_THS2 = 0x36, // D
krobertson 17:323fc40376d5 94 INT2_THS_A = 0x36, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 95 IG_DUR2 = 0x37, // D
krobertson 17:323fc40376d5 96 INT2_DURATION_A = 0x37, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 97
krobertson 17:323fc40376d5 98 CLICK_CFG = 0x38, // D
krobertson 17:323fc40376d5 99 CLICK_CFG_A = 0x38, // DLHC
krobertson 17:323fc40376d5 100 CLICK_SRC = 0x39, // D
krobertson 17:323fc40376d5 101 CLICK_SRC_A = 0x39, // DLHC
krobertson 17:323fc40376d5 102 CLICK_THS = 0x3A, // D
krobertson 17:323fc40376d5 103 CLICK_THS_A = 0x3A, // DLHC
krobertson 17:323fc40376d5 104 TIME_LIMIT = 0x3B, // D
krobertson 17:323fc40376d5 105 TIME_LIMIT_A = 0x3B, // DLHC
krobertson 17:323fc40376d5 106 TIME_LATENCY = 0x3C, // D
krobertson 17:323fc40376d5 107 TIME_LATENCY_A = 0x3C, // DLHC
krobertson 17:323fc40376d5 108 TIME_WINDOW = 0x3D, // D
krobertson 17:323fc40376d5 109 TIME_WINDOW_A = 0x3D, // DLHC
krobertson 17:323fc40376d5 110
krobertson 17:323fc40376d5 111 Act_THS = 0x3E, // D
krobertson 17:323fc40376d5 112 Act_DUR = 0x3F, // D
krobertson 17:323fc40376d5 113
krobertson 17:323fc40376d5 114 CRA_REG_M = 0x00, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 115 CRB_REG_M = 0x01, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 116 MR_REG_M = 0x02, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 117
krobertson 17:323fc40376d5 118 SR_REG_M = 0x09, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 119 IRA_REG_M = 0x0A, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 120 IRB_REG_M = 0x0B, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 121 IRC_REG_M = 0x0C, // DLH, DLM, DLHC
krobertson 17:323fc40376d5 122
krobertson 17:323fc40376d5 123 WHO_AM_I_M = 0x0F, // DLM
krobertson 17:323fc40376d5 124 WHO_AM_I = 0x0F, // D
krobertson 17:323fc40376d5 125
krobertson 17:323fc40376d5 126 TEMP_OUT_H_M = 0x31, // DLHC
krobertson 17:323fc40376d5 127 TEMP_OUT_L_M = 0x32, // DLHC
krobertson 17:323fc40376d5 128
krobertson 17:323fc40376d5 129
krobertson 17:323fc40376d5 130 // dummy addresses for registers in different locations on different devices;
krobertson 17:323fc40376d5 131 // the library translates these based on device type
krobertson 17:323fc40376d5 132 // value with sign flipped is used as index into translated_regs array
krobertson 17:323fc40376d5 133
krobertson 17:323fc40376d5 134 OUT_X_H_M = -1,
krobertson 17:323fc40376d5 135 OUT_X_L_M = -2,
krobertson 17:323fc40376d5 136 OUT_Y_H_M = -3,
krobertson 17:323fc40376d5 137 OUT_Y_L_M = -4,
krobertson 17:323fc40376d5 138 OUT_Z_H_M = -5,
krobertson 17:323fc40376d5 139 OUT_Z_L_M = -6,
krobertson 17:323fc40376d5 140 // update dummy_reg_count if registers are added here!
krobertson 17:323fc40376d5 141
krobertson 17:323fc40376d5 142 // device-specific register addresses
krobertson 17:323fc40376d5 143 DLH_OUT_X_H_M = 0x03,
krobertson 17:323fc40376d5 144 DLH_OUT_X_L_M = 0x04,
krobertson 17:323fc40376d5 145 DLH_OUT_Y_H_M = 0x05,
krobertson 17:323fc40376d5 146 DLH_OUT_Y_L_M = 0x06,
krobertson 17:323fc40376d5 147 DLH_OUT_Z_H_M = 0x07,
krobertson 17:323fc40376d5 148 DLH_OUT_Z_L_M = 0x08,
krobertson 17:323fc40376d5 149
krobertson 17:323fc40376d5 150 DLM_OUT_X_H_M = 0x03,
krobertson 17:323fc40376d5 151 DLM_OUT_X_L_M = 0x04,
krobertson 17:323fc40376d5 152 DLM_OUT_Z_H_M = 0x05,
krobertson 17:323fc40376d5 153 DLM_OUT_Z_L_M = 0x06,
krobertson 17:323fc40376d5 154 DLM_OUT_Y_H_M = 0x07,
krobertson 17:323fc40376d5 155 DLM_OUT_Y_L_M = 0x08,
krobertson 17:323fc40376d5 156
krobertson 17:323fc40376d5 157 DLHC_OUT_X_H_M = 0x03,
krobertson 17:323fc40376d5 158 DLHC_OUT_X_L_M = 0x04,
krobertson 17:323fc40376d5 159 DLHC_OUT_Z_H_M = 0x05,
krobertson 17:323fc40376d5 160 DLHC_OUT_Z_L_M = 0x06,
krobertson 17:323fc40376d5 161 DLHC_OUT_Y_H_M = 0x07,
krobertson 17:323fc40376d5 162 DLHC_OUT_Y_L_M = 0x08,
krobertson 17:323fc40376d5 163
krobertson 17:323fc40376d5 164 D_OUT_X_L_M = 0x08,
krobertson 17:323fc40376d5 165 D_OUT_X_H_M = 0x09,
krobertson 17:323fc40376d5 166 D_OUT_Y_L_M = 0x0A,
krobertson 17:323fc40376d5 167 D_OUT_Y_H_M = 0x0B,
krobertson 17:323fc40376d5 168 D_OUT_Z_L_M = 0x0C,
krobertson 17:323fc40376d5 169 D_OUT_Z_H_M = 0x0D
krobertson 17:323fc40376d5 170 };
krobertson 17:323fc40376d5 171
krobertson 17:323fc40376d5 172 /**
krobertson 17:323fc40376d5 173 * \brief accelerometer readings
krobertson 17:323fc40376d5 174 **/
krobertson 17:323fc40376d5 175 vector<int16_t> a;
krobertson 17:323fc40376d5 176 /**
krobertson 17:323fc40376d5 177 * \brief magnetometer readings
krobertson 17:323fc40376d5 178 **/
krobertson 17:323fc40376d5 179 vector<int16_t> m;
krobertson 17:323fc40376d5 180 /**
krobertson 17:323fc40376d5 181 * \brief maximum magnetometer values (calibration values)
krobertson 17:323fc40376d5 182 **/
krobertson 17:323fc40376d5 183 vector<int16_t> m_max;
krobertson 17:323fc40376d5 184 /**
krobertson 17:323fc40376d5 185 * \brief minimum magnetometer values (calibration values)
krobertson 17:323fc40376d5 186 **/
krobertson 17:323fc40376d5 187 vector<int16_t> m_min;
krobertson 17:323fc40376d5 188
krobertson 17:323fc40376d5 189 /**
krobertson 17:323fc40376d5 190 * \brief Compass constructor
krobertson 17:323fc40376d5 191 **/
krobertson 17:323fc40376d5 192 Compass(void);
krobertson 17:323fc40376d5 193
krobertson 17:323fc40376d5 194 /**
krobertson 17:323fc40376d5 195 * \brief setup SPI, determine device type, and setup register addresses for device
krobertson 17:323fc40376d5 196 **/
krobertson 17:323fc40376d5 197 bool init(deviceType device = device_auto);
krobertson 17:323fc40376d5 198
krobertson 17:323fc40376d5 199 /**
krobertson 17:323fc40376d5 200 * \brief get the device type
krobertson 17:323fc40376d5 201 **/
krobertson 17:323fc40376d5 202 int getDeviceType(void) { return _device; }
krobertson 17:323fc40376d5 203
krobertson 17:323fc40376d5 204 /**
krobertson 17:323fc40376d5 205 * \brief enable default settings (writes default values to control registers)
krobertson 17:323fc40376d5 206 **/
krobertson 17:323fc40376d5 207 void enableDefault(void);
krobertson 17:323fc40376d5 208
krobertson 17:323fc40376d5 209 /**
krobertson 17:323fc40376d5 210 * \brief write to an accelerometer register
krobertson 17:323fc40376d5 211 **/
krobertson 17:323fc40376d5 212 void writeAccReg(regAddr reg, int value);
krobertson 17:323fc40376d5 213 int readAccReg(regAddr reg);
krobertson 17:323fc40376d5 214 void writeMagReg(regAddr reg, int value);
krobertson 17:323fc40376d5 215 int readMagReg(regAddr reg);
krobertson 17:323fc40376d5 216
krobertson 17:323fc40376d5 217 void writeReg(regAddr reg, int value);
krobertson 17:323fc40376d5 218 int readReg(regAddr reg);
krobertson 17:323fc40376d5 219
krobertson 17:323fc40376d5 220 void readAcc(void);
krobertson 17:323fc40376d5 221 void readMag(void);
krobertson 17:323fc40376d5 222 void read(void);
krobertson 17:323fc40376d5 223
krobertson 17:323fc40376d5 224 float get_heading(void);
krobertson 17:323fc40376d5 225 template <typename T> float get_heading(vector<T> from);
krobertson 17:323fc40376d5 226
krobertson 17:323fc40376d5 227 // vector functions
krobertson 17:323fc40376d5 228 template <typename Ta, typename Tb, typename To> static void vector_cross(const vector<Ta> *a, const vector<Tb> *b, vector<To> *out);
krobertson 17:323fc40376d5 229 template <typename Ta, typename Tb> static float vector_dot(const vector<Ta> *a,const vector<Tb> *b);
krobertson 17:323fc40376d5 230 static void vector_normalize(vector<float> *a);
krobertson 17:323fc40376d5 231
krobertson 17:323fc40376d5 232 deviceType _device; // chip type (DLH, DLM, or DLHC)
krobertson 17:323fc40376d5 233
krobertson 17:323fc40376d5 234 private:
krobertson 17:323fc40376d5 235 static const int dummy_reg_count = 6;
krobertson 17:323fc40376d5 236 regAddr translated_regs[dummy_reg_count + 1]; // index 0 not used
krobertson 17:323fc40376d5 237
krobertson 17:323fc40376d5 238 int testReg(regAddr reg);
krobertson 17:323fc40376d5 239 };
krobertson 17:323fc40376d5 240
krobertson 17:323fc40376d5 241 #endif