Driver library for the Freescale FXOS8700Q sensor

Dependencies:   MotionSensor

Dependents:   el14dg_Project frdm_serial_peopleAndComputing simple-client-app-shield pelion-example-frdm ... more

Fork of FXOS8700Q by Freescale

Revision:
10:834488c11340
Parent:
9:5553a64d0762
Child:
11:aee7dea904e2
--- a/FXOS8700Q.h	Wed May 07 18:08:08 2014 +0000
+++ b/FXOS8700Q.h	Thu Jun 18 22:53:07 2015 +0000
@@ -1,26 +1,25 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
+/* FXOS8700Q sensor driver
+ * Copyright (c) 2014-2015 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
 #ifndef FXOS8700Q_H
 #define FXOS8700Q_H
 
 #include "mbed.h"
 #include "MotionSensor.h"
+
 // FXOS8700CQ I2C address
 #define FXOS8700CQ_SLAVE_ADDR0 (0x1E<<1) // with pins SA0=0, SA1=0
 #define FXOS8700CQ_SLAVE_ADDR1 (0x1D<<1) // with pins SA0=1, SA1=0
@@ -42,108 +41,123 @@
 #define FXOS8700Q_WHOAMI_VAL 0xC7
 
 
-/**
-* MMA8451Q accelerometer example
-*
-* @code
-* #include "mbed.h"
-* #include "FXOS8700Q.h"
-* 
-* 
-* int main(void) {
-* 
-* FXOS8700Q combo( A4, A5, FXOS8700Q_I2C_ADDRESS0);
-* PwmOut rled(LED_RED);
-* PwmOut gled(LED_GREEN);
-* PwmOut bled(LED_BLUE);
-* 
-*     while (true) {       
-*         rled1.0 - combo(acc.getAccX());
-*         gled1.0 - combo(acc.getAccY());
-*         bled1.0 - combo(acc.getAccZ());
-*         wait(0.1);
-*     }
-* }
-* @endcode
-*/
+/** FXOS8700Q accelerometer example
+    @code
+    #include "mbed.h"
+    #include "FXOS8700Q.h"
+    I2C i2c(PTE25, PTE24);
+    FXOS8700QAccelerometer acc(i2c, FXOS8700CQ_SLAVE_ADDR1);    // Configured for the FRDM-K64F with onboard sensors
+    FXOS8700QMagnetometer mag(i2c, FXOS8700CQ_SLAVE_ADDR1);
+    int main(void)
+    {
+        motion_data_units_t acc_data, mag_data;
+        motion_data_counts_t acc_raw, mag_raw;
+        float faX, faY, faZ, fmX, fmY, fmZ, tmp_float;
+        int16_t raX, raY, raZ, rmX, rmY, rmZ, tmp_int;
+        acc.enable();
+        mag.enable();
+        while (true) {
+            // counts based results
+            acc.getAxis(acc_raw);
+            mag.getAxis(mag_raw);
+            acc.getX(raX);
+            acc.getY(raY);
+            acc.getZ(raZ);
+            mag.getX(rmX);
+            mag.getY(rmY);
+            mag.getZ(rmZ);
+            // unit based results
+            acc.getAxis(acc_data);
+            mag.getAxis(mag_data);
+            acc.getX(faX);
+            acc.getY(faY);
+            acc.getZ(faZ);
+            mag.getX(fmX);
+            mag.getY(fmY);
+            mag.getZ(fmZ);
+            wait(0.1f);
+        }
+    }
+    @endcode
+ */
 
-class FXOS8700Q_acc : public MotionSensor
+/** FXOS8700Q driver class
+ */
+class FXOS8700Q : public MotionSensor
 {
 public:
-  /**
-  * FXOS8700Q constructor
-  *
-  * @param sda SDA pin
-  * @param sdl SCL pin
-  * @param addr addr of the I2C peripheral
-  */
-  
-  FXOS8700Q_acc(PinName sda, PinName scl, int addr);
+
+    /** Read a device register
+        @param addr The address to read from
+        @param data The data to read from it
+        @param len The amount of data to read from it
+        @return 0 if successful, negative number otherwise
+     */
+    void readRegs(int addr, uint8_t *data, uint32_t len) const;
 
-  /**
-  * FXOS8700Q destructor
-  */
-  ~FXOS8700Q_acc();
+    /** Read the ID from a whoAmI register
+        @return The device whoAmI register contents
+     */
+    uint8_t whoAmI(void) const;
+
+    virtual void enable(void) const;
+    virtual void disable(void) const;
+    virtual uint32_t sampleRate(uint32_t frequency) const;
+    virtual uint32_t dataReady(void) const;
 
-    void enable(void);
-    void disable(void);
-    uint32_t sampleRate(uint32_t frequency);
-    uint32_t whoAmI(void);
-    uint32_t dataReady(void);
-    void getX(int16_t * x);
-    void getY(int16_t * y);
-    void getZ(int16_t * z);
-    void getX(float * x);
-    void getY(float * y);
-    void getZ(float * z);
-    void getAxis(MotionSensorDataCounts &data);
-    void getAxis(MotionSensorDataUnits &data);
-  
-  void readRegs(int addr, uint8_t * data, int len);
-  
-private:
-  I2C m_i2c;
-  int m_addr;
+protected:
+    I2C *_i2c;
+    uint8_t _addr;
+    
+    /** FXOS8700Q constructor
+        @param i2c a configured i2c object
+        @param addr addr of the I2C peripheral as wired
+     */
+    FXOS8700Q(I2C &i2c, uint8_t addr);
 
-  void writeRegs(uint8_t * data, int len);
-  int16_t getAccAxis(uint8_t addr);
+    /** FXOS8700Q deconstructor
+     */
+    ~FXOS8700Q();
+    
+    void writeRegs(uint8_t *data, uint32_t len) const;
+    int16_t getSensorAxis(uint8_t addr) const;
+};
+
+/** FXOS8700QAccelerometer interface
+ */
+class FXOS8700QAccelerometer : public FXOS8700Q
+{
+public:
+
+    FXOS8700QAccelerometer(I2C &i2c, uint8_t addr) : FXOS8700Q(i2c, addr) {}
+
+    virtual int16_t getX(int16_t &x) const;
+    virtual int16_t getY(int16_t &y) const;
+    virtual int16_t getZ(int16_t &z) const;
+    virtual float getX(float &x) const;
+    virtual float getY(float &y) const;
+    virtual float getZ(float &z) const;
+    virtual void getAxis(motion_data_counts_t &xyz) const;
+    virtual void getAxis(motion_data_units_t &xyz) const;
 
 };
 
-class FXOS8700Q_mag : public MotionSensor
+/** FXOS8700QMagnetometer interface
+ */
+class FXOS8700QMagnetometer : public FXOS8700Q
 {
 public:
-  FXOS8700Q_mag(PinName sda, PinName scl, int addr);
 
-  /**
-  * FXOS8700Q destructor
-  */
-  ~FXOS8700Q_mag();
+    FXOS8700QMagnetometer(I2C &i2c, uint8_t addr) : FXOS8700Q(i2c, addr) {}
 
-    void enable(void);
-    void disable(void);
-    uint32_t sampleRate(uint32_t fequency);
-    uint32_t whoAmI(void);
-    uint32_t dataReady(void);
-    void getX(int16_t * x);
-    void getY(int16_t * y);
-    void getZ(int16_t * z);
-    void getX(float * x);
-    void getY(float * y);
-    void getZ(float * z);
-    void getAxis(MotionSensorDataCounts &data);
-    void getAxis(MotionSensorDataUnits &data);
-  
-  void readRegs(int addr, uint8_t * data, int len);
-  
-private:
-  I2C m_i2c;
-  int m_addr;
-  char sbuf[12];
-  int sstatus;
-  
-  void writeRegs(uint8_t * data, int len);
-  int16_t getAccAxis(uint8_t addr);
+    virtual int16_t getX(int16_t &x) const;
+    virtual int16_t getY(int16_t &y) const;
+    virtual int16_t getZ(int16_t &z) const;
+    virtual float getX(float &x) const;
+    virtual float getY(float &y) const;
+    virtual float getZ(float &z) const;
+    virtual void getAxis(motion_data_counts_t &xyz) const;
+    virtual void getAxis(motion_data_units_t &xyz) const;
 
 };