BG96_K6xF_pelion-example-frdm_Temp

Dependencies:   FXAS21002 FXOS8700Q

Overview

This document is based on https://os.mbed.com/teams/NXP/code/pelion-example-frdm/ and the code forked Daniel_Lee's(https://os.mbed.com/users/Daniel_Lee/code/BG96_K6xF_pelion-example-frdm/)BG96_K6xF_pelion-example-frdm repository and added some features. Need a WIZnet IoT Shield BG96 board and development board.

This example is known to work great on the following platforms:

/media/uploads/stkim92/pel01.png

Requirement

  1. FRDM-K64F or FRDM-K66F
  2. WIZnet IoT Shield BG96 board
  3. USIM card

Example functionality

This example showcases the following device functionality:

Read onboard FXOS8700Q accelerometer, magnetometer and temperature(on shield). And report the values as Pelion LWM2M resources (see image below). (FRDM-K66F only) Read onboard FXAS21002 gyroscope and report the values as Pelion LWM2M resources. On user button click, increment Pelion LWM2M button resource. Allow the user to change the state of the board LED from Pelion LWM2M led_state resource and PUT request.

1. Import into Compiler

/media/uploads/stkim92/pel1.png

2. Apply Update Certificate

/media/uploads/stkim92/pel03.png

3. Compile and Program

/media/uploads/stkim92/pel04.png

4. If successfully connect to cellular networks(SKTelecom) then you can get below message

Device's Result

include the mbed library with this snippet

You can hold the user button during boot to format the storage and change the device identity.

M2Mnet(BG96) Power ON



Sensors configuration:

FXOS8700Q accelerometer = 0xC7

FXOS8700Q magnetometer  = 0xC7



Connecting to the network using the default network interface...

Connected to the network successfully. IP address: 2001:2D8:65

Initializing Pelion Device Management Client...

Initialized Pelion Device Management Client. Registering...

Press the user button to increment the LwM2M resource value...

Celsius temp : 26.10 C                                                             

FXOS8700Q mag:    0.217 x,   0.420 y,   0.288 z [gauss]     

Pelion Cloud Result (1)

/media/uploads/stkim92/pel4.png

Pelion Cloud Result (2)

/media/uploads/stkim92/pel5.png

Committer:
Daniel_Lee
Date:
Wed Jul 24 16:03:48 2019 +0000
Revision:
11:34e86cb4dd2f
Parent:
5:f2123dc31d30
Added BG96 power on sequence

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:a9d53048f0b6 1 // ----------------------------------------------------------------------------
screamer 0:a9d53048f0b6 2 // Copyright 2016-2018 ARM Ltd.
screamer 0:a9d53048f0b6 3 //
screamer 0:a9d53048f0b6 4 // SPDX-License-Identifier: Apache-2.0
screamer 0:a9d53048f0b6 5 //
screamer 0:a9d53048f0b6 6 // Licensed under the Apache License, Version 2.0 (the "License");
screamer 0:a9d53048f0b6 7 // you may not use this file except in compliance with the License.
screamer 0:a9d53048f0b6 8 // You may obtain a copy of the License at
screamer 0:a9d53048f0b6 9 //
screamer 0:a9d53048f0b6 10 // http://www.apache.org/licenses/LICENSE-2.0
screamer 0:a9d53048f0b6 11 //
screamer 0:a9d53048f0b6 12 // Unless required by applicable law or agreed to in writing, software
screamer 0:a9d53048f0b6 13 // distributed under the License is distributed on an "AS IS" BASIS,
screamer 0:a9d53048f0b6 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
screamer 0:a9d53048f0b6 15 // See the License for the specific language governing permissions and
screamer 0:a9d53048f0b6 16 // limitations under the License.
screamer 0:a9d53048f0b6 17 // ----------------------------------------------------------------------------
screamer 0:a9d53048f0b6 18 #ifndef MBED_TEST_MODE
screamer 0:a9d53048f0b6 19
screamer 0:a9d53048f0b6 20 #include "mbed.h"
screamer 0:a9d53048f0b6 21 #include "simple-mbed-cloud-client.h"
screamer 0:a9d53048f0b6 22 #include "FATFileSystem.h"
screamer 0:a9d53048f0b6 23 #include "LittleFileSystem.h"
screamer 5:f2123dc31d30 24
screamer 5:f2123dc31d30 25 // Default network interface object. Don't forget to change the WiFi SSID/password in mbed_app.json if you're using WiFi.
screamer 5:f2123dc31d30 26 NetworkInterface *net = NetworkInterface::get_default_instance();
screamer 5:f2123dc31d30 27
screamer 5:f2123dc31d30 28 // Default block device available on the target board
screamer 5:f2123dc31d30 29 BlockDevice *bd = BlockDevice::get_default_instance();
screamer 5:f2123dc31d30 30
screamer 5:f2123dc31d30 31 #if COMPONENT_SD || COMPONENT_NUSD
screamer 5:f2123dc31d30 32 // Use FATFileSystem for SD card type blockdevices
screamer 5:f2123dc31d30 33 FATFileSystem fs("fs");
screamer 5:f2123dc31d30 34 #else
screamer 5:f2123dc31d30 35 // Use LittleFileSystem for non-SD block devices to enable wear leveling and other functions
screamer 5:f2123dc31d30 36 LittleFileSystem fs("fs");
screamer 5:f2123dc31d30 37 #endif
screamer 5:f2123dc31d30 38
screamer 5:f2123dc31d30 39 // Default User button for GET example and for resetting the storage
screamer 5:f2123dc31d30 40 InterruptIn button(BUTTON1);
screamer 5:f2123dc31d30 41 // Default LED to use for PUT/POST example
screamer 5:f2123dc31d30 42 DigitalOut led(LED1, 0);
screamer 5:f2123dc31d30 43
screamer 5:f2123dc31d30 44 // How often to fetch sensor data (in seconds)
screamer 5:f2123dc31d30 45 #define SENSORS_POLL_INTERVAL 3.0
screamer 5:f2123dc31d30 46
screamer 5:f2123dc31d30 47 // Send all sensor data or just limited (useful for when running out of memory)
screamer 5:f2123dc31d30 48 //#define SEND_ALL_SENSORS
screamer 5:f2123dc31d30 49
screamer 5:f2123dc31d30 50 // Sensors related includes and initialization
screamer 1:42d51cf7cebe 51 #include "FXOS8700Q.h"
screamer 2:fba2c7066355 52 #include "FXAS21002.h"
screamer 1:42d51cf7cebe 53
screamer 2:fba2c7066355 54 #ifdef TARGET_K66F
screamer 2:fba2c7066355 55 I2C sens_i2c(PTD9, PTD8);
screamer 2:fba2c7066355 56 #else
screamer 2:fba2c7066355 57 I2C sens_i2c(PTE25, PTE24);
screamer 2:fba2c7066355 58 #endif /* TARGET_K66F */
screamer 2:fba2c7066355 59
screamer 2:fba2c7066355 60 FXOS8700QAccelerometer sens_acc(sens_i2c, FXOS8700CQ_SLAVE_ADDR1); // Configured for the FRDM-K64F with onboard sensors
screamer 2:fba2c7066355 61 FXOS8700QMagnetometer sens_mag(sens_i2c, FXOS8700CQ_SLAVE_ADDR1);
screamer 2:fba2c7066355 62 #ifdef TARGET_K66F
screamer 2:fba2c7066355 63 FXAS21002 sens_gyro(PTD9, PTD8, 0x20);
screamer 2:fba2c7066355 64 #endif /* TARGET_K66F */
screamer 1:42d51cf7cebe 65
screamer 0:a9d53048f0b6 66 // Declaring pointers for access to Pelion Device Management Client resources outside of main()
screamer 2:fba2c7066355 67 MbedCloudClientResource *res_button;
screamer 2:fba2c7066355 68 MbedCloudClientResource *res_led;
screamer 2:fba2c7066355 69 MbedCloudClientResource *res_post;
screamer 5:f2123dc31d30 70
screamer 5:f2123dc31d30 71 // Additional resources for sensor readings
screamer 1:42d51cf7cebe 72 #ifdef SEND_ALL_SENSORS
screamer 1:42d51cf7cebe 73 MbedCloudClientResource *res_magnometer_x;
screamer 1:42d51cf7cebe 74 MbedCloudClientResource *res_magnometer_y;
screamer 1:42d51cf7cebe 75 MbedCloudClientResource *res_magnometer_z;
screamer 1:42d51cf7cebe 76 MbedCloudClientResource *res_accelerometer_x;
screamer 1:42d51cf7cebe 77 MbedCloudClientResource *res_accelerometer_y;
screamer 1:42d51cf7cebe 78 MbedCloudClientResource *res_accelerometer_z;
screamer 2:fba2c7066355 79 #ifdef TARGET_K66F
screamer 2:fba2c7066355 80 MbedCloudClientResource *res_gyroscope_x;
screamer 2:fba2c7066355 81 MbedCloudClientResource *res_gyroscope_y;
screamer 2:fba2c7066355 82 MbedCloudClientResource *res_gyroscope_z;
screamer 2:fba2c7066355 83 #endif /* TARGET_K66F */
screamer 1:42d51cf7cebe 84 #endif /* SEND_ALL_SENSORS */
screamer 0:a9d53048f0b6 85
Daniel_Lee 11:34e86cb4dd2f 86
Daniel_Lee 11:34e86cb4dd2f 87 void BG96_Modem_PowerON(void)
Daniel_Lee 11:34e86cb4dd2f 88 {
Daniel_Lee 11:34e86cb4dd2f 89 DigitalOut BG96_RESET(D7);
Daniel_Lee 11:34e86cb4dd2f 90 DigitalOut BG96_PWRKEY(D9);
Daniel_Lee 11:34e86cb4dd2f 91
Daniel_Lee 11:34e86cb4dd2f 92 BG96_RESET = 1;
Daniel_Lee 11:34e86cb4dd2f 93 BG96_PWRKEY = 1;
Daniel_Lee 11:34e86cb4dd2f 94 wait_ms(200);
Daniel_Lee 11:34e86cb4dd2f 95
Daniel_Lee 11:34e86cb4dd2f 96 BG96_RESET = 0;
Daniel_Lee 11:34e86cb4dd2f 97 BG96_PWRKEY = 0;
Daniel_Lee 11:34e86cb4dd2f 98 wait_ms(300);
Daniel_Lee 11:34e86cb4dd2f 99
Daniel_Lee 11:34e86cb4dd2f 100 BG96_RESET = 1;
Daniel_Lee 11:34e86cb4dd2f 101 wait_ms(5000);
Daniel_Lee 11:34e86cb4dd2f 102 }
Daniel_Lee 11:34e86cb4dd2f 103
screamer 0:a9d53048f0b6 104 // An event queue is a very useful structure to debounce information between contexts (e.g. ISR and normal threads)
screamer 0:a9d53048f0b6 105 // This is great because things such as network operations are illegal in ISR, so updating a resource in a button's fall() function is not allowed
screamer 0:a9d53048f0b6 106 EventQueue eventQueue;
screamer 0:a9d53048f0b6 107
screamer 1:42d51cf7cebe 108 // When the device is registered, this variable will be used to access various useful information, like device ID etc.
screamer 1:42d51cf7cebe 109 static const ConnectorClientEndpointInfo* endpointInfo;
screamer 1:42d51cf7cebe 110
screamer 0:a9d53048f0b6 111 /**
screamer 0:a9d53048f0b6 112 * PUT handler - sets the value of the built-in LED
screamer 0:a9d53048f0b6 113 * @param resource The resource that triggered the callback
screamer 0:a9d53048f0b6 114 * @param newValue Updated value for the resource
screamer 0:a9d53048f0b6 115 */
screamer 0:a9d53048f0b6 116 void put_callback(MbedCloudClientResource *resource, m2m::String newValue) {
screamer 2:fba2c7066355 117 printf("*** PUT received, new value: %s \n", newValue.c_str());
screamer 0:a9d53048f0b6 118 led = atoi(newValue.c_str());
screamer 0:a9d53048f0b6 119 }
screamer 0:a9d53048f0b6 120
screamer 0:a9d53048f0b6 121 /**
screamer 0:a9d53048f0b6 122 * POST handler - prints the content of the payload
screamer 0:a9d53048f0b6 123 * @param resource The resource that triggered the callback
screamer 0:a9d53048f0b6 124 * @param buffer If a body was passed to the POST function, this contains the data.
screamer 0:a9d53048f0b6 125 * Note that the buffer is deallocated after leaving this function, so copy it if you need it longer.
screamer 0:a9d53048f0b6 126 * @param size Size of the body
screamer 0:a9d53048f0b6 127 */
screamer 0:a9d53048f0b6 128 void post_callback(MbedCloudClientResource *resource, const uint8_t *buffer, uint16_t size) {
screamer 2:fba2c7066355 129 printf("*** POST received (length %u). Payload: ", size);
screamer 0:a9d53048f0b6 130 for (size_t ix = 0; ix < size; ix++) {
screamer 0:a9d53048f0b6 131 printf("%02x ", buffer[ix]);
screamer 0:a9d53048f0b6 132 }
screamer 0:a9d53048f0b6 133 printf("\n");
screamer 0:a9d53048f0b6 134 }
screamer 0:a9d53048f0b6 135
screamer 0:a9d53048f0b6 136 /**
screamer 0:a9d53048f0b6 137 * Button handler
screamer 0:a9d53048f0b6 138 * This function will be triggered either by a physical button press or by a ticker every 5 seconds (see below)
screamer 0:a9d53048f0b6 139 */
screamer 0:a9d53048f0b6 140 void button_press() {
screamer 2:fba2c7066355 141 int v = res_button->get_value_int() + 1;
screamer 2:fba2c7066355 142 res_button->set_value(v);
screamer 2:fba2c7066355 143 printf("*** Button clicked %d times \n", v);
screamer 0:a9d53048f0b6 144 }
screamer 0:a9d53048f0b6 145
screamer 0:a9d53048f0b6 146 /**
screamer 0:a9d53048f0b6 147 * Notification callback handler
screamer 0:a9d53048f0b6 148 * @param resource The resource that triggered the callback
screamer 0:a9d53048f0b6 149 * @param status The delivery status of the notification
screamer 0:a9d53048f0b6 150 */
screamer 0:a9d53048f0b6 151 void button_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status) {
screamer 2:fba2c7066355 152 printf("*** Button notification, status %s (%d) \n", MbedCloudClientResource::delivery_status_to_string(status), status);
screamer 0:a9d53048f0b6 153 }
screamer 0:a9d53048f0b6 154
screamer 0:a9d53048f0b6 155 /**
screamer 0:a9d53048f0b6 156 * Registration callback handler
screamer 0:a9d53048f0b6 157 * @param endpoint Information about the registered endpoint such as the name (so you can find it back in portal)
screamer 0:a9d53048f0b6 158 */
screamer 0:a9d53048f0b6 159 void registered(const ConnectorClientEndpointInfo *endpoint) {
screamer 0:a9d53048f0b6 160 printf("Registered to Pelion Device Management. Endpoint Name: %s\n", endpoint->internal_endpoint_name.c_str());
screamer 3:2231338197f2 161 endpointInfo = endpoint;
screamer 0:a9d53048f0b6 162 }
screamer 0:a9d53048f0b6 163
screamer 1:42d51cf7cebe 164 /**
screamer 1:42d51cf7cebe 165 * Initialize sensors
screamer 1:42d51cf7cebe 166 */
screamer 1:42d51cf7cebe 167 void sensors_init() {
screamer 1:42d51cf7cebe 168 printf ("\nSensors configuration:\n");
screamer 1:42d51cf7cebe 169
screamer 2:fba2c7066355 170 sens_acc.enable();
screamer 2:fba2c7066355 171 sens_mag.enable();
screamer 2:fba2c7066355 172 #ifdef TARGET_K66F
screamer 2:fba2c7066355 173 sens_gyro.activate(true);
screamer 2:fba2c7066355 174 #endif /* TARGET_K66F */
screamer 1:42d51cf7cebe 175
screamer 2:fba2c7066355 176 printf("FXOS8700Q accelerometer = 0x%X\n", sens_acc.whoAmI());
screamer 2:fba2c7066355 177 printf("FXOS8700Q magnetometer = 0x%X\n", sens_mag.whoAmI());
screamer 2:fba2c7066355 178 #ifdef TARGET_K66F
screamer 2:fba2c7066355 179 printf("FXAS21002 gyroscope = 0x%X\n", sens_gyro.getStatus());
screamer 2:fba2c7066355 180 #endif /* TARGET_K66F */
screamer 1:42d51cf7cebe 181
screamer 1:42d51cf7cebe 182 printf("\n"); ;
screamer 1:42d51cf7cebe 183 }
screamer 1:42d51cf7cebe 184
screamer 1:42d51cf7cebe 185 /**
screamer 1:42d51cf7cebe 186 * Update sensors and report their values.
screamer 1:42d51cf7cebe 187 * This function is called periodically.
screamer 1:42d51cf7cebe 188 */
screamer 1:42d51cf7cebe 189 void sensors_update() {
screamer 1:42d51cf7cebe 190 motion_data_counts_t acc_raw, mag_raw;
screamer 1:42d51cf7cebe 191
screamer 2:fba2c7066355 192 sens_acc.getAxis(acc_raw);
screamer 2:fba2c7066355 193 sens_mag.getAxis(mag_raw);
screamer 1:42d51cf7cebe 194
screamer 2:fba2c7066355 195 float mag_x = (double)mag_raw.x / 1000.0, mag_y = (double)mag_raw.y / 1000.0, mag_z = (double)mag_raw.z / 1000.0;
screamer 2:fba2c7066355 196 float acc_x = (double)acc_raw.x / 1000.0, acc_y = (double)acc_raw.y / 1000.0, acc_z = (double)acc_raw.z / 1000.0;
screamer 2:fba2c7066355 197 #ifdef TARGET_K66F
screamer 2:fba2c7066355 198 float gyro_x = (double)sens_gyro.getX() / 1000.0, gyro_y = (double)sens_gyro.getY() / 1000.0, gyro_z = (double)sens_gyro.getZ() / 1000.0;
screamer 2:fba2c7066355 199 #endif /* TARGET_K66F */
screamer 1:42d51cf7cebe 200
screamer 2:fba2c7066355 201 printf(" \n");
screamer 2:fba2c7066355 202 printf("FXOS8700Q mag: %7.3f x, %7.3f y, %7.3f z [gauss] \n", mag_x, mag_y, mag_z);
screamer 2:fba2c7066355 203 printf("FXOS8700Q acc: %7.3f x, %7.3f y, %7.3f z [g] \n", acc_x, acc_y, acc_z);
screamer 2:fba2c7066355 204 #ifdef TARGET_K66F
screamer 2:fba2c7066355 205 printf("FXAS21002 gryo: %7.3f x, %7.3f y, %7.3f z [dps] \n", gyro_x, gyro_y, gyro_z);
screamer 2:fba2c7066355 206 printf("\r\033[4A");
screamer 2:fba2c7066355 207 #else
screamer 1:42d51cf7cebe 208 printf("\r\033[3A");
screamer 2:fba2c7066355 209 #endif /* TARGET_K66F */
screamer 1:42d51cf7cebe 210
screamer 1:42d51cf7cebe 211 if (endpointInfo) {
screamer 1:42d51cf7cebe 212 #ifdef SEND_ALL_SENSORS
screamer 3:2231338197f2 213 res_accelerometer_x->set_value(acc_x);
screamer 3:2231338197f2 214 res_accelerometer_y->set_value(acc_y);
screamer 3:2231338197f2 215 res_accelerometer_z->set_value(acc_z);
screamer 2:fba2c7066355 216 res_magnometer_x->set_value(mag_x);
screamer 2:fba2c7066355 217 res_magnometer_y->set_value(mag_y);
screamer 2:fba2c7066355 218 res_magnometer_z->set_value(mag_z);
screamer 2:fba2c7066355 219 #ifdef TARGET_K66F
screamer 2:fba2c7066355 220 res_gyroscope_x->set_value(gyro_x);
screamer 2:fba2c7066355 221 res_gyroscope_y->set_value(gyro_y);
screamer 2:fba2c7066355 222 res_gyroscope_z->set_value(gyro_z);
screamer 2:fba2c7066355 223 #endif /* TARGET_K66F */
screamer 1:42d51cf7cebe 224 #endif /* SEND_ALL_SENSORS */
screamer 1:42d51cf7cebe 225 }
screamer 1:42d51cf7cebe 226 }
screamer 1:42d51cf7cebe 227
screamer 0:a9d53048f0b6 228 int main(void) {
screamer 0:a9d53048f0b6 229 printf("\nStarting Simple Pelion Device Management Client example\n");
screamer 0:a9d53048f0b6 230
screamer 2:fba2c7066355 231 int storage_status = fs.mount(bd);
screamer 2:fba2c7066355 232 if (storage_status != 0) {
screamer 2:fba2c7066355 233 printf("Storage mounting failed.\n");
screamer 2:fba2c7066355 234 }
screamer 0:a9d53048f0b6 235 #if USE_BUTTON == 1
screamer 0:a9d53048f0b6 236 // If the User button is pressed ons start, then format storage.
screamer 2:fba2c7066355 237 bool btn_pressed = (button.read() == MBED_CONF_APP_BUTTON_PRESSED_STATE);
screamer 2:fba2c7066355 238 if (btn_pressed) {
screamer 2:fba2c7066355 239 printf("User button is pushed on start...\n");
screamer 2:fba2c7066355 240 }
screamer 2:fba2c7066355 241 #else
screamer 2:fba2c7066355 242 bool btn_pressed = FALSE;
screamer 2:fba2c7066355 243 #endif /* USE_BUTTON */
screamer 2:fba2c7066355 244
screamer 2:fba2c7066355 245 if (storage_status || btn_pressed) {
screamer 2:fba2c7066355 246 printf("Formatting the storage...\n");
screamer 0:a9d53048f0b6 247 int storage_status = StorageHelper::format(&fs, bd);
screamer 0:a9d53048f0b6 248 if (storage_status != 0) {
screamer 0:a9d53048f0b6 249 printf("ERROR: Failed to reformat the storage (%d).\n", storage_status);
screamer 0:a9d53048f0b6 250 }
screamer 0:a9d53048f0b6 251 } else {
screamer 0:a9d53048f0b6 252 printf("You can hold the user button during boot to format the storage and change the device identity.\n");
screamer 0:a9d53048f0b6 253 }
screamer 0:a9d53048f0b6 254
Daniel_Lee 11:34e86cb4dd2f 255 BG96_Modem_PowerON();
Daniel_Lee 11:34e86cb4dd2f 256 printf("M2Mnet(BG96) Power ON\n");
Daniel_Lee 11:34e86cb4dd2f 257
screamer 1:42d51cf7cebe 258 sensors_init();
screamer 1:42d51cf7cebe 259
screamer 0:a9d53048f0b6 260 // Connect to the Internet (DHCP is expected to be on)
screamer 0:a9d53048f0b6 261 printf("Connecting to the network using the default network interface...\n");
screamer 0:a9d53048f0b6 262 net = NetworkInterface::get_default_instance();
screamer 0:a9d53048f0b6 263
screamer 0:a9d53048f0b6 264 nsapi_error_t net_status = NSAPI_ERROR_NO_CONNECTION;
screamer 0:a9d53048f0b6 265 while ((net_status = net->connect()) != NSAPI_ERROR_OK) {
screamer 0:a9d53048f0b6 266 printf("Unable to connect to network (%d). Retrying...\n", net_status);
screamer 0:a9d53048f0b6 267 }
screamer 0:a9d53048f0b6 268
screamer 0:a9d53048f0b6 269 printf("Connected to the network successfully. IP address: %s\n", net->get_ip_address());
screamer 0:a9d53048f0b6 270
screamer 0:a9d53048f0b6 271 printf("Initializing Pelion Device Management Client...\n");
screamer 0:a9d53048f0b6 272
screamer 0:a9d53048f0b6 273 // SimpleMbedCloudClient handles registering over LwM2M to Pelion Device Management
screamer 0:a9d53048f0b6 274 SimpleMbedCloudClient client(net, bd, &fs);
screamer 0:a9d53048f0b6 275 int client_status = client.init();
screamer 0:a9d53048f0b6 276 if (client_status != 0) {
screamer 0:a9d53048f0b6 277 printf("Pelion Client initialization failed (%d)\n", client_status);
screamer 0:a9d53048f0b6 278 return -1;
screamer 0:a9d53048f0b6 279 }
screamer 0:a9d53048f0b6 280
screamer 0:a9d53048f0b6 281 // Creating resources, which can be written or read from the cloud
screamer 2:fba2c7066355 282 res_button = client.create_resource("3200/0/5501", "button_count");
screamer 2:fba2c7066355 283 res_button->set_value(0);
screamer 2:fba2c7066355 284 res_button->methods(M2MMethod::GET);
screamer 2:fba2c7066355 285 res_button->observable(true);
screamer 2:fba2c7066355 286 res_button->attach_notification_callback(button_callback);
screamer 2:fba2c7066355 287
screamer 2:fba2c7066355 288 res_led = client.create_resource("3201/0/5853", "led_state");
screamer 2:fba2c7066355 289 res_led->set_value(led.read());
screamer 2:fba2c7066355 290 res_led->methods(M2MMethod::GET | M2MMethod::PUT);
screamer 2:fba2c7066355 291 res_led->attach_put_callback(put_callback);
screamer 2:fba2c7066355 292
screamer 2:fba2c7066355 293 res_post = client.create_resource("3300/0/5605", "execute_function");
screamer 2:fba2c7066355 294 res_post->methods(M2MMethod::POST);
screamer 2:fba2c7066355 295 res_post->attach_post_callback(post_callback);
screamer 2:fba2c7066355 296
screamer 2:fba2c7066355 297 #ifdef SEND_ALL_SENSORS
screamer 2:fba2c7066355 298 res_accelerometer_x = client.create_resource("3313/0/5702", "Accelerometer X");
screamer 2:fba2c7066355 299 res_accelerometer_x->set_value(0);
screamer 2:fba2c7066355 300 res_accelerometer_x->methods(M2MMethod::GET);
screamer 2:fba2c7066355 301 res_accelerometer_x->observable(true);
screamer 2:fba2c7066355 302
screamer 2:fba2c7066355 303 res_accelerometer_y = client.create_resource("3313/0/5703", "Accelerometer Y");
screamer 2:fba2c7066355 304 res_accelerometer_y->set_value(0);
screamer 2:fba2c7066355 305 res_accelerometer_y->methods(M2MMethod::GET);
screamer 2:fba2c7066355 306 res_accelerometer_y->observable(true);
screamer 2:fba2c7066355 307
screamer 2:fba2c7066355 308 res_accelerometer_z = client.create_resource("3313/0/5704", "Accelerometer Z");
screamer 2:fba2c7066355 309 res_accelerometer_z->set_value(0);
screamer 2:fba2c7066355 310 res_accelerometer_z->methods(M2MMethod::GET);
screamer 2:fba2c7066355 311 res_accelerometer_z->observable(true);
screamer 0:a9d53048f0b6 312
screamer 2:fba2c7066355 313 res_magnometer_x = client.create_resource("3314/0/5702", "Magnometer X");
screamer 2:fba2c7066355 314 res_magnometer_x->set_value(0);
screamer 2:fba2c7066355 315 res_magnometer_x->methods(M2MMethod::GET);
screamer 2:fba2c7066355 316 res_magnometer_x->observable(true);
screamer 2:fba2c7066355 317
screamer 2:fba2c7066355 318 res_magnometer_y = client.create_resource("3314/0/5703", "Magnometer Y");
screamer 2:fba2c7066355 319 res_magnometer_y->set_value(0);
screamer 2:fba2c7066355 320 res_magnometer_y->methods(M2MMethod::GET);
screamer 2:fba2c7066355 321 res_magnometer_y->observable(true);
screamer 2:fba2c7066355 322
screamer 2:fba2c7066355 323 res_magnometer_z = client.create_resource("3314/0/5704", "Magnometer Z");
screamer 2:fba2c7066355 324 res_magnometer_z->set_value(0);
screamer 2:fba2c7066355 325 res_magnometer_z->methods(M2MMethod::GET);
screamer 2:fba2c7066355 326 res_magnometer_z->observable(true);
screamer 0:a9d53048f0b6 327
screamer 2:fba2c7066355 328 #ifdef TARGET_K66F
screamer 2:fba2c7066355 329 res_gyroscope_x = client.create_resource("3334/0/5702", "Gyroscope X");
screamer 2:fba2c7066355 330 res_gyroscope_x->set_value(0);
screamer 2:fba2c7066355 331 res_gyroscope_x->methods(M2MMethod::GET);
screamer 2:fba2c7066355 332 res_gyroscope_x->observable(true);
screamer 2:fba2c7066355 333
screamer 2:fba2c7066355 334 res_gyroscope_y = client.create_resource("3334/0/5703", "Gyroscope Y");
screamer 2:fba2c7066355 335 res_gyroscope_y->set_value(0);
screamer 2:fba2c7066355 336 res_gyroscope_y->methods(M2MMethod::GET);
screamer 2:fba2c7066355 337 res_gyroscope_y->observable(true);
screamer 2:fba2c7066355 338
screamer 2:fba2c7066355 339 res_gyroscope_z = client.create_resource("3334/0/5704", "Gyroscope Z");
screamer 2:fba2c7066355 340 res_gyroscope_z->set_value(0);
screamer 2:fba2c7066355 341 res_gyroscope_z->methods(M2MMethod::GET);
screamer 2:fba2c7066355 342 res_gyroscope_z->observable(true);
screamer 2:fba2c7066355 343 #endif /* TARGET_K66F */
screamer 2:fba2c7066355 344 #endif /* SEND_ALL_SENSORS */
screamer 0:a9d53048f0b6 345
screamer 0:a9d53048f0b6 346 printf("Initialized Pelion Device Management Client. Registering...\n");
screamer 0:a9d53048f0b6 347
screamer 0:a9d53048f0b6 348 // Callback that fires when registering is complete
screamer 0:a9d53048f0b6 349 client.on_registered(&registered);
screamer 0:a9d53048f0b6 350
screamer 0:a9d53048f0b6 351 // Register with Pelion DM
screamer 0:a9d53048f0b6 352 client.register_and_connect();
screamer 0:a9d53048f0b6 353
screamer 0:a9d53048f0b6 354 // The button fires on an interrupt context, but debounces it to the eventqueue, so it's safe to do network operations
screamer 0:a9d53048f0b6 355 button.fall(eventQueue.event(&button_press));
screamer 0:a9d53048f0b6 356 printf("Press the user button to increment the LwM2M resource value...\n");
screamer 1:42d51cf7cebe 357
screamer 0:a9d53048f0b6 358 // The timer fires on an interrupt context, but debounces it to the eventqueue, so it's safe to do network operations
screamer 0:a9d53048f0b6 359 Ticker timer;
screamer 1:42d51cf7cebe 360 timer.attach(eventQueue.event(&sensors_update), SENSORS_POLL_INTERVAL);
screamer 0:a9d53048f0b6 361
screamer 0:a9d53048f0b6 362 // You can easily run the eventQueue in a separate thread if required
screamer 0:a9d53048f0b6 363 eventQueue.dispatch_forever();
screamer 0:a9d53048f0b6 364 }
screamer 0:a9d53048f0b6 365
screamer 0:a9d53048f0b6 366 #endif /* MBED_TEST_MODE */