Own fork of C027_Support

Dependents:   MbedSmartRestMain MbedSmartRestMain

Fork of C027_Support by u-blox

Files at this revision

API Documentation at this revision

Comitter:
mazgch
Date:
Fri Mar 14 13:07:48 2014 +0000
Parent:
17:296d94a006b4
Child:
19:2b5d097ca15d
Child:
20:535ef78655df
Commit message:
extend Api for GPS and GNSS

Changed in this revision

GPS.cpp Show annotated file Show diff for this revision Revisions of this file
GPS.h Show annotated file Show diff for this revision Revisions of this file
MDM.cpp Show annotated file Show diff for this revision Revisions of this file
MDM.h Show annotated file Show diff for this revision Revisions of this file
SerialPipe.cpp Show annotated file Show diff for this revision Revisions of this file
SerialPipe.h Show annotated file Show diff for this revision Revisions of this file
--- a/GPS.cpp	Fri Jan 31 09:49:51 2014 +0000
+++ b/GPS.cpp	Fri Mar 14 13:07:48 2014 +0000
@@ -203,6 +203,24 @@
     return false;
 }
 
+bool GPSParser::getNmeaAngle(int ix, char* buf, int len, double& d)
+{
+    char ch;
+    char val;
+    if (getNmeaItem(ix,buf,len,val) && getNmeaItem(ix+1,buf,len,ch) && 
+        ((ch == 'S') || (ch == 'N') || (ch == 'E') || (ch == 'W')))
+    {
+        val *= 0.01;
+        int i = (int)d;
+        val = (val - i) / 0.6 + i;
+        if (ch == 'S' || ch == 'W')
+            val = -val;
+        d = val;
+        return true;
+    }
+    return false;
+}
+                
 const char GPSParser::toHex[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
 
 // ----------------------------------------------------------------
@@ -221,11 +239,6 @@
     return _getMessage(&_pipeRx, buf, len);   
 }
 
-char GPSSerial::next(void)
-{ 
-    return _pipeRx.next(); 
-}
-
 int GPSSerial::_send(const void* buf, int len)   
 { 
     return put((const char*)buf, len, true/*=blocking*/); 
@@ -319,11 +332,6 @@
     return read;
 }
 
-char GPSI2C::next(void)                       
-{ 
-    return _pipe.next(); 
-}
-
 int GPSI2C::_send(const void* buf, int len)
 { 
     return !I2C::write(GPSADR,(const char*)buf,len,true) ? len : 0; 
--- a/GPS.h	Fri Jan 31 09:49:51 2014 +0000
+++ b/GPS.h	Fri Mar 14 13:07:48 2014 +0000
@@ -28,6 +28,7 @@
     static bool getNmeaItem(int ix, char* buf, int len, double& val);
     static bool getNmeaItem(int ix, char* buf, int len, int& val, int base/*=10*/);
     static bool getNmeaItem(int ix, char* buf, int len, char& val);
+    static bool getNmeaAngle(int ix, char* buf, int len, double& d);
 protected:
     static int _getMessage(Pipe<char>* pipe, char* buf, int len);
     static int _parseNmea(Pipe<char>* pipe, int len);
@@ -43,7 +44,6 @@
               int rxSize = RX_SIZE, int txSize = TX_SIZE);
     virtual int getMessage(char* buf, int len);
 protected:
-    virtual char next(void);
     virtual int _send(const void* buf, int len);
 };
 
@@ -59,7 +59,6 @@
     virtual int sendNmea(const char* buf, int len);
     virtual int sendUbx(unsigned char cls, unsigned char id, const void* buf = NULL, int len = 0);
 protected:
-    virtual char next(void);
     bool writeable(void) { return true; }
     bool putc(int c)     { char ch = c; return send(&ch, 1); }
     virtual int _send(const void* buf, int len);
--- /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
--- a/MDM.h	Fri Jan 31 09:49:51 2014 +0000
+++ b/MDM.h	Fri Mar 14 13:07:48 2014 +0000
@@ -1,14 +1,60 @@
 #pragma once 
 
 #include "mbed.h"
+#include "Pipe.h"
+#include "SerialPipe.h"
 #include "C027_PinNames.h"
 
-class MDMSerial : public RawSerial
+#define RX_SIZE 256
+#define TX_SIZE 128
+
+class MDMParser
+{
+public:
+    #define WAIT      -1
+    #define NOT_FOUND  0
+    
+    #define LENGTH(x)   (x & 0x00FFFF)
+//    #define PROTOCOL(x) (x & 0xFF0000)
+    virtual int getLine(char* buf, int len) = 0; 
+    virtual int getResp(char* buf, int len) = 0; 
+    virtual int send(const char* buf, int len);
+    
+protected:
+    static int _getLine(Pipe<char>* pipe, char* buffer, int length);
+    static int _getResp(Pipe<char>* pipe, char* buffer, int length);
+    virtual int _send(const void* buf, int len) = 0;
+};
+
+// -----------------------------------------------------------------------
+
+class MDMSerial :  public SerialPipe, public MDMParser
 {
 public: 
-    MDMSerial() : RawSerial(MDMTXD,MDMRXD)
-    {
-        baud(MDMBAUD);
-        set_flow_control(SerialBase::RTSCTS, MDMRTS, MDMCTS);
-    }
+    MDMSerial(PinName tx = MDMTXD, PinName rx = MDMRXD, int baudrate = MDMBAUD,
+              int rxSize = RX_SIZE, int txSize = TX_SIZE);
+    MDMSerial(PinName tx = MDMTXD, PinName rx = MDMRXD, int baudrate = MDMBAUD,
+              PinName rts = MDMRTS, PinName cts = MDMCTS,
+              int rxSize = RX_SIZE, int txSize = TX_SIZE);
+    virtual int getLine(char* buffer, int length);
+    virtual int getResp(char* buffer, int length);
+protected:
+    virtual int _send(const void* buf, int len);
 };
+
+// -----------------------------------------------------------------------
+
+#define HAVE_MDMUSB
+#ifdef HAVE_MDMUSB
+class MDMUsb :  /*public UsbSerial,*/ public MDMParser
+{
+public: 
+    MDMUsb(void);
+    virtual int getLine(char* buffer, int length);
+    virtual int getResp(char* buffer, int length);
+protected:
+    virtual int _send(const void* buf, int len);
+};
+#endif
+
+
--- a/SerialPipe.cpp	Fri Jan 31 09:49:51 2014 +0000
+++ b/SerialPipe.cpp	Fri Mar 14 13:07:48 2014 +0000
@@ -102,73 +102,3 @@
     }
 }
 
-// -----------------------------------------------------------------------
-
-int SerialPipeEx::getLine(char* buffer, int length)
-{
-    return getLine(buffer, length, &_pipeRx);
-}
-
-int SerialPipeEx::getLine(char* buffer, int length, Pipe<char>* pipe)
-{
-    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 SerialPipeEx::getResp(char* buffer, int length)
-{
-    return getResp(buffer, length, &_pipeRx);
-}
-
-int SerialPipeEx::getResp(char* buffer, int length, Pipe<char>* pipe)
-{
-    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;
-}
--- a/SerialPipe.h	Fri Jan 31 09:49:51 2014 +0000
+++ b/SerialPipe.h	Fri Mar 14 13:07:48 2014 +0000
@@ -26,16 +26,3 @@
     Pipe<char> _pipeRx;
     Pipe<char> _pipeTx;
 };
-
-// -----------------------------------------------------------------------
-#define WAIT      -1
-#define NOT_FOUND  0
-
-class SerialPipeEx : public SerialPipe
-{
-public:
-    int getLine(char* buffer, int length);
-    static int getLine(char* buffer, int length, Pipe<char>* pipe);
-    int getResp(char* buffer, int length);
-    static int getResp(char* buffer, int length, Pipe<char>* pipe);
-};