Official reference client implementation for Cumulocity SmartREST on u-blox C027.

Dependencies:   C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed

Fork of MbedSmartRestMain by Vincent Wochnik

Committer:
xinlei
Date:
Fri Mar 20 13:55:21 2015 +0000
Revision:
91:423177e8a401
Parent:
87:a01faf58e938
Child:
92:48069375dffa
Code refactoring to ease coupling

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Cumulocity 41:804f6a0bda26 1 #include "AccelerationMeasurement.h"
Cumulocity 41:804f6a0bda26 2 #include "ComposedRecord.h"
Cumulocity 41:804f6a0bda26 3 #include "CharValue.h"
Cumulocity 41:804f6a0bda26 4 #include "IntegerValue.h"
Cumulocity 41:804f6a0bda26 5 #include "FloatValue.h"
xinlei 71:063c45e99578 6 #include "MbedClient.h"
xinlei 72:c5709ae7b193 7 #include "logging.h"
xinlei 71:063c45e99578 8
xinlei 87:a01faf58e938 9 #define THRESHOLD_PERCENT_ACCE 0.1 // Percentage cut-off for avoiding sending similar acceleration sensor data.
xinlei 73:313975bfec96 10 // Time interval for forcing a sending even if acceleration sensor readings are constantly similar (in seconds).
xinlei 73:313975bfec96 11 #define TIME_LIMIT_ACCE 900
Cumulocity 41:804f6a0bda26 12
xinlei 73:313975bfec96 13 AccelerationMeasurement::AccelerationMeasurement(AbstractSmartRest& client, SmartRestTemplate& tpl, long& deviceId,
xinlei 91:423177e8a401 14 DeviceIO& io, DeviceInfo& deviceInfo, DisplayInfo& displayInfo) :
Cumulocity 41:804f6a0bda26 15 _client(client),
Cumulocity 41:804f6a0bda26 16 _tpl(tpl),
Cumulocity 41:804f6a0bda26 17 _deviceId(deviceId),
xinlei 91:423177e8a401 18 _sensor(SDA,SCL),
xinlei 73:313975bfec96 19 _io(io),
xinlei 73:313975bfec96 20 _deviceInfo(deviceInfo),
xinlei 82:ca7430f50b2b 21 _displayInfo(displayInfo)
Cumulocity 41:804f6a0bda26 22 {
Cumulocity 41:804f6a0bda26 23 _init = false;
xinlei 71:063c45e99578 24 oldValues[0] = 0;
xinlei 71:063c45e99578 25 oldValues[1] = 0;
xinlei 71:063c45e99578 26 oldValues[2] = 0;
xinlei 71:063c45e99578 27 sendingTimer.start();
Cumulocity 41:804f6a0bda26 28 }
Cumulocity 41:804f6a0bda26 29
Cumulocity 41:804f6a0bda26 30 bool AccelerationMeasurement::init()
Cumulocity 41:804f6a0bda26 31 {
Cumulocity 41:804f6a0bda26 32 if (_init)
Cumulocity 41:804f6a0bda26 33 return false;
Cumulocity 41:804f6a0bda26 34
Cumulocity 41:804f6a0bda26 35 // Insert measurement
Cumulocity 47:89ae46d5c466 36 // USAGE: 106,<DEVICE/ID>,<X>,<Y>,<Z>
xinlei 73:313975bfec96 37 if (!_tpl.add("10,106,POST,/measurement/measurements,application/vnd.com.nsn.cumulocity.measurement+json,application/vnd.com.nsn.cumulocity.measurement+json,%%,NOW UNSIGNED NUMBER NUMBER NUMBER,\"{\"\"time\"\":\"\"%%\"\",\"\"source\"\":{\"\"id\"\":\"\"%%\"\"},\"\"type\"\":\"\"c8y_MotionMeasurement\"\",\"\"c8y_MotionMeasurement\"\":{\"\"x\"\":{\"\"value\"\":%%,\"\"unit\"\":\"\"m/s^2\"\"},\"\"y\"\":{\"\"value\"\":%%,\"\"unit\"\":\"\"m/s^2\"\"},\"\"z\"\":{\"\"value\"\":%%,\"\"unit\"\":\"\"m/s^2\"\"}}}\"\r\n"))
Cumulocity 41:804f6a0bda26 38 return false;
Cumulocity 41:804f6a0bda26 39
Cumulocity 41:804f6a0bda26 40 _test = _sensor.testConnection();
Cumulocity 41:804f6a0bda26 41 _init = true;
Cumulocity 41:804f6a0bda26 42 return true;
Cumulocity 41:804f6a0bda26 43 }
Cumulocity 41:804f6a0bda26 44
Cumulocity 41:804f6a0bda26 45 bool AccelerationMeasurement::run()
Cumulocity 41:804f6a0bda26 46 {
xinlei 85:5dc5a50e4b06 47 extern bool lastSensorReadingSent;
Cumulocity 41:804f6a0bda26 48 if (!_test)
Cumulocity 41:804f6a0bda26 49 return false;
xinlei 77:f6717e4eccc4 50
xinlei 71:063c45e99578 51 float data[3] = { 0.0, 0.0, 0.0 };
xinlei 77:f6717e4eccc4 52 _sensor.readData(data);
xinlei 77:f6717e4eccc4 53
xinlei 82:ca7430f50b2b 54 // if (abs(oldValues[0]-data[0]) <= abs(oldValues[0])*THRESHOLD_PERCENT_ACCE &&
xinlei 82:ca7430f50b2b 55 // abs(oldValues[1]-data[1]) <= abs(oldValues[1])*THRESHOLD_PERCENT_ACCE &&
xinlei 82:ca7430f50b2b 56 // abs(oldValues[2]-data[2]) <= abs(oldValues[2])*THRESHOLD_PERCENT_ACCE) {
xinlei 87:a01faf58e938 57 if (((0.15>abs(data[0])) || (abs(oldValues[0]-data[0]) <= abs(oldValues[0])*THRESHOLD_PERCENT_ACCE)) &&
xinlei 87:a01faf58e938 58 ((0.1> abs(data[1])) || (abs(oldValues[1]-data[1]) <= abs(oldValues[1])*THRESHOLD_PERCENT_ACCE))) {
xinlei 71:063c45e99578 59 if (sendingTimer.read() < TIME_LIMIT_ACCE) {
xinlei 87:a01faf58e938 60 // printf("[N] Acc %f, %f, %f\r\n", data[0], data[1], data[2]);
xinlei 85:5dc5a50e4b06 61 if (lastSensorReadingSent) {
xinlei 85:5dc5a50e4b06 62 _io.lcdPrint(_displayInfo.getFirstLine(), _displayInfo.getSecondLine());
xinlei 85:5dc5a50e4b06 63 lastSensorReadingSent=false;
xinlei 85:5dc5a50e4b06 64 }
xinlei 73:313975bfec96 65 aDebug("Similar acceleration readings found, no sending!\r\n");
xinlei 71:063c45e99578 66 return true;
xinlei 71:063c45e99578 67 } else {
xinlei 77:f6717e4eccc4 68 aDebug("Acceleration sensor timed out at %f s, a sending is forced.\r\n", sendingTimer.read());
xinlei 71:063c45e99578 69 }
xinlei 71:063c45e99578 70 }
xinlei 87:a01faf58e938 71 // printf("[Y] Acc %f, %f, %f\r\n", data[0], data[1], data[2]);
xinlei 73:313975bfec96 72 char status[27] = {0};
xinlei 73:313975bfec96 73 snprintf(status, 27, "Sending Acc %.1f,%.1f,%.1f", data[0], data[1], data[2]);
xinlei 84:3c8ceb12b773 74 _io.lcdPrint(_displayInfo.getFirstLine(), _displayInfo.getSecondLine(), status);
xinlei 77:f6717e4eccc4 75
Cumulocity 41:804f6a0bda26 76 ComposedRecord record;
Cumulocity 41:804f6a0bda26 77 IntegerValue msgId(106);
Cumulocity 41:804f6a0bda26 78 IntegerValue devId(_deviceId);
Cumulocity 41:804f6a0bda26 79 FloatValue xValue(data[0], 2);
Cumulocity 41:804f6a0bda26 80 FloatValue yValue(data[1], 2);
Cumulocity 41:804f6a0bda26 81 FloatValue zValue(data[2], 2);
Cumulocity 41:804f6a0bda26 82 if ((!record.add(msgId)) || (!record.add(devId)) || (!record.add(xValue)) || (!record.add(yValue)) || (!record.add(zValue)))
Cumulocity 41:804f6a0bda26 83 return false;
Cumulocity 41:804f6a0bda26 84
xinlei 73:313975bfec96 85 float t_start = sendingTimer.read();
Cumulocity 41:804f6a0bda26 86 if (_client.send(record) != SMARTREST_SUCCESS) {
xinlei 76:b07effe83fb8 87 aWarning("Sending acceleration readings failed.");
Cumulocity 41:804f6a0bda26 88 _client.stop();
Cumulocity 41:804f6a0bda26 89 return false;
Cumulocity 41:804f6a0bda26 90 }
xinlei 73:313975bfec96 91 float t_end = sendingTimer.read();
Cumulocity 41:804f6a0bda26 92 _client.stop();
xinlei 73:313975bfec96 93 aInfo("Acceleration readings sent in %.1f.\r\n", t_end-t_start);
xinlei 71:063c45e99578 94 oldValues[0] = data[0];
xinlei 71:063c45e99578 95 oldValues[1] = data[1];
xinlei 71:063c45e99578 96 oldValues[2] = data[2];
xinlei 71:063c45e99578 97 sendingTimer.reset();
xinlei 85:5dc5a50e4b06 98 lastSensorReadingSent=true;
Cumulocity 41:804f6a0bda26 99 return true;
Cumulocity 41:804f6a0bda26 100 }