Command processor to access I2C and SPI Takes URI coded commands and returns JSON array

Fork of SerialInterface by Greg Steiert

Revision:
2:3f6a8ac111a9
Parent:
0:828bfd94972b
Child:
3:601b78524967
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SerialInterface.cpp	Thu Dec 08 05:21:57 2016 +0000
@@ -0,0 +1,129 @@
+/* Pmod Interface Library
+ *
+ */
+
+#include "mbed.h"
+#include "SerialInterface.h"
+
+SerialInterface::SerialInterface()
+{
+}
+
+SerialInterface::~SerialInterface()
+{
+}
+
+// Initialize SerialInterface
+void SerialInterface::init(I2C* i2c, SPI* spi)
+{
+    _i2c = i2c;  // save pointer to I2C interface
+    _spi = spi;  // save pointer to SPI interface
+}
+
+/* I2C
+ * /i/[even]/[data]...       write
+ * /i/[odd]/[cnt]/[data]...  read
+ * [even] = even I2C address used for writes
+ * [odd]  = odd I2C address used for reads
+ * [data] = data to be writen, if data is included with a read, the data
+ *     will be written prior to the read to set the register address
+ * [cnt]  = number of bytes to read
+ */
+void SerialInterface::fnc_i2c(char* resp)
+{
+    int dcnt=0;
+    if (_args[IA_CNT] < 2) {
+        sprintf(resp, "[-1]");
+    } else {
+        if (_args[IA_ADD] & 1) {
+            sprintf(resp, "[");
+            resp +=1;
+            if (_args[IA_CNT] > 2) {
+                for (dcnt = 0; dcnt < (_args[IA_CNT] -2) ; dcnt++) {
+                    _dbuf[dcnt] = _args[(dcnt +3)];
+                }
+                if ((*_i2c).write(_args[IA_ADD], _dbuf, dcnt, true) != 0) {
+                    sprintf(resp, "-1,");
+                    resp +=3;
+                }
+            }
+            if ((*_i2c).read(_args[IA_ADD], _dbuf, _args[IA_DATA])!=0) {
+                sprintf(resp, "-1]");
+            } else {
+                for (dcnt = 0; dcnt < _args[IA_DATA]; dcnt++) {
+                    sprintf(resp,"0x%02X,", _dbuf[dcnt]);
+                    resp +=5;
+                }
+                sprintf((resp-1), "]");
+            }
+        } else {
+            for (dcnt = 0; dcnt < (_args[IA_CNT] -1) ; dcnt++) {
+                _dbuf[dcnt] = _args[(dcnt +2)];
+            }
+            if ((*_i2c).write(_args[IA_ADD], _dbuf, dcnt) == 0) {
+                sprintf(resp,"[%d]", dcnt);
+            } else {
+                sprintf(resp, "[-1]");
+            }
+        }
+    }
+}
+
+/* SPI
+ * /s/[data]...      read+write
+ * [data] = data to be writen
+ *   this shifts out each data byte provided
+ *   and returns each byte shifted in
+ */
+void SerialInterface::fnc_spi(char* resp)
+{
+    int dcnt=0;
+    int dataIn;
+    if (_args[0] < 1) {
+        sprintf(resp, "[-1]");
+    } else {
+        sprintf(resp, "[");
+        resp++;
+        while(dcnt < _args[0]) {
+            dcnt++;
+            dataIn = (*_spi).write(_args[dcnt]);
+            sprintf(resp, "0x%02X,", dataIn);
+            resp += 5;
+        }
+        sprintf((resp-1), "]");
+    }
+}
+
+void SerialInterface::call(char* input, char* output)
+{
+    char cmd;
+    _args[0] = 0;
+    if (*input == '/') {
+        input++;
+        cmd = *input;
+        input = strchr(input, '/');
+        while (*input == '/') {
+            input++;
+            _args[(_args[0]+1)] = strtol(input, &input, 0);
+            if (input) {
+                _args[0]++;
+            }
+        }
+        switch (cmd) {
+            case 'i':
+            case 'I':
+                fnc_i2c(output);
+                break;
+            case 's':
+            case 'S':
+                fnc_spi(output);
+                break;
+            default:
+                sprintf(output, "!commands: i2c spi");
+                break;
+        }
+    } else {
+        sprintf(output, "!format:  /cmd/arg1/arg2...");
+
+    }
+}