MMA7361L interface

Dependents:   MMA7361L_Example ARLISS2012_Hidaka

Revision:
0:d66a303c5664
Child:
2:ce1a0d55f3c9
diff -r 000000000000 -r d66a303c5664 MMA7361L.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MMA7361L.h	Wed Apr 25 02:33:51 2012 +0000
@@ -0,0 +1,184 @@
+#ifndef MMA7361L_H
+#define MMA7361L_H
+
+#include "mbed.h"
+
+/**
+ * MMA7361L accelerometer
+ */
+class MMA7361L {
+public:
+    /**
+     * Creates an MMA7361L accelerometer interface, connected to the specified pins
+     *
+     * @param xoutPin xout pin
+     * @param youtPin yout pin
+     * @param zoutPin zout pin
+     * @param zeroGDetectPin 0G detect pin
+     * @param gSelectPin select 1.5G/6G pin
+     * @param sleepPin sleep pin
+     *
+     */
+    MMA7361L(PinName xoutPin, PinName youtPin, PinName zoutPin, PinName zeroGDetectPin = NC, PinName gSelectPin = NC, PinName sleepPin = NC);
+
+    /**
+    * Scale enumeration declaration
+    */
+    enum Scale {
+
+        /**
+         * 1.5G mode
+         */
+        SCALE_1_5G,
+
+        /**
+         * 6G mode
+         */
+        SCALE_6G
+    };
+
+    /**
+     * Gets the current total acceleration
+     *
+     * @param forceRead true to read the device, false to use cache whenever appropriate
+     * @returns total acceleration in g
+     */
+    float getAccel(bool forceRead = false);
+
+    /**
+     * Gets the current acceleration along the X axis
+     *
+     * @param forceRead true to read the device, false to use cache whenever appropriate
+     * @returns acceleration along the X axis
+     */
+    float getAccelX(bool forceRead = false);
+
+    /**
+     * Gets the current acceleration along the Y axis
+     *
+     * @param forceRead true to read the device, false to use cache whenever appropriate
+     * @returns acceleration along the Y axis
+     */
+    float getAccelY(bool forceRead = false);
+
+    /**
+     * Gets the current acceleration along the Z axis
+     *
+     * @param forceRead true to read the device, false to use cache whenever appropriate
+     * @returns acceleration along the Z axis
+     */
+    float getAccelZ(bool forceRead = false);
+
+    /**
+     * Computes the inclination of the X axis
+     *
+     * @param forceRead true to read the device, false to use cache whenever appropriate
+     * @returns the inclination of the X axis
+     */
+    float getTiltX(bool forceRead = false);
+
+    /**
+     * Computes the inclination of the Y axis
+     *
+     * @param forceRead true to read the device, false to use cache whenever appropriate
+     * @returns the inclination of the Y axis
+     */
+    float getTiltY(bool forceRead = false);
+
+    /**
+     * Computes the inclination of the Z axis
+     *
+     * @param forceRead true to read the device, false to use cache whenever appropriate
+     * @returns the inclination of the Z axis
+     */
+    float getTiltZ(bool forceRead = false);
+
+    /**
+     * Specifies the scale to use
+     *
+     * @param scale SCALE_1_5G (for 1.5G) or SCALE_6G (for 6G)
+     */
+    void setScale(Scale scale);
+
+    /**
+     * Sets sleep mode
+     *
+     * @param on true to activate sleep mode, false to resume normal operation
+     */
+    void setSleep(bool on);
+
+    /**
+     * Tests whether 0G is detected
+     *
+     * @returns true if 0G is detected, false otherwise
+     */
+    bool zeroGDetected();
+
+    /**
+     * Sets fucntion to be called when 0G is detected
+     *
+     * @param func pointer to a function called when 0G is detected, 0 to reset as none
+     */
+    void setZeroGDetectListener(void (*func)(void));
+
+    /**
+     * Sets member fucntion to be called when 0G is detected
+     *
+     * @param t pointer to the object to call the member function on
+     * @param func pointer to the member function to be called when 0G is detected, 0 to reset as none
+     */
+    template<typename T>
+    void setZeroGDetectListener(T* t, void (T::*func)(void));
+
+    /**
+    * Prints instance info for debugging
+    */
+    void printInfo();
+
+    /**
+     * Sets calibration info
+     *
+     * @param scale scale for calibration
+     * @param minX min X value when the X axis is vertical and stable under 1g
+     * @param maxX max X value when the X axis is vertical and stable under 1g
+     * @param minY min Y value when the Y axis is vertical and stable under 1g
+     * @param maxY max Y value when the Y axis is vertical and stable under 1g
+     * @param minZ min Z value when the Z axis is vertical and stable under 1g
+     * @param maxZ max Z value when the Z axis is vertical and stable under 1g
+     */
+
+    void calibrate(Scale scale, float minX, float maxX, float minY, float maxY, float minZ, float maxZ);
+
+private:
+    enum {
+        ACCEL = 1 << 0,
+        ACCEL_X = 1 << 1,
+        ACCEL_Y = 1 << 2,
+        ACCEL_Z = 1 << 3,
+        TILT_X = 1 << 4,
+        TILT_Y = 1 << 5,
+        TILT_Z = 1 << 6
+    };
+
+    AnalogIn xout, yout, zout;
+    InterruptIn zeroGDetect;
+    DigitalOut gSelect;
+    DigitalOut sleep;
+    bool zeroGDetectEnabled;
+    bool gSelectEnabled;
+    bool sleepEnabled;
+    Scale scale;
+    float ratio;
+    float accelX, accelY, accelZ;
+    int flags;
+    struct Calibration {
+        float minX, maxX;
+        float minY, maxY;
+        float minZ, maxZ;
+    } calib[2];
+
+    void prepare(int type, bool forceRead);
+    float calibrate(float value, int type, Scale scale);
+};
+
+#endif
\ No newline at end of file