Simulated product dispenser

Dependencies:   HTS221

Fork of mbed-cloud-workshop-connect-HTS221 by Jim Carver

Revision:
1:521604503e81
Parent:
0:6b753f761943
Child:
2:d5f5207e8b2a
--- a/main.cpp	Fri Oct 12 21:22:49 2018 +0000
+++ b/main.cpp	Fri Oct 19 02:01:38 2018 +0000
@@ -37,7 +37,9 @@
 
 
 
+#include "HTS221/HTS221Sensor.h"
 
+            
 // An event queue is a very useful structure to debounce information between contexts (e.g. ISR and normal threads)
 // This is great because things such as network operations are illegal in ISR, so updating a resource in a button's fall() function is not allowed
 EventQueue eventQueue;
@@ -56,14 +58,40 @@
 // Declaring pointers for access to Mbed Cloud Client resources outside of main()
 MbedCloudClientResource *button_res;
 MbedCloudClientResource *pattern_res;
+MbedCloudClientResource *temperature_res;
+MbedCloudClientResource *humidity_res;
+static int v = 0;
 
 // This function gets triggered by the timer. It's easy to replace it by an InterruptIn and fall() mode on a real button
 void fake_button_press() {
-    int v = button_res->get_value_int() + 1;
+
+    button_res->set_value(v++);
+    if(v > 1000) v = 0;
+    //printf("Simulated button clicked %d times\n", v);
+
+}
+
+// Manage the HST221 in an independent thread
+Thread HTS221Thread;
 
-    button_res->set_value(v);
-
-    printf("Simulated button clicked %d times\n", v);
+void HTS221Handler(void)
+{
+    uint8_t id;
+    float value1, value2;
+    static DevI2C devI2c(PB_11,PB_10); // This defines the processor port pins attached to the I2C bus
+    static HTS221Sensor hum_temp(&devI2c);
+    hum_temp.init(NULL);
+    hum_temp.read_id(&id); // Read the device ID
+    printf("\r\n\n\nHTS221  humidity & temperature    = 0x%X\r\n", id);
+    hum_temp.enable();
+    while(1) {
+        wait(5); // Update every 5 seconds
+        // Update temperature and humidity resources 
+        hum_temp.get_temperature(&value1);
+        hum_temp.get_humidity(&value2);
+        temperature_res->set_value(value1);
+        humidity_res->set_value(value2);
+    }
 }
 
 /**
@@ -82,6 +110,9 @@
  *               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());
 
@@ -111,7 +142,15 @@
  * @param status The delivery status of the notification
  */
 void button_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status) {
-    printf("Button notification, status %s (%d)\n", MbedCloudClientResource::delivery_status_to_string(status), status);
+    printf("Button %s (%d)\n", MbedCloudClientResource::delivery_status_to_string(status), status);
+}
+
+void temperature_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status) {
+    printf("Temperature %s (%d)\n", MbedCloudClientResource::delivery_status_to_string(status), status);
+}
+
+void humidity_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status) {
+    printf("Humidity %s (%d)\n", MbedCloudClientResource::delivery_status_to_string(status), status);
 }
 
 /**
@@ -123,6 +162,7 @@
 }
 
 int main(void) {
+
     printf("Starting Simple Mbed Cloud Client example\n");
 
     printf("Checking SDCard is Formatted\r\n");
@@ -144,7 +184,12 @@
     // if (err < 0) {
     //     error("error: %s (%d)\n", strerror(-err), err);
     // }
+    
+    //
+    // Initalize temperature and humidity sensor
+    //
 
+    
     printf("Connecting to the network using Wifi...\n");
 
     // Connect to the internet (DHCP is expected to be on)
@@ -180,7 +225,19 @@
     MbedCloudClientResource *blink_res = client.create_resource("3201/0/5850", "blink_action");
     blink_res->methods(M2MMethod::POST);
     blink_res->attach_post_callback(blink_callback);
-
+       
+    temperature_res = client.create_resource("3303/0/5700", "temperature");
+    temperature_res->set_value(0);
+    temperature_res->methods(M2MMethod::GET);
+    temperature_res->observable(true);
+    temperature_res->attach_notification_callback(temperature_callback);
+    
+    humidity_res = client.create_resource("3304/0/5700", "humidity");
+    humidity_res->set_value(0);
+    humidity_res->methods(M2MMethod::GET);
+    humidity_res->observable(true);
+    humidity_res->attach_notification_callback(humidity_callback);
+   
     printf("Initialized Mbed Cloud Client. Registering...\n");
 
     // Callback that fires when registering is complete
@@ -193,7 +250,8 @@
     // The timer fires on an interrupt context, but debounces it to the eventqueue, so it's safe to do network operations
     Ticker timer;
     timer.attach(eventQueue.event(&fake_button_press), 5.0);
-
+    HTS221Thread.start(HTS221Handler);
+    
     // You can easily run the eventQueue in a separate thread if required
     eventQueue.dispatch_forever();
 }