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:20:11 2019 +0000
Revision:
13:ec1c3a64ee39
Parent:
5:f2123dc31d30
Child:
14:bd420de18a97
Update;

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 13:ec1c3a64ee39 86 void BG96_Modem_PowerON(void)
Daniel_Lee 13:ec1c3a64ee39 87 {
Daniel_Lee 13:ec1c3a64ee39 88 DigitalOut BG96_RESET(D7);
Daniel_Lee 13:ec1c3a64ee39 89 DigitalOut BG96_PWRKEY(D9);
Daniel_Lee 13:ec1c3a64ee39 90
Daniel_Lee 13:ec1c3a64ee39 91 BG96_RESET = 1;
Daniel_Lee 13:ec1c3a64ee39 92 BG96_PWRKEY = 1;
Daniel_Lee 13:ec1c3a64ee39 93 wait_ms(200);
Daniel_Lee 13:ec1c3a64ee39 94
Daniel_Lee 13:ec1c3a64ee39 95 BG96_RESET = 0;
Daniel_Lee 13:ec1c3a64ee39 96 BG96_PWRKEY = 0;
Daniel_Lee 13:ec1c3a64ee39 97 wait_ms(300);
Daniel_Lee 13:ec1c3a64ee39 98
Daniel_Lee 13:ec1c3a64ee39 99 BG96_RESET = 1;
Daniel_Lee 13:ec1c3a64ee39 100 wait_ms(5000);
Daniel_Lee 13:ec1c3a64ee39 101 }
Daniel_Lee 13:ec1c3a64ee39 102
screamer 0:a9d53048f0b6 103 // An event queue is a very useful structure to debounce information between contexts (e.g. ISR and normal threads)
screamer 0:a9d53048f0b6 104 // 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 105 EventQueue eventQueue;
screamer 0:a9d53048f0b6 106
screamer 1:42d51cf7cebe 107 // When the device is registered, this variable will be used to access various useful information, like device ID etc.
screamer 1:42d51cf7cebe 108 static const ConnectorClientEndpointInfo* endpointInfo;
screamer 1:42d51cf7cebe 109
screamer 0:a9d53048f0b6 110 /**
screamer 0:a9d53048f0b6 111 * PUT handler - sets the value of the built-in LED
screamer 0:a9d53048f0b6 112 * @param resource The resource that triggered the callback
screamer 0:a9d53048f0b6 113 * @param newValue Updated value for the resource
screamer 0:a9d53048f0b6 114 */
screamer 0:a9d53048f0b6 115 void put_callback(MbedCloudClientResource *resource, m2m::String newValue) {
screamer 2:fba2c7066355 116 printf("*** PUT received, new value: %s \n", newValue.c_str());
screamer 0:a9d53048f0b6 117 led = atoi(newValue.c_str());
screamer 0:a9d53048f0b6 118 }
screamer 0:a9d53048f0b6 119
screamer 0:a9d53048f0b6 120 /**
screamer 0:a9d53048f0b6 121 * POST handler - prints the content of the payload
screamer 0:a9d53048f0b6 122 * @param resource The resource that triggered the callback
screamer 0:a9d53048f0b6 123 * @param buffer If a body was passed to the POST function, this contains the data.
screamer 0:a9d53048f0b6 124 * Note that the buffer is deallocated after leaving this function, so copy it if you need it longer.
screamer 0:a9d53048f0b6 125 * @param size Size of the body
screamer 0:a9d53048f0b6 126 */
screamer 0:a9d53048f0b6 127 void post_callback(MbedCloudClientResource *resource, const uint8_t *buffer, uint16_t size) {
screamer 2:fba2c7066355 128 printf("*** POST received (length %u). Payload: ", size);
screamer 0:a9d53048f0b6 129 for (size_t ix = 0; ix < size; ix++) {
screamer 0:a9d53048f0b6 130 printf("%02x ", buffer[ix]);
screamer 0:a9d53048f0b6 131 }
screamer 0:a9d53048f0b6 132 printf("\n");
screamer 0:a9d53048f0b6 133 }
screamer 0:a9d53048f0b6 134
screamer 0:a9d53048f0b6 135 /**
screamer 0:a9d53048f0b6 136 * Button handler
screamer 0:a9d53048f0b6 137 * This function will be triggered either by a physical button press or by a ticker every 5 seconds (see below)
screamer 0:a9d53048f0b6 138 */
screamer 0:a9d53048f0b6 139 void button_press() {
screamer 2:fba2c7066355 140 int v = res_button->get_value_int() + 1;
screamer 2:fba2c7066355 141 res_button->set_value(v);
screamer 2:fba2c7066355 142 printf("*** Button clicked %d times \n", v);
screamer 0:a9d53048f0b6 143 }
screamer 0:a9d53048f0b6 144
screamer 0:a9d53048f0b6 145 /**
screamer 0:a9d53048f0b6 146 * Notification callback handler
screamer 0:a9d53048f0b6 147 * @param resource The resource that triggered the callback
screamer 0:a9d53048f0b6 148 * @param status The delivery status of the notification
screamer 0:a9d53048f0b6 149 */
screamer 0:a9d53048f0b6 150 void button_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status) {
screamer 2:fba2c7066355 151 printf("*** Button notification, status %s (%d) \n", MbedCloudClientResource::delivery_status_to_string(status), status);
screamer 0:a9d53048f0b6 152 }
screamer 0:a9d53048f0b6 153
screamer 0:a9d53048f0b6 154 /**
screamer 0:a9d53048f0b6 155 * Registration callback handler
screamer 0:a9d53048f0b6 156 * @param endpoint Information about the registered endpoint such as the name (so you can find it back in portal)
screamer 0:a9d53048f0b6 157 */
screamer 0:a9d53048f0b6 158 void registered(const ConnectorClientEndpointInfo *endpoint) {
screamer 0:a9d53048f0b6 159 printf("Registered to Pelion Device Management. Endpoint Name: %s\n", endpoint->internal_endpoint_name.c_str());
screamer 3:2231338197f2 160 endpointInfo = endpoint;
screamer 0:a9d53048f0b6 161 }
screamer 0:a9d53048f0b6 162
screamer 1:42d51cf7cebe 163 /**
screamer 1:42d51cf7cebe 164 * Initialize sensors
screamer 1:42d51cf7cebe 165 */
screamer 1:42d51cf7cebe 166 void sensors_init() {
screamer 1:42d51cf7cebe 167 printf ("\nSensors configuration:\n");
screamer 1:42d51cf7cebe 168
screamer 2:fba2c7066355 169 sens_acc.enable();
screamer 2:fba2c7066355 170 sens_mag.enable();
screamer 2:fba2c7066355 171 #ifdef TARGET_K66F
screamer 2:fba2c7066355 172 sens_gyro.activate(true);
screamer 2:fba2c7066355 173 #endif /* TARGET_K66F */
screamer 1:42d51cf7cebe 174
screamer 2:fba2c7066355 175 printf("FXOS8700Q accelerometer = 0x%X\n", sens_acc.whoAmI());
screamer 2:fba2c7066355 176 printf("FXOS8700Q magnetometer = 0x%X\n", sens_mag.whoAmI());
screamer 2:fba2c7066355 177 #ifdef TARGET_K66F
screamer 2:fba2c7066355 178 printf("FXAS21002 gyroscope = 0x%X\n", sens_gyro.getStatus());
screamer 2:fba2c7066355 179 #endif /* TARGET_K66F */
screamer 1:42d51cf7cebe 180
screamer 1:42d51cf7cebe 181 printf("\n"); ;
screamer 1:42d51cf7cebe 182 }
screamer 1:42d51cf7cebe 183
screamer 1:42d51cf7cebe 184 /**
screamer 1:42d51cf7cebe 185 * Update sensors and report their values.
screamer 1:42d51cf7cebe 186 * This function is called periodically.
screamer 1:42d51cf7cebe 187 */
screamer 1:42d51cf7cebe 188 void sensors_update() {
screamer 1:42d51cf7cebe 189 motion_data_counts_t acc_raw, mag_raw;
screamer 1:42d51cf7cebe 190
screamer 2:fba2c7066355 191 sens_acc.getAxis(acc_raw);
screamer 2:fba2c7066355 192 sens_mag.getAxis(mag_raw);
screamer 1:42d51cf7cebe 193
screamer 2:fba2c7066355 194 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 195 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 196 #ifdef TARGET_K66F
screamer 2:fba2c7066355 197 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 198 #endif /* TARGET_K66F */
screamer 1:42d51cf7cebe 199
screamer 2:fba2c7066355 200 printf(" \n");
screamer 2:fba2c7066355 201 printf("FXOS8700Q mag: %7.3f x, %7.3f y, %7.3f z [gauss] \n", mag_x, mag_y, mag_z);
screamer 2:fba2c7066355 202 printf("FXOS8700Q acc: %7.3f x, %7.3f y, %7.3f z [g] \n", acc_x, acc_y, acc_z);
screamer 2:fba2c7066355 203 #ifdef TARGET_K66F
screamer 2:fba2c7066355 204 printf("FXAS21002 gryo: %7.3f x, %7.3f y, %7.3f z [dps] \n", gyro_x, gyro_y, gyro_z);
screamer 2:fba2c7066355 205 printf("\r\033[4A");
screamer 2:fba2c7066355 206 #else
screamer 1:42d51cf7cebe 207 printf("\r\033[3A");
screamer 2:fba2c7066355 208 #endif /* TARGET_K66F */
screamer 1:42d51cf7cebe 209
screamer 1:42d51cf7cebe 210 if (endpointInfo) {
screamer 1:42d51cf7cebe 211 #ifdef SEND_ALL_SENSORS
screamer 3:2231338197f2 212 res_accelerometer_x->set_value(acc_x);
screamer 3:2231338197f2 213 res_accelerometer_y->set_value(acc_y);
screamer 3:2231338197f2 214 res_accelerometer_z->set_value(acc_z);
screamer 2:fba2c7066355 215 res_magnometer_x->set_value(mag_x);
screamer 2:fba2c7066355 216 res_magnometer_y->set_value(mag_y);
screamer 2:fba2c7066355 217 res_magnometer_z->set_value(mag_z);
screamer 2:fba2c7066355 218 #ifdef TARGET_K66F
screamer 2:fba2c7066355 219 res_gyroscope_x->set_value(gyro_x);
screamer 2:fba2c7066355 220 res_gyroscope_y->set_value(gyro_y);
screamer 2:fba2c7066355 221 res_gyroscope_z->set_value(gyro_z);
screamer 2:fba2c7066355 222 #endif /* TARGET_K66F */
screamer 1:42d51cf7cebe 223 #endif /* SEND_ALL_SENSORS */
screamer 1:42d51cf7cebe 224 }
screamer 1:42d51cf7cebe 225 }
screamer 1:42d51cf7cebe 226
screamer 0:a9d53048f0b6 227 int main(void) {
screamer 0:a9d53048f0b6 228 printf("\nStarting Simple Pelion Device Management Client example\n");
screamer 0:a9d53048f0b6 229
screamer 2:fba2c7066355 230 int storage_status = fs.mount(bd);
screamer 2:fba2c7066355 231 if (storage_status != 0) {
screamer 2:fba2c7066355 232 printf("Storage mounting failed.\n");
screamer 2:fba2c7066355 233 }
screamer 0:a9d53048f0b6 234 #if USE_BUTTON == 1
screamer 0:a9d53048f0b6 235 // If the User button is pressed ons start, then format storage.
screamer 2:fba2c7066355 236 bool btn_pressed = (button.read() == MBED_CONF_APP_BUTTON_PRESSED_STATE);
screamer 2:fba2c7066355 237 if (btn_pressed) {
screamer 2:fba2c7066355 238 printf("User button is pushed on start...\n");
screamer 2:fba2c7066355 239 }
screamer 2:fba2c7066355 240 #else
screamer 2:fba2c7066355 241 bool btn_pressed = FALSE;
screamer 2:fba2c7066355 242 #endif /* USE_BUTTON */
screamer 2:fba2c7066355 243
screamer 2:fba2c7066355 244 if (storage_status || btn_pressed) {
screamer 2:fba2c7066355 245 printf("Formatting the storage...\n");
screamer 0:a9d53048f0b6 246 int storage_status = StorageHelper::format(&fs, bd);
screamer 0:a9d53048f0b6 247 if (storage_status != 0) {
screamer 0:a9d53048f0b6 248 printf("ERROR: Failed to reformat the storage (%d).\n", storage_status);
screamer 0:a9d53048f0b6 249 }
screamer 0:a9d53048f0b6 250 } else {
screamer 0:a9d53048f0b6 251 printf("You can hold the user button during boot to format the storage and change the device identity.\n");
screamer 0:a9d53048f0b6 252 }
screamer 0:a9d53048f0b6 253
Daniel_Lee 13:ec1c3a64ee39 254 BG96_Modem_PowerON();
Daniel_Lee 13:ec1c3a64ee39 255 printf("M2Mnet(BG96) Power ON\n");
Daniel_Lee 13:ec1c3a64ee39 256
screamer 1:42d51cf7cebe 257 sensors_init();
screamer 1:42d51cf7cebe 258
screamer 0:a9d53048f0b6 259 // Connect to the Internet (DHCP is expected to be on)
screamer 0:a9d53048f0b6 260 printf("Connecting to the network using the default network interface...\n");
screamer 0:a9d53048f0b6 261 net = NetworkInterface::get_default_instance();
screamer 0:a9d53048f0b6 262
screamer 0:a9d53048f0b6 263 nsapi_error_t net_status = NSAPI_ERROR_NO_CONNECTION;
screamer 0:a9d53048f0b6 264 while ((net_status = net->connect()) != NSAPI_ERROR_OK) {
screamer 0:a9d53048f0b6 265 printf("Unable to connect to network (%d). Retrying...\n", net_status);
screamer 0:a9d53048f0b6 266 }
screamer 0:a9d53048f0b6 267
screamer 0:a9d53048f0b6 268 printf("Connected to the network successfully. IP address: %s\n", net->get_ip_address());
screamer 0:a9d53048f0b6 269
screamer 0:a9d53048f0b6 270 printf("Initializing Pelion Device Management Client...\n");
screamer 0:a9d53048f0b6 271
screamer 0:a9d53048f0b6 272 // SimpleMbedCloudClient handles registering over LwM2M to Pelion Device Management
screamer 0:a9d53048f0b6 273 SimpleMbedCloudClient client(net, bd, &fs);
screamer 0:a9d53048f0b6 274 int client_status = client.init();
screamer 0:a9d53048f0b6 275 if (client_status != 0) {
screamer 0:a9d53048f0b6 276 printf("Pelion Client initialization failed (%d)\n", client_status);
screamer 0:a9d53048f0b6 277 return -1;
screamer 0:a9d53048f0b6 278 }
screamer 0:a9d53048f0b6 279
screamer 0:a9d53048f0b6 280 // Creating resources, which can be written or read from the cloud
screamer 2:fba2c7066355 281 res_button = client.create_resource("3200/0/5501", "button_count");
screamer 2:fba2c7066355 282 res_button->set_value(0);
screamer 2:fba2c7066355 283 res_button->methods(M2MMethod::GET);
screamer 2:fba2c7066355 284 res_button->observable(true);
screamer 2:fba2c7066355 285 res_button->attach_notification_callback(button_callback);
screamer 2:fba2c7066355 286
screamer 2:fba2c7066355 287 res_led = client.create_resource("3201/0/5853", "led_state");
screamer 2:fba2c7066355 288 res_led->set_value(led.read());
screamer 2:fba2c7066355 289 res_led->methods(M2MMethod::GET | M2MMethod::PUT);
screamer 2:fba2c7066355 290 res_led->attach_put_callback(put_callback);
screamer 2:fba2c7066355 291
screamer 2:fba2c7066355 292 res_post = client.create_resource("3300/0/5605", "execute_function");
screamer 2:fba2c7066355 293 res_post->methods(M2MMethod::POST);
screamer 2:fba2c7066355 294 res_post->attach_post_callback(post_callback);
screamer 2:fba2c7066355 295
screamer 2:fba2c7066355 296 #ifdef SEND_ALL_SENSORS
screamer 2:fba2c7066355 297 res_accelerometer_x = client.create_resource("3313/0/5702", "Accelerometer X");
screamer 2:fba2c7066355 298 res_accelerometer_x->set_value(0);
screamer 2:fba2c7066355 299 res_accelerometer_x->methods(M2MMethod::GET);
screamer 2:fba2c7066355 300 res_accelerometer_x->observable(true);
screamer 2:fba2c7066355 301
screamer 2:fba2c7066355 302 res_accelerometer_y = client.create_resource("3313/0/5703", "Accelerometer Y");
screamer 2:fba2c7066355 303 res_accelerometer_y->set_value(0);
screamer 2:fba2c7066355 304 res_accelerometer_y->methods(M2MMethod::GET);
screamer 2:fba2c7066355 305 res_accelerometer_y->observable(true);
screamer 2:fba2c7066355 306
screamer 2:fba2c7066355 307 res_accelerometer_z = client.create_resource("3313/0/5704", "Accelerometer Z");
screamer 2:fba2c7066355 308 res_accelerometer_z->set_value(0);
screamer 2:fba2c7066355 309 res_accelerometer_z->methods(M2MMethod::GET);
screamer 2:fba2c7066355 310 res_accelerometer_z->observable(true);
screamer 0:a9d53048f0b6 311
screamer 2:fba2c7066355 312 res_magnometer_x = client.create_resource("3314/0/5702", "Magnometer X");
screamer 2:fba2c7066355 313 res_magnometer_x->set_value(0);
screamer 2:fba2c7066355 314 res_magnometer_x->methods(M2MMethod::GET);
screamer 2:fba2c7066355 315 res_magnometer_x->observable(true);
screamer 2:fba2c7066355 316
screamer 2:fba2c7066355 317 res_magnometer_y = client.create_resource("3314/0/5703", "Magnometer Y");
screamer 2:fba2c7066355 318 res_magnometer_y->set_value(0);
screamer 2:fba2c7066355 319 res_magnometer_y->methods(M2MMethod::GET);
screamer 2:fba2c7066355 320 res_magnometer_y->observable(true);
screamer 2:fba2c7066355 321
screamer 2:fba2c7066355 322 res_magnometer_z = client.create_resource("3314/0/5704", "Magnometer Z");
screamer 2:fba2c7066355 323 res_magnometer_z->set_value(0);
screamer 2:fba2c7066355 324 res_magnometer_z->methods(M2MMethod::GET);
screamer 2:fba2c7066355 325 res_magnometer_z->observable(true);
screamer 0:a9d53048f0b6 326
screamer 2:fba2c7066355 327 #ifdef TARGET_K66F
screamer 2:fba2c7066355 328 res_gyroscope_x = client.create_resource("3334/0/5702", "Gyroscope X");
screamer 2:fba2c7066355 329 res_gyroscope_x->set_value(0);
screamer 2:fba2c7066355 330 res_gyroscope_x->methods(M2MMethod::GET);
screamer 2:fba2c7066355 331 res_gyroscope_x->observable(true);
screamer 2:fba2c7066355 332
screamer 2:fba2c7066355 333 res_gyroscope_y = client.create_resource("3334/0/5703", "Gyroscope Y");
screamer 2:fba2c7066355 334 res_gyroscope_y->set_value(0);
screamer 2:fba2c7066355 335 res_gyroscope_y->methods(M2MMethod::GET);
screamer 2:fba2c7066355 336 res_gyroscope_y->observable(true);
screamer 2:fba2c7066355 337
screamer 2:fba2c7066355 338 res_gyroscope_z = client.create_resource("3334/0/5704", "Gyroscope Z");
screamer 2:fba2c7066355 339 res_gyroscope_z->set_value(0);
screamer 2:fba2c7066355 340 res_gyroscope_z->methods(M2MMethod::GET);
screamer 2:fba2c7066355 341 res_gyroscope_z->observable(true);
screamer 2:fba2c7066355 342 #endif /* TARGET_K66F */
screamer 2:fba2c7066355 343 #endif /* SEND_ALL_SENSORS */
screamer 0:a9d53048f0b6 344
screamer 0:a9d53048f0b6 345 printf("Initialized Pelion Device Management Client. Registering...\n");
screamer 0:a9d53048f0b6 346
screamer 0:a9d53048f0b6 347 // Callback that fires when registering is complete
screamer 0:a9d53048f0b6 348 client.on_registered(&registered);
screamer 0:a9d53048f0b6 349
screamer 0:a9d53048f0b6 350 // Register with Pelion DM
screamer 0:a9d53048f0b6 351 client.register_and_connect();
screamer 0:a9d53048f0b6 352
screamer 0:a9d53048f0b6 353 // The button fires on an interrupt context, but debounces it to the eventqueue, so it's safe to do network operations
screamer 0:a9d53048f0b6 354 button.fall(eventQueue.event(&button_press));
screamer 0:a9d53048f0b6 355 printf("Press the user button to increment the LwM2M resource value...\n");
screamer 1:42d51cf7cebe 356
screamer 0:a9d53048f0b6 357 // The timer fires on an interrupt context, but debounces it to the eventqueue, so it's safe to do network operations
screamer 0:a9d53048f0b6 358 Ticker timer;
screamer 1:42d51cf7cebe 359 timer.attach(eventQueue.event(&sensors_update), SENSORS_POLL_INTERVAL);
screamer 0:a9d53048f0b6 360
screamer 0:a9d53048f0b6 361 // You can easily run the eventQueue in a separate thread if required
screamer 0:a9d53048f0b6 362 eventQueue.dispatch_forever();
screamer 0:a9d53048f0b6 363 }
screamer 0:a9d53048f0b6 364
screamer 0:a9d53048f0b6 365 #endif /* MBED_TEST_MODE */