Generic example for any board with IDMW0xM1 shield

Committer:
Wolfgang Betz
Date:
Tue Feb 20 15:09:08 2018 +0100
Revision:
18:04813dfab243
Parent:
17:ada41201c642
Child:
19:5dd1ec7fdf0d
Try to make things compile & configure/exclude SD card

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