Based on https://os.mbed.com/users/Airium/code/module_LSM303DLHC/ Main difference is the usage of the I2C - now it is passed as parameter making cooperative use easier. LSM303DLHC Full Driver: Readings For Acc, Mag and Temp; Class Method for frequently-used 13 sensor parameters; Class Method to direct modify registers; Support Calibration (offset scale);

Revision:
1:4ee6df2df73a
Parent:
0:a4131de4bddd
--- a/LSM303DLHC.cpp	Fri Jan 24 16:06:24 2020 +0000
+++ b/LSM303DLHC.cpp	Mon Feb 03 07:43:48 2020 +0000
@@ -40,48 +40,95 @@
     temp_scale[0] = 1.;
 }
 
-void LSM303DLHC::GetAcc(float arr[3]){
+int LSM303DLHC::GetAcc(float arr[3]){
+    int result;
     data[0] = OUT_X_L_A | (1 << 7); // MSB=1 to read multiple bytes
-    _i2c->write(ACC_ADDRESS, data, 1);
-    _i2c->read(ACC_ADDRESS, data, 6);
+    result = _i2c->write(ACC_ADDRESS, data, 1);
+    if (0 != result) 
+    {
+        printf("\nI2C write issue (%02x)%d\n", MAG_ADDRESS, result);
+        return result;
+    }
+    result = _i2c->read(ACC_ADDRESS, data, 6);
+    if (0 != result) 
+    {
+        printf("\nI2C read issue (%02x)%d\n", MAG_ADDRESS, result);
+        return result;
+    }
 
     int count_x = ((((int)(int8_t)data[1])<<8 | ((uint8_t)data[0])) >> 4);
     int count_y = ((((int)(int8_t)data[3])<<8 | ((uint8_t)data[2])) >> 4);
     int count_z = ((((int)(int8_t)data[5])<<8 | ((uint8_t)data[4])) >> 4);
 
-//    printf("\nA %02X.%02X %02X.%02X %02X.%02X %04x %04x %04x\n", data[1], data[0], data[3], data[2], data[5], data[4], count_x, count_y, count_z);
+    float a_x = acc_scale[0] * (acc_offset[0] + count_x * acc_scale_multiplier);
+    float a_y = acc_scale[1] * (acc_offset[1] + count_y * acc_scale_multiplier);
+    float a_z = acc_scale[2] * (acc_offset[2] + count_z * acc_scale_multiplier);
+    arr[0] = a_x;
+    arr[1] = a_y;
+    arr[2] = a_z;
 
-    arr[0] = acc_scale[0] * (acc_offset[0] + count_x * acc_scale_multiplier);
-    arr[1] = acc_scale[1] * (acc_offset[1] + count_y * acc_scale_multiplier);
-    arr[2] = acc_scale[2] * (acc_offset[2] + count_z * acc_scale_multiplier);
+//    printf("\nA %02X.%02X %02X.%02X %02X.%02X %04x %04x %04x %7.3f %7.3f %7.3f \n", data[1], data[0], data[3], data[2], data[5], data[4], count_x, count_y, count_z, a_x, a_y, a_z);
+
+    return 0;
 }
 
-void LSM303DLHC::GetMag(float arr[3]){
+int LSM303DLHC::GetMag(float arr[3]){
+    int result;
     data[0] = OUT_X_H_M;
-    _i2c->write(MAG_ADDRESS, data, 1);
-    _i2c->read(MAG_ADDRESS, data, 6);
-    
+    result = _i2c->write(MAG_ADDRESS, data, 1);
+    if (0 != result) 
+    {
+        printf("\nI2C write issue (%02x)%d\n", MAG_ADDRESS, result);
+        return result;
+    }
+    result = _i2c->read(MAG_ADDRESS, data, 6);
+    if (0 != result) 
+    {
+        printf("\nI2C read issue (%02x)%d\n", MAG_ADDRESS, result);
+        return result;
+    }
+
     int count_x = ((int)(int8_t)data[0])<<8 | ((uint8_t)data[1]);
     int count_y = ((int)(int8_t)data[4])<<8 | ((uint8_t)data[5]);
     int count_z = ((int)(int8_t)data[2])<<8 | ((uint8_t)data[3]);
     
-//    printf("\nM %02X.%02X %02X.%02X %02X.%02X %04x %04x %04x\n", data[1], data[0], data[3], data[2], data[5], data[4], count_x, count_y, count_z);
+    float m_x = mag_scale[0] * (mag_offset[0] + count_x * mag_scale_x_multiplier);
+    float m_y = mag_scale[1] * (mag_offset[1] + count_y * mag_scale_y_multiplier);
+    float m_z = mag_scale[2] * (mag_offset[2] + count_z * mag_scale_z_multiplier);
 
-    arr[0] = mag_scale[0] * (mag_offset[0] + count_x * mag_scale_x_multiplier);
-    arr[1] = mag_scale[1] * (mag_offset[1] + count_y * mag_scale_y_multiplier);
-    arr[2] = mag_scale[2] * (mag_offset[2] + count_z * mag_scale_z_multiplier);
+    arr[0] = m_x;
+    arr[1] = m_y;
+    arr[2] = m_z;
+
+//    printf("\nM %02X.%02X %02X.%02X %02X.%02X %04x %04x %04x %7.3f %7.3f %7.3f \n", data[1], data[0], data[3], data[2], data[5], data[4], count_x, count_y, count_z, m_x, m_y, m_z);
+
+    return 0;
 }
 
-void LSM303DLHC::GetTemp(float arr[1]){
+int LSM303DLHC::GetTemp(float arr[1]){
+    int result;
     data[0] = TEMP_OUT_H_M;
-    _i2c->write(MAG_ADDRESS, data, 1);
-    _i2c->read(MAG_ADDRESS, data, 2);
-    
+    result = _i2c->write(MAG_ADDRESS, data, 1);
+    if (0 != result) 
+    {
+        printf("\nI2C write issue (%02x)%d\n", MAG_ADDRESS, result);
+        return result;
+    }
+    result = _i2c->read(MAG_ADDRESS, data, 2);
+    if (0 != result) 
+    {
+        printf("\nI2C read issue (%02x)%d\n", MAG_ADDRESS, result);
+        return result;
+    }
+
     int count = (((int)(int8_t)data[0]<<8) | ((uint8_t)data[1]))>>4;
-    
-//    printf("\nT %02X.%02X %04X %d\n", data[0], data[1], count, count);
-    
-    arr[0] = temp_scale[0] * (temp_offset[0] + count/8.);
+    float temp = count / 8.;
+
+//    printf("\nT %02X.%02X %04X %d %7.3f\n", data[0], data[1], count, count, temp);
+
+    arr[0] = temp_scale[0] * (temp_offset[0] + temp);
+
+    return 0;
 }
 
 void LSM303DLHC::ACtrl(ACC_ODR cmd){