Workshop example

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Revision:
12:1f1a50e973db
Parent:
11:8df4529f060d
Child:
13:42b49a0caade
--- a/main.cpp	Mon Dec 10 10:42:29 2018 +0000
+++ b/main.cpp	Mon Dec 10 17:19:20 2018 +0000
@@ -29,12 +29,12 @@
 // #include "VL53L0X.h"
 
 static DevI2C devI2c(PB_11,PB_10);
-static HTS221Sensor hum_temp(&devI2c);
-static LPS22HBSensor press_temp(&devI2c);
-static LSM6DSLSensor acc_gyro(&devI2c,LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW,PD_11); // low address
-static LIS3MDL magnetometer(&devI2c);
+static HTS221Sensor sen_hum_temp(&devI2c);
+static LPS22HBSensor sen_press_temp(&devI2c);
+static LSM6DSLSensor sen_acc_gyro(&devI2c,LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW,PD_11); // low address
+static LIS3MDL sen_mag(&devI2c);
 static DigitalOut shutdown_pin(PC_6);
-// static VL53L0X range(&devI2c, &shutdown_pin, PC_7);
+// static VL53L0X sen_distance(&devI2c, &shutdown_pin, PC_7);
 
 InterruptIn button(USER_BUTTON);
 #define SENSORS_POLL_INTERVAL 1.0
@@ -56,14 +56,19 @@
 DigitalOut led(LED1);
 
 // Declaring pointers for access to Pelion Client resources outside of main()
-MbedCloudClientResource *button_res;
-MbedCloudClientResource *led_res;
+MbedCloudClientResource *res_button;
+MbedCloudClientResource *res_led;
 
+// Additional resources for sensor readings
+MbedCloudClientResource *res_humidity;
+MbedCloudClientResource *res_temperature;
 #ifdef SENSORS_AND_BUTTONS
-// Additional resources for sensor readings
-MbedCloudClientResource *humidity_res;
-MbedCloudClientResource *temperature_res;
-MbedCloudClientResource *distance_res;
+MbedCloudClientResource *res_pressure;
+MbedCloudClientResource *res_temperature2;
+MbedCloudClientResource *res_magnometer;
+MbedCloudClientResource *res_accelerometer;
+MbedCloudClientResource *res_gyroscope;
+MbedCloudClientResource *res_distance;
 #endif /* SENSORS_AND_BUTTONS */
 
 // When the device is registered, this variable will be used to access various useful information, like device ID etc.
@@ -87,16 +92,16 @@
  * @param size Size of the body
  */
 void led_post_callback(MbedCloudClientResource *resource, const uint8_t *buffer, uint16_t size) {
-    printf("POST received. Going to blink LED pattern: %s\n", led_res->get_value().c_str());
-    led = atoi(led_res->get_value().c_str());
+    printf("POST received. Going to blink LED pattern: %s\n", res_led->get_value().c_str());
+    led = atoi(res_led->get_value().c_str());
 }
 
 /**
  * Button function triggered by the physical button press or by timer depending on SENSORS_AND_BUTTONS macro.
  */
 void button_press() {
-    int v = button_res->get_value_int() + 1;
-    button_res->set_value(v);
+    int v = res_button->get_value_int() + 1;
+    res_button->set_value(v);
     printf("Button clicked %d times\n", v);
 }
 
@@ -126,32 +131,32 @@
     uint8_t id;
 
     // Initialize sensors
-    hum_temp.init(NULL);
-    press_temp.init(NULL);
-    acc_gyro.init(NULL);
-    magnetometer.init(NULL);
+    sen_hum_temp.init(NULL);
+    sen_press_temp.init(NULL);
+    sen_acc_gyro.init(NULL);
+    sen_mag.init(NULL);
     // range.init_sensor(VL53L0X_DEFAULT_ADDRESS);
 
     /// Call sensors enable routines
-    hum_temp.enable();
-    press_temp.enable();
-    //magnetometer.enable();
-    acc_gyro.enable_x();
-    acc_gyro.enable_g();
+    sen_hum_temp.enable();
+    sen_press_temp.enable();
+    //sen_mag.enable();
+    sen_acc_gyro.enable_x();
+    sen_acc_gyro.enable_g();
 
     printf("\033[2J\033[20A");
-    printf ("\r\n--- Sensors configuration ---\r\n\r\n");
+    printf ("\r\nSensors configuration:\r\n");
 
-    hum_temp.read_id(&id);
+    sen_hum_temp.read_id(&id);
     printf("HTS221  humidity & temperature    = 0x%X\r\n", id);
-    press_temp.read_id(&id);
+    sen_press_temp.read_id(&id);
     printf("LPS22HB pressure & temperature    = 0x%X\r\n", id);
-    magnetometer.read_id(&id);
+    sen_mag.read_id(&id);
     printf("LIS3MDL magnetometer              = 0x%X\r\n", id);
-    acc_gyro.read_id(&id);
+    sen_acc_gyro.read_id(&id);
     printf("LSM6DSL accelerometer & gyroscope = 0x%X\r\n", id);
 
-    printf("\n\r--- Reading sensor values ---\n\r"); ;
+    printf("\r\n"); ;
 }
 
 /**
@@ -159,44 +164,43 @@
  * This function is called periodically.
  */
 void sensors_update() {
-    float value1, value2;
+    float fval1, fval2;
     int32_t axes[3];
-    uint32_t distance;
+    uint32_t uval;
 
     printf("\r\n");
 
-    value1 = value2 = 0.0;
-    hum_temp.get_temperature(&value1);
-    hum_temp.get_humidity(&value2);
+    fval1 = fval2 = 0.0;
+    sen_hum_temp.get_temperature(&fval1);
+    sen_hum_temp.get_humidity(&fval2);
     if (endpointInfo) {
-        temperature_res->set_value(value1);
-        humidity_res->set_value(value2);
+        res_temperature->set_value(fval1);
+        res_humidity->set_value(fval2);
     }
-    printf("HTS221:  [temp] %.2f C, [hum]   %.2f%%\r\n", value1, value2);
+    printf("HTS221 temp:  %7.2f C,  humidity: %7.2f %%\r\n", fval1, fval2);
 
-    value1 = value2 = 0.0;
-    press_temp.get_temperature(&value1);
-    // press_temp.get_pressure(&value2);
-    printf("LPS22HB: [temp] %.2f C, [press] %.2f mbar\r\n", value1, value2);
-    printf("Mag/Acc/Gyro readings:        x,      y,      z\r\n");
+    fval1 = fval2 = 0.0;
+    sen_press_temp.get_temperature(&fval1);
+    sen_press_temp.get_pressure(&fval2);
+    printf("LPS22HB temp: %7.2f C,  pressure: %7.2f mbar      \r\n", fval1, fval2);
 
-    magnetometer.get_m_axes(axes);
-    printf("LIS3MDL [mag/mgauss]:    %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
-    acc_gyro.get_x_axes(axes);
-    printf("LSM6DSL [acc/mg]:        %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
-    acc_gyro.get_g_axes(axes);
-    printf("LSM6DSL [gyro/mdps]:     %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
+    sen_mag.get_m_axes(axes);
+    printf("LIS3MDL mag:  %7ld x, %7ld y, %7ld z [mgauss]      \r\n", axes[0], axes[1], axes[2]);
+    sen_acc_gyro.get_x_axes(axes);
+    printf("LSM6DSL acc:  %7ld x, %7ld y, %7ld z [mg]       \r\n", axes[0], axes[1], axes[2]);
+    sen_acc_gyro.get_g_axes(axes);
+    printf("LSM6DSL gyro: %7ld x, %7ld y, %7ld z [mdps]      \r\n", axes[0], axes[1], axes[2]);
 
-    // if (range.get_distance(&distance) == VL53L0X_ERROR_NONE) {
-    //     printf("VL53L0X [mm]:            %6ld\r\n", distance);
+    // if (range.get_distance(&uval) == VL53L0X_ERROR_NONE) {
+    //     printf("VL53L0X [mm]:            %6ld\r\n", uval);
     //     if (endpointInfo) {
-    //         distance_res->set_value((int)distance);
+    //         res_distance->set_value((int)uval);
     //     }
     // } else {
     //     printf("VL53L0X [mm]:                --\r\n");
     // }
 
-    printf("\033[7A");
+    printf("\033[6A");
 }
 #endif /* SENSORS_AND_BUTTONS */
 
@@ -257,34 +261,34 @@
     }
 
     // Creating resources, which can be written or read from the cloud
-    button_res = client.create_resource("3200/0/5501", "button_count");
-    button_res->set_value(0);
-    button_res->methods(M2MMethod::GET);
-    button_res->observable(true);
-    button_res->attach_notification_callback(button_callback);
+    res_button = client.create_resource("3200/0/5501", "button_count");
+    res_button->set_value(0);
+    res_button->methods(M2MMethod::GET);
+    res_button->observable(true);
+    res_button->attach_notification_callback(button_callback);
 
 #ifdef SENSORS_AND_BUTTONS
     // Sensor resources
-    temperature_res = client.create_resource("3303/0/5700", "temperature");
-    temperature_res->set_value(0);
-    temperature_res->methods(M2MMethod::GET);
-    temperature_res->observable(true);
+    res_temperature = client.create_resource("3303/0/5700", "temperature");
+    res_temperature->set_value(0);
+    res_temperature->methods(M2MMethod::GET);
+    res_temperature->observable(true);
 
-    humidity_res = client.create_resource("3304/0/5700", "humidity");
-    humidity_res->set_value(0);
-    humidity_res->methods(M2MMethod::GET);
-    humidity_res->observable(true);
+    res_humidity = client.create_resource("3304/0/5700", "humidity");
+    res_humidity->set_value(0);
+    res_humidity->methods(M2MMethod::GET);
+    res_humidity->observable(true);
 
-    // distance_res = client.create_resource("3330/0/5700", "distance");
-    // distance_res->set_value(0);
-    // distance_res->methods(M2MMethod::GET);
-    // distance_res->observable(true);
+    // res_distance = client.create_resource("3330/0/5700", "distance");
+    // res_distance->set_value(0);
+    // res_distance->methods(M2MMethod::GET);
+    // res_distance->observable(true);
 #endif /* SENSORS_AND_BUTTONS */
 
-    // led_res = client.create_resource("3201/0/5853", "led_state");
-    // led_res->set_value(1);
-    // led_res->methods(M2MMethod::GET | M2MMethod::PUT);
-    // led_res->attach_put_callback(led_put_callback);
+    // res_led = client.create_resource("3201/0/5853", "led_state");
+    // res_led->set_value(1);
+    // res_led->methods(M2MMethod::GET | M2MMethod::PUT);
+    // res_led->attach_put_callback(led_put_callback);
 
     printf("Initialized Pelion Client. Registering...\n");
 
@@ -294,6 +298,11 @@
     // Register with Pelion DM
     client.register_and_connect();
 
+    int i = 600; // wait 60 seconds
+    while (i-- > 0 && !client.is_client_registered()) {
+        wait_ms(100);
+    }
+
     // Placeholder for callback to update local resource when GET comes.
     // The timer fires on an interrupt context, but debounces it to the eventqueue, so it's safe to do network operations
 #ifdef SENSORS_AND_BUTTONS