support library for C027 helper functions for Buffer Pipes, Buffered Serial Port (rtos capable) and GPS parsing. It includes modem APIs for USSD, SMS and Sockets.

Dependents:   HTTPClient_Cellular_HelloWorld Cellular_HelloMQTT MbedSmartRestMain Car_Bon_car_module ... more

This library is intended to be used with u-blox products such as the C027 or a shield with u-blox cellular and GPS modules like the cellular and positioning shield from Embedded Artist.

For 2G/GSM and 3G/UMTS you need to:

  • have a SIM card and know its PIN number
  • need to know you network operators APN setting These setting should be passed to the connect or init and join functions. You can also extend the APN database in MDMAPN.h.

For CDMA products you need to make sure that you have provisioned and activated the modem with either Sprint or Verizon.

Revision:
136:8dc8f48275fc
Parent:
135:cbccf4052d45
Child:
137:6a7a5c4f35f6
diff -r cbccf4052d45 -r 8dc8f48275fc MDM.cpp
--- a/MDM.cpp	Thu Jan 21 15:59:42 2016 +0000
+++ b/MDM.cpp	Fri Jan 22 15:28:39 2016 +0000
@@ -192,17 +192,51 @@
                     int socket = _findSocket(a);
                     TRACE("Socket %d: handle %d closed by remote host\r\n", socket, a);
                     if ((socket != SOCKET_ERROR) && _sockets[socket].connected)
-                        _sockets[socket].connected = false;                
+                        _sockets[socket].connected = false;                                    
                 // +UULOC: <date>,<time>,<lat>,<long>,<alt>,<uncertainty>,<speed>, <direction>,<vertical_acc>,<sensor_used>,<SV_used>,<antenna_status>, <jamming_status>
                 }else if (sscanf(cmd, "UULOC: %d/%d/%d,%d:%d:%d.%*d,%f,%f,%d,%d,%d,%d,%d,%d,%d,%*d,%*d",\
-                        &_loc.time.tm_mday, &_loc.time.tm_mon, &_loc.time.tm_year, &_loc.time.tm_hour, &_loc.time.tm_min, &_loc.time.tm_sec,\
-                        &_loc.latitue, &_loc.longitude, &_loc.altitutude, &_loc.uncertainty, &_loc.speed, &_loc.direction, &_loc.verticalAcc, \
-                        &_loc.sensorUsed, &_loc.svUsed) == 15) {
-                    _loc.time.tm_mon -= 1;
-                    _loc.time.tm_wday=0;
-                    _loc.time.tm_yday=0;
-                    _loc.validData = true;
-                    TRACE("Parsed UULOC position\r\n");
+                        &_loc[0].time.tm_mday, &_loc[0].time.tm_mon, &_loc[0].time.tm_year, &_loc[0].time.tm_hour, &_loc[0].time.tm_min, &_loc[0].time.tm_sec,\
+                        &_loc[0].latitude, &_loc[0].longitude, &_loc[0].altitutude, &_loc[0].uncertainty, &_loc[0].speed, &_loc[0].direction, &_loc[0].verticalAcc, \
+                        &b, &_loc[0].svUsed) == 15) {
+                    TRACE("Parsed UULOC position at index 0\r\n");                                        
+                    _loc[0].sensor = (b==0)? CELL_LAST : (b==1)? CELL_GNSS : (b==2)? CELL_LOCATE : (b==3)? CELL_HYBRID : CELL_LAST;
+                    _loc[0].time.tm_mon -= 1;
+                    _loc[0].time.tm_wday=0;
+                    _loc[0].time.tm_yday=0;
+                    _loc[0].validData = true;
+                    _locExpPos=1;
+                    _locRcvPos++;
+               // +UULOC: <sol>,<num>,<sensor_used>,<date>,<time>,<lat>,<long>,<alt>,<uncertainty>,<speed>, <direction>,<vertical_acc>,,<SV_used>,<antenna_status>, <jamming_status>                              
+               }else if (sscanf(cmd, "UULOC: %d,%d,%d,%d/%d/%d,%d:%d:%d.%*d,%f,%f,%d,%d,%d,%d,%d,%d,%*d,%*d",\
+                        &a,&_locExpPos,&b, \
+                        &_loc[CELL_MAX_HYP-1].time.tm_mday, &_loc[CELL_MAX_HYP-1].time.tm_mon, &_loc[CELL_MAX_HYP-1].time.tm_year, &_loc[CELL_MAX_HYP-1].time.tm_hour, &_loc[CELL_MAX_HYP-1].time.tm_min, &_loc[CELL_MAX_HYP-1].time.tm_sec,\
+                        &_loc[CELL_MAX_HYP-1].latitude, &_loc[CELL_MAX_HYP-1].longitude, &_loc[CELL_MAX_HYP-1].altitutude, &_loc[CELL_MAX_HYP-1].uncertainty, &_loc[CELL_MAX_HYP-1].speed, &_loc[CELL_MAX_HYP-1].direction, &_loc[CELL_MAX_HYP-1].verticalAcc, \
+                        &_loc[CELL_MAX_HYP-1].svUsed) == 17) {  
+                    if (--a>=0){                         
+                        TRACE("Parsed UULOC position at index %d\r\n",a);                    
+                        memcpy(&_loc[a], &_loc[CELL_MAX_HYP-1], sizeof(*_loc)); 
+                        _loc[a].sensor = (b==0)? CELL_LAST : (b==1)? CELL_GNSS : (b==2)? CELL_LOCATE : (b==3)? CELL_HYBRID : CELL_LAST;                                       
+                        _loc[a].time.tm_mon -= 1;
+                        _loc[a].time.tm_wday=0;
+                        _loc[a].time.tm_yday=0;
+                        _loc[a].validData = true;                    
+                        _locRcvPos++;                                            
+                    }
+              //+UULOC: <sol>,<num>,<sensor_used>,<date>,<time>,<lat>,<long>,<alt>,<lat50>,<long50>,<major50>,<minor50>,<orientation50>,<confidence50>[,<lat95>,<long95>,<major95>,<minor95>,<orientation95>,<confidence95>]
+               }else if (sscanf(cmd, "UULOC: %d,%d,%d,%d/%d/%d,%d:%d:%d.%*d,%f,%f,%d,%*f,%*f,%d,%*d,%*d,%*d",\
+                        &a,&_locExpPos,&b, \
+                        &_loc[CELL_MAX_HYP-1].time.tm_mday, &_loc[CELL_MAX_HYP-1].time.tm_mon, &_loc[CELL_MAX_HYP-1].time.tm_year, &_loc[CELL_MAX_HYP-1].time.tm_hour, &_loc[CELL_MAX_HYP-1].time.tm_min, &_loc[CELL_MAX_HYP-1].time.tm_sec,\
+                        &_loc[CELL_MAX_HYP-1].latitude, &_loc[CELL_MAX_HYP-1].longitude, &_loc[CELL_MAX_HYP-1].altitutude, &_loc[CELL_MAX_HYP-1].uncertainty) == 13) {                    
+                    if (--a>=0){    
+                        TRACE("Parsed UULOC position at index %d\r\n",a);
+                        memcpy(&_loc[a], &_loc[CELL_MAX_HYP-1], sizeof(*_loc));                                        
+                        _loc[a].sensor = (b==0)? CELL_LAST : (b==1)? CELL_GNSS : (b==2)? CELL_LOCATE : (b==3)? CELL_HYBRID : CELL_LAST;
+                        _loc[a].time.tm_mon -= 1;
+                        _loc[a].time.tm_wday=0;
+                        _loc[a].time.tm_yday=0;
+                        _loc[a].validData = true;                    
+                        _locRcvPos++;                    
+                    }                              
                 // +UHTTPCR: <profile_id>,<op_code>,<param_val>
                 } else if ((sscanf(cmd, "UUHTTPCR: %d,%d,%d", &a, &b, &c) == 3)) {
                     _httpProfiles[a].cmd = b;          //command
@@ -252,7 +286,7 @@
                                 else if (a == 5) *reg = REG_ROAMING;  // 5: registered, roaming
                                 else if (a == 6) *reg = REG_HOME;     // 6: registered, sms only, home
                                 if ((r >= 3) && (b != 0xFFFF))      _net.lac = b; // location area code
-                                if ((r >= 4) && (c != 0xFFFFFFFF))  _net.ci  = c; // cell ID
+                                if ((r >= 4) && (c != 0xFFFFFFFF))  _net.ci  = c; // cell ID                                                                                                
                                 // access technology
                                 if (r >= 5) {
                                     if      (d == 0) _net.act = ACT_GSM;      // 0: GSM
@@ -1894,8 +1928,7 @@
 }
 
 // ----------------------------------------------------------------
-
-int MDMParser::cellLocSrvHttp (const char* token, const char* server_1, const char* server_2, int days/* = 14*/, \
+int MDMParser::cellLocSrvTcp(const char* token, const char* server_1, const char* server_2, int days/* = 14*/, \
         int period/* = 4*/, int resolution/* = 1*/)
 {
     bool ok = false;
@@ -1904,7 +1937,7 @@
         sendFormated("AT+UGSRV=\"%s\",\"%s\",\"%s\"\r\n", server_1, server_2, token, days, period, resolution);
         ok = (RESP_OK == waitFinalResp());
     } else
-        ok = false; //command not supported by module
+        ERROR("Command not supported\r\n"); 
     UNLOCK();
     return ok;
 }
@@ -1918,12 +1951,12 @@
         sendFormated("AT+UGAOP=\"%s\",%d,%d,%d\r\n", server_1, port, latency, mode);
         ok = (RESP_OK == waitFinalResp());
     } else
-        ok = false; //command not supported by module
+        ERROR("Command not supported\r\n"); 
     UNLOCK();
     return ok;
 }
 
-int MDMParser::cellLocUnsolIndication(int mode)
+int MDMParser::cellLocUnsol(int mode)
 {
     bool ok = false;
     LOCK();
@@ -1931,12 +1964,12 @@
         sendFormated("AT+ULOCIND=%d\r\n", mode);
         ok = (RESP_OK == waitFinalResp());
     } else
-        ok = false; //command not supported by module
+        ERROR("Command not supported\r\n"); 
     UNLOCK();
     return ok;
 }
 
-int MDMParser::cellLocConfigSensor(int scanMode)
+int MDMParser::cellLocConfig(int scanMode)
 {
     bool ok = false;
     LOCK();
@@ -1944,39 +1977,62 @@
         sendFormated("AT+ULOCCELL=%d\r\n", scanMode);
         ok = (RESP_OK == waitFinalResp());    
     }else
-        ok = false; //command not supported by module
+        ERROR("Command not supported\r\n"); 
     UNLOCK();
     return ok;
 }
 
-int MDMParser::cellLocRequest(int sensor, int timeout, int accuracy, int numHypotesis /* =1*/)
+int MDMParser::cellLocRequest(CellSensType sensor, int timeout, int accuracy, CellRespType type/* =1*/, int hypotesis/* =1*/)
 {
     bool ok = false;
     
-    LOCK();
-     _loc.validData = false;
+    if (hypotesis > 1 && type != CELL_MULTIHYP){
+        ERROR("Num hypotesis is not set accordelying to CellRespType\r\n");
+        return false;
+        }        
+    if (hypotesis > CELL_MAX_HYP){
+        ERROR("Number of hypotesis is too big\r\n");
+        return false;  
+    }        
+    LOCK();      
+    _locRcvPos=0;
+    _locExpPos=0;
+    for (int i=0; i < hypotesis; i++)
+        _loc[i].validData = false;          
     if (_dev.dev == DEV_LISA_U2_03S){
-        sendFormated("AT+ULOC=2,%d,1,%d,%d,%d\r\n", sensor, timeout, accuracy, numHypotesis);
+        sendFormated("AT+ULOC=2,%d,%d,%d,%d,%d\r\n", sensor, type, timeout, accuracy, hypotesis);        
         ok = (RESP_OK == waitFinalResp());
     } else if (_dev.dev != DEV_TOBY_L2){
         sendFormated("AT+ULOC=2,%d,1,%d,%d\r\n",  sensor, timeout, accuracy);
         ok = (RESP_OK == waitFinalResp());
-    }
-    else  ok = false; //command not supported by module
-
-
+    } else
+        ERROR("Command not supported\r\n");  
     UNLOCK();
     return ok;
 }  
-
-int MDMParser::cellLocGet(CellLocData *data){
+int MDMParser::cellLocGetRes()
+{
+    return _locRcvPos;
+}
+int MDMParser::cellLocGetExpRes()
+{
+    int res=0;
     waitFinalResp(NULL,NULL,0);
-    if (_loc.validData){
-        memcpy(data, &_loc, sizeof(_loc));
-        _loc.validData = false;
-        return true;
-    }
-    return false;
+    LOCK();
+    if (_locRcvPos>0)
+        res = _locExpPos;
+    UNLOCK();
+    return res;
+}
+
+int MDMParser::cellLocGetData(CellLocData *data, int index/*=0*/){
+    
+    if (!_loc[index].validData)
+          return false;
+    LOCK(); 
+    memcpy(data, &_loc[index], sizeof(*_loc));
+    UNLOCK();
+    return true;
 }
 
 // ----------------------------------------------------------------