ST / Mbed OS example-IDW01M1-mbed-Cloud-connect
Committer:
MarceloSalazar
Date:
Tue Feb 13 10:07:23 2018 +0000
Revision:
8:2dc39d9489de
Child:
1:1ccf36276cd3
First version

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 8:2dc39d9489de 19 #include "simple-mbed-cloud-client.h"
MarceloSalazar 8:2dc39d9489de 20 #include "mbed.h"
MarceloSalazar 8:2dc39d9489de 21
MarceloSalazar 8:2dc39d9489de 22 // Pointers to the resources that will be created in main_application().
MarceloSalazar 8:2dc39d9489de 23 static M2MResource* button_res;
MarceloSalazar 8:2dc39d9489de 24 static M2MResource* pattern_res;
MarceloSalazar 8:2dc39d9489de 25 static M2MResource* blink_res;
MarceloSalazar 8:2dc39d9489de 26
MarceloSalazar 8:2dc39d9489de 27 // Pointer to mbedClient, used for calling close function.
MarceloSalazar 8:2dc39d9489de 28 static SimpleMbedCloudClient *client;
MarceloSalazar 8:2dc39d9489de 29
MarceloSalazar 8:2dc39d9489de 30 void pattern_updated(const char *)
MarceloSalazar 8:2dc39d9489de 31 {
MarceloSalazar 8:2dc39d9489de 32 printf("PUT received, new value: %s\n", pattern_res->get_value_string().c_str());
MarceloSalazar 8:2dc39d9489de 33 }
MarceloSalazar 8:2dc39d9489de 34
MarceloSalazar 8:2dc39d9489de 35 void blink_callback(void *) {
MarceloSalazar 8:2dc39d9489de 36 String pattern_string = pattern_res->get_value_string();
MarceloSalazar 8:2dc39d9489de 37 const char *pattern = pattern_string.c_str();
MarceloSalazar 8:2dc39d9489de 38 printf("LED pattern = %s\n", pattern);
MarceloSalazar 8:2dc39d9489de 39 // The pattern is something like 500:200:500, so parse that.
MarceloSalazar 8:2dc39d9489de 40 // LED blinking is done while parsing.
MarceloSalazar 8:2dc39d9489de 41 toggle_led();
MarceloSalazar 8:2dc39d9489de 42 while (*pattern != '\0') {
MarceloSalazar 8:2dc39d9489de 43 // Wait for requested time.
MarceloSalazar 8:2dc39d9489de 44 do_wait(atoi(pattern));
MarceloSalazar 8:2dc39d9489de 45 toggle_led();
MarceloSalazar 8:2dc39d9489de 46 // Search for next value.
MarceloSalazar 8:2dc39d9489de 47 pattern = strchr(pattern, ':');
MarceloSalazar 8:2dc39d9489de 48 if(!pattern) {
MarceloSalazar 8:2dc39d9489de 49 break; // while
MarceloSalazar 8:2dc39d9489de 50 }
MarceloSalazar 8:2dc39d9489de 51 pattern++;
MarceloSalazar 8:2dc39d9489de 52 }
MarceloSalazar 8:2dc39d9489de 53 led_off();
MarceloSalazar 8:2dc39d9489de 54 }
MarceloSalazar 8:2dc39d9489de 55
MarceloSalazar 8:2dc39d9489de 56 void button_notification_status_callback(const M2MBase& object, const NoticationDeliveryStatus status)
MarceloSalazar 8:2dc39d9489de 57 {
MarceloSalazar 8:2dc39d9489de 58 switch(status) {
MarceloSalazar 8:2dc39d9489de 59 case NOTIFICATION_STATUS_BUILD_ERROR:
MarceloSalazar 8:2dc39d9489de 60 printf("Notification callback: (%s) error when building CoAP message\n", object.uri_path());
MarceloSalazar 8:2dc39d9489de 61 break;
MarceloSalazar 8:2dc39d9489de 62 case NOTIFICATION_STATUS_RESEND_QUEUE_FULL:
MarceloSalazar 8:2dc39d9489de 63 printf("Notification callback: (%s) CoAP resend queue full\n", object.uri_path());
MarceloSalazar 8:2dc39d9489de 64 break;
MarceloSalazar 8:2dc39d9489de 65 case NOTIFICATION_STATUS_SENT:
MarceloSalazar 8:2dc39d9489de 66 printf("Notification callback: (%s) Notification sent to server\n", object.uri_path());
MarceloSalazar 8:2dc39d9489de 67 break;
MarceloSalazar 8:2dc39d9489de 68 case NOTIFICATION_STATUS_DELIVERED:
MarceloSalazar 8:2dc39d9489de 69 printf("Notification callback: (%s) Notification delivered\n", object.uri_path());
MarceloSalazar 8:2dc39d9489de 70 break;
MarceloSalazar 8:2dc39d9489de 71 case NOTIFICATION_STATUS_SEND_FAILED:
MarceloSalazar 8:2dc39d9489de 72 printf("Notification callback: (%s) Notification sending failed\n", object.uri_path());
MarceloSalazar 8:2dc39d9489de 73 break;
MarceloSalazar 8:2dc39d9489de 74 case NOTIFICATION_STATUS_SUBSCRIBED:
MarceloSalazar 8:2dc39d9489de 75 printf("Notification callback: (%s) subscribed\n", object.uri_path());
MarceloSalazar 8:2dc39d9489de 76 break;
MarceloSalazar 8:2dc39d9489de 77 case NOTIFICATION_STATUS_UNSUBSCRIBED:
MarceloSalazar 8:2dc39d9489de 78 printf("Notification callback: (%s) subscription removed\n", object.uri_path());
MarceloSalazar 8:2dc39d9489de 79 break;
MarceloSalazar 8:2dc39d9489de 80 default:
MarceloSalazar 8:2dc39d9489de 81 break;
MarceloSalazar 8:2dc39d9489de 82 }
MarceloSalazar 8:2dc39d9489de 83 }
MarceloSalazar 8:2dc39d9489de 84
MarceloSalazar 8:2dc39d9489de 85 // This function is called when a POST request is received for resource 5000/0/1.
MarceloSalazar 8:2dc39d9489de 86 void unregister(void *)
MarceloSalazar 8:2dc39d9489de 87 {
MarceloSalazar 8:2dc39d9489de 88 printf("Unregister resource executed\n");
MarceloSalazar 8:2dc39d9489de 89 client->close();
MarceloSalazar 8:2dc39d9489de 90 }
MarceloSalazar 8:2dc39d9489de 91
MarceloSalazar 8:2dc39d9489de 92 // This function is called when a POST request is received for resource 5000/0/2.
MarceloSalazar 8:2dc39d9489de 93 void factory_reset(void *)
MarceloSalazar 8:2dc39d9489de 94 {
MarceloSalazar 8:2dc39d9489de 95 printf("Factory reset resource executed\n");
MarceloSalazar 8:2dc39d9489de 96 client->close();
MarceloSalazar 8:2dc39d9489de 97 kcm_status_e kcm_status = kcm_factory_reset();
MarceloSalazar 8:2dc39d9489de 98 if (kcm_status != KCM_STATUS_SUCCESS) {
MarceloSalazar 8:2dc39d9489de 99 printf("Failed to do factory reset - %d\n", kcm_status);
MarceloSalazar 8:2dc39d9489de 100 } else {
MarceloSalazar 8:2dc39d9489de 101 printf("Factory reset completed. Now restart the device\n");
MarceloSalazar 8:2dc39d9489de 102 }
MarceloSalazar 8:2dc39d9489de 103 }
MarceloSalazar 8:2dc39d9489de 104
MarceloSalazar 8:2dc39d9489de 105 int main(void)
MarceloSalazar 8:2dc39d9489de 106 {
MarceloSalazar 8:2dc39d9489de 107 // IOTMORF-1712: DAPLINK starts the previous application during flashing a new binary
MarceloSalazar 8:2dc39d9489de 108 // This is workaround to prevent possible deletion of credentials or storage corruption
MarceloSalazar 8:2dc39d9489de 109 // while replacing the application binary.
MarceloSalazar 8:2dc39d9489de 110 wait(2);
MarceloSalazar 8:2dc39d9489de 111
MarceloSalazar 8:2dc39d9489de 112 // SimpleClient is used for registering and unregistering resources to a server.
MarceloSalazar 8:2dc39d9489de 113 SimpleMbedCloudClient mbedClient;
MarceloSalazar 8:2dc39d9489de 114
MarceloSalazar 8:2dc39d9489de 115 // Save pointer to mbedClient so that other functions can access it.
MarceloSalazar 8:2dc39d9489de 116 client = &mbedClient;
MarceloSalazar 8:2dc39d9489de 117
MarceloSalazar 8:2dc39d9489de 118 printf("Client initialized\r\n");
MarceloSalazar 8:2dc39d9489de 119 #ifdef MBED_HEAP_STATS_ENABLED
MarceloSalazar 8:2dc39d9489de 120 heap_stats();
MarceloSalazar 8:2dc39d9489de 121 #endif
MarceloSalazar 8:2dc39d9489de 122
MarceloSalazar 8:2dc39d9489de 123 // Create resource for button count. Path of this resource will be: 3200/0/5501.
MarceloSalazar 8:2dc39d9489de 124 button_res = mbedClient.add_cloud_resource(3200, 0, 5501, "button_resource", M2MResourceInstance::INTEGER,
MarceloSalazar 8:2dc39d9489de 125 M2MBase::GET_ALLOWED, 0, true, NULL, (void*)button_notification_status_callback);
MarceloSalazar 8:2dc39d9489de 126
MarceloSalazar 8:2dc39d9489de 127 // Create resource for led blinking pattern. Path of this resource will be: 3201/0/5853.
MarceloSalazar 8:2dc39d9489de 128 pattern_res = mbedClient.add_cloud_resource(3201, 0, 5853, "pattern_resource", M2MResourceInstance::STRING,
MarceloSalazar 8:2dc39d9489de 129 M2MBase::GET_PUT_ALLOWED, "500:500:500:500", false, (void*)pattern_updated, NULL);
MarceloSalazar 8:2dc39d9489de 130
MarceloSalazar 8:2dc39d9489de 131 // Create resource for starting the led blinking. Path of this resource will be: 3201/0/5850.
MarceloSalazar 8:2dc39d9489de 132 blink_res = mbedClient.add_cloud_resource(3201, 0, 5850, "blink_resource", M2MResourceInstance::STRING,
MarceloSalazar 8:2dc39d9489de 133 M2MBase::POST_ALLOWED, "", false, (void*)blink_callback, NULL);
MarceloSalazar 8:2dc39d9489de 134
MarceloSalazar 8:2dc39d9489de 135 // Create resource for unregistering the device. Path of this resource will be: 5000/0/1.
MarceloSalazar 8:2dc39d9489de 136 mbedClient.add_cloud_resource(5000, 0, 1, "unregister", M2MResourceInstance::STRING,
MarceloSalazar 8:2dc39d9489de 137 M2MBase::POST_ALLOWED, NULL, false, (void*)unregister, NULL);
MarceloSalazar 8:2dc39d9489de 138
MarceloSalazar 8:2dc39d9489de 139 // Create resource for running factory reset for the device. Path of this resource will be: 5000/0/2.
MarceloSalazar 8:2dc39d9489de 140 mbedClient.add_cloud_resource(5000, 0, 2, "factory_reset", M2MResourceInstance::STRING,
MarceloSalazar 8:2dc39d9489de 141 M2MBase::POST_ALLOWED, NULL, false, (void*)factory_reset, NULL);
MarceloSalazar 8:2dc39d9489de 142
MarceloSalazar 8:2dc39d9489de 143 mbedClient.register_and_connect();
MarceloSalazar 8:2dc39d9489de 144
MarceloSalazar 8:2dc39d9489de 145 // Check if client is registering or registered, if true sleep and repeat.
MarceloSalazar 8:2dc39d9489de 146 while (mbedClient.is_register_called()) {
MarceloSalazar 8:2dc39d9489de 147 static int button_count = 0;
MarceloSalazar 8:2dc39d9489de 148 do_wait(100);
MarceloSalazar 8:2dc39d9489de 149 if (button_clicked()) {
MarceloSalazar 8:2dc39d9489de 150 button_res->set_value(++button_count);
MarceloSalazar 8:2dc39d9489de 151 }
MarceloSalazar 8:2dc39d9489de 152 }
MarceloSalazar 8:2dc39d9489de 153
MarceloSalazar 8:2dc39d9489de 154 // Client unregistered, exit program.
MarceloSalazar 8:2dc39d9489de 155 return 0;
MarceloSalazar 8:2dc39d9489de 156 }