Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of C027_Support by
Diff: MDM.cpp
- Revision:
 - 136:8dc8f48275fc
 - Parent:
 - 135:cbccf4052d45
 - Child:
 - 137:6a7a5c4f35f6
 
--- 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;
 }
 
 // ----------------------------------------------------------------
    