compas and acc for my stuents

Revision:
0:034b0a5fc70a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LSM303D_my.cpp	Wed Jul 15 07:31:33 2020 +0000
@@ -0,0 +1,80 @@
+#include "LSM303D_my.h"
+
+char EcompLSM303D_GetID(I2C *ecomp)
+{
+  char data;
+  data=WHO_AM_I;
+  ecomp->write(I2C_ADDR,&data, 1,1); // 1-no stop
+  ecomp->read(I2C_ADDR,&data, 1,0);  
+  return data;   
+}         
+//-------------------------------
+void EcompLSM303D_Ini(I2C *ecomp)
+{
+    char data_write[2];
+
+       data_write[0]=CTRL7;  //enable
+       data_write[1]=0;
+       ecomp->write(I2C_ADDR,data_write, 2,0);     
+       
+//! high resolution(6), Magnetic data rate configuration =6.25 Hz(4)=160ms 25Hz(c)=40ms
+       data_write[0]=CTRL5;  
+       data_write[1]=0x6c;//0x64;
+       ecomp->write(I2C_ADDR,data_write, 2,0);  
+         
+//! Magnetic full-scale (6 +-12gaus)  
+       data_write[0]=CTRL6;  
+       data_write[1]=0x60;
+       ecomp->write(I2C_ADDR,data_write, 2,0); 
+       
+//!update after read, and all axes of acceleration enabled at 25Hz  - 0x41
+//!update continuos, and all axes of acceleration enabled at 25Hz  - 0x47
+       data_write[0]=CTRL1;  
+       data_write[1]=0x47;
+       ecomp->write(I2C_ADDR,data_write, 2,0); 
+       
+//! 50Hz anti-alias, +/- 16g, no self-test, (SPI 3-wire)
+       data_write[0]=CTRL2;  
+       data_write[1]=0xe1;
+       ecomp->write(I2C_ADDR,data_write, 2,0); 
+}
+
+//-----------------------------------------------
+void EcompLSM303D_Get_M_Axis(I2C *ecomp,int16_t* m)
+{
+    char data_write[2];
+    char  buffer[6];
+    data_write[0]=OUT_X_L_M|0x80;
+    ecomp->write(I2C_ADDR,data_write, 1,1); 
+    ecomp->read(I2C_ADDR,buffer, 6,0);
+    m[0]=*((int16_t*)&buffer[0]);
+    m[1]=*((int16_t*)&buffer[2]);
+    m[2]=*((int16_t*)&buffer[4]);  
+}
+
+//-------------------------------------------------
+void EcompLSM303D_Get_A_Axis(I2C *ecomp,double* acc)
+{
+    char data_write[2];
+    char  buffer[6];
+    int16_t a[3];
+    data_write[0]=OUT_X_L_A|0x80;
+    ecomp->write(I2C_ADDR,data_write, 1,1); 
+    ecomp->read(I2C_ADDR,buffer, 6,0);
+    a[0]=*((int16_t*)&buffer[0]);
+    a[1]=*((int16_t*)&buffer[2]);
+    a[2]=*((int16_t*)&buffer[4]);
+    acc[0]=(double)a[0]*0.061;//0.000 061
+    acc[1]=(double)a[1]*0.061;
+    acc[2]=(double)a[2]*0.0061;      
+}
+
+//-----------------------------------------
+uint16_t CalculateBearing(int xi,  int yi){
+double a;
+
+    a=180*atan2((double)yi,(double)xi)/M_PI;
+    if(a < 0)
+      a += 360;
+    return (uint16_t)floor(a); 
+}