Simulated product dispenser
Fork of mbed-cloud-workshop-connect-HTS221 by
Revision 4:e518dde96e59, committed 2018-10-25
- Comitter:
- JimCarver
- Date:
- Thu Oct 25 14:00:12 2018 +0000
- Parent:
- 3:0d3492ebb1a5
- Commit message:
- Simulated dispenser
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 0d3492ebb1a5 -r e518dde96e59 main.cpp --- 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