Complete sensor demo.

Dependencies:   modem_ref_helper CRC X_NUCLEO_IKS01A1 DebouncedInterrupt

Revision:
0:87c57e1b1e1c
Child:
1:4d3968b2941b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sensors.cpp	Mon May 15 16:00:25 2017 +0000
@@ -0,0 +1,348 @@
+#include "mbed.h"
+#include "WizziDebug.h"
+#include "sensors.h"
+#include "hwcfg.h"
+
+#if defined(TARGET_STM32L152RE)
+LIS3MDL *magnetometer;
+LSM6DS0 *accelerometer;
+LSM6DS0 *gyroscope;
+#elif defined(TARGET_STM32L432KC)
+LSM303C_ACC_Sensor *accelerometer;
+LSM303C_MAG_Sensor *magnetometer;
+    #if defined(SENSOR_LIGHT_MEAS) && defined(SENSOR_LIGHT_EN)
+    AnalogIn g_light_meas(SENSOR_LIGHT_MEAS);
+    DigitalOut g_light_en_l(SENSOR_LIGHT_EN);
+    #endif
+#endif
+LPS25H *pressure_sensor;
+LPS25H *temp_sensor2;
+HTS221 *humidity_sensor;
+HTS221 *temp_sensor1;
+
+
+
+bool Init_HTS221(HTS221* ht_sensor)
+{
+    uint8_t ht_id = 0;
+    HUM_TEMP_InitTypeDef InitStructure;
+
+    /* Check presence */
+    if((ht_sensor->ReadID(&ht_id) != HUM_TEMP_OK) ||
+       (ht_id != I_AM_HTS221))
+        {
+            delete ht_sensor;
+            ht_sensor = NULL;
+            return false;
+        }
+    
+    /* Configure sensor */
+    InitStructure.OutputDataRate = HTS221_ODR_12_5Hz;
+
+    if(ht_sensor->Init(&InitStructure) != HUM_TEMP_OK)
+    {
+        delete ht_sensor;
+        ht_sensor = NULL;
+        return false;
+    }
+    
+    return true;
+}
+
+bool Init_LIS3MDL(LIS3MDL* magnetometer)
+{
+    uint8_t m_id = 0;
+    MAGNETO_InitTypeDef InitStructure;
+
+    /* Check presence */
+    if((magnetometer->ReadID(&m_id) != MAGNETO_OK) ||
+       (m_id != I_AM_LIS3MDL_M))
+    {
+        delete magnetometer;
+        magnetometer = NULL;
+        return false;
+    }
+      
+    /* Configure sensor */
+    InitStructure.M_FullScale = LIS3MDL_M_FS_4;
+    InitStructure.M_OperatingMode = LIS3MDL_M_MD_CONTINUOUS;
+    InitStructure.M_XYOperativeMode = LIS3MDL_M_OM_HP;
+    InitStructure.M_OutputDataRate = LIS3MDL_M_DO_80;
+
+    if(magnetometer->Init(&InitStructure) != MAGNETO_OK)
+    {
+        return false;
+    }
+      
+    return true;
+}
+
+bool Init_LPS25H(LPS25H* pt_sensor)
+{
+    uint8_t p_id = 0;
+    PRESSURE_InitTypeDef InitStructure;
+    
+    /* Check presence */
+    if((pt_sensor->ReadID(&p_id) != PRESSURE_OK) ||
+       (p_id != I_AM_LPS25H))
+    {
+        delete pt_sensor;
+        pt_sensor = NULL;
+        return false;
+    }
+            
+    /* Configure sensor */
+    InitStructure.OutputDataRate = LPS25H_ODR_1Hz;
+    InitStructure.BlockDataUpdate = LPS25H_BDU_CONT;
+    InitStructure.DiffEnable = LPS25H_DIFF_DISABLE;
+    InitStructure.SPIMode = LPS25H_SPI_SIM_4W;
+    InitStructure.PressureResolution = LPS25H_P_RES_AVG_8;
+    InitStructure.TemperatureResolution = LPS25H_T_RES_AVG_8;
+        
+    if(pt_sensor->Init(&InitStructure) != PRESSURE_OK)
+    {
+        return false;
+    }
+    
+    return true;
+}
+
+bool Init_LSM6DS0(LSM6DS0* gyro_lsm6ds0)
+{
+    IMU_6AXES_InitTypeDef InitStructure;
+    uint8_t xg_id = 0;
+
+    /* Check presence */
+    if((gyro_lsm6ds0->ReadID(&xg_id) != IMU_6AXES_OK) ||
+       (xg_id != I_AM_LSM6DS0_XG))
+    {
+        delete gyro_lsm6ds0;
+        gyro_lsm6ds0 = NULL;
+        return false;
+    }
+            
+    /* Configure sensor */
+    InitStructure.G_FullScale       = 2000.0f; /* 2000DPS */
+    InitStructure.G_OutputDataRate  = 119.0f;  /* 119HZ */
+    InitStructure.G_X_Axis          = 1;       /* Enable */
+    InitStructure.G_Y_Axis          = 1;       /* Enable */
+    InitStructure.G_Z_Axis          = 1;       /* Enable */
+
+    InitStructure.X_FullScale       = 2.0f;    /* 2G */
+    InitStructure.X_OutputDataRate  = 119.0f;  /* 119HZ */
+    InitStructure.X_X_Axis          = 1;       /* Enable */
+    InitStructure.X_Y_Axis          = 1;       /* Enable */
+    InitStructure.X_Z_Axis          = 1;       /* Enable */
+              
+    if(gyro_lsm6ds0->Init(&InitStructure) != IMU_6AXES_OK)
+    {
+        return false; 
+    }
+            
+    return true;
+}
+
+bool Init_LSM303C_MAG(LSM303C_MAG_Sensor* magnetometer)
+{
+    uint8_t id = 0;
+    uint8_t error = 0;
+    
+    error = magnetometer->ReadID(&id);
+    
+    /* Check presence */
+    if(error)
+    {
+        EPRINT("LSM303C_MAG Not detected!\r\n");
+        delete magnetometer;
+        magnetometer = NULL;
+        return false;
+    }
+    
+    if (id != I_AM_LSM303C_MAG)
+    {
+        EPRINT("This is not a LSM303C_MAG (0x02X != 0x02X)\r\n", id, I_AM_LSM303C_MAG);
+        delete magnetometer;
+        magnetometer = NULL;
+        return false;
+    }
+    
+    if(magnetometer->Init(NULL))
+    {
+        return false;
+    }
+    
+    if(magnetometer->Set_M_ODR(1.250))
+    {
+        return false;
+    }
+    
+    if(magnetometer->Enable())
+    {
+        return false;
+    }
+    
+    return true;
+}
+
+bool Init_LSM303C_ACC(LSM303C_ACC_Sensor* accelerometer)
+{
+    uint8_t id = 0;
+    uint8_t error = 0;
+    
+    error = accelerometer->ReadID(&id);
+    
+    /* Check presence */
+    if(error)
+    {
+        EPRINT("LSM303C_ACC Not detected!\r\n");
+        delete accelerometer;
+        accelerometer = NULL;
+        return false;
+    }
+    
+    if (id != I_AM_LSM303C_ACC)
+    {
+        EPRINT("This is not a LSM303C_ACC (0x02X != 0x02X)\r\n", id, I_AM_LSM303C_ACC);
+        delete accelerometer;
+        accelerometer = NULL;
+        return false;
+    }
+    
+    if(accelerometer->Init(NULL))
+    {
+        return false;
+    }
+    
+    if(accelerometer->Set_X_ODR(10))
+    {
+        return false;
+    }
+    
+    if(accelerometer->Enable())
+    {
+        return false;
+    }
+    
+    return true;
+}
+
+// Cal method
+#define CALL_METH(obj, meth, param, ret) ((obj == NULL) ?       \
+                      ((*(param) = (ret)), 0) : \
+                      ((obj)->meth(param))      \
+                      )
+              
+__inline int32_t float2_to_int(float v)
+{
+    return (int32_t)(v*100);
+}
+
+bool mag_get_value(int32_t* buf)
+{
+#if (_MAG_EN_ == 0)
+    return simul_sensor_value(buf, 3, -1900, 1900);
+#elif (_MAG_EN_ == 1)
+    return CALL_METH(magnetometer, Get_M_Axes, buf, 0)? true : false;
+#else 
+    return false;
+#endif
+}
+
+bool acc_get_value(int32_t* buf)
+{
+#if (_ACC_EN_ == 0)
+    return simul_sensor_value(buf, 3, -1900, 1900);
+#elif (_ACC_EN_ == 1)
+    return CALL_METH(accelerometer, Get_X_Axes, buf, 0)? true : false;
+#else 
+    return false;
+#endif
+}
+
+bool gyr_get_value(int32_t* buf)
+{
+#if (_GYR_EN_ == 0)
+    return simul_sensor_value(buf, 3, -40000, 40000);
+#elif (_GYR_EN_ == 1)
+    return CALL_METH(gyroscope, Get_G_Axes, buf, 0)? true : false;
+#else 
+    return false;
+#endif
+}
+
+bool pre_get_value(int32_t* buf)
+{
+#if (_PRE_EN_ == 0)
+    return simul_sensor_value(buf, 1, 96000, 104000);
+#elif (_PRE_EN_ == 1)
+    bool err;
+    float tmp;
+    err = CALL_METH(pressure_sensor, GetPressure, &tmp, 0.0f)? true : false;
+    buf[0] = float2_to_int(tmp);
+    return err;
+#else 
+    return false;
+#endif
+}
+
+bool hum_get_value(int32_t* buf)
+{
+#if (_HUM_EN_ == 0)
+    return simul_sensor_value(buf, 1, 1000, 9000);
+#elif (_HUM_EN_ == 1)
+    bool err;
+    float tmp;
+    err = CALL_METH(humidity_sensor, GetHumidity, &tmp, 0.0f)? true : false;
+    buf[0] = float2_to_int(tmp);
+    return err;
+#else
+    return false;
+#endif
+}
+
+bool tem1_get_value(int32_t* buf)
+{
+#if (_TEM1_EN_ == 0)
+    return simul_sensor_value(buf, 1, 1100, 3900);
+#elif (_TEM1_EN_ == 1)
+    bool err;
+    float tmp;
+    err = CALL_METH(temp_sensor1, GetTemperature, &tmp, 0.0f)? true : false;
+    buf[0] = float2_to_int(tmp);    
+    return err;
+#else
+    return false;
+#endif
+}
+
+bool tem2_get_value(int32_t* buf)
+{
+#if (_TEM2_EN_ == 0)
+    return simul_sensor_value(buf, 1, 5100, 10100);
+#elif (_TEM2_EN_ == 1)
+    bool err;
+    float tmp;
+    err = CALL_METH(temp_sensor2, GetFahrenheit, &tmp, 0.0f)? true : false;
+    buf[0] = float2_to_int(tmp);
+    return err;
+#else
+    return false;
+#endif
+}
+
+bool light_get_value(int32_t* buf)
+{
+#if (_LIGHT_EN_ == 0)
+    return simul_sensor_value(buf, 1, 0, 100);
+#elif (_LIGHT_EN_ == 1) && defined(SENSOR_LIGHT_MEAS) && defined(SENSOR_LIGHT_EN)
+    float tmp;
+    g_light_en_l = 0;
+    Thread::wait(10);
+    tmp = g_light_meas;
+    g_light_en_l = 1;
+    buf[0] = float2_to_int(tmp);
+    return false;
+#else
+    return false;
+#endif
+}
\ No newline at end of file