Generic example for any board with IDMW0xM1 shield

Committer:
Wolfgang Betz
Date:
Wed Mar 14 13:02:03 2018 +0100
Revision:
31:11e00e0c285d
Parent:
21:1e89d014263d
Child:
40:17cd01e5f1fa
Remove warnings in `main.cpp`

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MarceloSalazar 0:e13a8a944e25 1 // ----------------------------------------------------------------------------
MarceloSalazar 0:e13a8a944e25 2 // Copyright 2016-2017 ARM Ltd.
MarceloSalazar 0:e13a8a944e25 3 //
MarceloSalazar 0:e13a8a944e25 4 // SPDX-License-Identifier: Apache-2.0
MarceloSalazar 0:e13a8a944e25 5 //
MarceloSalazar 0:e13a8a944e25 6 // Licensed under the Apache License, Version 2.0 (the "License");
MarceloSalazar 0:e13a8a944e25 7 // you may not use this file except in compliance with the License.
MarceloSalazar 0:e13a8a944e25 8 // You may obtain a copy of the License at
MarceloSalazar 0:e13a8a944e25 9 //
MarceloSalazar 0:e13a8a944e25 10 // http://www.apache.org/licenses/LICENSE-2.0
MarceloSalazar 0:e13a8a944e25 11 //
MarceloSalazar 0:e13a8a944e25 12 // Unless required by applicable law or agreed to in writing, software
MarceloSalazar 0:e13a8a944e25 13 // distributed under the License is distributed on an "AS IS" BASIS,
MarceloSalazar 0:e13a8a944e25 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
MarceloSalazar 0:e13a8a944e25 15 // See the License for the specific language governing permissions and
MarceloSalazar 0:e13a8a944e25 16 // limitations under the License.
MarceloSalazar 0:e13a8a944e25 17 // ----------------------------------------------------------------------------
MarceloSalazar 0:e13a8a944e25 18
MarceloSalazar 1:1ccf36276cd3 19 #include "mbed.h"
MarceloSalazar 1:1ccf36276cd3 20 #include "mbed-trace/mbed_trace.h"
MarceloSalazar 1:1ccf36276cd3 21 #include "mbed-trace-helper.h"
MarceloSalazar 0:e13a8a944e25 22 #include "simple-mbed-cloud-client.h"
MarceloSalazar 1:1ccf36276cd3 23 #include "key-config-manager/kcm_status.h"
MarceloSalazar 1:1ccf36276cd3 24 #include "key-config-manager/key_config_manager.h"
MarceloSalazar 1:1ccf36276cd3 25 #include "SDBlockDevice.h"
MarceloSalazar 1:1ccf36276cd3 26 #include "FATFileSystem.h"
Wolfgang Betz 17:ada41201c642 27 //#include "EthernetInterface.h"
Wolfgang Betz 17:ada41201c642 28 #include "SpwfSAInterface.h"
MarceloSalazar 1:1ccf36276cd3 29
Wolfgang Betz 17:ada41201c642 30 #define LED_OFF 1
Wolfgang Betz 21:1e89d014263d 31 #define LED_RED NC // betzw: `LED1` conflicts with SPI clock, maybe better use `NC`
MarceloSalazar 0:e13a8a944e25 32
Wolfgang Betz 17:ada41201c642 33 DigitalOut led(LED_RED, LED_OFF);
Wolfgang Betz 17:ada41201c642 34 InterruptIn button(BUTTON1);
bridadan 5:c18fab181ede 35
Wolfgang Betz 19:5dd1ec7fdf0d 36 // EthernetInterface net;
Wolfgang Betz 19:5dd1ec7fdf0d 37 SpwfSAInterface wifi(MBED_CONF_APP_WIFI_TX, MBED_CONF_APP_WIFI_RX);
Wolfgang Betz 19:5dd1ec7fdf0d 38 SDBlockDevice sd(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS);
Wolfgang Betz 19:5dd1ec7fdf0d 39 FATFileSystem fs("sd");
Wolfgang Betz 19:5dd1ec7fdf0d 40
MarceloSalazar 0:e13a8a944e25 41 // Pointers to the resources that will be created in main_application().
MarceloSalazar 1:1ccf36276cd3 42 static MbedCloudClientResource* pattern_ptr;
MarceloSalazar 0:e13a8a944e25 43
MarceloSalazar 0:e13a8a944e25 44 // Pointer to mbedClient, used for calling close function.
MarceloSalazar 0:e13a8a944e25 45 static SimpleMbedCloudClient *client;
MarceloSalazar 0:e13a8a944e25 46
MarceloSalazar 1:1ccf36276cd3 47 static bool button_pressed = false;
MarceloSalazar 1:1ccf36276cd3 48
MarceloSalazar 1:1ccf36276cd3 49 void button_press() {
MarceloSalazar 1:1ccf36276cd3 50 button_pressed = true;
MarceloSalazar 1:1ccf36276cd3 51 }
MarceloSalazar 1:1ccf36276cd3 52
MarceloSalazar 1:1ccf36276cd3 53 void pattern_updated(const char *) {
Wolfgang Betz 18:04813dfab243 54 printf("PUT received, new value: %s\n", pattern_ptr->get_value().c_str());
Wolfgang Betz 18:04813dfab243 55 // Placeholder for PUT action
MarceloSalazar 0:e13a8a944e25 56 }
MarceloSalazar 0:e13a8a944e25 57
MarceloSalazar 0:e13a8a944e25 58 void blink_callback(void *) {
Wolfgang Betz 18:04813dfab243 59 String pattern_str = pattern_ptr->get_value();
Wolfgang Betz 18:04813dfab243 60 const char *pattern = pattern_str.c_str();
Wolfgang Betz 18:04813dfab243 61 printf("POST received. LED pattern = %s\n", pattern);
Wolfgang Betz 18:04813dfab243 62 // Placeholder for POST action
MarceloSalazar 0:e13a8a944e25 63 // The pattern is something like 500:200:500, so parse that.
Wolfgang Betz 17:ada41201c642 64 // LED blinking is done while parsing.
Wolfgang Betz 17:ada41201c642 65 led = !led;
Wolfgang Betz 17:ada41201c642 66 while (*pattern != '\0') {
Wolfgang Betz 17:ada41201c642 67 // Wait for requested time.
Wolfgang Betz 17:ada41201c642 68 wait_ms(atoi(pattern));
Wolfgang Betz 17:ada41201c642 69 led = !led;
Wolfgang Betz 17:ada41201c642 70 // Search for next value.
Wolfgang Betz 17:ada41201c642 71 pattern = strchr(pattern, ':');
Wolfgang Betz 17:ada41201c642 72 if(!pattern) {
Wolfgang Betz 17:ada41201c642 73 break; // while
Wolfgang Betz 17:ada41201c642 74 }
Wolfgang Betz 17:ada41201c642 75 pattern++;
Wolfgang Betz 17:ada41201c642 76 }
Wolfgang Betz 17:ada41201c642 77
Wolfgang Betz 17:ada41201c642 78 led = LED_OFF;
MarceloSalazar 0:e13a8a944e25 79 }
MarceloSalazar 0:e13a8a944e25 80
Wolfgang Betz 17:ada41201c642 81 void button_notification_status_callback(const M2MBase& object, const NoticationDeliveryStatus status)
MarceloSalazar 0:e13a8a944e25 82 {
Wolfgang Betz 17:ada41201c642 83 switch(status) {
Wolfgang Betz 17:ada41201c642 84 case NOTIFICATION_STATUS_BUILD_ERROR:
Wolfgang Betz 17:ada41201c642 85 printf("Notification callback: (%s) error when building CoAP message\n", object.uri_path());
Wolfgang Betz 17:ada41201c642 86 break;
Wolfgang Betz 17:ada41201c642 87 case NOTIFICATION_STATUS_RESEND_QUEUE_FULL:
Wolfgang Betz 17:ada41201c642 88 printf("Notification callback: (%s) CoAP resend queue full\n", object.uri_path());
Wolfgang Betz 17:ada41201c642 89 break;
Wolfgang Betz 17:ada41201c642 90 case NOTIFICATION_STATUS_SENT:
Wolfgang Betz 17:ada41201c642 91 printf("Notification callback: (%s) Notification sent to server\n", object.uri_path());
Wolfgang Betz 17:ada41201c642 92 break;
Wolfgang Betz 17:ada41201c642 93 case NOTIFICATION_STATUS_DELIVERED:
Wolfgang Betz 17:ada41201c642 94 printf("Notification callback: (%s) Notification delivered\n", object.uri_path());
Wolfgang Betz 17:ada41201c642 95 break;
Wolfgang Betz 17:ada41201c642 96 case NOTIFICATION_STATUS_SEND_FAILED:
Wolfgang Betz 17:ada41201c642 97 printf("Notification callback: (%s) Notification sending failed\n", object.uri_path());
Wolfgang Betz 17:ada41201c642 98 break;
Wolfgang Betz 17:ada41201c642 99 case NOTIFICATION_STATUS_SUBSCRIBED:
Wolfgang Betz 17:ada41201c642 100 printf("Notification callback: (%s) subscribed\n", object.uri_path());
Wolfgang Betz 17:ada41201c642 101 break;
Wolfgang Betz 17:ada41201c642 102 case NOTIFICATION_STATUS_UNSUBSCRIBED:
Wolfgang Betz 17:ada41201c642 103 printf("Notification callback: (%s) subscription removed\n", object.uri_path());
Wolfgang Betz 17:ada41201c642 104 break;
Wolfgang Betz 17:ada41201c642 105 default:
Wolfgang Betz 17:ada41201c642 106 break;
Wolfgang Betz 17:ada41201c642 107 }
MarceloSalazar 0:e13a8a944e25 108 }
MarceloSalazar 0:e13a8a944e25 109
Wolfgang Betz 17:ada41201c642 110 // This function is called when a POST request is received for resource 5000/0/1.
Wolfgang Betz 17:ada41201c642 111 void unregister_cb(void *)
Wolfgang Betz 17:ada41201c642 112 {
Wolfgang Betz 17:ada41201c642 113 printf("Unregister resource executed\n");
Wolfgang Betz 17:ada41201c642 114 client->close();
Wolfgang Betz 17:ada41201c642 115 }
Wolfgang Betz 17:ada41201c642 116
Wolfgang Betz 17:ada41201c642 117 // This function is called when a POST request is received for resource 5000/0/2.
Wolfgang Betz 17:ada41201c642 118 void factory_reset_cb(void *)
Wolfgang Betz 17:ada41201c642 119 {
Wolfgang Betz 17:ada41201c642 120 printf("Factory reset resource executed\n");
Wolfgang Betz 17:ada41201c642 121 client->close();
Wolfgang Betz 17:ada41201c642 122 kcm_status_e kcm_status = kcm_factory_reset();
Wolfgang Betz 17:ada41201c642 123 if (kcm_status != KCM_STATUS_SUCCESS) {
Wolfgang Betz 17:ada41201c642 124 printf("Failed to do factory reset - %d\n", kcm_status);
Wolfgang Betz 17:ada41201c642 125 } else {
Wolfgang Betz 17:ada41201c642 126 printf("Factory reset completed. Now restart the device\n");
Wolfgang Betz 17:ada41201c642 127 }
Wolfgang Betz 17:ada41201c642 128 }
MarceloSalazar 0:e13a8a944e25 129
MarceloSalazar 0:e13a8a944e25 130 int main(void)
MarceloSalazar 0:e13a8a944e25 131 {
Wolfgang Betz 17:ada41201c642 132 // IOTMORF-1712: DAPLINK starts the previous application during flashing a new binary
Wolfgang Betz 17:ada41201c642 133 // This is workaround to prevent possible deletion of credentials or storage corruption
Wolfgang Betz 17:ada41201c642 134 // while replacing the application binary.
MarceloSalazar 0:e13a8a944e25 135 wait(2);
MarceloSalazar 0:e13a8a944e25 136
MarceloSalazar 1:1ccf36276cd3 137 // Misc OS setup
MarceloSalazar 1:1ccf36276cd3 138 srand(time(NULL));
MarceloSalazar 1:1ccf36276cd3 139
MarceloSalazar 1:1ccf36276cd3 140 printf("Start Simple Mbed Cloud Client\n");
MarceloSalazar 1:1ccf36276cd3 141
Wolfgang Betz 17:ada41201c642 142 // Initialize button interrupt
Wolfgang Betz 17:ada41201c642 143 button.fall(&button_press);
Wolfgang Betz 17:ada41201c642 144
MarceloSalazar 1:1ccf36276cd3 145 // Initialize SD card
MarceloSalazar 1:1ccf36276cd3 146 int status = sd.init();
MarceloSalazar 1:1ccf36276cd3 147 if (status != BD_ERROR_OK) {
MarceloSalazar 1:1ccf36276cd3 148 printf("Failed to init SD card\r\n");
MarceloSalazar 1:1ccf36276cd3 149 return -1;
MarceloSalazar 1:1ccf36276cd3 150 }
MarceloSalazar 0:e13a8a944e25 151
MarceloSalazar 1:1ccf36276cd3 152 // Mount the file system (reformatting on failure)
MarceloSalazar 1:1ccf36276cd3 153 status = fs.mount(&sd);
MarceloSalazar 1:1ccf36276cd3 154 if (status) {
MarceloSalazar 1:1ccf36276cd3 155 printf("Failed to mount FAT file system, reformatting...\r\n");
MarceloSalazar 1:1ccf36276cd3 156 status = fs.reformat(&sd);
Wolfgang Betz 17:ada41201c642 157
MarceloSalazar 1:1ccf36276cd3 158 if (status) {
MarceloSalazar 1:1ccf36276cd3 159 printf("Failed to reformat FAT file system\r\n");
MarceloSalazar 1:1ccf36276cd3 160 return -1;
MarceloSalazar 1:1ccf36276cd3 161 } else {
MarceloSalazar 1:1ccf36276cd3 162 printf("Reformat and mount complete\r\n");
MarceloSalazar 1:1ccf36276cd3 163 }
MarceloSalazar 1:1ccf36276cd3 164 }
MarceloSalazar 1:1ccf36276cd3 165
Wolfgang Betz 17:ada41201c642 166 printf("Connecting to the network using WiFi...\n");
MarceloSalazar 1:1ccf36276cd3 167
Wolfgang Betz 17:ada41201c642 168 // status = wifi.connect();
Wolfgang Betz 17:ada41201c642 169 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);
MarceloSalazar 1:1ccf36276cd3 170 if (status) {
MarceloSalazar 1:1ccf36276cd3 171 printf("Connection to Network Failed %d!\n", status);
MarceloSalazar 1:1ccf36276cd3 172 return -1;
MarceloSalazar 1:1ccf36276cd3 173 } else {
Wolfgang Betz 17:ada41201c642 174 const char *ip_addr = wifi.get_ip_address();
MarceloSalazar 1:1ccf36276cd3 175 printf("Connected successfully\n");
MarceloSalazar 1:1ccf36276cd3 176 printf("IP address %s\n", ip_addr);
MarceloSalazar 1:1ccf36276cd3 177 }
MarceloSalazar 1:1ccf36276cd3 178
Wolfgang Betz 17:ada41201c642 179 SimpleMbedCloudClient mbedClient(&wifi);
MarceloSalazar 0:e13a8a944e25 180 // Save pointer to mbedClient so that other functions can access it.
MarceloSalazar 0:e13a8a944e25 181 client = &mbedClient;
MarceloSalazar 0:e13a8a944e25 182
MarceloSalazar 1:1ccf36276cd3 183 status = mbedClient.init();
MarceloSalazar 1:1ccf36276cd3 184 if (status) {
MarceloSalazar 1:1ccf36276cd3 185 return -1;
MarceloSalazar 1:1ccf36276cd3 186 }
MarceloSalazar 1:1ccf36276cd3 187
MarceloSalazar 0:e13a8a944e25 188 printf("Client initialized\r\n");
MarceloSalazar 0:e13a8a944e25 189
MarceloSalazar 1:1ccf36276cd3 190 // Mbed Cloud Client resource setup
MarceloSalazar 1:1ccf36276cd3 191 MbedCloudClientResource *button = mbedClient.create_resource("3200/0/5501", "button_resource");
Wolfgang Betz 31:11e00e0c285d 192 button->set_value((char*)"0");
MarceloSalazar 1:1ccf36276cd3 193 button->methods(M2MMethod::GET);
MarceloSalazar 1:1ccf36276cd3 194 button->observable(true);
Wolfgang Betz 18:04813dfab243 195 button->attach_notification_callback(button_notification_status_callback);
MarceloSalazar 0:e13a8a944e25 196
MarceloSalazar 1:1ccf36276cd3 197 MbedCloudClientResource *pattern = mbedClient.create_resource("3201/0/5853", "pattern_resource");
Wolfgang Betz 31:11e00e0c285d 198 pattern->set_value((char*)"500:500:500:500");
MarceloSalazar 1:1ccf36276cd3 199 pattern->methods(M2MMethod::GET | M2MMethod::PUT);
Wolfgang Betz 18:04813dfab243 200 pattern->attach_put_callback(pattern_updated);
MarceloSalazar 1:1ccf36276cd3 201 pattern_ptr = pattern;
MarceloSalazar 0:e13a8a944e25 202
MarceloSalazar 1:1ccf36276cd3 203 MbedCloudClientResource *blink = mbedClient.create_resource("3201/0/5850", "blink_resource");
MarceloSalazar 1:1ccf36276cd3 204 blink->methods(M2MMethod::POST);
Wolfgang Betz 18:04813dfab243 205 blink->attach_post_callback(blink_callback);
Wolfgang Betz 17:ada41201c642 206
Wolfgang Betz 17:ada41201c642 207 MbedCloudClientResource *unregister = mbedClient.create_resource("5000/0/1", "unregister");
Wolfgang Betz 17:ada41201c642 208 unregister->methods(M2MMethod::POST);
Wolfgang Betz 18:04813dfab243 209 unregister->attach_post_callback(unregister_cb);
Wolfgang Betz 17:ada41201c642 210
Wolfgang Betz 17:ada41201c642 211 MbedCloudClientResource *factoryReset = mbedClient.create_resource("5000/0/2", "factory_reset");
Wolfgang Betz 17:ada41201c642 212 factoryReset->methods(M2MMethod::POST);
Wolfgang Betz 18:04813dfab243 213 factoryReset->attach_post_callback(factory_reset_cb);
MarceloSalazar 0:e13a8a944e25 214
MarceloSalazar 0:e13a8a944e25 215 mbedClient.register_and_connect();
MarceloSalazar 0:e13a8a944e25 216
MarceloSalazar 0:e13a8a944e25 217 // Check if client is registering or registered, if true sleep and repeat.
MarceloSalazar 0:e13a8a944e25 218 while (mbedClient.is_register_called()) {
MarceloSalazar 0:e13a8a944e25 219 static int button_count = 0;
MarceloSalazar 1:1ccf36276cd3 220 wait_ms(100);
MarceloSalazar 1:1ccf36276cd3 221
MarceloSalazar 1:1ccf36276cd3 222 if (button_pressed) {
MarceloSalazar 1:1ccf36276cd3 223 button_pressed = false;
Wolfgang Betz 17:ada41201c642 224 printf("Button clicked %d times\r\n", ++button_count);
MarceloSalazar 1:1ccf36276cd3 225 button->set_value(button_count);
MarceloSalazar 0:e13a8a944e25 226 }
MarceloSalazar 0:e13a8a944e25 227 }
MarceloSalazar 0:e13a8a944e25 228
MarceloSalazar 0:e13a8a944e25 229 // Client unregistered, exit program.
MarceloSalazar 0:e13a8a944e25 230 return 0;
MarceloSalazar 0:e13a8a944e25 231 }