Osamu Koizumi
/
Pelion-workshop-Grove-sensors
Pelion workshop with Grove sensors.
Diff: main.cpp
- Revision:
- 0:e13a8a944e25
- Child:
- 1:1ccf36276cd3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Feb 13 10:07:23 2018 +0000 @@ -0,0 +1,156 @@ +// ---------------------------------------------------------------------------- +// Copyright 2016-2017 ARM Ltd. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- + +#include "simple-mbed-cloud-client.h" +#include "mbed.h" + +// Pointers to the resources that will be created in main_application(). +static M2MResource* button_res; +static M2MResource* pattern_res; +static M2MResource* blink_res; + +// Pointer to mbedClient, used for calling close function. +static SimpleMbedCloudClient *client; + +void pattern_updated(const char *) + { + printf("PUT received, new value: %s\n", pattern_res->get_value_string().c_str()); +} + +void blink_callback(void *) { + String pattern_string = pattern_res->get_value_string(); + const char *pattern = pattern_string.c_str(); + printf("LED pattern = %s\n", pattern); + // The pattern is something like 500:200:500, so parse that. + // LED blinking is done while parsing. + toggle_led(); + while (*pattern != '\0') { + // Wait for requested time. + do_wait(atoi(pattern)); + toggle_led(); + // Search for next value. + pattern = strchr(pattern, ':'); + if(!pattern) { + break; // while + } + pattern++; + } + led_off(); +} + +void button_notification_status_callback(const M2MBase& object, const NoticationDeliveryStatus status) +{ + 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(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(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) +{ + // 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); + + // SimpleClient is used for registering and unregistering resources to a server. + SimpleMbedCloudClient mbedClient; + + // Save pointer to mbedClient so that other functions can access it. + client = &mbedClient; + + printf("Client initialized\r\n"); +#ifdef MBED_HEAP_STATS_ENABLED + heap_stats(); +#endif + + // Create resource for button count. Path of this resource will be: 3200/0/5501. + button_res = mbedClient.add_cloud_resource(3200, 0, 5501, "button_resource", M2MResourceInstance::INTEGER, + M2MBase::GET_ALLOWED, 0, true, NULL, (void*)button_notification_status_callback); + + // Create resource for led blinking pattern. Path of this resource will be: 3201/0/5853. + pattern_res = mbedClient.add_cloud_resource(3201, 0, 5853, "pattern_resource", M2MResourceInstance::STRING, + M2MBase::GET_PUT_ALLOWED, "500:500:500:500", false, (void*)pattern_updated, NULL); + + // Create resource for starting the led blinking. Path of this resource will be: 3201/0/5850. + blink_res = mbedClient.add_cloud_resource(3201, 0, 5850, "blink_resource", M2MResourceInstance::STRING, + M2MBase::POST_ALLOWED, "", false, (void*)blink_callback, NULL); + + // Create resource for unregistering the device. Path of this resource will be: 5000/0/1. + mbedClient.add_cloud_resource(5000, 0, 1, "unregister", M2MResourceInstance::STRING, + M2MBase::POST_ALLOWED, NULL, false, (void*)unregister, NULL); + + // Create resource for running factory reset for the device. Path of this resource will be: 5000/0/2. + mbedClient.add_cloud_resource(5000, 0, 2, "factory_reset", M2MResourceInstance::STRING, + M2MBase::POST_ALLOWED, NULL, false, (void*)factory_reset, NULL); + + mbedClient.register_and_connect(); + + // Check if client is registering or registered, if true sleep and repeat. + while (mbedClient.is_register_called()) { + static int button_count = 0; + do_wait(100); + if (button_clicked()) { + button_res->set_value(++button_count); + } + } + + // Client unregistered, exit program. + return 0; +}