Generic example for any board with IDMW0xM1 shield

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);
         }
     }