* add C027_Support fork

Fork of C027_Support by u-blox

Revision:
18:e5697801df29
Child:
19:2b5d097ca15d
Child:
20:535ef78655df
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MDM.cpp	Fri Mar 14 13:07:48 2014 +0000
@@ -0,0 +1,113 @@
+#include "mbed.h"
+#include <ctype.h>
+#include "MDM.h"
+
+
+int MDMParser::send(const char* buf, int len)
+{
+    return _send(buf, len);
+}
+
+int MDMParser::_getLine(Pipe<char>* pipe, char* buffer, int length)
+{
+    int o = 0;
+    int i = 0;
+    int l = pipe->start();
+    while ((i < l) && (o < length))
+    {
+        int t = pipe->next();
+        i ++;
+        if (t == '\r')     // terminate commands with carriage return
+        {
+            pipe->done();
+            if (length > o)
+                buffer[o] = '\0';
+            return o;          // if enter send the zero char
+        }
+        else if (t == '\n')     // skip/filter new line 
+             /* skip */;
+        else if (t != '\b')     // normal char (no backspace)
+            buffer[o++] = t;
+        else if (o > 0)         // backspace
+            o --;               // remove it
+    }
+    o = 0;
+    if (length > 0)
+        buffer[0] = '\0';
+    return WAIT;
+}
+
+int MDMParser::_getResp(Pipe<char>* pipe, char* buffer, int length)
+{
+    int o = 0;
+    int i = 0;
+    int l = pipe->start();
+    static const char erTxt[] = "ERROR\r\n";
+    static const char okTxt[] = "OK\r\n";
+    int er = 0;
+    int ok = 0;
+    while ((i < pipe->size()) && (o < length))
+    {
+        int t = pipe->next();
+        i ++;
+        buffer[o++] = t;
+        ok = (t == okTxt[ok]) ? ok + 1 : 0;
+        er = (t == erTxt[er]) ? er + 1 : 0;
+        if ((okTxt[ok] == '\0') || (erTxt[er] == '\0'))
+        {
+            pipe->done();
+            if (length > o)
+                buffer[o] = '\0';
+            return o;
+        }
+    }
+    o = 0;
+    if (length > 0)
+        buffer[0] = '\0';
+    return WAIT;
+}
+
+// ----------------------------------------------------------------
+// Serial Implementation 
+// ----------------------------------------------------------------
+
+MDMSerial::MDMSerial(PinName tx /*= MDMTXD*/, PinName rx /*= MDMRXD*/, int baudrate /*= MDMBAUD*/,
+            int rxSize /*= 256*/, int txSize /*= 128*/) : 
+            SerialPipe(tx, rx, rxSize, txSize)
+{
+    baud(baudrate);
+}
+
+MDMSerial::MDMSerial(PinName tx /*= MDMTXD*/, PinName rx /*= MDMRXD*/, int baudrate /*= MDMBAUD*/,
+            PinName rts /*= MDMRTS*/, PinName cts /*= MDMCTS*/, int rxSize /*= 256*/, int txSize /*= 128*/) : 
+            SerialPipe(tx, rx, rts, cts, rxSize, txSize)
+{
+    baud(baudrate);
+}
+
+int MDMSerial::_send(const void* buf, int len)   
+{ 
+    return put((const char*)buf, len, true/*=blocking*/); 
+}
+
+int MDMSerial::getLine(char* buffer, int length)
+{
+    return _getLine(&_pipeRx, buffer, length);
+}
+
+int MDMSerial::getResp(char* buffer, int length)
+{
+    return _getResp(&_pipeRx, buffer, length);
+}
+
+// ----------------------------------------------------------------
+// USB Implementation 
+// ----------------------------------------------------------------
+
+#ifdef HAVE_MDMUSB
+// TODO properly implement with USB 
+MDMUsb::MDMUsb(void)                             { }
+int MDMUsb::_send(const void* buf, int len)      { return len; }
+int MDMUsb::getLine(char* buffer, int length)    { return NOT_FOUND; }
+int MDMUsb::getResp(char* buffer, int length)    { return NOT_FOUND; }
+#endif
\ No newline at end of file