demo project

Dependencies:   AX-12A Dynamixel mbed iothub_client EthernetInterface NTPClient ConfigFile SDFileSystem iothub_amqp_transport mbed-rtos proton-c-mbed wolfSSL

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;
+}