Mbed Cloud Example Project - LPC546xx (Completed Version)

Fork of mbed-cloud-example-lpc546xx by Clark Jarvis

Committer:
clarkjarvis
Date:
Thu Oct 11 18:59:07 2018 +0000
Revision:
10:f30cd412e968
Parent:
9:582d0ef3b83b
Updated Resource Creation to align with Open Mobile Alliance Registry

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maclobdell 0:1f42bb53bff5 1 // ----------------------------------------------------------------------------
maclobdell 0:1f42bb53bff5 2 // Copyright 2016-2017 ARM Ltd.
maclobdell 0:1f42bb53bff5 3 //
maclobdell 0:1f42bb53bff5 4 // SPDX-License-Identifier: Apache-2.0
maclobdell 0:1f42bb53bff5 5 //
maclobdell 0:1f42bb53bff5 6 // Licensed under the Apache License, Version 2.0 (the "License");
maclobdell 0:1f42bb53bff5 7 // you may not use this file except in compliance with the License.
maclobdell 0:1f42bb53bff5 8 // You may obtain a copy of the License at
maclobdell 0:1f42bb53bff5 9 //
maclobdell 0:1f42bb53bff5 10 // http://www.apache.org/licenses/LICENSE-2.0
maclobdell 0:1f42bb53bff5 11 //
maclobdell 0:1f42bb53bff5 12 // Unless required by applicable law or agreed to in writing, software
maclobdell 0:1f42bb53bff5 13 // distributed under the License is distributed on an "AS IS" BASIS,
maclobdell 0:1f42bb53bff5 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
maclobdell 0:1f42bb53bff5 15 // See the License for the specific language governing permissions and
maclobdell 0:1f42bb53bff5 16 // limitations under the License.
maclobdell 0:1f42bb53bff5 17 // ----------------------------------------------------------------------------
maclobdell 0:1f42bb53bff5 18
maclobdell 0:1f42bb53bff5 19 #include "mbed.h"
maclobdell 0:1f42bb53bff5 20 #include "mbed-trace/mbed_trace.h"
maclobdell 0:1f42bb53bff5 21 #include "mbed-trace-helper.h"
maclobdell 0:1f42bb53bff5 22 #include "simple-mbed-cloud-client.h"
maclobdell 0:1f42bb53bff5 23 #include "key-config-manager/kcm_status.h"
maclobdell 0:1f42bb53bff5 24 #include "key-config-manager/key_config_manager.h"
maclobdell 0:1f42bb53bff5 25 #include "SDBlockDevice.h"
maclobdell 0:1f42bb53bff5 26 #include "FATFileSystem.h"
maclobdell 0:1f42bb53bff5 27 #include "EthernetInterface.h"
maclobdell 0:1f42bb53bff5 28
maclobdell 0:1f42bb53bff5 29 // Placeholder to hardware that trigger events (timer, button, etc)
maclobdell 0:1f42bb53bff5 30 Ticker timer;
clarkjarvis 4:5994ee6e8f63 31 InterruptIn sw2(SW2);
clarkjarvis 4:5994ee6e8f63 32 DigitalOut led(LED1,1);
maclobdell 0:1f42bb53bff5 33
maclobdell 0:1f42bb53bff5 34 // Placeholder for storage
maclobdell 0:1f42bb53bff5 35 SDBlockDevice sd(D11, D12, D13, D10); //MOSI, MISO, SCLK, CS
maclobdell 0:1f42bb53bff5 36 FATFileSystem fs("sd");
maclobdell 0:1f42bb53bff5 37
clarkjarvis 8:99d61dd3bfb9 38 // To-Do #2: Add global pointer declaration for Rate Resource
clarkjarvis 9:582d0ef3b83b 39 // Pointer declaration for Rate Resource
clarkjarvis 9:582d0ef3b83b 40 static MbedCloudClientResource* rate_ptr;
clarkjarvis 9:582d0ef3b83b 41
maclobdell 0:1f42bb53bff5 42 static bool button_pressed = false;
maclobdell 0:1f42bb53bff5 43 void button_press() {
maclobdell 0:1f42bb53bff5 44 button_pressed = true;
maclobdell 0:1f42bb53bff5 45 }
maclobdell 0:1f42bb53bff5 46
clarkjarvis 4:5994ee6e8f63 47 void led_toggle() {
clarkjarvis 4:5994ee6e8f63 48 led = !led;
clarkjarvis 4:5994ee6e8f63 49 }
clarkjarvis 4:5994ee6e8f63 50
clarkjarvis 8:99d61dd3bfb9 51 // To-Do #3: Add Cloud Client Resource Callback Functions
clarkjarvis 9:582d0ef3b83b 52 // Resource Callback Functions
clarkjarvis 9:582d0ef3b83b 53 void blink_rate_updated(const char *) {
clarkjarvis 9:582d0ef3b83b 54 printf("PUT received, Storing LED Blink Rate: %s (ms)\r\n", rate_ptr->get_value().c_str());
clarkjarvis 9:582d0ef3b83b 55 }
clarkjarvis 9:582d0ef3b83b 56
clarkjarvis 9:582d0ef3b83b 57 void blink_enable_callback(void *) {
clarkjarvis 9:582d0ef3b83b 58 String pattern_str = rate_ptr->get_value();
clarkjarvis 9:582d0ef3b83b 59 const char *rate = pattern_str.c_str();
clarkjarvis 9:582d0ef3b83b 60 printf("POST received. Enabling LED Blink Rate = %s (ms)\n", rate);
clarkjarvis 9:582d0ef3b83b 61
clarkjarvis 9:582d0ef3b83b 62 float value = atoi(rate_ptr->get_value().c_str())/1000.0;
clarkjarvis 9:582d0ef3b83b 63 timer.detach();
clarkjarvis 9:582d0ef3b83b 64 timer.attach(&led_toggle,value);
clarkjarvis 9:582d0ef3b83b 65 }
clarkjarvis 9:582d0ef3b83b 66
clarkjarvis 9:582d0ef3b83b 67 void button_callback(const M2MBase& object, const NoticationDeliveryStatus status)
clarkjarvis 9:582d0ef3b83b 68 {
clarkjarvis 9:582d0ef3b83b 69 printf("Button notification. Callback: (%s)\n", object.uri_path());
clarkjarvis 9:582d0ef3b83b 70 }
clarkjarvis 9:582d0ef3b83b 71
clarkjarvis 4:5994ee6e8f63 72
maclobdell 0:1f42bb53bff5 73 int main(void)
maclobdell 0:1f42bb53bff5 74 {
maclobdell 0:1f42bb53bff5 75 // Requires DAPLink 245+ (https://github.com/ARMmbed/DAPLink/pull/364)
maclobdell 0:1f42bb53bff5 76 // Older versions: workaround to prevent possible deletion of credentials:
maclobdell 0:1f42bb53bff5 77 wait(2);
maclobdell 0:1f42bb53bff5 78
maclobdell 0:1f42bb53bff5 79 // Misc OS setup
maclobdell 0:1f42bb53bff5 80 srand(time(NULL));
maclobdell 0:1f42bb53bff5 81
maclobdell 0:1f42bb53bff5 82 // Placeholder for network
maclobdell 0:1f42bb53bff5 83 EthernetInterface net;
maclobdell 0:1f42bb53bff5 84
maclobdell 0:1f42bb53bff5 85 printf("Start Simple Mbed Cloud Client\n");
maclobdell 0:1f42bb53bff5 86
maclobdell 0:1f42bb53bff5 87 // Initialize SD card
maclobdell 0:1f42bb53bff5 88 int status = sd.init();
maclobdell 0:1f42bb53bff5 89 if (status != BD_ERROR_OK) {
maclobdell 0:1f42bb53bff5 90 printf("Failed to init SD card\r\n");
maclobdell 0:1f42bb53bff5 91 return -1;
maclobdell 0:1f42bb53bff5 92 }
maclobdell 0:1f42bb53bff5 93
maclobdell 0:1f42bb53bff5 94 // Mount the file system (reformatting on failure)
maclobdell 0:1f42bb53bff5 95 status = fs.mount(&sd);
maclobdell 0:1f42bb53bff5 96 if (status) {
maclobdell 0:1f42bb53bff5 97 printf("Failed to mount FAT file system, reformatting...\r\n");
maclobdell 0:1f42bb53bff5 98 status = fs.reformat(&sd);
maclobdell 0:1f42bb53bff5 99 if (status) {
maclobdell 0:1f42bb53bff5 100 printf("Failed to reformat FAT file system\r\n");
maclobdell 0:1f42bb53bff5 101 return -1;
maclobdell 0:1f42bb53bff5 102 } else {
maclobdell 0:1f42bb53bff5 103 printf("Reformat and mount complete\r\n");
maclobdell 0:1f42bb53bff5 104 }
maclobdell 0:1f42bb53bff5 105 }
maclobdell 0:1f42bb53bff5 106
clarkjarvis 4:5994ee6e8f63 107 // Connect to Network (obtain IP address)
maclobdell 0:1f42bb53bff5 108 printf("Connecting to the network using Ethernet...\n");
maclobdell 0:1f42bb53bff5 109 status = net.connect();
maclobdell 0:1f42bb53bff5 110 if (status) {
maclobdell 0:1f42bb53bff5 111 printf("Connection to Network Failed %d!\n", status);
maclobdell 0:1f42bb53bff5 112 return -1;
maclobdell 0:1f42bb53bff5 113 } else {
maclobdell 0:1f42bb53bff5 114 const char *ip_addr = net.get_ip_address();
maclobdell 0:1f42bb53bff5 115 printf("Connected successfully\n");
maclobdell 0:1f42bb53bff5 116 printf("IP address %s\n", ip_addr);
maclobdell 0:1f42bb53bff5 117 }
maclobdell 0:1f42bb53bff5 118
clarkjarvis 4:5994ee6e8f63 119 // Mbed Cloud Client Initialization
maclobdell 0:1f42bb53bff5 120 SimpleMbedCloudClient mbedClient(&net);
maclobdell 0:1f42bb53bff5 121 status = mbedClient.init();
maclobdell 0:1f42bb53bff5 122 if (status) {
maclobdell 0:1f42bb53bff5 123 return -1;
maclobdell 0:1f42bb53bff5 124 }
maclobdell 0:1f42bb53bff5 125 printf("Client initialized\r\n");
maclobdell 0:1f42bb53bff5 126
clarkjarvis 8:99d61dd3bfb9 127 // To-Do #1: Add Mbed Cloud Client resources
clarkjarvis 9:582d0ef3b83b 128 // Setup Mbed Cloud Client Resources
clarkjarvis 10:f30cd412e968 129 MbedCloudClientResource *button = mbedClient.create_resource("3200/0/5501", "button_resource"); // Digital Input / Instance / Counter
clarkjarvis 9:582d0ef3b83b 130 button->set_value("0");
clarkjarvis 9:582d0ef3b83b 131 button->methods(M2MMethod::GET);
clarkjarvis 9:582d0ef3b83b 132 button->observable(true);
clarkjarvis 9:582d0ef3b83b 133 button->attach_notification_callback(button_callback);
clarkjarvis 9:582d0ef3b83b 134
clarkjarvis 10:f30cd412e968 135 MbedCloudClientResource *rate = mbedClient.create_resource("3201/0/5521", "blink_rate_resource"); // Digital Output / Instance / Delay Duration
clarkjarvis 9:582d0ef3b83b 136 rate->set_value("500");
clarkjarvis 9:582d0ef3b83b 137 rate->methods(M2MMethod::GET | M2MMethod::PUT);
clarkjarvis 9:582d0ef3b83b 138 rate->observable(false);
clarkjarvis 9:582d0ef3b83b 139 rate->attach_put_callback(blink_rate_updated);
clarkjarvis 9:582d0ef3b83b 140 rate_ptr = rate;
clarkjarvis 9:582d0ef3b83b 141
clarkjarvis 10:f30cd412e968 142 MbedCloudClientResource *blink = mbedClient.create_resource("3201/0/5823", "blink_enable_resource"); // Digital Output / Instance / Event ID
clarkjarvis 9:582d0ef3b83b 143 blink->methods(M2MMethod::POST);
clarkjarvis 9:582d0ef3b83b 144 blink->attach_post_callback(blink_enable_callback);
maclobdell 0:1f42bb53bff5 145
clarkjarvis 4:5994ee6e8f63 146 // Mbed Cloud Register Client and Connect
maclobdell 0:1f42bb53bff5 147 mbedClient.register_and_connect();
maclobdell 0:1f42bb53bff5 148
maclobdell 0:1f42bb53bff5 149 // Wait for client to finish registering
maclobdell 0:1f42bb53bff5 150 while (!mbedClient.is_client_registered()) {
maclobdell 0:1f42bb53bff5 151 wait_ms(100);
maclobdell 0:1f42bb53bff5 152 }
maclobdell 0:1f42bb53bff5 153
clarkjarvis 4:5994ee6e8f63 154 // Setup LED and Push BUtton
clarkjarvis 4:5994ee6e8f63 155 timer.attach(&led_toggle, 0.5);
clarkjarvis 4:5994ee6e8f63 156 sw2.fall(&button_press);
clarkjarvis 10:f30cd412e968 157
maclobdell 0:1f42bb53bff5 158 // Check if client is registering or registered, if true sleep and repeat.
maclobdell 0:1f42bb53bff5 159 while (mbedClient.is_register_called()) {
maclobdell 0:1f42bb53bff5 160 static int button_count = 0;
maclobdell 0:1f42bb53bff5 161 wait_ms(100);
clarkjarvis 10:f30cd412e968 162
maclobdell 0:1f42bb53bff5 163 if (button_pressed) {
maclobdell 0:1f42bb53bff5 164 button_pressed = false;
clarkjarvis 4:5994ee6e8f63 165 printf("Button Pressed %d time(s).\r\n",(++button_count));
clarkjarvis 8:99d61dd3bfb9 166 // To-Do #4: Add function to set button resource value
clarkjarvis 9:582d0ef3b83b 167 // Call to update button resource count
clarkjarvis 9:582d0ef3b83b 168 button->set_value(button_count);
maclobdell 0:1f42bb53bff5 169 }
maclobdell 0:1f42bb53bff5 170 }
maclobdell 0:1f42bb53bff5 171
maclobdell 0:1f42bb53bff5 172 // Client unregistered, exit program.
maclobdell 0:1f42bb53bff5 173 return 0;
maclobdell 0:1f42bb53bff5 174 }