1

Revision:
12:172540ff6b8b
Parent:
11:dfd1e0afcb7b
Child:
13:4bd8b4cd479d
--- a/MMA8452.cpp	Tue Mar 04 16:23:40 2014 +0000
+++ b/MMA8452.cpp	Tue Mar 04 17:50:47 2014 +0000
@@ -25,11 +25,17 @@
 // Connect module at I2C address using I2C port pins sda and scl
 MMA8452::MMA8452(PinName sda, PinName scl, int frequency) : _i2c(sda, scl) , _frequency(frequency) {
    DBG("Creating MMA8452");
+   
+   // set I2C frequency
    _i2c.frequency(_frequency);
    
-   // setup read and write addresses to avoid duplication
+   // setup read and write addresses for convenience
    _readAddress   = MMA8452_ADDRESS | 0x01;
    _writeAddress  = MMA8452_ADDRESS & 0xFE;
+   
+   // set some defaults
+   _bitDepth = BIT_DEPTH_UNKNOWN;
+   setBitDepth(BIT_DEPTH_12);
    DBG("Done");
 }
 
@@ -40,13 +46,13 @@
 // Setting the control register bit 1 to true to activate the MMA8452
 int MMA8452::activate() {
     // perform write and return error code
-    return logicalORRegister(CTRL_REG_1,MMA8452_ACTIVE_MASK);
+    return logicalORRegister(MMA8452_CTRL_REG_1,MMA8452_ACTIVE_MASK);
 }
 
 // Setting the control register bit 1 to 0 to standby the MMA8452
 int MMA8452::standby() {
     // perform write and return error code
-    return logicalANDRegister(CTRL_REG_1,MMA8452_STANDBY_MASK);
+    return logicalANDRegister(MMA8452_CTRL_REG_1,MMA8452_STANDBY_MASK);
 }
 
 // this reads a register, applies a bitmask with logical AND, sets a value with logical OR,
@@ -102,6 +108,7 @@
 }
 
 int MMA8452::setBitDepth(BitDepth depth,int toggleActivation) {
+   _bitDepth = depth;
    return maskAndApplyRegister(
       MMA8452_CTRL_REG_1,
       MMA8452_BIT_DEPTH_MASK,
@@ -110,105 +117,25 @@
    );
 }
 
-
-// Get device ID 
-int MMA8452::getDeviceID(char *dst)
-{
-    return readRegister(WHO_AM_I,dst);
+int MMA8452::isXYZReady() {
+   char rval = 0;
+   if(readRegister(MMA8452_STATUS,&rval)) {
+      return 0;
+   }
+   return (rval&MMA8452_STATUS_ZYXDR_MASK);
 }
-
-
-int MMA8452::readRaw(char src, char *dst, int len) {
-    // this is the register we want to get data from               
-    char register_address[1];
-    register_address[0] = src;
-    
-    if(_i2c.write(_writeAddress,register_address,1,true) == 0)
-    {
-        if(_i2c.read(_readAddress,dst,len)==0)
-        {
-           return 0;
-        }
-    }
-    
-    // failure case, zero array and return error
-    for(int i=0; i<len; i++) {
-       dst[i] = 0x00;
-    }
-    return 1;   
-}
-
-// Reads x data. This method reads two registers containing the x-axis values from the accelerometer. 
-// It takes a 2 byte char array and copies the register values into the buffer. If it fails the char array
-// is set to '0'. It returns '0' success '1' fail. This method does nothing to the registers - just returns
-// the raw data.
-//int MMA8452::read_x(int& xaxisLSB)
-int MMA8452::readRawX(char *xaxis) {   
-    return readRaw(OUT_X_MSB,xaxis,2);  
-}
-
-
-// Reads y data. This method reads two registers containing the x-axis values from the accelerometer. 
-// It takes a 2 byte char array and copies the register values into the buffer. If it fails the char array
-// is set to '0'. It returns '0' success '1' fail. This method does nothing to the registers - just returns
-// the raw data.
-
-int MMA8452::readRawY(char *yaxis) {
-   return readRaw(OUT_Y_MSB,yaxis,2);
+ 
+int MMA8452::getDeviceID(char *dst) {
+   return readRegister(MMA8452_WHO_AM_I,dst);
 }
 
-
-
-// Reads z data. This method reads two registers containing the x-axis values from the accelerometer. 
-// It takes a 2 byte char array and copies the register values into the buffer. If it fails the char array
-// is set to '0'. It returns '0' success '1' fail. This method does nothing to the registers - just returns
-// the raw data.
-
-int MMA8452::readRawZ(char *zaxis)
-{
-   return readRaw(OUT_Z_MSB,zaxis,2);
+int MMA8452::getStatus(char* dst) {
+   return readRegister(MMA8452_STATUS,dst);
 }
 
-
-
-// Reads y data
-int MMA8452::read_y()
-{
-    char mcu_address = (MMA8452_ADDRESS <<1);
-
-    _i2c.start();                  // Start
-    _i2c.write(mcu_address);              // A write to device 0x98
-    _i2c.write(OUT_Y_MSB);             // Register to read
-    _i2c.start();                  
-    _i2c.write(mcu_address);              // Read from device 0x99
-    int y = _i2c.read(0);         // Read the data
-    _i2c.stop();
-    
-    return y; 
-
-}
-
-// Reads z data
-int MMA8452::read_z()
-{
-    char mcu_address = (MMA8452_ADDRESS <<1);
-    
-    _i2c.start();                  // Start
-    _i2c.write(mcu_address);              // A write to device 0x98
-    _i2c.write(OUT_Z_MSB);             // Register to read
-    _i2c.start();                  
-    _i2c.write(mcu_address);              // Read from device 0x99
-    int z = _i2c.read(0);         // Read the data
-    _i2c.stop();
-    
-    return z;
-
-}
-
-
 MMA8452::DynamicRange MMA8452::getDynamicRange() {
    char rval = 0;
-   if(readRegister(MMA8452_CTRL_REG_1,&rval)) {
+   if(readRegister(MMA8452_XYZ_DATA_CFG,&rval)) {
       return MMA8452::DYNAMIC_RANGE_UNKNOWN;
    }
    rval &= (MMA8452_DYNAMIC_RANGE_MASK^0xFF);
@@ -228,35 +155,15 @@
 }
 
 // Reads xyz
-int MMA8452::readRawXYZ(char *x, char *y, char *z) 
-{
-    
-    
-    char mcu_address = (MMA8452_ADDRESS <<1);
-    char register_buffer[6] ={0,0,0,0,0,0};
-    const char Addr_X = OUT_X_MSB;
-    _i2c.write(mcu_address);              // A write to device 0x98
-    _i2c.write(MMA8452_ADDRESS, &Addr_X, 1);         // Pointer to the OUT_X_MSB register
-    
-    if(_i2c.write(mcu_address,&Addr_X,1) == 0)
-    {
-        if(_i2c.read(mcu_address,register_buffer,6) == 0)
-        {
-            *x = register_buffer[1];
-            *y = register_buffer[3];
-            *z = register_buffer[5];
-            return 0;           // yahoooooo
-        }
-        else
-        {
-            return 1;           // failed oh nooo!
-        }    
-    }
-    else
-    {
-        return 1;               // failed oh nooo!
-    }
-
+int MMA8452::readRawXYZ(char *dst) {
+   if(_bitDepth==BIT_DEPTH_UNKNOWN) {
+      return 1;
+   }
+   int readLen = 3;
+   if(_bitDepth==BIT_DEPTH_12) {
+      readLen = 6;
+   }
+   return readRegister(MMA8452_OUT_X_MSB,dst,readLen);
 }
 
 // apply an AND mask to a register. read register value, apply mask, write it back
@@ -284,7 +191,6 @@
    return writeRegister(addr,value);
 }
 
-
 // apply an OR mask to a register. read register value, apply mask, write it back
 int MMA8452::logicalXORRegister(char addr, char mask) {
    char value = 0;
@@ -367,7 +273,7 @@
    // get register value
    char v = 0;
    if(readRegister(reg,&v)) {
-      DBG("Error reading control register");
+      DBG("Error reading specified register");
       return;
    }
    // print out details
@@ -410,6 +316,18 @@
          }
       break;
       
+      case MMA8452_STATUS:
+         DBG("STATUS has value: 0x%x",v);
+         DBG(" 7  ZYXOW: %d",(v&0x80)>>7);
+         DBG(" 6  ZOW: %d",  (v&0x40)>>6);
+         DBG(" 5  YOW: %d",  (v&0x20)>>5);
+         DBG(" 4  XOW: %d",  (v&0x10)>>4);
+         DBG(" 3  ZYXDR: %d",(v&0x08)>>3);
+         DBG(" 2  ZDR: %d",  (v&0x04)>>2);
+         DBG(" 1  YDR: %d",  (v&0x02)>>1);
+         DBG(" 0  XDR: %d",  (v&0x01));
+      break;
+      
       default:
          DBG("Unknown register address: 0x%x",reg);
       break;