MMA7361L interface

Dependents:   MMA7361L_Example ARLISS2012_Hidaka

Committer:
yamaguch
Date:
Mon May 20 05:24:57 2013 +0000
Revision:
2:ce1a0d55f3c9
Parent:
0:d66a303c5664
rename sleep to nSleep

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yamaguch 0:d66a303c5664 1 #ifndef MMA7361L_H
yamaguch 0:d66a303c5664 2 #define MMA7361L_H
yamaguch 0:d66a303c5664 3
yamaguch 0:d66a303c5664 4 #include "mbed.h"
yamaguch 0:d66a303c5664 5
yamaguch 0:d66a303c5664 6 /**
yamaguch 0:d66a303c5664 7 * MMA7361L accelerometer
yamaguch 0:d66a303c5664 8 */
yamaguch 0:d66a303c5664 9 class MMA7361L {
yamaguch 0:d66a303c5664 10 public:
yamaguch 0:d66a303c5664 11 /**
yamaguch 0:d66a303c5664 12 * Creates an MMA7361L accelerometer interface, connected to the specified pins
yamaguch 0:d66a303c5664 13 *
yamaguch 0:d66a303c5664 14 * @param xoutPin xout pin
yamaguch 0:d66a303c5664 15 * @param youtPin yout pin
yamaguch 0:d66a303c5664 16 * @param zoutPin zout pin
yamaguch 0:d66a303c5664 17 * @param zeroGDetectPin 0G detect pin
yamaguch 0:d66a303c5664 18 * @param gSelectPin select 1.5G/6G pin
yamaguch 2:ce1a0d55f3c9 19 * @param nSleepPin ~sleep pin
yamaguch 0:d66a303c5664 20 *
yamaguch 0:d66a303c5664 21 */
yamaguch 0:d66a303c5664 22 MMA7361L(PinName xoutPin, PinName youtPin, PinName zoutPin, PinName zeroGDetectPin = NC, PinName gSelectPin = NC, PinName sleepPin = NC);
yamaguch 0:d66a303c5664 23
yamaguch 0:d66a303c5664 24 /**
yamaguch 0:d66a303c5664 25 * Scale enumeration declaration
yamaguch 0:d66a303c5664 26 */
yamaguch 0:d66a303c5664 27 enum Scale {
yamaguch 0:d66a303c5664 28
yamaguch 0:d66a303c5664 29 /**
yamaguch 0:d66a303c5664 30 * 1.5G mode
yamaguch 0:d66a303c5664 31 */
yamaguch 0:d66a303c5664 32 SCALE_1_5G,
yamaguch 0:d66a303c5664 33
yamaguch 0:d66a303c5664 34 /**
yamaguch 0:d66a303c5664 35 * 6G mode
yamaguch 0:d66a303c5664 36 */
yamaguch 0:d66a303c5664 37 SCALE_6G
yamaguch 0:d66a303c5664 38 };
yamaguch 0:d66a303c5664 39
yamaguch 0:d66a303c5664 40 /**
yamaguch 0:d66a303c5664 41 * Gets the current total acceleration
yamaguch 0:d66a303c5664 42 *
yamaguch 0:d66a303c5664 43 * @param forceRead true to read the device, false to use cache whenever appropriate
yamaguch 0:d66a303c5664 44 * @returns total acceleration in g
yamaguch 0:d66a303c5664 45 */
yamaguch 0:d66a303c5664 46 float getAccel(bool forceRead = false);
yamaguch 0:d66a303c5664 47
yamaguch 0:d66a303c5664 48 /**
yamaguch 0:d66a303c5664 49 * Gets the current acceleration along the X axis
yamaguch 0:d66a303c5664 50 *
yamaguch 0:d66a303c5664 51 * @param forceRead true to read the device, false to use cache whenever appropriate
yamaguch 0:d66a303c5664 52 * @returns acceleration along the X axis
yamaguch 0:d66a303c5664 53 */
yamaguch 0:d66a303c5664 54 float getAccelX(bool forceRead = false);
yamaguch 0:d66a303c5664 55
yamaguch 0:d66a303c5664 56 /**
yamaguch 0:d66a303c5664 57 * Gets the current acceleration along the Y axis
yamaguch 0:d66a303c5664 58 *
yamaguch 0:d66a303c5664 59 * @param forceRead true to read the device, false to use cache whenever appropriate
yamaguch 0:d66a303c5664 60 * @returns acceleration along the Y axis
yamaguch 0:d66a303c5664 61 */
yamaguch 0:d66a303c5664 62 float getAccelY(bool forceRead = false);
yamaguch 0:d66a303c5664 63
yamaguch 0:d66a303c5664 64 /**
yamaguch 0:d66a303c5664 65 * Gets the current acceleration along the Z axis
yamaguch 0:d66a303c5664 66 *
yamaguch 0:d66a303c5664 67 * @param forceRead true to read the device, false to use cache whenever appropriate
yamaguch 0:d66a303c5664 68 * @returns acceleration along the Z axis
yamaguch 0:d66a303c5664 69 */
yamaguch 0:d66a303c5664 70 float getAccelZ(bool forceRead = false);
yamaguch 0:d66a303c5664 71
yamaguch 0:d66a303c5664 72 /**
yamaguch 0:d66a303c5664 73 * Computes the inclination of the X axis
yamaguch 0:d66a303c5664 74 *
yamaguch 0:d66a303c5664 75 * @param forceRead true to read the device, false to use cache whenever appropriate
yamaguch 0:d66a303c5664 76 * @returns the inclination of the X axis
yamaguch 0:d66a303c5664 77 */
yamaguch 0:d66a303c5664 78 float getTiltX(bool forceRead = false);
yamaguch 0:d66a303c5664 79
yamaguch 0:d66a303c5664 80 /**
yamaguch 0:d66a303c5664 81 * Computes the inclination of the Y axis
yamaguch 0:d66a303c5664 82 *
yamaguch 0:d66a303c5664 83 * @param forceRead true to read the device, false to use cache whenever appropriate
yamaguch 0:d66a303c5664 84 * @returns the inclination of the Y axis
yamaguch 0:d66a303c5664 85 */
yamaguch 0:d66a303c5664 86 float getTiltY(bool forceRead = false);
yamaguch 0:d66a303c5664 87
yamaguch 0:d66a303c5664 88 /**
yamaguch 0:d66a303c5664 89 * Computes the inclination of the Z axis
yamaguch 0:d66a303c5664 90 *
yamaguch 0:d66a303c5664 91 * @param forceRead true to read the device, false to use cache whenever appropriate
yamaguch 0:d66a303c5664 92 * @returns the inclination of the Z axis
yamaguch 0:d66a303c5664 93 */
yamaguch 0:d66a303c5664 94 float getTiltZ(bool forceRead = false);
yamaguch 0:d66a303c5664 95
yamaguch 0:d66a303c5664 96 /**
yamaguch 0:d66a303c5664 97 * Specifies the scale to use
yamaguch 0:d66a303c5664 98 *
yamaguch 0:d66a303c5664 99 * @param scale SCALE_1_5G (for 1.5G) or SCALE_6G (for 6G)
yamaguch 0:d66a303c5664 100 */
yamaguch 0:d66a303c5664 101 void setScale(Scale scale);
yamaguch 0:d66a303c5664 102
yamaguch 0:d66a303c5664 103 /**
yamaguch 0:d66a303c5664 104 * Sets sleep mode
yamaguch 0:d66a303c5664 105 *
yamaguch 0:d66a303c5664 106 * @param on true to activate sleep mode, false to resume normal operation
yamaguch 0:d66a303c5664 107 */
yamaguch 0:d66a303c5664 108 void setSleep(bool on);
yamaguch 0:d66a303c5664 109
yamaguch 0:d66a303c5664 110 /**
yamaguch 0:d66a303c5664 111 * Tests whether 0G is detected
yamaguch 0:d66a303c5664 112 *
yamaguch 0:d66a303c5664 113 * @returns true if 0G is detected, false otherwise
yamaguch 0:d66a303c5664 114 */
yamaguch 0:d66a303c5664 115 bool zeroGDetected();
yamaguch 0:d66a303c5664 116
yamaguch 0:d66a303c5664 117 /**
yamaguch 0:d66a303c5664 118 * Sets fucntion to be called when 0G is detected
yamaguch 0:d66a303c5664 119 *
yamaguch 0:d66a303c5664 120 * @param func pointer to a function called when 0G is detected, 0 to reset as none
yamaguch 0:d66a303c5664 121 */
yamaguch 0:d66a303c5664 122 void setZeroGDetectListener(void (*func)(void));
yamaguch 0:d66a303c5664 123
yamaguch 0:d66a303c5664 124 /**
yamaguch 0:d66a303c5664 125 * Sets member fucntion to be called when 0G is detected
yamaguch 0:d66a303c5664 126 *
yamaguch 0:d66a303c5664 127 * @param t pointer to the object to call the member function on
yamaguch 0:d66a303c5664 128 * @param func pointer to the member function to be called when 0G is detected, 0 to reset as none
yamaguch 0:d66a303c5664 129 */
yamaguch 0:d66a303c5664 130 template<typename T>
yamaguch 0:d66a303c5664 131 void setZeroGDetectListener(T* t, void (T::*func)(void));
yamaguch 0:d66a303c5664 132
yamaguch 0:d66a303c5664 133 /**
yamaguch 0:d66a303c5664 134 * Prints instance info for debugging
yamaguch 0:d66a303c5664 135 */
yamaguch 0:d66a303c5664 136 void printInfo();
yamaguch 0:d66a303c5664 137
yamaguch 0:d66a303c5664 138 /**
yamaguch 0:d66a303c5664 139 * Sets calibration info
yamaguch 0:d66a303c5664 140 *
yamaguch 0:d66a303c5664 141 * @param scale scale for calibration
yamaguch 0:d66a303c5664 142 * @param minX min X value when the X axis is vertical and stable under 1g
yamaguch 0:d66a303c5664 143 * @param maxX max X value when the X axis is vertical and stable under 1g
yamaguch 0:d66a303c5664 144 * @param minY min Y value when the Y axis is vertical and stable under 1g
yamaguch 0:d66a303c5664 145 * @param maxY max Y value when the Y axis is vertical and stable under 1g
yamaguch 0:d66a303c5664 146 * @param minZ min Z value when the Z axis is vertical and stable under 1g
yamaguch 0:d66a303c5664 147 * @param maxZ max Z value when the Z axis is vertical and stable under 1g
yamaguch 0:d66a303c5664 148 */
yamaguch 0:d66a303c5664 149
yamaguch 0:d66a303c5664 150 void calibrate(Scale scale, float minX, float maxX, float minY, float maxY, float minZ, float maxZ);
yamaguch 0:d66a303c5664 151
yamaguch 0:d66a303c5664 152 private:
yamaguch 0:d66a303c5664 153 enum {
yamaguch 0:d66a303c5664 154 ACCEL = 1 << 0,
yamaguch 0:d66a303c5664 155 ACCEL_X = 1 << 1,
yamaguch 0:d66a303c5664 156 ACCEL_Y = 1 << 2,
yamaguch 0:d66a303c5664 157 ACCEL_Z = 1 << 3,
yamaguch 0:d66a303c5664 158 TILT_X = 1 << 4,
yamaguch 0:d66a303c5664 159 TILT_Y = 1 << 5,
yamaguch 0:d66a303c5664 160 TILT_Z = 1 << 6
yamaguch 0:d66a303c5664 161 };
yamaguch 0:d66a303c5664 162
yamaguch 0:d66a303c5664 163 AnalogIn xout, yout, zout;
yamaguch 0:d66a303c5664 164 InterruptIn zeroGDetect;
yamaguch 0:d66a303c5664 165 DigitalOut gSelect;
yamaguch 2:ce1a0d55f3c9 166 DigitalOut nSleep;
yamaguch 0:d66a303c5664 167 bool zeroGDetectEnabled;
yamaguch 0:d66a303c5664 168 bool gSelectEnabled;
yamaguch 0:d66a303c5664 169 bool sleepEnabled;
yamaguch 0:d66a303c5664 170 Scale scale;
yamaguch 0:d66a303c5664 171 float ratio;
yamaguch 0:d66a303c5664 172 float accelX, accelY, accelZ;
yamaguch 0:d66a303c5664 173 int flags;
yamaguch 0:d66a303c5664 174 struct Calibration {
yamaguch 0:d66a303c5664 175 float minX, maxX;
yamaguch 0:d66a303c5664 176 float minY, maxY;
yamaguch 0:d66a303c5664 177 float minZ, maxZ;
yamaguch 0:d66a303c5664 178 } calib[2];
yamaguch 0:d66a303c5664 179
yamaguch 0:d66a303c5664 180 void prepare(int type, bool forceRead);
yamaguch 0:d66a303c5664 181 float calibrate(float value, int type, Scale scale);
yamaguch 0:d66a303c5664 182 };
yamaguch 0:d66a303c5664 183
yamaguch 0:d66a303c5664 184 #endif