ST / Mbed OS example-IDW01M1-mbed-Cloud-connect
Committer:
MarceloSalazar
Date:
Wed Feb 14 10:43:56 2018 +0000
Revision:
9:f965dcece9b5
Parent:
8:2dc39d9489de
Child:
2:6ed27f413b30
Simplified version of application

Who changed what in which revision?

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