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:
Mon Apr 13 14:24:58 2015 +0000
Revision:
93:0acd11870c6a
Parent:
92:48069375dffa
Child:
94:61d44636f020
v2.1rc1

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 93:0acd11870c6a 13 AccelerationMeasurement::AccelerationMeasurement(AbstractSmartRest& client, SmartRestTemplate& tpl,
xinlei 93:0acd11870c6a 14 long& deviceId, DeviceInfo& deviceInfo, LCDDisplay& lcdDisplay) :
xinlei 92:48069375dffa 15 _deviceId(deviceId),
Cumulocity 41:804f6a0bda26 16 _tpl(tpl),
xinlei 92:48069375dffa 17 _client(client),
xinlei 91:423177e8a401 18 _sensor(SDA,SCL),
xinlei 73:313975bfec96 19 _deviceInfo(deviceInfo),
xinlei 93:0acd11870c6a 20 _lcdDisplay(lcdDisplay)
Cumulocity 41:804f6a0bda26 21 {
Cumulocity 41:804f6a0bda26 22 _init = false;
xinlei 71:063c45e99578 23 oldValues[0] = 0;
xinlei 71:063c45e99578 24 oldValues[1] = 0;
xinlei 71:063c45e99578 25 oldValues[2] = 0;
xinlei 71:063c45e99578 26 sendingTimer.start();
Cumulocity 41:804f6a0bda26 27 }
Cumulocity 41:804f6a0bda26 28
Cumulocity 41:804f6a0bda26 29 bool AccelerationMeasurement::init()
Cumulocity 41:804f6a0bda26 30 {
Cumulocity 41:804f6a0bda26 31 if (_init)
Cumulocity 41:804f6a0bda26 32 return false;
Cumulocity 41:804f6a0bda26 33
Cumulocity 41:804f6a0bda26 34 // Insert measurement
Cumulocity 47:89ae46d5c466 35 // USAGE: 106,<DEVICE/ID>,<X>,<Y>,<Z>
xinlei 73:313975bfec96 36 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 37 return false;
Cumulocity 41:804f6a0bda26 38
Cumulocity 41:804f6a0bda26 39 _test = _sensor.testConnection();
Cumulocity 41:804f6a0bda26 40 _init = true;
Cumulocity 41:804f6a0bda26 41 return true;
Cumulocity 41:804f6a0bda26 42 }
Cumulocity 41:804f6a0bda26 43
Cumulocity 41:804f6a0bda26 44 bool AccelerationMeasurement::run()
Cumulocity 41:804f6a0bda26 45 {
Cumulocity 41:804f6a0bda26 46 if (!_test)
Cumulocity 41:804f6a0bda26 47 return false;
xinlei 77:f6717e4eccc4 48
xinlei 71:063c45e99578 49 float data[3] = { 0.0, 0.0, 0.0 };
xinlei 77:f6717e4eccc4 50 _sensor.readData(data);
xinlei 77:f6717e4eccc4 51
xinlei 82:ca7430f50b2b 52 // if (abs(oldValues[0]-data[0]) <= abs(oldValues[0])*THRESHOLD_PERCENT_ACCE &&
xinlei 82:ca7430f50b2b 53 // abs(oldValues[1]-data[1]) <= abs(oldValues[1])*THRESHOLD_PERCENT_ACCE &&
xinlei 82:ca7430f50b2b 54 // abs(oldValues[2]-data[2]) <= abs(oldValues[2])*THRESHOLD_PERCENT_ACCE) {
xinlei 87:a01faf58e938 55 if (((0.15>abs(data[0])) || (abs(oldValues[0]-data[0]) <= abs(oldValues[0])*THRESHOLD_PERCENT_ACCE)) &&
xinlei 87:a01faf58e938 56 ((0.1> abs(data[1])) || (abs(oldValues[1]-data[1]) <= abs(oldValues[1])*THRESHOLD_PERCENT_ACCE))) {
xinlei 71:063c45e99578 57 if (sendingTimer.read() < TIME_LIMIT_ACCE) {
xinlei 87:a01faf58e938 58 // printf("[N] Acc %f, %f, %f\r\n", data[0], data[1], data[2]);
xinlei 93:0acd11870c6a 59 if (strcmp(_lcdDisplay.getThirdLine(), "")) {
xinlei 93:0acd11870c6a 60 _lcdDisplay.setThirdLine("");
xinlei 85:5dc5a50e4b06 61 }
xinlei 71:063c45e99578 62 return true;
xinlei 71:063c45e99578 63 } else {
xinlei 93:0acd11870c6a 64 aDebug("Acc: Timeout at %f s.\n", sendingTimer.read());
xinlei 71:063c45e99578 65 }
xinlei 71:063c45e99578 66 }
xinlei 87:a01faf58e938 67 // printf("[Y] Acc %f, %f, %f\r\n", data[0], data[1], data[2]);
xinlei 73:313975bfec96 68 char status[27] = {0};
xinlei 93:0acd11870c6a 69 snprintf(status, 27, "Send Acc %.1f,%.1f,%.1f", data[0], data[1], data[2]);
xinlei 93:0acd11870c6a 70 _lcdDisplay.setThirdLine(status);
xinlei 77:f6717e4eccc4 71
Cumulocity 41:804f6a0bda26 72 ComposedRecord record;
Cumulocity 41:804f6a0bda26 73 IntegerValue msgId(106);
Cumulocity 41:804f6a0bda26 74 IntegerValue devId(_deviceId);
Cumulocity 41:804f6a0bda26 75 FloatValue xValue(data[0], 2);
Cumulocity 41:804f6a0bda26 76 FloatValue yValue(data[1], 2);
Cumulocity 41:804f6a0bda26 77 FloatValue zValue(data[2], 2);
Cumulocity 41:804f6a0bda26 78 if ((!record.add(msgId)) || (!record.add(devId)) || (!record.add(xValue)) || (!record.add(yValue)) || (!record.add(zValue)))
Cumulocity 41:804f6a0bda26 79 return false;
Cumulocity 41:804f6a0bda26 80
xinlei 73:313975bfec96 81 float t_start = sendingTimer.read();
Cumulocity 41:804f6a0bda26 82 if (_client.send(record) != SMARTREST_SUCCESS) {
xinlei 93:0acd11870c6a 83 aWarning("Acc: Send failed.\n");
Cumulocity 41:804f6a0bda26 84 _client.stop();
Cumulocity 41:804f6a0bda26 85 return false;
Cumulocity 41:804f6a0bda26 86 }
xinlei 73:313975bfec96 87 float t_end = sendingTimer.read();
Cumulocity 41:804f6a0bda26 88 _client.stop();
xinlei 93:0acd11870c6a 89 aDebug("Acc: Sent in %.1f.\n", t_end-t_start);
xinlei 71:063c45e99578 90 oldValues[0] = data[0];
xinlei 71:063c45e99578 91 oldValues[1] = data[1];
xinlei 71:063c45e99578 92 oldValues[2] = data[2];
xinlei 71:063c45e99578 93 sendingTimer.reset();
Cumulocity 41:804f6a0bda26 94 return true;
Cumulocity 41:804f6a0bda26 95 }