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:
screamer
Date:
Wed Mar 27 17:49:40 2019 +0000
Revision:
5:f2123dc31d30
Parent:
4:ec3c125c37bf
Child:
11:34e86cb4dd2f
Child:
13:ec1c3a64ee39
Improve inline documentation

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