Workshop example

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Revision:
11:8df4529f060d
Parent:
10:b27c962b3c3f
Child:
12:1f1a50e973db
--- a/main.cpp	Sat Dec 08 01:46:22 2018 +0000
+++ b/main.cpp	Mon Dec 10 10:42:29 2018 +0000
@@ -20,13 +20,13 @@
 #include "simple-mbed-cloud-client.h"
 #include "LittleFileSystem.h"
 
-//#define SENSORS_AND_BUTTONS
+#define SENSORS_AND_BUTTONS
 #ifdef SENSORS_AND_BUTTONS
 #include "HTS221Sensor.h"
 #include "LPS22HBSensor.h"
 #include "LSM6DSLSensor.h"
 #include "lis3mdl_class.h"
-#include "VL53L0X.h"
+// #include "VL53L0X.h"
 
 static DevI2C devI2c(PB_11,PB_10);
 static HTS221Sensor hum_temp(&devI2c);
@@ -34,9 +34,10 @@
 static LSM6DSLSensor acc_gyro(&devI2c,LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW,PD_11); // low address
 static LIS3MDL magnetometer(&devI2c);
 static DigitalOut shutdown_pin(PC_6);
-static VL53L0X range(&devI2c, &shutdown_pin, PC_7);
+// static VL53L0X range(&devI2c, &shutdown_pin, PC_7);
 
 InterruptIn button(USER_BUTTON);
+#define SENSORS_POLL_INTERVAL 1.0
 #endif /* SENSORS_AND_BUTTONS */
 
 // An event queue is a very useful structure to debounce information between contexts (e.g. ISR and normal threads)
@@ -51,9 +52,12 @@
 SlicingBlockDevice sd(bd, 0, 2*1024*1024);
 LittleFileSystem fs("fs", &sd);
 
+// Default LED to use for PUT/POST
+DigitalOut led(LED1);
+
 // Declaring pointers for access to Pelion Client resources outside of main()
 MbedCloudClientResource *button_res;
-MbedCloudClientResource *pattern_res;
+MbedCloudClientResource *led_res;
 
 #ifdef SENSORS_AND_BUTTONS
 // Additional resources for sensor readings
@@ -66,21 +70,13 @@
 static const ConnectorClientEndpointInfo* endpointInfo;
 
 /**
- * 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);
-    printf("Button clicked %d times\n", v);
-}
-
-/**
  * PUT handler
  * @param resource The resource that triggered the callback
  * @param newValue Updated value for the resource
  */
-void pattern_updated(MbedCloudClientResource *resource, m2m::String newValue) {
+void led_put_callback(MbedCloudClientResource *resource, m2m::String newValue) {
     printf("PUT received, new value: %s\n", newValue.c_str());
+    led = atoi(newValue.c_str());
 }
 
 /**
@@ -90,27 +86,18 @@
  *               Note that the buffer is deallocated after leaving this function, so copy it if you need it longer.
  * @param size Size of the body
  */
-void blink_callback(MbedCloudClientResource *resource, const uint8_t *buffer, uint16_t size) {
-    printf("POST received. Going to blink LED pattern: %s\n", pattern_res->get_value().c_str());
-
-    static DigitalOut augmentedLed(LED1); // LED that is used for blinking the pattern
+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());
+}
 
-    // Parse the pattern string, and toggle the LED in that pattern
-    string s = std::string(pattern_res->get_value().c_str());
-    size_t i = 0;
-    size_t pos = s.find(':');
-    while (pos != string::npos) {
-        wait_ms(atoi(s.substr(i, pos - i).c_str()));
-        augmentedLed = !augmentedLed;
-
-        i = ++pos;
-        pos = s.find(':', pos);
-
-        if (pos == string::npos) {
-            wait_ms(atoi(s.substr(i, s.length()).c_str()));
-            augmentedLed = !augmentedLed;
-        }
-    }
+/**
+ * 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);
+    printf("Button clicked %d times\n", v);
 }
 
 /**
@@ -131,10 +118,10 @@
     endpointInfo = endpoint;
 }
 
-#ifdef SENSORS_AND_BUTTONS
 /**
  * Initialize sensors
  */
+#ifdef SENSORS_AND_BUTTONS
 void sensors_init() {
     uint8_t id;
 
@@ -143,7 +130,7 @@
     press_temp.init(NULL);
     acc_gyro.init(NULL);
     magnetometer.init(NULL);
-    range.init_sensor(VL53L0X_DEFAULT_ADDRESS);
+    // range.init_sensor(VL53L0X_DEFAULT_ADDRESS);
 
     /// Call sensors enable routines
     hum_temp.enable();
@@ -189,7 +176,7 @@
 
     value1 = value2 = 0.0;
     press_temp.get_temperature(&value1);
-    press_temp.get_pressure(&value2);
+    // 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");
 
@@ -200,16 +187,16 @@
     acc_gyro.get_g_axes(axes);
     printf("LSM6DSL [gyro/mdps]:     %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
 
-    if (range.get_distance(&distance) == VL53L0X_ERROR_NONE) {
-        printf("VL53L0X [mm]:            %6ld\r\n", distance);
-        if (endpointInfo) {
-            distance_res->set_value((int)distance);
-        }
-    } else {
-        printf("VL53L0X [mm]:                --\r\n");
-    }
+    // if (range.get_distance(&distance) == VL53L0X_ERROR_NONE) {
+    //     printf("VL53L0X [mm]:            %6ld\r\n", distance);
+    //     if (endpointInfo) {
+    //         distance_res->set_value((int)distance);
+    //     }
+    // } else {
+    //     printf("VL53L0X [mm]:                --\r\n");
+    // }
 
-    printf("\033[8A");
+    printf("\033[7A");
 }
 #endif /* SENSORS_AND_BUTTONS */
 
@@ -276,15 +263,6 @@
     button_res->observable(true);
     button_res->attach_notification_callback(button_callback);
 
-    pattern_res = client.create_resource("3201/0/5853", "blink_pattern");
-    pattern_res->set_value("500:500:500:500:500:500:500:500");
-    pattern_res->methods(M2MMethod::GET | M2MMethod::PUT);
-    pattern_res->attach_put_callback(pattern_updated);
-
-    MbedCloudClientResource *blink_res = client.create_resource("3201/0/5850", "blink_action");
-    blink_res->methods(M2MMethod::POST);
-    blink_res->attach_post_callback(blink_callback);
-
 #ifdef SENSORS_AND_BUTTONS
     // Sensor resources
     temperature_res = client.create_resource("3303/0/5700", "temperature");
@@ -297,12 +275,17 @@
     humidity_res->methods(M2MMethod::GET);
     humidity_res->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);
+    // distance_res = client.create_resource("3330/0/5700", "distance");
+    // distance_res->set_value(0);
+    // distance_res->methods(M2MMethod::GET);
+    // distance_res->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);
+
     printf("Initialized Pelion Client. Registering...\n");
 
     // Callback that fires when registering is complete
@@ -314,10 +297,10 @@
     // 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
-    button.fall(eventQueue.event(button_press));
+    button.fall(eventQueue.event(&button_press));
 
     Ticker timer;
-    timer.attach(eventQueue.event(sensors_update), 3.0);
+    timer.attach(eventQueue.event(&sensors_update), SENSORS_POLL_INTERVAL);
 #else /* SENSORS_AND_BUTTONS */
     Ticker timer;
     timer.attach(eventQueue.event(&button_press), 5.0);