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:
Tue Mar 26 13:51:36 2019 +0000
Revision:
3:2231338197f2
Parent:
2:fba2c7066355
Child:
4:ec3c125c37bf
Report the values to Pelion (not just locally)

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