Updated ref

Dependencies:   FXOS8700Q-driver MODSERIAL

Fork of AAT_LWM2M_K64F by Vinay Shrivastav

Committer:
navigators
Date:
Fri Mar 24 10:34:55 2017 +0000
Revision:
62:8dc6ee02d19b
Parent:
60:e5cf3017ef09
Lwm2m reference

Who changed what in which revision?

UserRevisionLine numberNew contents of line
remembervin 52:74019970a2bf 1 #include "simpleclient.h"
remembervin 52:74019970a2bf 2 #include "mbed-trace/mbed_trace.h"
remembervin 52:74019970a2bf 3 #include "mbedtls/entropy_poll.h"
remembervin 52:74019970a2bf 4 #include "FXOS8700Q.h"
remembervin 52:74019970a2bf 5 #include "MODSERIAL.h"
remembervin 52:74019970a2bf 6
remembervin 52:74019970a2bf 7 #define PI 3.14159265
remembervin 52:74019970a2bf 8
remembervin 52:74019970a2bf 9 //MODSERIAL gps
remembervin 52:74019970a2bf 10 MODSERIAL gps(PTD3, PTD2); // (PTC17, PTC16) UART3 not functional on etherenet enabling
remembervin 52:74019970a2bf 11 I2C i2c(PTE25, PTE24); // Configured for the FRDM-K64F with onboard sensors
remembervin 52:74019970a2bf 12 FXOS8700QAccelerometer accel(i2c,FXOS8700CQ_SLAVE_ADDR1);
remembervin 52:74019970a2bf 13 char cDataBuffer[500];
remembervin 52:74019970a2bf 14
remembervin 52:74019970a2bf 15 struct gnss_params
remembervin 52:74019970a2bf 16 {
navigators 56:1f3fccf0d3f4 17 double latitude; //Latitude
navigators 56:1f3fccf0d3f4 18 double longitude; //Longitude
navigators 56:1f3fccf0d3f4 19 double altitude; //Altitude
navigators 56:1f3fccf0d3f4 20 double baselineLen; //BaseLine Length
navigators 56:1f3fccf0d3f4 21 double heading; // Heading
remembervin 52:74019970a2bf 22 int date;
navigators 56:1f3fccf0d3f4 23 double time;
remembervin 52:74019970a2bf 24 int fix_quality; // 0 INVALID, 1 GPS, 2 DIFF
navigators 59:66ddd5bfd1b5 25 int numsat;
navigators 59:66ddd5bfd1b5 26 char mode; // RTK mode
remembervin 52:74019970a2bf 27 };
remembervin 52:74019970a2bf 28
remembervin 52:74019970a2bf 29
remembervin 52:74019970a2bf 30 #if MBED_CONF_APP_NETWORK_INTERFACE == WIFI
remembervin 52:74019970a2bf 31 #if TARGET_UBLOX_EVK_ODIN_W2
remembervin 52:74019970a2bf 32 #include "OdinWiFiInterface.h"
remembervin 52:74019970a2bf 33 OdinWiFiInterface wifi;
remembervin 52:74019970a2bf 34 #else
remembervin 52:74019970a2bf 35 #include "ESP8266Interface.h"
remembervin 52:74019970a2bf 36 ESP8266Interface wifi(MBED_CONF_APP_WIFI_TX, MBED_CONF_APP_WIFI_RX);
remembervin 52:74019970a2bf 37 #endif
remembervin 52:74019970a2bf 38 #elif MBED_CONF_APP_NETWORK_INTERFACE == ETHERNET
remembervin 52:74019970a2bf 39 #include "EthernetInterface.h"
remembervin 52:74019970a2bf 40 EthernetInterface eth;
remembervin 52:74019970a2bf 41 #elif MBED_CONF_APP_NETWORK_INTERFACE == MESH_LOWPAN_ND
remembervin 52:74019970a2bf 42 #define MESH
remembervin 52:74019970a2bf 43 #include "NanostackInterface.h"
remembervin 52:74019970a2bf 44 LoWPANNDInterface mesh;
remembervin 52:74019970a2bf 45 #elif MBED_CONF_APP_NETWORK_INTERFACE == MESH_THREAD
remembervin 52:74019970a2bf 46 #define MESH
remembervin 52:74019970a2bf 47 #include "NanostackInterface.h"
remembervin 52:74019970a2bf 48 ThreadInterface mesh;
remembervin 52:74019970a2bf 49 #endif
remembervin 52:74019970a2bf 50
remembervin 52:74019970a2bf 51 #if defined(MESH)
remembervin 52:74019970a2bf 52 #if MBED_CONF_APP_MESH_RADIO_TYPE == ATMEL
remembervin 52:74019970a2bf 53 #include "NanostackRfPhyAtmel.h"
remembervin 52:74019970a2bf 54 NanostackRfPhyAtmel rf_phy(ATMEL_SPI_MOSI, ATMEL_SPI_MISO, ATMEL_SPI_SCLK, ATMEL_SPI_CS,
remembervin 52:74019970a2bf 55 ATMEL_SPI_RST, ATMEL_SPI_SLP, ATMEL_SPI_IRQ, ATMEL_I2C_SDA, ATMEL_I2C_SCL);
remembervin 52:74019970a2bf 56 #elif MBED_CONF_APP_MESH_RADIO_TYPE == MCR20
remembervin 52:74019970a2bf 57 #include "NanostackRfPhyMcr20a.h"
remembervin 52:74019970a2bf 58 NanostackRfPhyMcr20a rf_phy(MCR20A_SPI_MOSI, MCR20A_SPI_MISO, MCR20A_SPI_SCLK, MCR20A_SPI_CS, MCR20A_SPI_RST, MCR20A_SPI_IRQ);
remembervin 52:74019970a2bf 59 #endif //MBED_CONF_APP_RADIO_TYPE
remembervin 52:74019970a2bf 60 #endif //MESH
remembervin 52:74019970a2bf 61
remembervin 52:74019970a2bf 62 #ifdef MESH
remembervin 52:74019970a2bf 63 // Mesh does not have DNS, so must use direct IPV6 address
remembervin 52:74019970a2bf 64 #define MBED_SERVER_ADDRESS "coaps://[2607:f0d0:2601:52::20]:5684"
remembervin 52:74019970a2bf 65 #else
remembervin 52:74019970a2bf 66 // This is address to mbed Device Connector, name based
remembervin 52:74019970a2bf 67 // assume all other stacks support DNS properly
remembervin 52:74019970a2bf 68 #define MBED_SERVER_ADDRESS "coap://leshan.eclipse.org:5683" //"coap://api.connector.mbed.com:5684"
remembervin 52:74019970a2bf 69 #endif
remembervin 52:74019970a2bf 70
remembervin 52:74019970a2bf 71 RawSerial output(USBTX, USBRX);
remembervin 52:74019970a2bf 72
remembervin 52:74019970a2bf 73 // Status indication
remembervin 52:74019970a2bf 74 DigitalOut red_led(LED1);
remembervin 52:74019970a2bf 75 DigitalOut green_led(LED2);
remembervin 52:74019970a2bf 76 DigitalOut blue_led(LED3);
remembervin 52:74019970a2bf 77 //Ticker status_ticker;
remembervin 52:74019970a2bf 78 void blinky() {
remembervin 52:74019970a2bf 79 red_led = !red_led;
remembervin 52:74019970a2bf 80
remembervin 52:74019970a2bf 81 }
remembervin 52:74019970a2bf 82
remembervin 52:74019970a2bf 83 // These are example resource values for the Device Object
remembervin 52:74019970a2bf 84 struct MbedClientDevice device = {
navigators 53:ff25489c63af 85 "SwarrosTechPvtLtd", // Manufacturer
navigators 53:ff25489c63af 86 "ANtennaAlignment", // Type
remembervin 52:74019970a2bf 87 "0.01", // ModelNumber
remembervin 52:74019970a2bf 88 "007" // SerialNumber
remembervin 52:74019970a2bf 89 };
remembervin 52:74019970a2bf 90
remembervin 52:74019970a2bf 91 // Instantiate the class which implements LWM2M Client API (from simpleclient.h)
remembervin 52:74019970a2bf 92 MbedClient mbed_client(device);
remembervin 52:74019970a2bf 93
remembervin 52:74019970a2bf 94
remembervin 52:74019970a2bf 95 // In case of K64F board , there is button resource available
remembervin 52:74019970a2bf 96 // to change resource value and unregister
remembervin 52:74019970a2bf 97 #ifdef TARGET_K64F
remembervin 52:74019970a2bf 98 // Set up Hardware interrupt button.
remembervin 52:74019970a2bf 99 InterruptIn obs_button(SW2);
remembervin 52:74019970a2bf 100 InterruptIn unreg_button(SW3);
remembervin 52:74019970a2bf 101 #endif
remembervin 52:74019970a2bf 102
remembervin 52:74019970a2bf 103 // set up a timer to simulate updating resource,
remembervin 52:74019970a2bf 104 // there is no functionality to unregister.
remembervin 52:74019970a2bf 105 Ticker timer;
remembervin 52:74019970a2bf 106
remembervin 52:74019970a2bf 107 /*
remembervin 52:74019970a2bf 108 * Arguments for running "blink" in it's own thread.
remembervin 52:74019970a2bf 109 */
remembervin 52:74019970a2bf 110 class BlinkArgs {
remembervin 52:74019970a2bf 111 public:
remembervin 52:74019970a2bf 112 BlinkArgs() {
remembervin 52:74019970a2bf 113 clear();
remembervin 52:74019970a2bf 114 }
remembervin 52:74019970a2bf 115 void clear() {
remembervin 52:74019970a2bf 116 position = 0;
remembervin 52:74019970a2bf 117 blink_pattern.clear();
remembervin 52:74019970a2bf 118 }
remembervin 52:74019970a2bf 119 uint16_t position;
remembervin 52:74019970a2bf 120 std::vector<uint32_t> blink_pattern;
remembervin 52:74019970a2bf 121 };
remembervin 52:74019970a2bf 122
remembervin 52:74019970a2bf 123 /*
remembervin 52:74019970a2bf 124 * The Led contains one property (pattern) and a function (blink).
remembervin 52:74019970a2bf 125 * When the function blink is executed, the pattern is read, and the LED
remembervin 52:74019970a2bf 126 * will blink based on the pattern.
remembervin 52:74019970a2bf 127 */
remembervin 52:74019970a2bf 128 class LedResource {
remembervin 52:74019970a2bf 129 public:
remembervin 52:74019970a2bf 130 LedResource() {
remembervin 52:74019970a2bf 131 // create ObjectID with metadata tag of '3201', which is 'digital output'
remembervin 52:74019970a2bf 132 led_object = M2MInterfaceFactory::create_object("3201");
remembervin 52:74019970a2bf 133 M2MObjectInstance* led_inst = led_object->create_object_instance();
remembervin 52:74019970a2bf 134
remembervin 52:74019970a2bf 135 // 5853 = Multi-state output
remembervin 52:74019970a2bf 136 M2MResource* pattern_res = led_inst->create_dynamic_resource("5853", "Pattern",
remembervin 52:74019970a2bf 137 M2MResourceInstance::STRING, false);
remembervin 52:74019970a2bf 138 // read and write
remembervin 52:74019970a2bf 139 pattern_res->set_operation(M2MBase::GET_PUT_ALLOWED);
remembervin 52:74019970a2bf 140 // set initial pattern (toggle every 200ms. 7 toggles in total)
remembervin 52:74019970a2bf 141 pattern_res->set_value((const uint8_t*)"500:500:500:500:500:500:500", 27);
remembervin 52:74019970a2bf 142
remembervin 52:74019970a2bf 143 // there's not really an execute LWM2M ID that matches... hmm...
remembervin 52:74019970a2bf 144 M2MResource* led_res = led_inst->create_dynamic_resource("5850", "Blink",
remembervin 52:74019970a2bf 145 M2MResourceInstance::OPAQUE, false);
remembervin 52:74019970a2bf 146 // we allow executing a function here...
remembervin 52:74019970a2bf 147 led_res->set_operation(M2MBase::POST_ALLOWED);
remembervin 52:74019970a2bf 148 // when a POST comes in, we want to execute the led_execute_callback
remembervin 52:74019970a2bf 149 led_res->set_execute_function(execute_callback(this, &LedResource::blink));
remembervin 52:74019970a2bf 150 // Completion of execute function can take a time, that's why delayed response is used
remembervin 52:74019970a2bf 151 led_res->set_delayed_response(true);
remembervin 52:74019970a2bf 152 blink_args = new BlinkArgs();
remembervin 52:74019970a2bf 153 }
remembervin 52:74019970a2bf 154
remembervin 52:74019970a2bf 155 ~LedResource() {
remembervin 52:74019970a2bf 156 delete blink_args;
remembervin 52:74019970a2bf 157 }
remembervin 52:74019970a2bf 158
remembervin 52:74019970a2bf 159 M2MObject* get_object() {
remembervin 52:74019970a2bf 160 return led_object;
remembervin 52:74019970a2bf 161 }
remembervin 52:74019970a2bf 162
remembervin 52:74019970a2bf 163 void blink(void *argument) {
remembervin 52:74019970a2bf 164 // read the value of 'Pattern'
remembervin 52:74019970a2bf 165 //status_ticker.detach();
remembervin 52:74019970a2bf 166 green_led = 1;
remembervin 52:74019970a2bf 167
remembervin 52:74019970a2bf 168 M2MObjectInstance* inst = led_object->object_instance();
remembervin 52:74019970a2bf 169 M2MResource* res = inst->resource("5853");
remembervin 52:74019970a2bf 170 // Clear previous blink data
remembervin 52:74019970a2bf 171 blink_args->clear();
remembervin 52:74019970a2bf 172
remembervin 52:74019970a2bf 173 // values in mbed Client are all buffers, and we need a vector of int's
remembervin 52:74019970a2bf 174 uint8_t* buffIn = NULL;
remembervin 52:74019970a2bf 175 uint32_t sizeIn;
remembervin 52:74019970a2bf 176 res->get_value(buffIn, sizeIn);
remembervin 52:74019970a2bf 177
remembervin 52:74019970a2bf 178 // turn the buffer into a string, and initialize a vector<int> on the heap
remembervin 52:74019970a2bf 179 std::string s((char*)buffIn, sizeIn);
remembervin 52:74019970a2bf 180 free(buffIn);
remembervin 52:74019970a2bf 181 output.printf("led_execute_callback pattern=%s\r\n", s.c_str());
remembervin 52:74019970a2bf 182
remembervin 52:74019970a2bf 183 // our pattern is something like 500:200:500, so parse that
remembervin 52:74019970a2bf 184 std::size_t found = s.find_first_of(":");
remembervin 52:74019970a2bf 185 while (found!=std::string::npos) {
remembervin 52:74019970a2bf 186 blink_args->blink_pattern.push_back(atoi((const char*)s.substr(0,found).c_str()));
remembervin 52:74019970a2bf 187 s = s.substr(found+1);
remembervin 52:74019970a2bf 188 found=s.find_first_of(":");
remembervin 52:74019970a2bf 189 if(found == std::string::npos) {
remembervin 52:74019970a2bf 190 blink_args->blink_pattern.push_back(atoi((const char*)s.c_str()));
remembervin 52:74019970a2bf 191 }
remembervin 52:74019970a2bf 192 }
remembervin 52:74019970a2bf 193 // check if POST contains payload
remembervin 52:74019970a2bf 194 if (argument) {
remembervin 52:74019970a2bf 195 M2MResource::M2MExecuteParameter* param = (M2MResource::M2MExecuteParameter*)argument;
remembervin 52:74019970a2bf 196 String object_name = param->get_argument_object_name();
remembervin 52:74019970a2bf 197 uint16_t object_instance_id = param->get_argument_object_instance_id();
remembervin 52:74019970a2bf 198 String resource_name = param->get_argument_resource_name();
remembervin 52:74019970a2bf 199 int payload_length = param->get_argument_value_length();
remembervin 52:74019970a2bf 200 uint8_t* payload = param->get_argument_value();
remembervin 52:74019970a2bf 201 output.printf("Resource: %s/%d/%s executed\r\n", object_name.c_str(), object_instance_id, resource_name.c_str());
remembervin 52:74019970a2bf 202 output.printf("Payload: %.*s\r\n", payload_length, payload);
remembervin 52:74019970a2bf 203 }
remembervin 52:74019970a2bf 204 // do_blink is called with the vector, and starting at -1
remembervin 52:74019970a2bf 205 blinky_thread.start(this, &LedResource::do_blink);
remembervin 52:74019970a2bf 206 }
remembervin 52:74019970a2bf 207
remembervin 52:74019970a2bf 208 private:
remembervin 52:74019970a2bf 209 M2MObject* led_object;
remembervin 52:74019970a2bf 210 Thread blinky_thread;
remembervin 52:74019970a2bf 211 BlinkArgs *blink_args;
remembervin 52:74019970a2bf 212 void do_blink() {
remembervin 52:74019970a2bf 213 for (;;) {
remembervin 52:74019970a2bf 214 // blink the LED
remembervin 52:74019970a2bf 215 green_led = !green_led;
remembervin 52:74019970a2bf 216 // up the position, if we reached the end of the vector
remembervin 52:74019970a2bf 217 if (blink_args->position >= blink_args->blink_pattern.size()) {
remembervin 52:74019970a2bf 218 // send delayed response after blink is done
remembervin 52:74019970a2bf 219 M2MObjectInstance* inst = led_object->object_instance();
remembervin 52:74019970a2bf 220 M2MResource* led_res = inst->resource("5850");
remembervin 52:74019970a2bf 221 led_res->send_delayed_post_response();
remembervin 52:74019970a2bf 222 red_led = 1;
remembervin 52:74019970a2bf 223 //status_ticker.attach_us(blinky, 250000);
remembervin 52:74019970a2bf 224 return;
remembervin 52:74019970a2bf 225 }
remembervin 52:74019970a2bf 226 // Wait requested time, then continue prosessing the blink pattern from next position.
remembervin 52:74019970a2bf 227 Thread::wait(blink_args->blink_pattern.at(blink_args->position));
remembervin 52:74019970a2bf 228 blink_args->position++;
remembervin 52:74019970a2bf 229 }
remembervin 52:74019970a2bf 230 }
remembervin 52:74019970a2bf 231 };
remembervin 52:74019970a2bf 232
remembervin 52:74019970a2bf 233 /*
remembervin 52:74019970a2bf 234 * The button contains one property (click count).
remembervin 52:74019970a2bf 235 * When `handle_button_click` is executed, the counter updates.
remembervin 52:74019970a2bf 236 */
remembervin 52:74019970a2bf 237 class ButtonResource {
remembervin 52:74019970a2bf 238 public:
remembervin 52:74019970a2bf 239 ButtonResource(): counter(0) {
remembervin 52:74019970a2bf 240 // create ObjectID with metadata tag of '3200', which is 'digital input'
remembervin 52:74019970a2bf 241 btn_object = M2MInterfaceFactory::create_object("3200");
remembervin 52:74019970a2bf 242 M2MObjectInstance* btn_inst = btn_object->create_object_instance();
remembervin 52:74019970a2bf 243 // create resource with ID '5501', which is digital input counter
remembervin 52:74019970a2bf 244 M2MResource* btn_res = btn_inst->create_dynamic_resource("5501", "Button",
remembervin 52:74019970a2bf 245 M2MResourceInstance::INTEGER, true /* observable */);
remembervin 52:74019970a2bf 246 // we can read this value
remembervin 52:74019970a2bf 247 btn_res->set_operation(M2MBase::GET_ALLOWED);
remembervin 52:74019970a2bf 248 // set initial value (all values in mbed Client are buffers)
remembervin 52:74019970a2bf 249 // to be able to read this data easily in the Connector console, we'll use a string
remembervin 52:74019970a2bf 250 btn_res->set_value((uint8_t*)"0", 1);
remembervin 52:74019970a2bf 251 }
remembervin 52:74019970a2bf 252
remembervin 52:74019970a2bf 253 ~ButtonResource() {
remembervin 52:74019970a2bf 254 }
remembervin 52:74019970a2bf 255
remembervin 52:74019970a2bf 256 M2MObject* get_object() {
remembervin 52:74019970a2bf 257 return btn_object;
remembervin 52:74019970a2bf 258 }
remembervin 52:74019970a2bf 259
remembervin 52:74019970a2bf 260 /*
remembervin 52:74019970a2bf 261 * When you press the button, we read the current value of the click counter
remembervin 52:74019970a2bf 262 * from mbed Device Connector, then up the value with one.
remembervin 52:74019970a2bf 263 */
remembervin 52:74019970a2bf 264 void handle_button_click() {
remembervin 52:74019970a2bf 265 M2MObjectInstance* inst = btn_object->object_instance();
remembervin 52:74019970a2bf 266 M2MResource* res = inst->resource("5501");
remembervin 52:74019970a2bf 267
remembervin 52:74019970a2bf 268 // up counter
remembervin 52:74019970a2bf 269 counter++;
remembervin 52:74019970a2bf 270 #ifdef TARGET_K64F
remembervin 52:74019970a2bf 271 //printf("handle_button_click, new value of counter is %d\r\n", counter);
remembervin 52:74019970a2bf 272 #endif
remembervin 52:74019970a2bf 273
remembervin 52:74019970a2bf 274 // serialize the value of counter as a string, and tell connector
remembervin 52:74019970a2bf 275 char buffer[20];
remembervin 52:74019970a2bf 276 int size = sprintf(buffer,"%d",counter);
remembervin 52:74019970a2bf 277 res->set_value((uint8_t*)buffer, size);
remembervin 52:74019970a2bf 278 }
remembervin 52:74019970a2bf 279
remembervin 52:74019970a2bf 280 private:
remembervin 52:74019970a2bf 281 M2MObject* btn_object;
remembervin 52:74019970a2bf 282 uint16_t counter;
remembervin 52:74019970a2bf 283 };
remembervin 52:74019970a2bf 284
remembervin 52:74019970a2bf 285 /*
remembervin 52:74019970a2bf 286 * The GNSS contains 1 property (Azimuth).
remembervin 52:74019970a2bf 287 * When `handle_azimuth_update` is executed, the azimuth updates.
remembervin 52:74019970a2bf 288 */
remembervin 52:74019970a2bf 289 class GnssResource {
remembervin 52:74019970a2bf 290 public:
remembervin 52:74019970a2bf 291 GnssResource(): azimuth(0) {
remembervin 52:74019970a2bf 292 // create ObjectID with metadata tag of '3336', which is 'GPS location'
remembervin 52:74019970a2bf 293 gnss_object = M2MInterfaceFactory::create_object("3336");
remembervin 52:74019970a2bf 294
remembervin 52:74019970a2bf 295 M2MObjectInstance* gnss_inst = gnss_object->create_object_instance();
remembervin 52:74019970a2bf 296 // create resource with ID '5513', which is digital input Latitude
remembervin 52:74019970a2bf 297 M2MResource* lat_res = gnss_inst->create_dynamic_resource("5513", "Latitude",
remembervin 52:74019970a2bf 298 M2MResourceInstance::FLOAT, true /* observable */);
remembervin 52:74019970a2bf 299 // we can read this value
remembervin 52:74019970a2bf 300 lat_res->set_operation(M2MBase::GET_ALLOWED);
remembervin 52:74019970a2bf 301 // set initial value (all values in mbed Client are buffers)
remembervin 52:74019970a2bf 302 // to be able to read this data easily in the Connector console, we'll use a string
remembervin 52:74019970a2bf 303 lat_res->set_value(0.0);
remembervin 52:74019970a2bf 304
remembervin 52:74019970a2bf 305 M2MResource* long_res = gnss_inst->create_dynamic_resource("5514", "Longitude",
remembervin 52:74019970a2bf 306 M2MResourceInstance::FLOAT, true /* observable */);
remembervin 52:74019970a2bf 307 // we can read this value
remembervin 52:74019970a2bf 308 long_res->set_operation(M2MBase::GET_ALLOWED);
remembervin 52:74019970a2bf 309 // set initial value (all values in mbed Client are buffers)
remembervin 52:74019970a2bf 310 // to be able to read this data easily in the Connector console, we'll use a string
remembervin 52:74019970a2bf 311 long_res->set_value(0.0);
remembervin 52:74019970a2bf 312
remembervin 52:74019970a2bf 313 M2MResource* alt_res = gnss_inst->create_dynamic_resource("5515", "Altitude",
remembervin 52:74019970a2bf 314 M2MResourceInstance::FLOAT, true /* observable */);
remembervin 52:74019970a2bf 315 // we can read this value
remembervin 52:74019970a2bf 316 alt_res->set_operation(M2MBase::GET_ALLOWED);
remembervin 52:74019970a2bf 317 // set initial value (all values in mbed Client are buffers)
remembervin 52:74019970a2bf 318 // to be able to read this data easily in the Connector console, we'll use a string
remembervin 52:74019970a2bf 319 alt_res->set_value(0.0);
remembervin 52:74019970a2bf 320
remembervin 52:74019970a2bf 321 M2MResource* azi_res = gnss_inst->create_dynamic_resource("5705", "Heading",
remembervin 52:74019970a2bf 322 M2MResourceInstance::FLOAT, true /* observable */);
remembervin 52:74019970a2bf 323 // we can read this value
remembervin 52:74019970a2bf 324 azi_res->set_operation(M2MBase::GET_ALLOWED);
remembervin 52:74019970a2bf 325 // set initial value (all values in mbed Client are buffers)
remembervin 52:74019970a2bf 326 // to be able to read this data easily in the Connector console, we'll use a string
remembervin 52:74019970a2bf 327 azi_res->set_value(0.0);
remembervin 52:74019970a2bf 328
remembervin 52:74019970a2bf 329 M2MResource* app_res = gnss_inst->create_dynamic_resource("5750", "AppType",
remembervin 52:74019970a2bf 330 M2MResourceInstance::STRING, true /* observable */);
remembervin 52:74019970a2bf 331 // we can read this value
remembervin 52:74019970a2bf 332 app_res->set_operation(M2MBase::GET_ALLOWED);
remembervin 52:74019970a2bf 333 // set initial value (all values in mbed Client are buffers)
remembervin 52:74019970a2bf 334 // to be able to read this data easily in the Connector console, we'll use a string
remembervin 52:74019970a2bf 335 size = sprintf(buffer,"%s","AntennaAlignment");
remembervin 52:74019970a2bf 336 app_res->set_value((const uint8_t*)buffer, size);
remembervin 52:74019970a2bf 337
remembervin 52:74019970a2bf 338 #if 0
remembervin 52:74019970a2bf 339 M2MResource* time_res = gnss_inst->create_dynamic_resource("5707", "Time",
remembervin 52:74019970a2bf 340 M2MResourceInstance::INTEGER, true /* observable */);
remembervin 52:74019970a2bf 341 // we can read this value
remembervin 52:74019970a2bf 342 time_res->set_operation(M2MBase::GET_ALLOWED);
remembervin 52:74019970a2bf 343 // set initial value (all values in mbed Client are buffers)
remembervin 52:74019970a2bf 344 // to be able to read this data easily in the Connector console, we'll use a string
remembervin 52:74019970a2bf 345 time_res->set_value((uint8_t*)"0", 1);
remembervin 52:74019970a2bf 346
remembervin 52:74019970a2bf 347 M2MResource* numsat_res = gnss_inst->create_dynamic_resource("5708", "NumSat",
remembervin 52:74019970a2bf 348 M2MResourceInstance::INTEGER, true /* observable */);
remembervin 52:74019970a2bf 349 // we can read this value
remembervin 52:74019970a2bf 350 numsat_res->set_operation(M2MBase::GET_ALLOWED);
remembervin 52:74019970a2bf 351 // set initial value (all values in mbed Client are buffers)
remembervin 52:74019970a2bf 352 // to be able to read this data easily in the Connector console, we'll use a string
remembervin 52:74019970a2bf 353 numsat_res->set_value((uint8_t*)"0", 1);
remembervin 52:74019970a2bf 354
remembervin 52:74019970a2bf 355 M2MResource* blen_res = gnss_inst->create_dynamic_resource("5709", "BaseLen",
remembervin 52:74019970a2bf 356 M2MResourceInstance::FLOAT, true /* observable */);
remembervin 52:74019970a2bf 357 // we can read this value
remembervin 52:74019970a2bf 358 blen_res->set_operation(M2MBase::GET_ALLOWED);
remembervin 52:74019970a2bf 359 // set initial value (all values in mbed Client are buffers)
remembervin 52:74019970a2bf 360 // to be able to read this data easily in the Connector console, we'll use a string
remembervin 52:74019970a2bf 361 blen_res->set_value(0.0);
remembervin 52:74019970a2bf 362
remembervin 52:74019970a2bf 363 M2MResource* fq_res = gnss_inst->create_dynamic_resource("5710", "FixQuality",
remembervin 52:74019970a2bf 364 M2MResourceInstance::INTEGER, true /* observable */);
remembervin 52:74019970a2bf 365 // we can read this value
remembervin 52:74019970a2bf 366 fq_res->set_operation(M2MBase::GET_ALLOWED);
remembervin 52:74019970a2bf 367 // set initial value (all values in mbed Client are buffers)
remembervin 52:74019970a2bf 368 // to be able to read this data easily in the Connector console, we'll use a string
remembervin 52:74019970a2bf 369 fq_res->set_value((uint8_t*)"0", 1);
remembervin 52:74019970a2bf 370
remembervin 52:74019970a2bf 371 M2MResource* date_res = gnss_inst->create_dynamic_resource("5706", "Date",
remembervin 52:74019970a2bf 372 M2MResourceInstance::INTEGER, true /* observable */);
remembervin 52:74019970a2bf 373 // we can read this value
remembervin 52:74019970a2bf 374 date_res->set_operation(M2MBase::GET_ALLOWED);
remembervin 52:74019970a2bf 375 // set initial value (all values in mbed Client are buffers)
remembervin 52:74019970a2bf 376 // to be able to read this data easily in the Connector console, we'll use a string
remembervin 52:74019970a2bf 377 date_res->set_value((uint8_t*)"0", 1);
remembervin 52:74019970a2bf 378 #endif
remembervin 52:74019970a2bf 379
remembervin 52:74019970a2bf 380 }
remembervin 52:74019970a2bf 381
remembervin 52:74019970a2bf 382 ~GnssResource() {
remembervin 52:74019970a2bf 383 }
remembervin 52:74019970a2bf 384
remembervin 52:74019970a2bf 385 M2MObject* get_object() {
remembervin 52:74019970a2bf 386 return gnss_object;
remembervin 52:74019970a2bf 387 }
remembervin 52:74019970a2bf 388
remembervin 52:74019970a2bf 389 /*
remembervin 52:74019970a2bf 390 * When you press the button, we read the current value of the click azimuth
remembervin 52:74019970a2bf 391 * from mbed Device Connector, then up the value with one.
remembervin 52:74019970a2bf 392 */
remembervin 52:74019970a2bf 393 void gps_scan(void)
remembervin 52:74019970a2bf 394 {
remembervin 52:74019970a2bf 395 char c;
remembervin 52:74019970a2bf 396 PSTI32 = false; GPGGA = false;
remembervin 52:74019970a2bf 397 Timer timeout;
remembervin 52:74019970a2bf 398 timeout.start();
remembervin 52:74019970a2bf 399
remembervin 52:74019970a2bf 400 while((!PSTI32 || !GPGGA) && (timeout.read() < 10))
remembervin 52:74019970a2bf 401 {
remembervin 52:74019970a2bf 402 if(gps.readable())
remembervin 52:74019970a2bf 403 {
remembervin 52:74019970a2bf 404 if(gps.getc() == '$'); // wait for a $
remembervin 52:74019970a2bf 405 {
remembervin 52:74019970a2bf 406 for(int i=0; i<sizeof(cDataBuffer); i++)
remembervin 52:74019970a2bf 407 {
remembervin 52:74019970a2bf 408 c = gps.getc();
remembervin 52:74019970a2bf 409 if( c == '\r' )
remembervin 52:74019970a2bf 410 {
remembervin 52:74019970a2bf 411 //pc.printf("%s\n", cDataBuffer);
remembervin 52:74019970a2bf 412 parse(cDataBuffer, i);
remembervin 52:74019970a2bf 413 i = sizeof(cDataBuffer);
remembervin 52:74019970a2bf 414 }
remembervin 52:74019970a2bf 415 else
remembervin 52:74019970a2bf 416 {
remembervin 52:74019970a2bf 417 cDataBuffer[i] = c;
remembervin 52:74019970a2bf 418 }
remembervin 52:74019970a2bf 419 }
remembervin 52:74019970a2bf 420 }
remembervin 52:74019970a2bf 421 }
remembervin 52:74019970a2bf 422 else break;
remembervin 52:74019970a2bf 423 }
remembervin 52:74019970a2bf 424 timeout.stop();
remembervin 52:74019970a2bf 425 }
remembervin 52:74019970a2bf 426
remembervin 52:74019970a2bf 427 void parse(char *cmd, int n)
remembervin 52:74019970a2bf 428 {
remembervin 52:74019970a2bf 429 char ns, ew, tf, status, mode;
navigators 54:5f8d9f40acb8 430 int fq, nst, fix, date, pstino; // fix quality, Number of satellites being tracked, 3D fix
navigators 54:5f8d9f40acb8 431 float latitude, longitude, speed, timefix, altitude, eastprj, northprj, upprj, blength, bcourse;
remembervin 52:74019970a2bf 432
remembervin 52:74019970a2bf 433 // Global Positioning System Fix Data
remembervin 52:74019970a2bf 434 if(strncmp(cmd,"$GPGGA", 6) == 0)
remembervin 52:74019970a2bf 435 {
navigators 58:8c8679a77b7c 436 sscanf(cmd, "$GPGGA,%f,%f,%c,%f,%c,%d,%d,%*f,%f", &timefix, &latitude, &ns, &longitude, &ew, &fq, &nst, &altitude);
navigators 58:8c8679a77b7c 437 output.printf("GPGGA Fix taken at: %f, Latitude: %f %c, Longitude: %f %c, Fix quality: %d, Number of sat: %d, Altitude: %f M\n", timefix, latitude/100, ns, longitude/100, ew, fq, nst, altitude);
navigators 58:8c8679a77b7c 438 gnss_scan.latitude = latitude/100;
navigators 58:8c8679a77b7c 439 gnss_scan.longitude = longitude/100;
remembervin 52:74019970a2bf 440 //gnss_scan.date = date;
navigators 54:5f8d9f40acb8 441 // gnss_scan.time = timefix;
remembervin 52:74019970a2bf 442 gnss_scan.altitude = altitude;
remembervin 52:74019970a2bf 443 gnss_scan.fix_quality = fq;
remembervin 52:74019970a2bf 444 gnss_scan.numsat = nst;
remembervin 52:74019970a2bf 445 GPGGA = true;
remembervin 52:74019970a2bf 446 }
remembervin 52:74019970a2bf 447
remembervin 52:74019970a2bf 448 // Baseline length, Azimuth
remembervin 52:74019970a2bf 449 if(strncmp(cmd,"$PSTI", 5) == 0)
remembervin 52:74019970a2bf 450 {
navigators 55:381a4d2fdebb 451 sscanf(cmd, "$PSTI,%d,%f,%d,%c,%c,%f,%f,%f,%f,%f", &pstino, &timefix, &date, &status, &mode, &eastprj, &northprj, &upprj, &blength, &bcourse);
remembervin 52:74019970a2bf 452 if(32 == pstino)
remembervin 52:74019970a2bf 453 {
navigators 56:1f3fccf0d3f4 454 output.printf("PSTI32 Fix taken at: %f, Date: %d, Status: %c, Mode: %c, Baseline length: %f m, Azimuth: %f degrees\n", timefix, date, status, mode, blength, bcourse);
navigators 55:381a4d2fdebb 455 gnss_scan.heading = bcourse; gnss_scan.date = date; //gnss_scan.time = timefix;
remembervin 52:74019970a2bf 456 gnss_scan.baselineLen = blength; //BaseLine Length
navigators 59:66ddd5bfd1b5 457 gnss_scan.mode = mode;
remembervin 52:74019970a2bf 458 PSTI32 = true;
remembervin 52:74019970a2bf 459 }
remembervin 52:74019970a2bf 460 }
remembervin 52:74019970a2bf 461 #if 0
remembervin 52:74019970a2bf 462 // Satellite status
remembervin 52:74019970a2bf 463 if(strncmp(cmd,"$GPGSA", 6) == 0)
remembervin 52:74019970a2bf 464 {
remembervin 52:74019970a2bf 465 sscanf(cmd, "$GPGSA,%c,%d,%d", &tf, &fix, &nst);
remembervin 52:74019970a2bf 466 pc.printf("GPGSA Type fix: %c, 3D fix: %d, number of sat: %d\r\n", tf, fix, nst);
remembervin 52:74019970a2bf 467 }
remembervin 52:74019970a2bf 468
remembervin 52:74019970a2bf 469 // Geographic position, Latitude and Longitude
remembervin 52:74019970a2bf 470 if(strncmp(cmd,"$GPGLL", 6) == 0)
remembervin 52:74019970a2bf 471 {
remembervin 52:74019970a2bf 472 sscanf(cmd, "$GPGLL,%f,%c,%f,%c,%f", &latitude, &ns, &longitude, &ew, &timefix);
remembervin 52:74019970a2bf 473 pc.printf("GPGLL Latitude: %f %c, Longitude: %f %c, Fix taken at: %f\n", latitude, ns, longitude, ew, timefix);
remembervin 52:74019970a2bf 474 }
remembervin 52:74019970a2bf 475
remembervin 52:74019970a2bf 476 // Geographic position, Latitude and Longitude
remembervin 52:74019970a2bf 477 if(strncmp(cmd,"$GPRMC", 6) == 0)
remembervin 52:74019970a2bf 478 {
remembervin 52:74019970a2bf 479 sscanf(cmd, "$GPRMC,%f,%c,%f,%c,%f,%c,%f,,%d", &timefix, &status, &latitude, &ns, &longitude, &ew, &speed, &date);
remembervin 52:74019970a2bf 480 pc.printf("GPRMC Fix taken at: %f, Status: %c, Latitude: %f %c, Longitude: %f %c, Speed: %f, Date: %d\n", timefix, status, latitude, ns, longitude, ew, speed, date);
remembervin 52:74019970a2bf 481 }
remembervin 52:74019970a2bf 482 #endif
remembervin 52:74019970a2bf 483 }
remembervin 52:74019970a2bf 484 void handle_gnss_update() {
remembervin 52:74019970a2bf 485 M2MObjectInstance* inst = gnss_object->object_instance();
remembervin 52:74019970a2bf 486 M2MResource* latituderes = inst->resource("5513");
remembervin 52:74019970a2bf 487 M2MResource* longituderes = inst->resource("5514");
remembervin 52:74019970a2bf 488 M2MResource* altres = inst->resource("5515");
remembervin 52:74019970a2bf 489 M2MResource* azimuthres = inst->resource("5705");
remembervin 52:74019970a2bf 490 M2MResource* appres = inst->resource("5750");
remembervin 52:74019970a2bf 491
remembervin 52:74019970a2bf 492 gps_scan();
remembervin 52:74019970a2bf 493
remembervin 52:74019970a2bf 494 size = sprintf(buffer,"%f",gnss_scan.latitude);
remembervin 52:74019970a2bf 495 latituderes->set_value((const uint8_t*)buffer, size);
remembervin 52:74019970a2bf 496
remembervin 52:74019970a2bf 497 size = sprintf(buffer,"%f",gnss_scan.longitude);
remembervin 52:74019970a2bf 498 longituderes->set_value((const uint8_t*)buffer, size);
remembervin 52:74019970a2bf 499
remembervin 52:74019970a2bf 500 size = sprintf(buffer,"%f",gnss_scan.altitude);
remembervin 52:74019970a2bf 501 altres->set_value((const uint8_t*)buffer, size);
remembervin 52:74019970a2bf 502
remembervin 52:74019970a2bf 503 size = sprintf(buffer,"%f",gnss_scan.heading);
remembervin 52:74019970a2bf 504 azimuthres->set_value((const uint8_t*)buffer, size);
remembervin 52:74019970a2bf 505
navigators 59:66ddd5bfd1b5 506 if(gnss_scan.mode == 'F')
navigators 59:66ddd5bfd1b5 507 {
navigators 60:e5cf3017ef09 508 size = sprintf(buffer,"%s","AntennaAlignmentFlt");
navigators 59:66ddd5bfd1b5 509 appres->set_value((const uint8_t*)buffer, size);
navigators 59:66ddd5bfd1b5 510 }
navigators 59:66ddd5bfd1b5 511 else if(gnss_scan.mode == 'R')
navigators 59:66ddd5bfd1b5 512 {
navigators 60:e5cf3017ef09 513 size = sprintf(buffer,"%s","AntennaAlignmentFix");
navigators 59:66ddd5bfd1b5 514 appres->set_value((const uint8_t*)buffer, size);
navigators 59:66ddd5bfd1b5 515 }
navigators 59:66ddd5bfd1b5 516 else
navigators 59:66ddd5bfd1b5 517 {
navigators 59:66ddd5bfd1b5 518 size = sprintf(buffer,"%s","AntennaAlignment");
navigators 59:66ddd5bfd1b5 519 appres->set_value((const uint8_t*)buffer, size);
navigators 59:66ddd5bfd1b5 520 }
remembervin 52:74019970a2bf 521
remembervin 52:74019970a2bf 522 #if 0
remembervin 52:74019970a2bf 523
remembervin 52:74019970a2bf 524 M2MResource* dateres = inst->resource("5706");
remembervin 52:74019970a2bf 525 M2MResource* timeres = inst->resource("5707");
remembervin 52:74019970a2bf 526 M2MResource* numsatres = inst->resource("5708");
remembervin 52:74019970a2bf 527 M2MResource* blenres = inst->resource("5709");
remembervin 52:74019970a2bf 528 M2MResource* fqres = inst->resource("5710");
remembervin 52:74019970a2bf 529
remembervin 52:74019970a2bf 530 size = sprintf(buffer,"%d",gnss_scan.date);
remembervin 52:74019970a2bf 531 dateres->set_value((const uint8_t*)buffer, size);
remembervin 52:74019970a2bf 532
remembervin 52:74019970a2bf 533 size = sprintf(buffer,"%d",gnss_scan.time);
remembervin 52:74019970a2bf 534 timeres->set_value((const uint8_t*)buffer, size);
remembervin 52:74019970a2bf 535
remembervin 52:74019970a2bf 536 size = sprintf(buffer,"%d",gnss_scan.numsat);
remembervin 52:74019970a2bf 537 numsatres->set_value((const uint8_t*)buffer, size);
remembervin 52:74019970a2bf 538
remembervin 52:74019970a2bf 539 size = sprintf(buffer,"%f",gnss_scan.baselineLen);
remembervin 52:74019970a2bf 540 blenres->set_value((const uint8_t*)buffer, size);
remembervin 52:74019970a2bf 541
remembervin 52:74019970a2bf 542 size = sprintf(buffer,"%d",gnss_scan.fix_quality);
remembervin 52:74019970a2bf 543 fqres->set_value((const uint8_t*)buffer, size);
remembervin 52:74019970a2bf 544 #endif
remembervin 52:74019970a2bf 545
remembervin 52:74019970a2bf 546 output.printf("GNSS data updated\n");
remembervin 52:74019970a2bf 547 }
remembervin 52:74019970a2bf 548
remembervin 52:74019970a2bf 549 private:
remembervin 52:74019970a2bf 550 M2MObject* gnss_object;
remembervin 52:74019970a2bf 551 uint16_t azimuth;
remembervin 52:74019970a2bf 552 bool PSTI32;
remembervin 52:74019970a2bf 553 bool GPGGA;
remembervin 52:74019970a2bf 554 gnss_params gnss_scan;
remembervin 52:74019970a2bf 555 char buffer[20];
remembervin 52:74019970a2bf 556 int size;
remembervin 52:74019970a2bf 557 };
remembervin 52:74019970a2bf 558
remembervin 52:74019970a2bf 559
remembervin 52:74019970a2bf 560 class AccelResource {
remembervin 52:74019970a2bf 561 public:
remembervin 52:74019970a2bf 562 AccelResource(){
remembervin 52:74019970a2bf 563
remembervin 52:74019970a2bf 564 // create ObjectID with metadata tag of '3313', which is 'IPSO Accelerometer'
remembervin 52:74019970a2bf 565 accel_object = M2MInterfaceFactory::create_object("3313");
remembervin 52:74019970a2bf 566 M2MObjectInstance* accel_inst = accel_object->create_object_instance();
remembervin 52:74019970a2bf 567
remembervin 52:74019970a2bf 568 // create resource with ID '5701', which is accelerometer units
remembervin 52:74019970a2bf 569 M2MResource* units_res = accel_inst->create_dynamic_resource("5701", "Units",
remembervin 52:74019970a2bf 570 M2MResourceInstance::STRING, false /* non-observable */);
remembervin 52:74019970a2bf 571 // we can read this value
remembervin 52:74019970a2bf 572 units_res->set_operation(M2MBase::GET_ALLOWED);
remembervin 52:74019970a2bf 573 // set initial value (all values in mbed Client are buffers)
remembervin 52:74019970a2bf 574 // to be able to read this data easily in the Connector console, we'll use a string
remembervin 52:74019970a2bf 575 size = sprintf(buffer,"%s","degrees");
remembervin 52:74019970a2bf 576 units_res->set_value((const uint8_t*)buffer, size);
remembervin 52:74019970a2bf 577
remembervin 52:74019970a2bf 578
remembervin 52:74019970a2bf 579 // create resource with ID '5702', which is accelerometer X value
remembervin 52:74019970a2bf 580 M2MResource* x_res = accel_inst->create_dynamic_resource("5702", "Tilt",
remembervin 52:74019970a2bf 581 M2MResourceInstance::FLOAT, true /* observable */);
remembervin 52:74019970a2bf 582 // we can read this value
remembervin 52:74019970a2bf 583 x_res->set_operation(M2MBase::GET_ALLOWED);
remembervin 52:74019970a2bf 584 // set initial value (all values in mbed Client are buffers)
remembervin 52:74019970a2bf 585 // to be able to read this data easily in the Connector console, we'll use a string
remembervin 52:74019970a2bf 586 size = sprintf(buffer,"%f",0.0);
remembervin 52:74019970a2bf 587 x_res->set_value((const uint8_t*)buffer, size);
remembervin 52:74019970a2bf 588
remembervin 52:74019970a2bf 589 // create resource with ID '5703', which is accelerometer Y value
remembervin 52:74019970a2bf 590 M2MResource* y_res = accel_inst->create_dynamic_resource("5703", "Roll",
remembervin 52:74019970a2bf 591 M2MResourceInstance::FLOAT, true /* observable */);
remembervin 52:74019970a2bf 592 // we can read this value
remembervin 52:74019970a2bf 593 y_res->set_operation(M2MBase::GET_ALLOWED);
remembervin 52:74019970a2bf 594 // set initial value (all values in mbed Client are buffers)
remembervin 52:74019970a2bf 595 // to be able to read this data easily in the Connector console, we'll use a string
remembervin 52:74019970a2bf 596 size = sprintf(buffer,"%f",0.0);
remembervin 52:74019970a2bf 597 y_res->set_value((const uint8_t*)buffer, size);
remembervin 52:74019970a2bf 598
remembervin 52:74019970a2bf 599 }
remembervin 52:74019970a2bf 600
remembervin 52:74019970a2bf 601 ~AccelResource() {
remembervin 52:74019970a2bf 602 }
remembervin 52:74019970a2bf 603
remembervin 52:74019970a2bf 604 M2MObject* get_object() {
remembervin 52:74019970a2bf 605 return accel_object;
remembervin 52:74019970a2bf 606 }
remembervin 52:74019970a2bf 607
remembervin 52:74019970a2bf 608 /*
remembervin 52:74019970a2bf 609 * Timer based update triggers planned
remembervin 52:74019970a2bf 610 */
remembervin 52:74019970a2bf 611
remembervin 52:74019970a2bf 612 void handle_accel_update()
remembervin 52:74019970a2bf 613 {
remembervin 52:74019970a2bf 614 double angleX, denomX_T, denomX_A, denomX_B, denomX_C; //intializing variable to hold the angle calculation
remembervin 52:74019970a2bf 615 double angleY, denomY_T, denomY_A, denomY_B, denomY_C;
remembervin 52:74019970a2bf 616 float faX, faY, faZ;
remembervin 52:74019970a2bf 617
remembervin 52:74019970a2bf 618 M2MObjectInstance* inst = accel_object->object_instance();
remembervin 52:74019970a2bf 619 M2MResource* xres = inst->resource("5702");
remembervin 52:74019970a2bf 620 M2MResource* yres = inst->resource("5703");
remembervin 52:74019970a2bf 621
remembervin 52:74019970a2bf 622 // Read accelerometer data
remembervin 52:74019970a2bf 623 //accel.getAxis(acc_data);
remembervin 52:74019970a2bf 624 accel.getX(faX);
remembervin 52:74019970a2bf 625 accel.getY(faY);
remembervin 52:74019970a2bf 626 accel.getZ(faZ);
remembervin 52:74019970a2bf 627
remembervin 52:74019970a2bf 628 // Canculate angles in degrees
remembervin 52:74019970a2bf 629 //X-AXIS
remembervin 52:74019970a2bf 630 denomX_A = pow(faY, 2);
remembervin 52:74019970a2bf 631 denomX_B = pow(faZ, 2);
remembervin 52:74019970a2bf 632 denomX_C = denomX_A + denomX_B;
remembervin 52:74019970a2bf 633 denomX_T = pow(denomX_C, .5); //pow returns base raised to the power exponent
remembervin 52:74019970a2bf 634
remembervin 52:74019970a2bf 635 angleX = atan(faX/denomX_T) * 180/PI; //should calculate the angle on the X axis in degrees based on raw data
remembervin 52:74019970a2bf 636
remembervin 52:74019970a2bf 637 //Y-AXIS
remembervin 52:74019970a2bf 638 denomY_A = pow(faX, 2);
remembervin 52:74019970a2bf 639 denomY_B = pow(faZ, 2);
remembervin 52:74019970a2bf 640 denomY_C = denomY_A + denomY_B;
remembervin 52:74019970a2bf 641 denomY_T = pow(denomY_C, .5); //pow returns base raised to the power exponent
remembervin 52:74019970a2bf 642
remembervin 52:74019970a2bf 643 angleY = atan(faY/denomY_T) * 180/PI; //should calculate the angle on the Y axis in degrees based on raw data
remembervin 52:74019970a2bf 644
remembervin 52:74019970a2bf 645 // serialize the value of x & y accel ops as a string, and tell connector
remembervin 52:74019970a2bf 646 size = sprintf(buffer,"%f",angleX);
remembervin 52:74019970a2bf 647 xres->set_value((const uint8_t*)buffer, size);
remembervin 52:74019970a2bf 648
remembervin 52:74019970a2bf 649 size = sprintf(buffer,"%f",angleY);
remembervin 52:74019970a2bf 650 yres->set_value((const uint8_t*)buffer, size);
remembervin 52:74019970a2bf 651 printf("Accelerometer update, x:%f degrees, y:%f degrees\r\n", angleX, angleY );
remembervin 52:74019970a2bf 652
remembervin 52:74019970a2bf 653 }
remembervin 52:74019970a2bf 654
remembervin 52:74019970a2bf 655 private:
remembervin 52:74019970a2bf 656 M2MObject* accel_object;
remembervin 52:74019970a2bf 657 //motion_data_units_t acc_data;
remembervin 52:74019970a2bf 658 char buffer[20];
remembervin 52:74019970a2bf 659 int size;
remembervin 52:74019970a2bf 660 };
remembervin 52:74019970a2bf 661
remembervin 52:74019970a2bf 662 class BigPayloadResource {
remembervin 52:74019970a2bf 663 public:
remembervin 52:74019970a2bf 664 BigPayloadResource() {
remembervin 52:74019970a2bf 665 big_payload = M2MInterfaceFactory::create_object("1000");
remembervin 52:74019970a2bf 666 M2MObjectInstance* payload_inst = big_payload->create_object_instance();
remembervin 52:74019970a2bf 667 M2MResource* payload_res = payload_inst->create_dynamic_resource("1", "BigData",
remembervin 52:74019970a2bf 668 M2MResourceInstance::STRING, true /* observable */);
remembervin 52:74019970a2bf 669 payload_res->set_operation(M2MBase::GET_PUT_ALLOWED);
remembervin 52:74019970a2bf 670 payload_res->set_value((uint8_t*)"0", 1);
remembervin 52:74019970a2bf 671 payload_res->set_incoming_block_message_callback(
remembervin 52:74019970a2bf 672 incoming_block_message_callback(this, &BigPayloadResource::block_message_received));
remembervin 52:74019970a2bf 673 payload_res->set_outgoing_block_message_callback(
remembervin 52:74019970a2bf 674 outgoing_block_message_callback(this, &BigPayloadResource::block_message_requested));
remembervin 52:74019970a2bf 675 }
remembervin 52:74019970a2bf 676
remembervin 52:74019970a2bf 677 M2MObject* get_object() {
remembervin 52:74019970a2bf 678 return big_payload;
remembervin 52:74019970a2bf 679 }
remembervin 52:74019970a2bf 680
remembervin 52:74019970a2bf 681 void block_message_received(M2MBlockMessage *argument) {
remembervin 52:74019970a2bf 682 if (argument) {
remembervin 52:74019970a2bf 683 if (M2MBlockMessage::ErrorNone == argument->error_code()) {
remembervin 52:74019970a2bf 684 if (argument->is_last_block()) {
remembervin 52:74019970a2bf 685 output.printf("Last block received\r\n");
remembervin 52:74019970a2bf 686 }
remembervin 52:74019970a2bf 687 output.printf("Block number: %d\r\n", argument->block_number());
remembervin 52:74019970a2bf 688 // First block received
remembervin 52:74019970a2bf 689 if (argument->block_number() == 0) {
remembervin 52:74019970a2bf 690 // Store block
remembervin 52:74019970a2bf 691 // More blocks coming
remembervin 52:74019970a2bf 692 } else {
remembervin 52:74019970a2bf 693 // Store blocks
remembervin 52:74019970a2bf 694 }
remembervin 52:74019970a2bf 695 } else {
remembervin 52:74019970a2bf 696 output.printf("Error when receiving block message! - EntityTooLarge\r\n");
remembervin 52:74019970a2bf 697 }
remembervin 52:74019970a2bf 698 output.printf("Total message size: %d\r\n", argument->total_message_size());
remembervin 52:74019970a2bf 699 }
remembervin 52:74019970a2bf 700 }
remembervin 52:74019970a2bf 701
remembervin 52:74019970a2bf 702 void block_message_requested(const String& resource, uint8_t *&/*data*/, uint32_t &/*len*/) {
remembervin 52:74019970a2bf 703 output.printf("GET request received for resource: %s\r\n", resource.c_str());
remembervin 52:74019970a2bf 704 // Copy data and length to coap response
remembervin 52:74019970a2bf 705 }
remembervin 52:74019970a2bf 706
remembervin 52:74019970a2bf 707 private:
remembervin 52:74019970a2bf 708 M2MObject* big_payload;
remembervin 52:74019970a2bf 709 };