Updated ref

Dependencies:   FXOS8700Q-driver MODSERIAL

Fork of AAT_LWM2M_K64F by Vinay Shrivastav

Committer:
navigators
Date:
Mon Jan 23 06:21:44 2017 +0000
Revision:
56:1f3fccf0d3f4
Parent:
55:381a4d2fdebb
Child:
57:c8acc7c16cbd
Took care of Leshan float assignment ambiguity

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