example using LOF sensor board and MEMS sensor board

Dependencies:   ST_INTERFACES X_NUCLEO_53L0A1 X_NUCLEO_COMMON X_NUCLEO_IKS01A1 Senet_Packet libmDot-mbed5

Revision:
0:06fc5a68ead2
Child:
1:a2c5a8a74527
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Apr 08 04:15:22 2017 +0000
@@ -0,0 +1,149 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "x_nucleo_iks01a1.h"
+#include "x_nucleo_53l0a1.h"
+
+Thread mems_thread;
+Thread range_thread;
+Mutex serial_mutex;
+
+DigitalOut led(D3);
+
+DevI2C i2c(D14, D15);
+
+/* Instantiate the expansion board */
+static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(&i2c);
+// MAKE SURE YOU JUMPER PIN D7 TO PIN D8!
+static X_NUCLEO_53L0A1 *range = X_NUCLEO_53L0A1::Instance(&i2c, A2, D7, D2);
+
+/* Retrieve the composing elements of the expansion board */
+static GyroSensor *gyroscope = mems_expansion_board->GetGyroscope();
+static MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer();
+static MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
+static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;
+static PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor;
+static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor;
+static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor;
+
+/* Helper function for printing from multiple threads */
+void ts_printf() {
+    serial_mutex.lock();
+    printf();
+    serial_mutex.unlock();
+}
+
+/* Helper function for printing floats & doubles */
+static char *printDouble(char* str, double v, int decimalDigits=2) {
+    int i = 1;
+    int intPart, fractPart;
+    int len;
+    char *ptr;
+
+    /* prepare decimal digits multiplicator */
+    for (;decimalDigits!=0; i*=10, decimalDigits--);
+
+    /* calculate integer & fractinal parts */
+    intPart = (int)v;
+    fractPart = (int)((v-(double)(int)v)*i);
+
+    /* fill in integer part */
+    sprintf(str, "%i.", intPart);
+
+    /* prepare fill in of fractional part */
+    len = strlen(str);
+    ptr = &str[len];
+
+    /* fill in leading fractional zeros */
+    for (i/=10;i>1; i/=10, ptr++) {
+      if(fractPart >= i) break;
+      *ptr = '0';
+    }
+
+    /* fill in (rest of) fractional part */
+    sprintf(ptr, "%i", fractPart);
+
+    return str;
+}
+
+/* Function to run the mems board */
+void mems_func() {
+    uint8_t id;
+    float value1, value2;
+    char buffer1[32], buffer2[32];
+    int32_t axes[3];
+
+    ts_printf("\r\n--- Starting mems board ---\r\n");
+
+    humidity_sensor->read_id(&id);
+    ts_printf("HTS221  humidity & temperature    = 0x%X\r\n", id);
+    pressure_sensor->read_id(&id);
+    ts_printf("LPS25H  pressure & temperature    = 0x%X\r\n", id);
+    magnetometer->read_id(&id);
+    ts_printf("LIS3MDL magnetometer              = 0x%X\r\n", id);
+    gyroscope->read_id(&id);
+    ts_printf("LSM6DS0 accelerometer & gyroscope = 0x%X\r\n", id);
+
+    wait(3);
+
+    while (true) {
+        temp_sensor1->get_temperature(&value1);
+        humidity_sensor->get_humidity(&value2);
+        ts_printf("HTS221: [temp] %7s°C,   [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
+
+        temp_sensor2->get_fahrenheit(&value1);
+        pressure_sensor->get_pressure(&value2);
+        ts_printf("LPS25H: [temp] %7s°F, [press] %smbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
+
+        magnetometer->get_m_axes(axes);
+        ts_printf("LIS3MDL [mag/mgauss]:  %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
+        
+        accelerometer->get_x_axes(axes);
+        ts_printf("LSM6DS0 [acc/mg]:      %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
+
+        gyroscope->get_g_axes(axes);
+        ts_printf("LSM6DS0 [gyro/mdps]:   %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
+
+        wait(1.5);
+    }
+}
+
+/* Function to run the range board */
+void range_func() {
+    int status;
+    uint32_t distance;
+
+    ts_printf("\r\n--- Starting range board ---\r\n");
+
+    /* init the 53L0A1 expansion board with default values */
+    while (true) {
+        status=board->InitBoard();
+        if (status) {
+            ts_printf("Failed to init range board!\r\n");
+            wait(1);
+        } else {
+            ts_printf("Range board initialized\r\n");
+            break;
+        }
+    }
+
+    while (true) {
+        status = board->sensor_centre->GetDistance(&distance);
+        if (status == VL53L0X_ERROR_NONE) {
+            ts_printf("Distance : %ld\n", distance);
+        }
+
+        wait(0.5);
+    }
+}
+
+int main() {
+    ts_printf("\r\n--- Application starting up ---\r\n");
+
+    mems_thread.start(mems_func);
+    range_thread.start(range_func);
+
+    while (true) {
+        led = !led;
+        wait(0.25);
+    }
+}
\ No newline at end of file