Workshop example

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Committer:
adustm
Date:
Fri Feb 23 18:38:12 2018 +0100
Revision:
1:e86b1cffc402
Child:
4:cf7342047b4d
Add initial files

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adustm 1:e86b1cffc402 1 // ----------------------------------------------------------------------------
adustm 1:e86b1cffc402 2 // Copyright 2016-2017 ARM Ltd.
adustm 1:e86b1cffc402 3 //
adustm 1:e86b1cffc402 4 // SPDX-License-Identifier: Apache-2.0
adustm 1:e86b1cffc402 5 //
adustm 1:e86b1cffc402 6 // Licensed under the Apache License, Version 2.0 (the "License");
adustm 1:e86b1cffc402 7 // you may not use this file except in compliance with the License.
adustm 1:e86b1cffc402 8 // You may obtain a copy of the License at
adustm 1:e86b1cffc402 9 //
adustm 1:e86b1cffc402 10 // http://www.apache.org/licenses/LICENSE-2.0
adustm 1:e86b1cffc402 11 //
adustm 1:e86b1cffc402 12 // Unless required by applicable law or agreed to in writing, software
adustm 1:e86b1cffc402 13 // distributed under the License is distributed on an "AS IS" BASIS,
adustm 1:e86b1cffc402 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
adustm 1:e86b1cffc402 15 // See the License for the specific language governing permissions and
adustm 1:e86b1cffc402 16 // limitations under the License.
adustm 1:e86b1cffc402 17 // ----------------------------------------------------------------------------
adustm 1:e86b1cffc402 18
adustm 1:e86b1cffc402 19 #include "mbed.h"
adustm 1:e86b1cffc402 20 #include "mbed-trace/mbed_trace.h"
adustm 1:e86b1cffc402 21 #include "mbed-trace-helper.h"
adustm 1:e86b1cffc402 22 #include "simple-mbed-cloud-client.h"
adustm 1:e86b1cffc402 23 #include "key-config-manager/kcm_status.h"
adustm 1:e86b1cffc402 24 #include "key-config-manager/key_config_manager.h"
adustm 1:e86b1cffc402 25 #include "SDBlockDevice.h"
adustm 1:e86b1cffc402 26 #include "FATFileSystem.h"
adustm 1:e86b1cffc402 27 #include "ISM43362Interface.h"
adustm 1:e86b1cffc402 28
adustm 1:e86b1cffc402 29 // Placeholder to hardware that trigger events (timer, button, etc)
adustm 1:e86b1cffc402 30 Ticker timer;
adustm 1:e86b1cffc402 31
adustm 1:e86b1cffc402 32 // Placeholder for storage
adustm 1:e86b1cffc402 33 SDBlockDevice sd(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS);
adustm 1:e86b1cffc402 34 FATFileSystem fs("sd");
adustm 1:e86b1cffc402 35
adustm 1:e86b1cffc402 36 // Pointers to the resources that will be created in main_application().
adustm 1:e86b1cffc402 37 static MbedCloudClientResource* pattern_ptr;
adustm 1:e86b1cffc402 38
adustm 1:e86b1cffc402 39 // Pointer to mbedClient, used for calling close function.
adustm 1:e86b1cffc402 40 static SimpleMbedCloudClient *client;
adustm 1:e86b1cffc402 41
adustm 1:e86b1cffc402 42 static bool button_pressed = false;
adustm 1:e86b1cffc402 43
adustm 1:e86b1cffc402 44 void button_press() {
adustm 1:e86b1cffc402 45 button_pressed = true;
adustm 1:e86b1cffc402 46 }
adustm 1:e86b1cffc402 47
adustm 1:e86b1cffc402 48 void pattern_updated(const char *) {
adustm 1:e86b1cffc402 49 printf("PUT received, new value: %s\n", pattern_ptr->get_value().c_str());
adustm 1:e86b1cffc402 50 // Placeholder for PUT action
adustm 1:e86b1cffc402 51 }
adustm 1:e86b1cffc402 52
adustm 1:e86b1cffc402 53 void blink_callback(void *) {
adustm 1:e86b1cffc402 54 String pattern_str = pattern_ptr->get_value();
adustm 1:e86b1cffc402 55 const char *pattern = pattern_str.c_str();
adustm 1:e86b1cffc402 56 printf("POST received. LED pattern = %s\n", pattern);
adustm 1:e86b1cffc402 57 // Placeholder for POST action
adustm 1:e86b1cffc402 58 // The pattern is something like 500:200:500, so parse that.
adustm 1:e86b1cffc402 59 }
adustm 1:e86b1cffc402 60
adustm 1:e86b1cffc402 61 void button_callback(const M2MBase& object, const NoticationDeliveryStatus status)
adustm 1:e86b1cffc402 62 {
adustm 1:e86b1cffc402 63 printf("Button notification. Callback: (%s)\n", object.uri_path());
adustm 1:e86b1cffc402 64 // Placeholder for GET
adustm 1:e86b1cffc402 65 }
adustm 1:e86b1cffc402 66
adustm 1:e86b1cffc402 67
adustm 1:e86b1cffc402 68 int main(void)
adustm 1:e86b1cffc402 69 {
adustm 1:e86b1cffc402 70 // Requires DAPLink 245+ (https://github.com/ARMmbed/DAPLink/pull/364)
adustm 1:e86b1cffc402 71 // Older versions: workaround to prevent possible deletion of credentials:
adustm 1:e86b1cffc402 72 wait(2);
adustm 1:e86b1cffc402 73
adustm 1:e86b1cffc402 74 // Misc OS setup
adustm 1:e86b1cffc402 75 srand(time(NULL));
adustm 1:e86b1cffc402 76
adustm 1:e86b1cffc402 77 // Placeholder for network
adustm 1:e86b1cffc402 78 printf("Start Simple Mbed Cloud Client\n");
adustm 1:e86b1cffc402 79 ISM43362Interface net(MBED_CONF_APP_WIFI_SPI_MOSI, MBED_CONF_APP_WIFI_SPI_MISO, MBED_CONF_APP_WIFI_SPI_SCLK, MBED_CONF_APP_WIFI_SPI_NSS, MBED_CONF_APP_WIFI_RESET, MBED_CONF_APP_WIFI_DATAREADY, MBED_CONF_APP_WIFI_WAKEUP, false);
adustm 1:e86b1cffc402 80
adustm 1:e86b1cffc402 81
adustm 1:e86b1cffc402 82 // Initialize SD card
adustm 1:e86b1cffc402 83 int status = sd.init();
adustm 1:e86b1cffc402 84 if (status != BD_ERROR_OK) {
adustm 1:e86b1cffc402 85 printf("Failed to init SD card\r\n");
adustm 1:e86b1cffc402 86 return -1;
adustm 1:e86b1cffc402 87 }
adustm 1:e86b1cffc402 88
adustm 1:e86b1cffc402 89 // Mount the file system (reformatting on failure)
adustm 1:e86b1cffc402 90 status = fs.mount(&sd);
adustm 1:e86b1cffc402 91 if (status) {
adustm 1:e86b1cffc402 92 printf("Failed to mount FAT file system, reformatting...\r\n");
adustm 1:e86b1cffc402 93 status = fs.reformat(&sd);
adustm 1:e86b1cffc402 94 if (status) {
adustm 1:e86b1cffc402 95 printf("Failed to reformat FAT file system\r\n");
adustm 1:e86b1cffc402 96 return -1;
adustm 1:e86b1cffc402 97 } else {
adustm 1:e86b1cffc402 98 printf("Reformat and mount complete\r\n");
adustm 1:e86b1cffc402 99 }
adustm 1:e86b1cffc402 100 }
adustm 1:e86b1cffc402 101
adustm 1:e86b1cffc402 102 printf("Connecting to the network using Wifi...\n");
adustm 1:e86b1cffc402 103
adustm 1:e86b1cffc402 104 status = net.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, (strlen(MBED_CONF_APP_WIFI_PASSWORD) > 1) ? NSAPI_SECURITY_WPA_WPA2 : NSAPI_SECURITY_NONE);
adustm 1:e86b1cffc402 105 if (status) {
adustm 1:e86b1cffc402 106 printf("Connection to Network Failed %d!\n", status);
adustm 1:e86b1cffc402 107 return -1;
adustm 1:e86b1cffc402 108 } else {
adustm 1:e86b1cffc402 109 const char *ip_addr = net.get_ip_address();
adustm 1:e86b1cffc402 110 printf("Connected successfully\n");
adustm 1:e86b1cffc402 111 printf("IP address %s\n", ip_addr);
adustm 1:e86b1cffc402 112 }
adustm 1:e86b1cffc402 113
adustm 1:e86b1cffc402 114 SimpleMbedCloudClient mbedClient(&net);
adustm 1:e86b1cffc402 115 // Save pointer to mbedClient so that other functions can access it.
adustm 1:e86b1cffc402 116 client = &mbedClient;
adustm 1:e86b1cffc402 117
adustm 1:e86b1cffc402 118 status = mbedClient.init();
adustm 1:e86b1cffc402 119 if (status) {
adustm 1:e86b1cffc402 120 printf("FAILED\r\n");
adustm 1:e86b1cffc402 121 return -1;
adustm 1:e86b1cffc402 122 }
adustm 1:e86b1cffc402 123
adustm 1:e86b1cffc402 124 printf("Client initialized\r\n");
adustm 1:e86b1cffc402 125
adustm 1:e86b1cffc402 126 // Mbed Cloud Client resource setup
adustm 1:e86b1cffc402 127 MbedCloudClientResource *button = mbedClient.create_resource("3200/0/5501", "button_resource");
adustm 1:e86b1cffc402 128 button->set_value("0");
adustm 1:e86b1cffc402 129 button->methods(M2MMethod::GET);
adustm 1:e86b1cffc402 130 button->observable(true);
adustm 1:e86b1cffc402 131 button->attach_notification_callback(button_callback);
adustm 1:e86b1cffc402 132
adustm 1:e86b1cffc402 133 MbedCloudClientResource *pattern = mbedClient.create_resource("3201/0/5853", "pattern_resource");
adustm 1:e86b1cffc402 134 pattern->set_value("500:500:500:500");
adustm 1:e86b1cffc402 135 pattern->methods(M2MMethod::GET | M2MMethod::PUT);
adustm 1:e86b1cffc402 136 pattern->attach_put_callback(pattern_updated);
adustm 1:e86b1cffc402 137 pattern_ptr = pattern;
adustm 1:e86b1cffc402 138
adustm 1:e86b1cffc402 139 MbedCloudClientResource *blink = mbedClient.create_resource("3201/0/5850", "blink_resource");
adustm 1:e86b1cffc402 140 blink->methods(M2MMethod::POST);
adustm 1:e86b1cffc402 141 blink->attach_post_callback(blink_callback);
adustm 1:e86b1cffc402 142
adustm 1:e86b1cffc402 143 mbedClient.register_and_connect();
adustm 1:e86b1cffc402 144
adustm 1:e86b1cffc402 145 // Wait for client to finish registering
adustm 1:e86b1cffc402 146 while (!mbedClient.is_client_registered()) {
adustm 1:e86b1cffc402 147 wait_ms(100);
adustm 1:e86b1cffc402 148 }
adustm 1:e86b1cffc402 149
adustm 1:e86b1cffc402 150 // Placeholder for callback to update local resource when GET comes.
adustm 1:e86b1cffc402 151 timer.attach(&button_press, 5.0);
adustm 1:e86b1cffc402 152
adustm 1:e86b1cffc402 153 // Check if client is registering or registered, if true sleep and repeat.
adustm 1:e86b1cffc402 154 while (mbedClient.is_register_called()) {
adustm 1:e86b1cffc402 155 static int button_count = 0;
adustm 1:e86b1cffc402 156 wait_ms(100);
adustm 1:e86b1cffc402 157
adustm 1:e86b1cffc402 158 if (button_pressed) {
adustm 1:e86b1cffc402 159 button_pressed = false;
adustm 1:e86b1cffc402 160 printf("Simulated button clicked %d times\r\n", ++button_count);
adustm 1:e86b1cffc402 161 button->set_value(button_count);
adustm 1:e86b1cffc402 162 }
adustm 1:e86b1cffc402 163 }
adustm 1:e86b1cffc402 164
adustm 1:e86b1cffc402 165 // Client unregistered, exit program.
adustm 1:e86b1cffc402 166 return 0;
adustm 1:e86b1cffc402 167 }