1

Revision:
12:172540ff6b8b
Parent:
11:dfd1e0afcb7b
Child:
13:4bd8b4cd479d
--- a/MMA8452.h	Tue Mar 04 16:23:40 2014 +0000
+++ b/MMA8452.h	Tue Mar 04 17:50:47 2014 +0000
@@ -74,42 +74,44 @@
 #endif
 
 // Register descriptions found in section 6 of pdf
-#define STATUS 0x00                         // Type 'read' : Real time status, should return 0x00
-#define OUT_X_MSB 0x01                      // Type 'read' : x axis - 8 most significatn bit of a 12 bit sample
-#define OUT_X_LSB 0x02                      // Type 'read' : x axis - 4 least significatn bit of a 12 bit sample
-#define OUT_Y_MSB 0x03                      // Type 'read' : y axis - 8 most significatn bit of a 12 bit sample
-#define OUT_Y_LSB 0x04                      // Type 'read' : y axis - 4 least significatn bit of a 12 bit sample
-#define OUT_Z_MSB 0x05                      // Type 'read' : z axis - 8 most significatn bit of a 12 bit sample
-#define OUT_Z_LSB 0x06                      // Type 'read' : z axis - 4 least significatn bit of a 12 bit sample
+#define MMA8452_STATUS 0x00                 // Type 'read' : Status of the data registers
+#define MMA8452_OUT_X_MSB 0x01              // Type 'read' : x axis - MSB of 2 byte sample
+#define MMA8452_OUT_X_LSB 0x02              // Type 'read' : x axis - LSB of 2 byte sample
+#define MMA8452_OUT_Y_MSB 0x03              // Type 'read' : y axis - MSB of 2 byte sample
+#define MMA8452_OUT_Y_LSB 0x04              // Type 'read' : y axis - LSB of 2 byte sample
+#define MMA8452_OUT_Z_MSB 0x05              // Type 'read' : z axis - MSB of 2 byte sample
+#define MMA8452_OUT_Z_LSB 0x06              // Type 'read' : z axis - LSB of 2 byte sample
 
-#define SYSMOD 0x0B                         // Type 'read' : This tells you if device is active, sleep or standy 0x00=STANDBY 0x01=WAKE 0x02=SLEEP
-#define WHO_AM_I 0x0D                       // Type 'read' : This should return the device id of 0x2A
+// register definitions
+#define MMA8452_XYZ_DATA_CFG 0x0E
+
+#define MMA8452_SYSMOD 0x0B                         // Type 'read' : This tells you if device is active, sleep or standy 0x00=STANDBY 0x01=WAKE 0x02=SLEEP
+#define MMA8452_WHO_AM_I 0x0D                       // Type 'read' : This should return the device id of 0x2A
 
-#define PL_STATUS 0x10                      // Type 'read' : This shows portrait landscape mode orientation
-#define PL_CFG 0x11                         // Type 'read/write' : This allows portrait landscape configuration
-#define PL_COUNT 0x12                       // Type 'read' : This is the portraint landscape debounce counter
-#define PL_BF_ZCOMP 0x13                    // Type 'read' :
-#define PL_THS_REG 0x14                     // Type 'read' :
+#define MMA8452_PL_STATUS 0x10                      // Type 'read' : This shows portrait landscape mode orientation
+#define MMA8452_PL_CFG 0x11                         // Type 'read/write' : This allows portrait landscape configuration
+#define MMA8452_PL_COUNT 0x12                       // Type 'read' : This is the portraint landscape debounce counter
+#define MMA8452_PL_BF_ZCOMP 0x13                    // Type 'read' :
+#define MMA8452_PL_THS_REG 0x14                     // Type 'read' :
 
-#define FF_MT_CFG 0X15                      // Type 'read/write' : Freefaul motion functional block configuration
-#define FF_MT_SRC 0X16                      // Type 'read' : Freefaul motion event source register
-#define FF_MT_THS 0X17                      // Type 'read' : Freefaul motion threshold register
-#define FF_COUNT 0X18                       // Type 'read' : Freefaul motion debouce counter
+#define MMA8452_FF_MT_CFG 0X15                      // Type 'read/write' : Freefaul motion functional block configuration
+#define MMA8452_FF_MT_SRC 0X16                      // Type 'read' : Freefaul motion event source register
+#define MMA8452_FF_MT_THS 0X17                      // Type 'read' : Freefaul motion threshold register
+#define MMA8452_FF_COUNT 0X18                       // Type 'read' : Freefaul motion debouce counter
 
-#define ASLP_COUNT 0x29                     // Type 'read/write' : Counter settings for auto sleep
-#define CTRL_REG_1 0x2A                     // Type 'read/write' :
-#define CTRL_REG_2 0x2B                     // Type 'read/write' :
-#define CTRL_REG_3 0x2C                     // Type 'read/write' :
-#define CTRL_REG_4 0x2D                     // Type 'read/write' :
-#define CTRL_REG_5 0x2E                     // Type 'read/write' :
+#define MMA8452_ASLP_COUNT 0x29                     // Type 'read/write' : Counter settings for auto sleep
+#define MMA8452_CTRL_REG_1 0x2A                     // Type 'read/write' :
+#define MMA8452_CTRL_REG_2 0x2B                     // Type 'read/write' :
+#define MMA8452_CTRL_REG_3 0x2C                     // Type 'read/write' :
+#define MMA8452_CTRL_REG_4 0x2D                     // Type 'read/write' :
+#define MMA8452_CTRL_REG_5 0x2E                     // Type 'read/write' :
 
 // Defined in table 13 of the Freescale PDF
+/// xxx these all need to have better names
 #define STANDBY 0x00                        // State value returned after a SYSMOD request, it can be in state STANDBY, WAKE or SLEEP
 #define WAKE 0x01                           // State value returned after a SYSMOD request, it can be in state STANDBY, WAKE or SLEEP
 #define SLEEP 0x02                          // State value returned after a SYSMOD request, it can be in state STANDBY, WAKE or SLEEP
 #define ACTIVE 0x01                         // Stage value returned and set in Control Register 1, it can be STANDBY=00, or ACTIVE=01
-
-
  
 #define TILT_STATUS 0x03        // Tilt Status (Read only)
 #define SRST_STATUS 0x04        // Sample Rate Status Register (Read only)
@@ -120,23 +122,27 @@
 #define PDET_STATUS 0x09        // Tap/Pulse Detection Register (Read/Write)
 #define PD_STATUS 0xA           // Tap/Pulse Debounce Count Register (Read/Write)
  
+// masks for enabling/disabling standby
 #define MMA8452_ACTIVE_MASK 0x01
 #define MMA8452_STANDBY_MASK 0xFE
- 
-#define MMA8452_XYZ_DATA_CFG 0x0E
-#define MMA8452_CTRL_REG_1 0x2A
 
+// mask for dynamic range reading and writing
 #define MMA8452_DYNAMIC_RANGE_MASK 0xFC
 
-
+// mask and shift for data rate reading and writing
 #define MMA8452_DATA_RATE_MASK 0xC7
 #define MMA8452_DATA_RATE_MASK_SHIFT 0x03
 
+// mask and shift for general reading and writing
 #define MMA8452_WRITE_MASK 0xFE
 #define MMA8452_READ_MASK 0x01
 
+// mask and shift for bit depth reading and writing
 #define MMA8452_BIT_DEPTH_MASK 0xFD
 #define MMA8452_BIT_DEPTH_MASK_SHIFT 0x01
+
+// status masks and shifts
+#define MMA8452_STATUS_ZYXDR_MASK 0x08
  
 class MMA8452         
 {        
@@ -151,7 +157,8 @@
         
        enum BitDepth {
            BIT_DEPTH_12=0x00,
-           BIT_DEPTH_8 // 1 sets fast read mode, hence the inversion
+           BIT_DEPTH_8, // 1 sets fast read mode, hence the inversion
+           BIT_DEPTH_UNKNOWN
        };
        
        enum DataRateHz {
@@ -228,21 +235,19 @@
         */        
       int getDeviceID(char* dst);  
       
-      int read_y();
-      
-      int read_z();  
+      int getStatus(char* dst);  
 
       /** Read the x register of the MMA8452
         *
         * @returns The value of x acceleration
         */
-      int readRawX(char *xaxis);
-      //int read_x(int& xaxisLSB);
+      int readRawX(char *dst);
+      
       /** Read the y register of the MMA8452
-        *
-        * @returns The value of y acceleration
-        */
-      int readRawY(char *yaxis);
+       * @param dst The destination buffer
+       * @returns The value of y acceleration
+       */
+      int readRawY(char *dst);
       
       /** Read the z register of the MMA8452
         *
@@ -250,30 +255,41 @@
         */
        int readRawZ(char * zaxis);
       
-      /** Read the x,y and z registers of the MMA8452
+      /** 
+       * Read the x,y, and z registers of the MMA8452.
        *
-       * takes a 2 byte char buffer to store the value
-       * for each axis.
-       * returns 0 for success, and 1 for failure
-       *
+       * @param dst The destination buffer. Note that this needs to be 3 bytes for
+       * BIT_DEPTH_8 and 6 bytes for BIT_DEPTH_12. It is upto the caller to ensure this.
+       * @return 0 for success, and 1 for failure
        */ 
-      int readRawXYZ(char *x, char *y, char *z); 
+      int readRawXYZ(char *dst); 
+      
+      int isXYZReady();
             
-        /** Read from specified MMA8452 register
-         *
-         * @param addr The internal registeraddress of the MMA8452
-         * @returns The value of the register
-         */
+      /** Read from specified MMA8452 register
+       *
+       * @param addr The internal registeraddress of the MMA8452
+       * @return The value of the register
+       */
       int readRegister(char addr, char *dst);
       
       int readRegister(char addr, char *dst, int nbytes);
         
-        /** Write to specified MMA8452 register
+       /** 
+        * Write to the specified MMA8452 register.
         *
-        * @param addr The internal registeraddress of the MMA8452
-        * @param data New value of the register
+        * @param addr The internal register address
+        * @param data Data to write
         */    
       int writeRegister(char addr, char data);
+      
+       /** 
+        * Write a data buffer to the specified MMA8452 register.
+        *
+        * @param addr The internal register address
+        * @param data Data buffer to write
+        * @param nbytes The length of the data buffer to write
+        */    
       int writeRegister(char addr, char *data, int nbytes);
       
       int logicalANDRegister(char addr, char mask);
@@ -285,6 +301,7 @@
       int setDataRate(DataRateHz dataRate, int toggleActivation=1);
       DynamicRange getDynamicRange();
       DataRateHz getDataRate();
+      BitDepth getBitDepth();
       
       void debugRegister(char reg);
    
@@ -296,6 +313,8 @@
       int _frequency;
       int _readAddress;
       int _writeAddress;
+      
+      BitDepth _bitDepth;
          
 };