Mbed Cloud Example Project - LPC546xx (Completed Version)

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

Committer:
clarkjarvis
Date:
Thu Oct 11 15:25:26 2018 +0000
Revision:
9:582d0ef3b83b
Parent:
8:99d61dd3bfb9
Child:
10:f30cd412e968
Final version of complete lab

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
maclobdell 0:1f42bb53bff5 43 static bool button_pressed = false;
maclobdell 0:1f42bb53bff5 44 void button_press() {
maclobdell 0:1f42bb53bff5 45 button_pressed = true;
maclobdell 0:1f42bb53bff5 46 }
maclobdell 0:1f42bb53bff5 47
clarkjarvis 4:5994ee6e8f63 48 void led_toggle() {
clarkjarvis 4:5994ee6e8f63 49 led = !led;
clarkjarvis 4:5994ee6e8f63 50 }
clarkjarvis 4:5994ee6e8f63 51
clarkjarvis 8:99d61dd3bfb9 52 // To-Do #3: Add Cloud Client Resource Callback Functions
clarkjarvis 9:582d0ef3b83b 53 // Resource Callback Functions
clarkjarvis 9:582d0ef3b83b 54 void blink_rate_updated(const char *) {
clarkjarvis 9:582d0ef3b83b 55 printf("PUT received, Storing LED Blink Rate: %s (ms)\r\n", rate_ptr->get_value().c_str());
clarkjarvis 9:582d0ef3b83b 56 }
clarkjarvis 9:582d0ef3b83b 57
clarkjarvis 9:582d0ef3b83b 58 void blink_enable_callback(void *) {
clarkjarvis 9:582d0ef3b83b 59 String pattern_str = rate_ptr->get_value();
clarkjarvis 9:582d0ef3b83b 60 const char *rate = pattern_str.c_str();
clarkjarvis 9:582d0ef3b83b 61 printf("POST received. Enabling LED Blink Rate = %s (ms)\n", rate);
clarkjarvis 9:582d0ef3b83b 62
clarkjarvis 9:582d0ef3b83b 63 float value = atoi(rate_ptr->get_value().c_str())/1000.0;
clarkjarvis 9:582d0ef3b83b 64 timer.detach();
clarkjarvis 9:582d0ef3b83b 65 timer.attach(&led_toggle,value);
clarkjarvis 9:582d0ef3b83b 66 }
clarkjarvis 9:582d0ef3b83b 67
clarkjarvis 9:582d0ef3b83b 68 void button_callback(const M2MBase& object, const NoticationDeliveryStatus status)
clarkjarvis 9:582d0ef3b83b 69 {
clarkjarvis 9:582d0ef3b83b 70 printf("Button notification. Callback: (%s)\n", object.uri_path());
clarkjarvis 9:582d0ef3b83b 71 }
clarkjarvis 9:582d0ef3b83b 72
clarkjarvis 4:5994ee6e8f63 73
maclobdell 0:1f42bb53bff5 74
maclobdell 0:1f42bb53bff5 75
maclobdell 0:1f42bb53bff5 76 int main(void)
maclobdell 0:1f42bb53bff5 77 {
maclobdell 0:1f42bb53bff5 78 // Requires DAPLink 245+ (https://github.com/ARMmbed/DAPLink/pull/364)
maclobdell 0:1f42bb53bff5 79 // Older versions: workaround to prevent possible deletion of credentials:
maclobdell 0:1f42bb53bff5 80 wait(2);
maclobdell 0:1f42bb53bff5 81
maclobdell 0:1f42bb53bff5 82 // Misc OS setup
maclobdell 0:1f42bb53bff5 83 srand(time(NULL));
maclobdell 0:1f42bb53bff5 84
maclobdell 0:1f42bb53bff5 85 // Placeholder for network
maclobdell 0:1f42bb53bff5 86 EthernetInterface net;
maclobdell 0:1f42bb53bff5 87
maclobdell 0:1f42bb53bff5 88 printf("Start Simple Mbed Cloud Client\n");
maclobdell 0:1f42bb53bff5 89
maclobdell 0:1f42bb53bff5 90 // Initialize SD card
maclobdell 0:1f42bb53bff5 91 int status = sd.init();
maclobdell 0:1f42bb53bff5 92 if (status != BD_ERROR_OK) {
maclobdell 0:1f42bb53bff5 93 printf("Failed to init SD card\r\n");
maclobdell 0:1f42bb53bff5 94 return -1;
maclobdell 0:1f42bb53bff5 95 }
maclobdell 0:1f42bb53bff5 96
maclobdell 0:1f42bb53bff5 97 // Mount the file system (reformatting on failure)
maclobdell 0:1f42bb53bff5 98 status = fs.mount(&sd);
maclobdell 0:1f42bb53bff5 99 if (status) {
maclobdell 0:1f42bb53bff5 100 printf("Failed to mount FAT file system, reformatting...\r\n");
maclobdell 0:1f42bb53bff5 101 status = fs.reformat(&sd);
maclobdell 0:1f42bb53bff5 102 if (status) {
maclobdell 0:1f42bb53bff5 103 printf("Failed to reformat FAT file system\r\n");
maclobdell 0:1f42bb53bff5 104 return -1;
maclobdell 0:1f42bb53bff5 105 } else {
maclobdell 0:1f42bb53bff5 106 printf("Reformat and mount complete\r\n");
maclobdell 0:1f42bb53bff5 107 }
maclobdell 0:1f42bb53bff5 108 }
maclobdell 0:1f42bb53bff5 109
clarkjarvis 4:5994ee6e8f63 110 // Connect to Network (obtain IP address)
maclobdell 0:1f42bb53bff5 111 printf("Connecting to the network using Ethernet...\n");
maclobdell 0:1f42bb53bff5 112 status = net.connect();
maclobdell 0:1f42bb53bff5 113 if (status) {
maclobdell 0:1f42bb53bff5 114 printf("Connection to Network Failed %d!\n", status);
maclobdell 0:1f42bb53bff5 115 return -1;
maclobdell 0:1f42bb53bff5 116 } else {
maclobdell 0:1f42bb53bff5 117 const char *ip_addr = net.get_ip_address();
maclobdell 0:1f42bb53bff5 118 printf("Connected successfully\n");
maclobdell 0:1f42bb53bff5 119 printf("IP address %s\n", ip_addr);
maclobdell 0:1f42bb53bff5 120 }
maclobdell 0:1f42bb53bff5 121
clarkjarvis 4:5994ee6e8f63 122 // Mbed Cloud Client Initialization
maclobdell 0:1f42bb53bff5 123 SimpleMbedCloudClient mbedClient(&net);
maclobdell 0:1f42bb53bff5 124 status = mbedClient.init();
maclobdell 0:1f42bb53bff5 125 if (status) {
maclobdell 0:1f42bb53bff5 126 return -1;
maclobdell 0:1f42bb53bff5 127 }
maclobdell 0:1f42bb53bff5 128 printf("Client initialized\r\n");
maclobdell 0:1f42bb53bff5 129
clarkjarvis 8:99d61dd3bfb9 130 // To-Do #1: Add Mbed Cloud Client resources
clarkjarvis 9:582d0ef3b83b 131 // Setup Mbed Cloud Client Resources
clarkjarvis 9:582d0ef3b83b 132 MbedCloudClientResource *button = mbedClient.create_resource("3200/0/5501", "button_resource");
clarkjarvis 9:582d0ef3b83b 133 button->set_value("0");
clarkjarvis 9:582d0ef3b83b 134 button->methods(M2MMethod::GET);
clarkjarvis 9:582d0ef3b83b 135 button->observable(true);
clarkjarvis 9:582d0ef3b83b 136 button->attach_notification_callback(button_callback);
clarkjarvis 9:582d0ef3b83b 137
clarkjarvis 9:582d0ef3b83b 138 MbedCloudClientResource *rate = mbedClient.create_resource("3201/0/5853", "blink_rate_resource");
clarkjarvis 9:582d0ef3b83b 139 rate->set_value("500");
clarkjarvis 9:582d0ef3b83b 140 rate->methods(M2MMethod::GET | M2MMethod::PUT);
clarkjarvis 9:582d0ef3b83b 141 rate->observable(false);
clarkjarvis 9:582d0ef3b83b 142 rate->attach_put_callback(blink_rate_updated);
clarkjarvis 9:582d0ef3b83b 143 rate_ptr = rate;
clarkjarvis 9:582d0ef3b83b 144
clarkjarvis 9:582d0ef3b83b 145 MbedCloudClientResource *blink = mbedClient.create_resource("3201/0/5850", "blink_enable_resource");
clarkjarvis 9:582d0ef3b83b 146 blink->methods(M2MMethod::POST);
clarkjarvis 9:582d0ef3b83b 147 blink->attach_post_callback(blink_enable_callback);
maclobdell 0:1f42bb53bff5 148
maclobdell 0:1f42bb53bff5 149
maclobdell 0:1f42bb53bff5 150
clarkjarvis 4:5994ee6e8f63 151 // Mbed Cloud Register Client and Connect
maclobdell 0:1f42bb53bff5 152 mbedClient.register_and_connect();
maclobdell 0:1f42bb53bff5 153
maclobdell 0:1f42bb53bff5 154 // Wait for client to finish registering
maclobdell 0:1f42bb53bff5 155 while (!mbedClient.is_client_registered()) {
maclobdell 0:1f42bb53bff5 156 wait_ms(100);
maclobdell 0:1f42bb53bff5 157 }
maclobdell 0:1f42bb53bff5 158
clarkjarvis 4:5994ee6e8f63 159 // Setup LED and Push BUtton
clarkjarvis 4:5994ee6e8f63 160 timer.attach(&led_toggle, 0.5);
clarkjarvis 4:5994ee6e8f63 161 sw2.fall(&button_press);
clarkjarvis 4:5994ee6e8f63 162
maclobdell 0:1f42bb53bff5 163 // Check if client is registering or registered, if true sleep and repeat.
maclobdell 0:1f42bb53bff5 164 while (mbedClient.is_register_called()) {
maclobdell 0:1f42bb53bff5 165 static int button_count = 0;
maclobdell 0:1f42bb53bff5 166 wait_ms(100);
maclobdell 0:1f42bb53bff5 167
maclobdell 0:1f42bb53bff5 168 if (button_pressed) {
maclobdell 0:1f42bb53bff5 169 button_pressed = false;
clarkjarvis 4:5994ee6e8f63 170 printf("Button Pressed %d time(s).\r\n",(++button_count));
clarkjarvis 8:99d61dd3bfb9 171 // To-Do #4: Add function to set button resource value
clarkjarvis 9:582d0ef3b83b 172 // Call to update button resource count
clarkjarvis 9:582d0ef3b83b 173 button->set_value(button_count);
maclobdell 0:1f42bb53bff5 174 }
maclobdell 0:1f42bb53bff5 175 }
maclobdell 0:1f42bb53bff5 176
maclobdell 0:1f42bb53bff5 177 // Client unregistered, exit program.
maclobdell 0:1f42bb53bff5 178 return 0;
maclobdell 0:1f42bb53bff5 179 }