demo project
Dependencies: AX-12A Dynamixel mbed iothub_client EthernetInterface NTPClient ConfigFile SDFileSystem iothub_amqp_transport mbed-rtos proton-c-mbed wolfSSL
Diff: IothubSerial.cpp
- Revision:
- 4:36a4eceb1b7f
- Child:
- 7:6723f6887d00
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/IothubSerial.cpp Wed Dec 23 18:34:06 2015 +0000 @@ -0,0 +1,168 @@ +#include "mbed.h" +#include "IothubSerial.h" +#include "crt_abstractions.h" + +char* nametemp = "temp"; +char* namevolt = "volt"; +char* namedeg = "rot"; + +IothubSerial::IothubSerial() +{ + _hasPending = false; +} + +// try to serialize the measurements into the buffer +// return bytes used or -1 if buffer too small or other error +// current serialization is a json array with ',' at end +// eg: temp: [22.0, 23.1, 22.3], +int IothubSerial::MeasureGroupToString(MeasureGroup& mg, char* buf, int bufsize) +{ + char* name; + int slen; + int startlen = bufsize; + + switch (mg.MeasId) + { + case NM_Temperature: + name = nametemp; + break; + + case NM_Voltage: + name = namevolt; + break; + + case NM_Degrees: + name = namedeg; + break; + + default: + return -1; + } + + if (bufsize > strlen(name) + 5) + { + slen = sprintf_s(buf, bufsize, "\"%s\": [", name); + if (slen > 0) + { + bufsize -= slen; + buf += slen; + } + else + return -1; + } + else + return -1; + + for (int i = 0; i < mg.NumVals; i++) + { + if (bufsize > 9) + { + if (i < mg.NumVals - 1) + slen = sprintf_s(buf, bufsize, "%7.2f, ", mg.MeasVals[i]); + else + slen = sprintf_s(buf, bufsize, "%7.2f ", mg.MeasVals[i]); + if (slen > 0) + { + bufsize -= slen; + buf += slen; + } + else + return -1; + } + else + return -1; + } + + if (bufsize > 2) + { + slen = sprintf_s(buf, bufsize, "],"); + if (slen > 0) + { + bufsize -= slen; + buf += slen; + } + else + return -1; + } + else + return -1; + + return startlen - bufsize; +} + +// try to serialize one or more measurements into the buffer +// return bytes used or -1 if buffer too small or other error. 0 if no data +// current serialization is a json object with entry per measure +// eg: { temp: [1, 2], volt: [12.1, 12.2] } +int IothubSerial::MeasureBufToString(char* buf, int bufsize) +{ + int slen; + bool hasdata = false; + bool copydata = false; + int startlen = bufsize; + + if (bufsize > 1) + { + slen = sprintf_s(buf, bufsize, "{"); + if (slen > 0) + { + bufsize -= slen; + buf += slen; + } + else + return -1; + } + else + return -1; + + if (_hasPending) + { + hasdata = true; + slen = MeasureGroupToString(_pending, buf, bufsize); + if (slen > 0) + { + bufsize -= slen; + buf += slen; + _hasPending = false; + copydata = true; + } + else + return -1; // no room for pending record + } + + while (!MeasureBuf.empty()) + { + if (!MeasureBuf.pop(_pending)) + { + break; + } + hasdata = true; + _hasPending = true; + slen = MeasureGroupToString(_pending, buf, bufsize); + if (slen > 0) + { + bufsize -= slen; + buf += slen; + _hasPending = false; + copydata = true; + } + else + break; // no room to serialize, leave pending for mext message + } + + if (!hasdata) + return 0; // no data + + if (!copydata) + return -1; // have data but buffer too small + + // replace final ',' with '}' + *(buf - 1) = '}'; + + return startlen - bufsize; +} + +bool IothubSerial::HasMeasureGroup() +{ + return _hasPending; +}