Class Module for MMA845x I2C Accelerometer.

Dependents:   mDotEVBM2X MTDOT-EVBDemo-DRH MTDOT-BOX-EVB-Factory-Firmware-LIB-108 MTDOT-UDKDemo_Senet ... more

Fork of MMA845x by Sam Grove

Committer:
Evan Hosseini
Date:
Wed Jan 31 10:02:14 2018 -0600
Revision:
5:d662a7003b6f
Parent:
1:41af2b3eefb5
Make driver thread safe by making i2c read transactions atomic

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 0:9d1e3a344e4f 1 /**
sam_grove 0:9d1e3a344e4f 2 * @file MMA845x.h
sam_grove 0:9d1e3a344e4f 3 * @brief Device driver - MMA845x 3-axis accelerometer IC
falingtrea 1:41af2b3eefb5 4 * @author Tim Barr
sam_grove 0:9d1e3a344e4f 5 * @version 1.0
sam_grove 0:9d1e3a344e4f 6 * @see http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8451Q.pdf
sam_grove 0:9d1e3a344e4f 7 * @see http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8452Q.pdf
sam_grove 0:9d1e3a344e4f 8 * @see http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8453Q.pdf
sam_grove 0:9d1e3a344e4f 9 *
falingtrea 1:41af2b3eefb5 10 * Copyright (c) 2015
sam_grove 0:9d1e3a344e4f 11 *
sam_grove 0:9d1e3a344e4f 12 * Licensed under the Apache License, Version 2.0 (the "License");
sam_grove 0:9d1e3a344e4f 13 * you may not use this file except in compliance with the License.
sam_grove 0:9d1e3a344e4f 14 * You may obtain a copy of the License at
sam_grove 0:9d1e3a344e4f 15 *
sam_grove 0:9d1e3a344e4f 16 * http://www.apache.org/licenses/LICENSE-2.0
sam_grove 0:9d1e3a344e4f 17 *
sam_grove 0:9d1e3a344e4f 18 * Unless required by applicable law or agreed to in writing, software
sam_grove 0:9d1e3a344e4f 19 * distributed under the License is distributed on an "AS IS" BASIS,
sam_grove 0:9d1e3a344e4f 20 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sam_grove 0:9d1e3a344e4f 21 * See the License for the specific language governing permissions and
sam_grove 0:9d1e3a344e4f 22 * limitations under the License.
falingtrea 1:41af2b3eefb5 23 * Forked from
sam_grove 0:9d1e3a344e4f 24 */
sam_grove 0:9d1e3a344e4f 25
sam_grove 0:9d1e3a344e4f 26 #ifndef MMA845X_H
sam_grove 0:9d1e3a344e4f 27 #define MMA845X_H
sam_grove 0:9d1e3a344e4f 28
sam_grove 0:9d1e3a344e4f 29 #include "mbed.h"
sam_grove 0:9d1e3a344e4f 30
sam_grove 0:9d1e3a344e4f 31 /** Using the Sparkfun SEN-10955
sam_grove 0:9d1e3a344e4f 32 *
sam_grove 0:9d1e3a344e4f 33 * Example:
sam_grove 0:9d1e3a344e4f 34 * @code
sam_grove 0:9d1e3a344e4f 35 * #include "mbed.h"
sam_grove 0:9d1e3a344e4f 36 * #include "MMA845x.h"
sam_grove 0:9d1e3a344e4f 37 *
sam_grove 0:9d1e3a344e4f 38
sam_grove 0:9d1e3a344e4f 39 *
sam_grove 0:9d1e3a344e4f 40 * int main()
sam_grove 0:9d1e3a344e4f 41 * {
sam_grove 0:9d1e3a344e4f 42
sam_grove 0:9d1e3a344e4f 43 * }
sam_grove 0:9d1e3a344e4f 44 * @endcode
sam_grove 0:9d1e3a344e4f 45 */
sam_grove 0:9d1e3a344e4f 46
sam_grove 0:9d1e3a344e4f 47
sam_grove 0:9d1e3a344e4f 48 /**
sam_grove 0:9d1e3a344e4f 49 * @class MMA845x_DATA
sam_grove 0:9d1e3a344e4f 50 * @brief API abstraction for the MMA845x 3-axis accelerometer IC data
sam_grove 0:9d1e3a344e4f 51 */
sam_grove 0:9d1e3a344e4f 52 class MMA845x_DATA
sam_grove 0:9d1e3a344e4f 53 {
sam_grove 0:9d1e3a344e4f 54 public:
sam_grove 0:9d1e3a344e4f 55
falingtrea 1:41af2b3eefb5 56 volatile int16_t _x; /*!< volatile data variable */
falingtrea 1:41af2b3eefb5 57 volatile int16_t _y; /*!< volatile data variable */
falingtrea 1:41af2b3eefb5 58 volatile int16_t _z; /*!< volatile data variable */
sam_grove 0:9d1e3a344e4f 59
sam_grove 0:9d1e3a344e4f 60 /** Create the MMA845x_DATA object initialized to the parameter (or 0 if none)
sam_grove 0:9d1e3a344e4f 61 * @param x - the init value of _x
sam_grove 0:9d1e3a344e4f 62 * @param y - the init value of _y
sam_grove 0:9d1e3a344e4f 63 * @param x - the init value of _z
sam_grove 0:9d1e3a344e4f 64 */
falingtrea 1:41af2b3eefb5 65 MMA845x_DATA(int16_t x = 0, int16_t y = 0, int16_t z = 0) : _x(x), _y(y), _z(z) {}
sam_grove 0:9d1e3a344e4f 66
sam_grove 0:9d1e3a344e4f 67 /** Overloaded '=' operator to allow shorthand coding, assigning objects to one another
sam_grove 0:9d1e3a344e4f 68 * @param rhs - an object of the same type to assign ourself the same values of
sam_grove 0:9d1e3a344e4f 69 * @return this
sam_grove 0:9d1e3a344e4f 70 */
sam_grove 0:9d1e3a344e4f 71 MMA845x_DATA &operator= (MMA845x_DATA const &rhs)
sam_grove 0:9d1e3a344e4f 72 {
sam_grove 0:9d1e3a344e4f 73 _x = rhs._x;
sam_grove 0:9d1e3a344e4f 74 _y = rhs._y;
sam_grove 0:9d1e3a344e4f 75 _z = rhs._z;
sam_grove 0:9d1e3a344e4f 76
sam_grove 0:9d1e3a344e4f 77 return *this;
sam_grove 0:9d1e3a344e4f 78 }
sam_grove 0:9d1e3a344e4f 79
sam_grove 0:9d1e3a344e4f 80 /** Overloaded '=' operator to allow shorthand coding, assigning objects to one another
sam_grove 0:9d1e3a344e4f 81 * @param val - Assign each data member (_x, _y, _z) this value
sam_grove 0:9d1e3a344e4f 82 * @return this
sam_grove 0:9d1e3a344e4f 83 */
falingtrea 1:41af2b3eefb5 84 MMA845x_DATA &operator= (int16_t const val)
sam_grove 0:9d1e3a344e4f 85 {
sam_grove 0:9d1e3a344e4f 86 _x = _y = _z = val;
sam_grove 0:9d1e3a344e4f 87
sam_grove 0:9d1e3a344e4f 88 return *this;
sam_grove 0:9d1e3a344e4f 89 }
sam_grove 0:9d1e3a344e4f 90
sam_grove 0:9d1e3a344e4f 91 /** Overloaded '==' operator to allow shorthand coding, test objects to one another
sam_grove 0:9d1e3a344e4f 92 * @param rhs - the object to compare against
sam_grove 0:9d1e3a344e4f 93 * @return 1 if the data members are the same and 0 otherwise
sam_grove 0:9d1e3a344e4f 94 */
sam_grove 0:9d1e3a344e4f 95 bool operator== (MMA845x_DATA const &rhs) const
sam_grove 0:9d1e3a344e4f 96 {
sam_grove 0:9d1e3a344e4f 97 return ((_x == rhs._x)&&(_y == rhs._y)&&(_z == rhs._z)) ? 1 : 0;
sam_grove 0:9d1e3a344e4f 98 }
sam_grove 0:9d1e3a344e4f 99 };
sam_grove 0:9d1e3a344e4f 100
sam_grove 0:9d1e3a344e4f 101 /**
sam_grove 0:9d1e3a344e4f 102 * @class MMA845x
sam_grove 0:9d1e3a344e4f 103 * @brief API abstraction for the MMA845x 3-axis accelerometer IC
falingtrea 1:41af2b3eefb5 104 * initial version will be polling only. Interrupt service and rtos support will
falingtrea 1:41af2b3eefb5 105 * be added at a later point
sam_grove 0:9d1e3a344e4f 106 */
sam_grove 0:9d1e3a344e4f 107 class MMA845x
sam_grove 0:9d1e3a344e4f 108 {
sam_grove 0:9d1e3a344e4f 109 public:
sam_grove 0:9d1e3a344e4f 110
sam_grove 0:9d1e3a344e4f 111 /**
falingtrea 1:41af2b3eefb5 112 * @enum SA0
sam_grove 0:9d1e3a344e4f 113 * @brief Possible terminations for the ADDR pin
sam_grove 0:9d1e3a344e4f 114 */
falingtrea 1:41af2b3eefb5 115 enum SA0
sam_grove 0:9d1e3a344e4f 116 {
sam_grove 0:9d1e3a344e4f 117 SA0_VSS = 0, /*!< SA0 connected to VSS */
sam_grove 0:9d1e3a344e4f 118 SA0_VDD /*!< SA0 connected to VDD */
sam_grove 0:9d1e3a344e4f 119 };
sam_grove 0:9d1e3a344e4f 120
sam_grove 0:9d1e3a344e4f 121 /**
falingtrea 1:41af2b3eefb5 122 * @enum WHO_AM_I_VAL
sam_grove 0:9d1e3a344e4f 123 * @brief Device ID's that this class is compatible with
sam_grove 0:9d1e3a344e4f 124 */
falingtrea 1:41af2b3eefb5 125 enum WHO_AM_I_VAL
sam_grove 0:9d1e3a344e4f 126 {
sam_grove 0:9d1e3a344e4f 127 MMA8451 = 0x1a, /*!< MMA8451 WHO_AM_I register content */
sam_grove 0:9d1e3a344e4f 128 MMA8452 = 0x2a, /*!< MMA8452 WHO_AM_I register content */
sam_grove 0:9d1e3a344e4f 129 MMA8453 = 0x3a, /*!< MMA8453 WHO_AM_I register content */
sam_grove 0:9d1e3a344e4f 130 };
falingtrea 1:41af2b3eefb5 131
falingtrea 1:41af2b3eefb5 132 /**
falingtrea 1:41af2b3eefb5 133 * @enum SYS_MODE
falingtrea 1:41af2b3eefb5 134 * @brief operating mode of MMA845x
falingtrea 1:41af2b3eefb5 135 */
falingtrea 1:41af2b3eefb5 136 enum SYS_MODE
falingtrea 1:41af2b3eefb5 137 {
falingtrea 1:41af2b3eefb5 138 STANDBY = 0,
falingtrea 1:41af2b3eefb5 139 WAKE, SLEEP
falingtrea 1:41af2b3eefb5 140 };
falingtrea 1:41af2b3eefb5 141
falingtrea 1:41af2b3eefb5 142 /**
falingtrea 1:41af2b3eefb5 143 * @enum STATUS
falingtrea 1:41af2b3eefb5 144 * @brief flags for data overwrite and data ready
falingtrea 1:41af2b3eefb5 145 */
falingtrea 1:41af2b3eefb5 146 enum STATUS
falingtrea 1:41af2b3eefb5 147 {
falingtrea 1:41af2b3eefb5 148 XDR = 0x01,
falingtrea 1:41af2b3eefb5 149 YDR = 0x02,
falingtrea 1:41af2b3eefb5 150 ZDR = 0x04,
falingtrea 1:41af2b3eefb5 151 XYZDR = 0x08,
falingtrea 1:41af2b3eefb5 152 XOW = 0x10,
falingtrea 1:41af2b3eefb5 153 YOW = 0x20,
falingtrea 1:41af2b3eefb5 154 ZOW = 0x40,
falingtrea 1:41af2b3eefb5 155 XYZOW = 0x80
falingtrea 1:41af2b3eefb5 156 };
falingtrea 1:41af2b3eefb5 157
falingtrea 1:41af2b3eefb5 158 /**
falingtrea 1:41af2b3eefb5 159 * @enum RANGE
falingtrea 1:41af2b3eefb5 160 * @brief values for measurement range positive and negative
falingtrea 1:41af2b3eefb5 161 */
falingtrea 1:41af2b3eefb5 162 enum RANGE
falingtrea 1:41af2b3eefb5 163 {
falingtrea 1:41af2b3eefb5 164 RANGE_2g = 0,
falingtrea 1:41af2b3eefb5 165 RANGE_4g, RANGE_8g
falingtrea 1:41af2b3eefb5 166 };
sam_grove 0:9d1e3a344e4f 167
sam_grove 0:9d1e3a344e4f 168 /**
falingtrea 1:41af2b3eefb5 169 * @enum RESOLUTION
falingtrea 1:41af2b3eefb5 170 * @brief selections for resolution of data, 8 bit or maximum
falingtrea 1:41af2b3eefb5 171 */
falingtrea 1:41af2b3eefb5 172 enum RESOLUTION
falingtrea 1:41af2b3eefb5 173 {
falingtrea 1:41af2b3eefb5 174 RES_MAX = 0, /* Read back full resolution - normal mode*/
falingtrea 1:41af2b3eefb5 175 RES_8BIT = 2 /* Read back 8 bit values only - fast mode*/
falingtrea 1:41af2b3eefb5 176 };
falingtrea 1:41af2b3eefb5 177
falingtrea 1:41af2b3eefb5 178 /**
falingtrea 1:41af2b3eefb5 179 * @enum LOW_NOISE
falingtrea 1:41af2b3eefb5 180 * @brief Low Noise mode Note: 4g max reading when on
falingtrea 1:41af2b3eefb5 181 */
falingtrea 1:41af2b3eefb5 182 enum LOW_NOISE
falingtrea 1:41af2b3eefb5 183 {
falingtrea 1:41af2b3eefb5 184 LN_OFF = 0x00, /* Low Noise mode off */
falingtrea 1:41af2b3eefb5 185 LN_ON = 0x02 /* Low Noise mode on, 4g max readings */
falingtrea 1:41af2b3eefb5 186 };
falingtrea 1:41af2b3eefb5 187
falingtrea 1:41af2b3eefb5 188 /**
falingtrea 1:41af2b3eefb5 189 * @enum HPF_MODE
falingtrea 1:41af2b3eefb5 190 * @brief High Pass Filter mode
falingtrea 1:41af2b3eefb5 191 */
falingtrea 1:41af2b3eefb5 192 enum HPF_MODE
falingtrea 1:41af2b3eefb5 193 {
falingtrea 1:41af2b3eefb5 194 HPF_OFF = 0x00, /* High Pass Filter mode off */
falingtrea 1:41af2b3eefb5 195 HPF_ON = 0x10 /* High Pass Filter mode on */
falingtrea 1:41af2b3eefb5 196 };
falingtrea 1:41af2b3eefb5 197
falingtrea 1:41af2b3eefb5 198 /**
falingtrea 1:41af2b3eefb5 199 * @enum DATA_RATE
falingtrea 1:41af2b3eefb5 200 * @brief values for normal output data rate in Hz
falingtrea 1:41af2b3eefb5 201 */
falingtrea 1:41af2b3eefb5 202 enum DATA_RATE
falingtrea 1:41af2b3eefb5 203 {
falingtrea 1:41af2b3eefb5 204 DR_800 = 0x00,
falingtrea 1:41af2b3eefb5 205 DR_400 = 0x08,
falingtrea 1:41af2b3eefb5 206 DR_200 = 0x10,
falingtrea 1:41af2b3eefb5 207 DR_100 = 0x18,
falingtrea 1:41af2b3eefb5 208 DR_50 = 0x20,
falingtrea 1:41af2b3eefb5 209 DR_12_5 = 0x28,
falingtrea 1:41af2b3eefb5 210 DR_6_25 = 0x30,
falingtrea 1:41af2b3eefb5 211 DR_1_56 = 0x38
falingtrea 1:41af2b3eefb5 212 };
falingtrea 1:41af2b3eefb5 213 /**
falingtrea 1:41af2b3eefb5 214 * @enum ASLP_DATA_RATE
falingtrea 1:41af2b3eefb5 215 * @brief values for auto_sleep mode data rate in HZ
falingtrea 1:41af2b3eefb5 216 */
falingtrea 1:41af2b3eefb5 217 enum ASLP_DATA_RATE
falingtrea 1:41af2b3eefb5 218 {
falingtrea 1:41af2b3eefb5 219 ASLPDR_50 = 0x00,
falingtrea 1:41af2b3eefb5 220 ALSPDR_12_5 = 0x40,
falingtrea 1:41af2b3eefb5 221 ASLPDR_6_25 = 0x80,
falingtrea 1:41af2b3eefb5 222 ASLPDR_1_56 = 0xB0
falingtrea 1:41af2b3eefb5 223 };
falingtrea 1:41af2b3eefb5 224
falingtrea 1:41af2b3eefb5 225 /**
falingtrea 1:41af2b3eefb5 226 * @enum OVERSAMPLE_MODE
falingtrea 1:41af2b3eefb5 227 * @brief sets the oversample mode, Normal, Low power and noise, High resolution, or low power
falingtrea 1:41af2b3eefb5 228 */
falingtrea 1:41af2b3eefb5 229 enum OVERSAMPLE_MODE
falingtrea 1:41af2b3eefb5 230 {
falingtrea 1:41af2b3eefb5 231 OS_NORMAL = 0,
falingtrea 1:41af2b3eefb5 232 OS_LO_PN, OS_HI_RES, OS_LO_POW
falingtrea 1:41af2b3eefb5 233 };
falingtrea 1:41af2b3eefb5 234
falingtrea 1:41af2b3eefb5 235 /**
falingtrea 1:41af2b3eefb5 236 * @enum REGISTER
sam_grove 0:9d1e3a344e4f 237 * @brief The device register map
sam_grove 0:9d1e3a344e4f 238 */
falingtrea 1:41af2b3eefb5 239 enum REGISTER
sam_grove 0:9d1e3a344e4f 240 {
falingtrea 1:41af2b3eefb5 241 STATUS = 0x00,
sam_grove 0:9d1e3a344e4f 242 OUT_X_MSB, OUT_X_LSB, OUT_Y_MSB, OUT_Y_LSB, OUT_Z_MSB, OUT_Z_LSB,
sam_grove 0:9d1e3a344e4f 243
falingtrea 1:41af2b3eefb5 244 F_SETUP = 0x09, TRIG_CFG, // only available on the MMA8451 variant
sam_grove 0:9d1e3a344e4f 245
falingtrea 1:41af2b3eefb5 246 SYSMOD = 0x0B,
sam_grove 0:9d1e3a344e4f 247 INT_SOURCE, WHO_AM_I, XYZ_DATA_CFG, HP_FILTER_CUTOFF, PL_STATUS,
sam_grove 0:9d1e3a344e4f 248 PL_CFG, PL_COUNT, PL_BF_ZCOMP, P_L_THS_REG, FF_MT_CFG, FF_MT_SRC,
sam_grove 0:9d1e3a344e4f 249 FF_MT_THS, FF_MT_COUNT,
sam_grove 0:9d1e3a344e4f 250
falingtrea 1:41af2b3eefb5 251 TRANSIENT_CFG = 0x1D,
sam_grove 0:9d1e3a344e4f 252 TRANSIENT_SRC, TRANSIENT_THS, TRANSIENT_COUNT, PULSE_CFG, PULSE_SRC,
sam_grove 0:9d1e3a344e4f 253 PULSE_THSX, PULSE_THSY, PULSE_THSZ, PULSE_TMLT, PULSE_LTCY, PULSE_WIND,
sam_grove 0:9d1e3a344e4f 254 ASLP_COUNT, CTRL_REG1, CTRL_REG2, CTRL_REG3, CTRL_REG4, CTRL_REG5,
sam_grove 0:9d1e3a344e4f 255 OFF_X, OFF_Y, OFF_Z
sam_grove 0:9d1e3a344e4f 256 };
sam_grove 0:9d1e3a344e4f 257
sam_grove 0:9d1e3a344e4f 258 /** Create the MMA845x object
sam_grove 0:9d1e3a344e4f 259 * @param i2c - A defined I2C object
falingtrea 1:41af2b3eefb5 260 * @param int1 - A defined InterruptIn object pointer. Default NULL for polling mode
falingtrea 1:41af2b3eefb5 261 * @param int2 - A defined InterruptIn object pointer. Default NULL for polling mode
falingtrea 1:41af2b3eefb5 262 * @param i2c_addr - state of pin SA0
falingtrea 1:41af2b3eefb5 263 * TODO - need to add interrupt support
sam_grove 0:9d1e3a344e4f 264 */
falingtrea 1:41af2b3eefb5 265 MMA845x(I2C &i2c, SA0 const i2c_addr = SA0_VSS, InterruptIn* int1 = NULL, InterruptIn* int2 = NULL);
sam_grove 0:9d1e3a344e4f 266
sam_grove 0:9d1e3a344e4f 267 /** Get the X data
falingtrea 1:41af2b3eefb5 268 * @return The last valid X-axis reading from the accelerometer
sam_grove 0:9d1e3a344e4f 269 */
falingtrea 1:41af2b3eefb5 270 int16_t getX(void);
sam_grove 0:9d1e3a344e4f 271
sam_grove 0:9d1e3a344e4f 272 /** Get the Y data
falingtrea 1:41af2b3eefb5 273 * @return The last valid Y-axis reading from the accelerometer
sam_grove 0:9d1e3a344e4f 274 */
falingtrea 1:41af2b3eefb5 275 int16_t getY(void);
sam_grove 0:9d1e3a344e4f 276
sam_grove 0:9d1e3a344e4f 277 /** Get the Z data
falingtrea 1:41af2b3eefb5 278 * @return The last Z-axis valid reading from the accelerometer
sam_grove 0:9d1e3a344e4f 279 */
falingtrea 1:41af2b3eefb5 280 int16_t getZ(void);
falingtrea 1:41af2b3eefb5 281
falingtrea 1:41af2b3eefb5 282 /** Get the XYZ data structure
falingtrea 1:41af2b3eefb5 283 * @return The last valid X, Y, and Z-axis readings from the accelerometer
falingtrea 1:41af2b3eefb5 284 */
falingtrea 1:41af2b3eefb5 285 MMA845x_DATA getXYZ(void);
sam_grove 0:9d1e3a344e4f 286
sam_grove 0:9d1e3a344e4f 287 /** Get the XYZ data structure
falingtrea 1:41af2b3eefb5 288 * @return accelerometer ID code. Test versus the WHO_AM_I_VAL enum
falingtrea 1:41af2b3eefb5 289 */
falingtrea 1:41af2b3eefb5 290 char getWhoAmI(void) const;
falingtrea 1:41af2b3eefb5 291
falingtrea 1:41af2b3eefb5 292 /** Setup the MMA845x for standard accelerometer read mode
falingtrea 1:41af2b3eefb5 293 * @range - set the measurement range using RANGE enum
falingtrea 1:41af2b3eefb5 294 * @resolution - set the ADC resolution using the RESOLUTION enum
falingtrea 1:41af2b3eefb5 295 * @lo_noise - Set the Low-Noise mode using the LOW_NOISE enum
falingtrea 1:41af2b3eefb5 296 * @data_rate - set the aquisition rate using the DATA_RATE enum
falingtrea 1:41af2b3eefb5 297 * @os_mode - Set the Over sample mode suing the OVERSAMPLE_MODE enum
falingtrea 1:41af2b3eefb5 298 * @hpf_mode - Set the Hi pass filter mode using the HPF_MOSE enum
falingtrea 1:41af2b3eefb5 299 * @return status of command
falingtrea 1:41af2b3eefb5 300 *
falingtrea 1:41af2b3eefb5 301 * This sets the resolution, range, data rate, oversample
falingtrea 1:41af2b3eefb5 302 * mode, hi and lo pass filter.
falingtrea 1:41af2b3eefb5 303 */
falingtrea 1:41af2b3eefb5 304 uint8_t setCommonParameters(RANGE range, RESOLUTION resolution, LOW_NOISE lo_noise,
falingtrea 1:41af2b3eefb5 305 DATA_RATE data_rate, OVERSAMPLE_MODE os_mode, HPF_MODE hpf_mode ) const;
falingtrea 1:41af2b3eefb5 306
falingtrea 1:41af2b3eefb5 307 /** Ebnable Motion detect mode and interrupt handler
falingtrea 1:41af2b3eefb5 308 * @return status of command
falingtrea 1:41af2b3eefb5 309 * TODO - need to implement function
sam_grove 0:9d1e3a344e4f 310 */
falingtrea 1:41af2b3eefb5 311 uint8_t enableMotionDetect(void) const;
falingtrea 1:41af2b3eefb5 312
falingtrea 1:41af2b3eefb5 313 /** Enable Pulse Detect mode and interrupt handler
falingtrea 1:41af2b3eefb5 314 * @return status of command
falingtrea 1:41af2b3eefb5 315 * TODO - need to implement function
falingtrea 1:41af2b3eefb5 316 */
falingtrea 1:41af2b3eefb5 317 uint8_t enablePulseDetect(void) const;
falingtrea 1:41af2b3eefb5 318
falingtrea 1:41af2b3eefb5 319 /** Enable Orientation mode and interrupt handler
falingtrea 1:41af2b3eefb5 320 * @return status of command
falingtrea 1:41af2b3eefb5 321 * TODO - need to implement function
sam_grove 0:9d1e3a344e4f 322 */
falingtrea 1:41af2b3eefb5 323 uint8_t enableOrientationDetect(void) const;
falingtrea 1:41af2b3eefb5 324
falingtrea 1:41af2b3eefb5 325 /** Enable Transient detect mode and interrupt handler
falingtrea 1:41af2b3eefb5 326 * @return status of command
falingtrea 1:41af2b3eefb5 327 * TODO - need to implement function
falingtrea 1:41af2b3eefb5 328 */
falingtrea 1:41af2b3eefb5 329 uint8_t enableTransientDetect(void) const;
falingtrea 1:41af2b3eefb5 330
falingtrea 1:41af2b3eefb5 331 /** Enable Autosleep function and interrupt handler
falingtrea 1:41af2b3eefb5 332 * @return status of command
falingtrea 1:41af2b3eefb5 333 * TODO - need to implement function
falingtrea 1:41af2b3eefb5 334 */
falingtrea 1:41af2b3eefb5 335 uint8_t enableAutoSleep(void) const;
falingtrea 1:41af2b3eefb5 336
falingtrea 1:41af2b3eefb5 337 /** Enbale FIFO function and interrupt handler
falingtrea 1:41af2b3eefb5 338 * @return status of command
falingtrea 1:41af2b3eefb5 339 * TODO - need to implement function
falingtrea 1:41af2b3eefb5 340 */
falingtrea 1:41af2b3eefb5 341 uint8_t enableFIFO(void) const;
sam_grove 0:9d1e3a344e4f 342
falingtrea 1:41af2b3eefb5 343 /** Put the MMA845x in the Standby mode
falingtrea 1:41af2b3eefb5 344 * @return status of command
sam_grove 0:9d1e3a344e4f 345 */
falingtrea 1:41af2b3eefb5 346 uint8_t standbyMode(void) const;
falingtrea 1:41af2b3eefb5 347
falingtrea 1:41af2b3eefb5 348 /** Put the MMA845x in the active mode
falingtrea 1:41af2b3eefb5 349 * @return status of command
falingtrea 1:41af2b3eefb5 350 */
falingtrea 1:41af2b3eefb5 351 uint8_t activeMode(void) const;
sam_grove 0:9d1e3a344e4f 352
falingtrea 1:41af2b3eefb5 353 /** Check the MMA845x status register
falingtrea 1:41af2b3eefb5 354 * @return status byte
falingtrea 1:41af2b3eefb5 355 */
falingtrea 1:41af2b3eefb5 356 uint8_t getStatus(void) const;
falingtrea 1:41af2b3eefb5 357
sam_grove 0:9d1e3a344e4f 358
sam_grove 0:9d1e3a344e4f 359 private:
sam_grove 0:9d1e3a344e4f 360
sam_grove 0:9d1e3a344e4f 361 I2C *_i2c;
sam_grove 0:9d1e3a344e4f 362 InterruptIn *_int1;
sam_grove 0:9d1e3a344e4f 363 InterruptIn *_int2;
sam_grove 0:9d1e3a344e4f 364 uint8_t _i2c_addr;
falingtrea 1:41af2b3eefb5 365 char _who_am_i;
sam_grove 0:9d1e3a344e4f 366 MMA845x_DATA _data;
falingtrea 1:41af2b3eefb5 367 bool _polling_mode;
falingtrea 1:41af2b3eefb5 368
falingtrea 1:41af2b3eefb5 369 uint8_t init(void);
sam_grove 0:9d1e3a344e4f 370
falingtrea 1:41af2b3eefb5 371 /** Write to a register (exposed for debugging reasons)
falingtrea 1:41af2b3eefb5 372 * Note: most writes are only valid in stop mode
falingtrea 1:41af2b3eefb5 373 * @param reg - The register to be written
falingtrea 1:41af2b3eefb5 374 * @param data - The data to be written
falingtrea 1:41af2b3eefb5 375 */
falingtrea 1:41af2b3eefb5 376 uint8_t writeRegister(uint8_t const reg, uint8_t const data) const;
falingtrea 1:41af2b3eefb5 377
falingtrea 1:41af2b3eefb5 378 /** Read from a register (exposed for debugging reasons)
falingtrea 1:41af2b3eefb5 379 * @param reg - The register to read from
falingtrea 1:41af2b3eefb5 380 * @return The register contents
falingtrea 1:41af2b3eefb5 381 */
falingtrea 1:41af2b3eefb5 382 uint8_t readRegister(uint8_t const reg, uint8_t count, char* data) const;
falingtrea 1:41af2b3eefb5 383
falingtrea 1:41af2b3eefb5 384
sam_grove 0:9d1e3a344e4f 385 };
sam_grove 0:9d1e3a344e4f 386
sam_grove 0:9d1e3a344e4f 387 #endif