ST
/
example-IDW01M1-mbed-Cloud-connect
Generic example for any board with IDMW0xM1 shield
Diff: main.cpp
- Revision:
- 17:ada41201c642
- Parent:
- 6:254a7e7fbef1
- Child:
- 18:04813dfab243
--- a/main.cpp Tue Feb 20 14:09:10 2018 +0100 +++ b/main.cpp Tue Feb 20 14:25:34 2018 +0100 @@ -24,14 +24,13 @@ #include "key-config-manager/key_config_manager.h" #include "SDBlockDevice.h" #include "FATFileSystem.h" -#include "EthernetInterface.h" +//#include "EthernetInterface.h" +#include "SpwfSAInterface.h" -// Placeholder to hardware that trigger events (timer, button, etc) -Ticker timer; +#define LED_OFF 1 -// Placeholder for storage -SDBlockDevice sd(PTE3, PTE1, PTE2, PTE4); -FATFileSystem fs("sd"); +DigitalOut led(LED_RED, LED_OFF); +InterruptIn button(BUTTON1); // Pointers to the resources that will be created in main_application(). static MbedCloudClientResource* pattern_ptr; @@ -46,39 +45,99 @@ } void pattern_updated(const char *) { - printf("PUT received, new value: %s\n", pattern_ptr->get_value().c_str()); - // Placeholder for PUT action + printf("PUT received, new value: %s\n", pattern_ptr->get_value()); } void blink_callback(void *) { - String pattern_str = pattern_ptr->get_value(); - const char *pattern = pattern_str.c_str(); - printf("POST received. LED pattern = %s\n", pattern); - // Placeholder for POST action + const char *pattern = pattern_ptr->get_value(); + printf("LED pattern = %s\n", pattern); // The pattern is something like 500:200:500, so parse that. + // LED blinking is done while parsing. + led = !led; + while (*pattern != '\0') { + // Wait for requested time. + wait_ms(atoi(pattern)); + led = !led; + // Search for next value. + pattern = strchr(pattern, ':'); + if(!pattern) { + break; // while + } + pattern++; + } + + led = LED_OFF; } -void button_callback(const M2MBase& object, const NoticationDeliveryStatus status) +void button_notification_status_callback(const M2MBase& object, const NoticationDeliveryStatus status) { - printf("Button notification. Callback: (%s)\n", object.uri_path()); - // Placeholder for GET + switch(status) { + case NOTIFICATION_STATUS_BUILD_ERROR: + printf("Notification callback: (%s) error when building CoAP message\n", object.uri_path()); + break; + case NOTIFICATION_STATUS_RESEND_QUEUE_FULL: + printf("Notification callback: (%s) CoAP resend queue full\n", object.uri_path()); + break; + case NOTIFICATION_STATUS_SENT: + printf("Notification callback: (%s) Notification sent to server\n", object.uri_path()); + break; + case NOTIFICATION_STATUS_DELIVERED: + printf("Notification callback: (%s) Notification delivered\n", object.uri_path()); + break; + case NOTIFICATION_STATUS_SEND_FAILED: + printf("Notification callback: (%s) Notification sending failed\n", object.uri_path()); + break; + case NOTIFICATION_STATUS_SUBSCRIBED: + printf("Notification callback: (%s) subscribed\n", object.uri_path()); + break; + case NOTIFICATION_STATUS_UNSUBSCRIBED: + printf("Notification callback: (%s) subscription removed\n", object.uri_path()); + break; + default: + break; + } } +// This function is called when a POST request is received for resource 5000/0/1. +void unregister_cb(void *) +{ + printf("Unregister resource executed\n"); + client->close(); +} + +// This function is called when a POST request is received for resource 5000/0/2. +void factory_reset_cb(void *) +{ + printf("Factory reset resource executed\n"); + client->close(); + kcm_status_e kcm_status = kcm_factory_reset(); + if (kcm_status != KCM_STATUS_SUCCESS) { + printf("Failed to do factory reset - %d\n", kcm_status); + } else { + printf("Factory reset completed. Now restart the device\n"); + } +} int main(void) { - // Requires DAPLink 245+ (https://github.com/ARMmbed/DAPLink/pull/364) - // Older versions: workaround to prevent possible deletion of credentials: + // IOTMORF-1712: DAPLINK starts the previous application during flashing a new binary + // This is workaround to prevent possible deletion of credentials or storage corruption + // while replacing the application binary. wait(2); // Misc OS setup srand(time(NULL)); - // Placeholder for network - EthernetInterface net; +// EthernetInterface net; + SpwfSAInterface wifi(MBED_CONF_APP_WIFI_TX, MBED_CONF_APP_WIFI_RX); + SDBlockDevice sd(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS); + FATFileSystem fs("sd"); printf("Start Simple Mbed Cloud Client\n"); + // Initialize button interrupt + button.fall(&button_press); + // Initialize SD card int status = sd.init(); if (status != BD_ERROR_OK) { @@ -91,6 +150,7 @@ if (status) { printf("Failed to mount FAT file system, reformatting...\r\n"); status = fs.reformat(&sd); + if (status) { printf("Failed to reformat FAT file system\r\n"); return -1; @@ -99,19 +159,20 @@ } } - printf("Connecting to the network using Ethernet...\n"); + printf("Connecting to the network using WiFi...\n"); - status = net.connect(); +// status = wifi.connect(); + status = wifi.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, (strlen(MBED_CONF_APP_WIFI_PASSWORD) > 1) ? NSAPI_SECURITY_WPA_WPA2 : NSAPI_SECURITY_NONE); if (status) { printf("Connection to Network Failed %d!\n", status); return -1; } else { - const char *ip_addr = net.get_ip_address(); + const char *ip_addr = wifi.get_ip_address(); printf("Connected successfully\n"); printf("IP address %s\n", ip_addr); } - SimpleMbedCloudClient mbedClient(&net); + SimpleMbedCloudClient mbedClient(&wifi); // Save pointer to mbedClient so that other functions can access it. client = &mbedClient; @@ -127,28 +188,28 @@ button->set_value("0"); button->methods(M2MMethod::GET); button->observable(true); - button->attach_notification_callback(button_callback); + button->attach_notification(M2MMethod::GET, (void*)button_notification_status_callback); MbedCloudClientResource *pattern = mbedClient.create_resource("3201/0/5853", "pattern_resource"); pattern->set_value("500:500:500:500"); pattern->methods(M2MMethod::GET | M2MMethod::PUT); - pattern->attach_put_callback(pattern_updated); + pattern->attach(M2MMethod::PUT, (void*)pattern_updated); pattern_ptr = pattern; MbedCloudClientResource *blink = mbedClient.create_resource("3201/0/5850", "blink_resource"); blink->methods(M2MMethod::POST); - blink->attach_post_callback(blink_callback); + blink->attach(M2MMethod::POST, (void*)blink_callback); + + MbedCloudClientResource *unregister = mbedClient.create_resource("5000/0/1", "unregister"); + unregister->methods(M2MMethod::POST); + unregister->attach(M2MMethod::POST, (void*)unregister_cb); + + MbedCloudClientResource *factoryReset = mbedClient.create_resource("5000/0/2", "factory_reset"); + factoryReset->methods(M2MMethod::POST); + factoryReset->attach(M2MMethod::POST, (void*)factory_reset_cb); mbedClient.register_and_connect(); - // Wait for client to finish registering - while (!mbedClient.is_client_registered()) { - wait_ms(100); - } - - // Placeholder for callback to update local resource when GET comes. - timer.attach(&button_press, 5.0); - // Check if client is registering or registered, if true sleep and repeat. while (mbedClient.is_register_called()) { static int button_count = 0; @@ -156,7 +217,7 @@ if (button_pressed) { button_pressed = false; - printf("Simulated button clicked %d times\r\n", ++button_count); + printf("Button clicked %d times\r\n", ++button_count); button->set_value(button_count); } }