library for using LSM303DM chip

Revision:
6:22556393747b
Parent:
5:9786e0a13a3a
--- a/LSM303.h	Tue Aug 12 11:43:45 2014 +0000
+++ b/LSM303.h	Mon Sep 08 01:46:11 2014 +0000
@@ -1,54 +1,6 @@
 #ifndef LSM303_h
 #define LSM303_h
 #include "mbed.h"
-/* LSM303DLM  mbed code based on AN3192 Application note and LSM303DLH example code by Jim Lindblom SparkFun Electronics 
-  modified by Frankie.Chu to arduino in year 2012.
-
-   date: 13/10/13
-   license: Use this with your own risk:-)
-
-   Calibration is a must to make your compass to work:
-   
-   //displays integer value with sign in 4 digit led display and waits delay seconds
-   void displayInt(TM1637 &tm, int value, float delay)...
-   // displays a digit in position of 4 digit led display
-   void TM1637::display(uint8_t position,int8_t digit)...
-   //calibration loop
-   for(int i = 0; i <200; i++) {
-
-        lsm.getLSM303_mag();
-
-// Mmin handler
-        if(lsm.m.x  <  lsm.m_min.x)
-            lsm.m_min.x  =  lsm.m.x;
-
-        if(lsm.m.y  <  lsm.m_min.y)
-            lsm.m_min.y  =  lsm.m.y;
-
-        if(lsm.m.z  <  lsm.m_min.z)
-            lsm.m_min.z  =  lsm.m.z;
-
-// Mmax handler
-        if(lsm.m.x  >  lsm.m_max.x)
-            lsm.m_max.x  =  lsm.m.x ;
-
-        if(lsm.m.y  >  lsm.m_max.y)
-            lsm.m_max.y =  lsm.m.y;
-
-        if(lsm.m.z  >  lsm.m_max.z)
-            lsm.m_max.z  =  lsm.m.z;
-
-        tm.clearDisplay();
-        tm.display(i%4,0);
-        wait(0.1);
-    }
-    displayInt(tm, lsm.m_min.x, 8);
-    displayInt(tm, lsm.m_min.y, 8);
-    displayInt(tm, lsm.m_min.z, 8);
-    displayInt(tm, lsm.m_max.x, 8);
-    displayInt(tm, lsm.m_max.y, 8);
-    displayInt(tm, lsm.m_max.z, 8);
-*/
 
 /* LSM303 Address definitions */
 #define LSM303_MAG  0x3C  // assuming SA0 grounded
@@ -99,42 +51,85 @@
 #define PI                    3.14159265
 //#define CALIBRATING //uncomment when calibrating
 
+/** LSM303DLM  mbed code based on AN3192 Application note and LSM303DLH example code by Jim Lindblom SparkFun Electronics 
+  modified by Frankie.Chu to arduino in year 2012.
+
+   date: 13/10/13
+   license: Use this with your own risk:-)
+
+   Calibration the compass and accelometer is a must to make your compass to work:
+@code
+   //calibration loop
+   for(int i = 0; i <200; i++) {
+
+        lsm.getLSM303_mag();
+
+// Mmin handler
+        if(lsm.m.x  <  lsm.m_min.x)
+            lsm.m_min.x  =  lsm.m.x;
+
+        if(lsm.m.y  <  lsm.m_min.y)
+            lsm.m_min.y  =  lsm.m.y;
+
+        if(lsm.m.z  <  lsm.m_min.z)
+            lsm.m_min.z  =  lsm.m.z;
+
+// Mmax handler
+        if(lsm.m.x  >  lsm.m_max.x)
+            lsm.m_max.x  =  lsm.m.x ;
+
+        if(lsm.m.y  >  lsm.m_max.y)
+            lsm.m_max.y =  lsm.m.y;
+
+        if(lsm.m.z  >  lsm.m_max.z)
+            lsm.m_max.z  =  lsm.m.z;
+        wait(0.1);
+    }
+@endcode
+*/
 class LSM303
-{// I am  LSM303DLM
+{
 public:
+    //! A plane with x,y and z axis
     typedef struct Plane {
         float x, y, z;
     } Plane;
     
-    Plane a; // accelerometer readings
+    //! accelerometer readings
+    Plane a; 
     Plane a_max;
     Plane a_min;
-    Plane m; // magnetometer readings
+    //! magnetometer readings
+    Plane m; 
     Plane m_max; // maximum magnetometer values, used for calibration
     Plane m_min; // minimum magnetometer values, used for calibration
+    Plane scale; //soft magneting field scaling
+    //! Initialises LSM303DLM chip
+    void setup();
+    //!Tests Accelometer. Returns 0xFF on error, 0x30 if succesful.
+    int testAcc();
+    //!Tests Compass. Returns 0xFF on error, 0x0F if succesful and LSM303DLM; 0x3C if LSM303DH.
+    int testMag();   
+    //! Returns compass heading in degrees   
+    float getTiltHeading();
+    //! Reads magnetometer values to m
+    void getLSM303_mag();
+    //! Reads accelerometer values to a
+    void getLSM303_accel();
+    
+private:
+    int _i2c_address;
     float pitch;
     float roll;
-    int setup();
-    
-    void getLSM303_mag();
-    void getLSM303_accel();
+ 
     int LSM303_read(int address);
-    int LSM303_write(int data, int address);
-    
-    int testAcc();
-    int testMag();
-    
-    float getTiltHeading();
-    
+    int LSM303_write(int data, int address);    
     // Plane functions
     static void vector_cross(const Plane *a, const Plane *b, Plane *out);
     static float vector_dot(const Plane *a,const Plane *b);
     static void vector_normalize(Plane *a);
-
-
-private:
- 
-    int _i2c_address;
+    
+    void getScale(Plane *scale);
 };
 
 #endif