Simulated product dispenser

Dependencies:   HTS221

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

Revision:
4:e518dde96e59
Parent:
3:0d3492ebb1a5
--- a/main.cpp	Mon Oct 22 23:01:04 2018 +0000
+++ b/main.cpp	Thu Oct 25 14:00:12 2018 +0000
@@ -39,7 +39,8 @@
 
 #include "HTS221/HTS221Sensor.h"
 
-            
+float rtime = 5.0;
+
 // 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;
@@ -60,16 +61,40 @@
 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 SwipeCount = 0;
+InterruptIn PIR(D5);
+DigitalOut motorOnLed(LED4);
+DigitalOut PIRtrigger(LED2); 
+DigitalOut connectLED(LED1);
+            
+Thread motorThread;
+Semaphore motorHold;
 
-    button_res->set_value(v++);
-    if(v > 1000) v = 0;
-    //printf("Simulated button clicked %d times\n", v);
+void motorAction(void)
+{
+while(1) {
+    motorHold.wait();
+    SwipeCount++;
+    motorOnLed = 0;
+    PIRtrigger = 1;
+    button_res->set_value(SwipeCount);
+    wait(rtime);
+    motorOnLed = 1;
+    }
+}
+    
+void PIRhandler(void)
+{
+    motorHold.release();
+}
+   
+void PIRreset(void)
+{
+    PIRtrigger = 0;
+}
 
-}
 
 // Manage the HST221 in an independent thread
 Thread HTS221Thread;
@@ -80,11 +105,13 @@
     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);
+    //printf("\r\n\n\nHTS221  humidity & temperature    = 0x%X\r\n", id);
     hum_temp.enable();
-    while(1) {
+    while(5) {
+        //printf("PIR=%x\r\n", PIR.read());
         wait(5); // Update every 5 seconds
         // Update temperature and humidity resources 
         hum_temp.get_temperature(&value1);
@@ -94,13 +121,24 @@
     }
 }
 
+
+// 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;
+
+
+    printf("Dispenser Swiped %d times\n", SwipeCount);
+}
+
 /**
  * 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) {
-    printf("PUT received, new value: %s\n", newValue.c_str());
+    //printf("PUT received, new value: %s\n", newValue.c_str());
+    rtime = atof(newValue.c_str());
+    printf("New Rtime= %f\r\n", rtime);
 }
 
 /**
@@ -110,16 +148,14 @@
  *               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) {
+/*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
+    static DigitalOut augmentedLed(LED2); // LED that is used for blinking the pattern
 
     // Parse the pattern string, and toggle the LED in that pattern
     string s = std::string(pattern_res->get_value().c_str());
+    //printf("Pattern = %s\r\n", s);
     size_t i = 0;
     size_t pos = s.find(':');
     while (pos != string::npos) {
@@ -135,16 +171,16 @@
         }
     }
 }
-
+*/
 /**
  * Notification callback handler
  * @param resource The resource that triggered the callback
  * @param status The delivery status of the notification
  */
 void button_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status) {
-    printf("Button %s (%d)\n", MbedCloudClientResource::delivery_status_to_string(status), status);
+    printf("callback %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);
 }
@@ -152,6 +188,16 @@
 void humidity_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status) {
     printf("Humidity %s (%d)\n", MbedCloudClientResource::delivery_status_to_string(status), status);
 }
+*/
+
+void startData(void)
+{
+    connectLED = 1;
+    PIR.rise(PIRhandler);
+    PIR.fall(PIRreset);
+    motorThread.start(motorAction);
+    HTS221Thread.start(HTS221Handler);
+}
 
 /**
  * Registration callback handler
@@ -159,14 +205,12 @@
  */
 void registered(const ConnectorClientEndpointInfo *endpoint) {
     printf("Connected to Mbed Cloud. Endpoint Name: %s\n", endpoint->internal_endpoint_name.c_str());
-    Ticker timer;
-    timer.attach(eventQueue.event(&fake_button_press), 5.0);
-    HTS221Thread.start(HTS221Handler);
+    startData(); 
 }
 
-
 int main(void) {
-
+    connectLED = 0;
+    motorOnLed = 1;
     printf("Starting Simple Mbed Cloud Client example\n");
 
     printf("Checking SDCard is Formatted\r\n");
@@ -188,12 +232,7 @@
     // 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)
@@ -222,25 +261,26 @@
     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->set_value("5.0");
     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);
-       
+*/    
     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);
+    temperature_res->attach_notification_callback(button_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);
+    humidity_res->attach_notification_callback(button_callback);
    
     printf("Initialized Mbed Cloud Client. Registering...\n");
 
@@ -250,10 +290,6 @@
     // Register with Mbed Cloud
     client.register_and_connect();
 
-    // 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
-
-    
     // You can easily run the eventQueue in a separate thread if required
     eventQueue.dispatch_forever();
-}
+}
\ No newline at end of file