ublox-at-cellular-interface-ext
Dependencies: ublox-at-cellular-interface
Revision 1:26a67ab07275, committed 2017-06-07
- Comitter:
- rob.meades@u-blox.com
- Date:
- Wed Jun 07 23:52:33 2017 +0100
- Parent:
- 0:0b75e22c9231
- Child:
- 2:3c825852fdbe
- Commit message:
- Add UbloxCellularDriverGen library, since it is being subclassed.
Improved printing of Cell Locate data.
Fixed bug with printing Cell Locate year.
Added parsing for an additional +UULOC form.
Changed in this revision
--- a/TESTS/unit_tests/cell-locate/main.cpp Mon Jun 05 12:58:04 2017 +0000
+++ b/TESTS/unit_tests/cell-locate/main.cpp Wed Jun 07 23:52:33 2017 +0100
@@ -84,6 +84,13 @@
// Lock for debug prints
static Mutex mtx;
+// Power up GNSS
+#ifdef TARGET_UBLOX_C030
+static DigitalInOut gnssEnable(GNSSEN, PIN_OUTPUT, PushPullNoPull, 1);
+#elif TARGET_UBLOX_C027
+static DigitalOut gnssEnable(GNSSEN, 1);
+#endif
+
// An instance of the cellular interface
static UbloxATCellularInterfaceExt *pDriver =
new UbloxATCellularInterfaceExt(MDMTXD, MDMRXD,
@@ -110,15 +117,12 @@
char timeString[25];
tr_debug("Cell Locate data:");
- if (strftime(timeString, sizeof(timeString), "%a %b %d %H:%M:%S %Y", (const tm *) &(pData->time)) > 0) {
+ if (strftime(timeString, sizeof(timeString), "%F %T", (const tm *) &(pData->time)) > 0) {
tr_debug(" time: %s", timeString);
}
tr_debug(" longitude: %.6f", pData->longitude);
tr_debug(" latitude: %.6f", pData->latitude);
- tr_debug(" altitude: %d metres", pData->altitude);
- tr_debug(" uncertainty: %d metres", pData->uncertainty);
- tr_debug(" speed: %d metres/second", pData->speed);
- tr_debug(" vertical accuracy: %d metres/second", pData->speed);
+ tr_debug(" altitude: %d metre(s)", pData->altitude);
switch (pData->sensor) {
case UbloxATCellularInterfaceExt::CELL_LAST:
tr_debug(" sensor type: last");
@@ -136,7 +140,13 @@
tr_debug(" sensor type: unknown");
break;
}
- tr_debug(" satellites used: %d", pData->svUsed);
+ tr_debug(" uncertainty: %d metre(s)", pData->uncertainty);
+ tr_debug(" speed: %d metre(s)/second", pData->speed);
+ tr_debug(" direction: %d degree(s)", pData->direction);
+ tr_debug(" vertical accuracy: %d metre(s)/second", pData->speed);
+ tr_debug(" satellite(s) used: %d", pData->svUsed);
+ tr_debug("I am here: "
+ "https://maps.google.com/?q=%.5f,%.5f", pData->latitude, pData->longitude);
}
// ----------------------------------------------------------------
--- a/UbloxATCellularInterfaceExt.cpp Mon Jun 05 12:58:04 2017 +0000
+++ b/UbloxATCellularInterfaceExt.cpp Wed Jun 07 23:52:33 2017 +0100
@@ -280,6 +280,7 @@
// +UHTTPCR: <profile_id>,<op_code>,<param_val>
if (read_at_to_char(urcBuf, sizeof (urcBuf), '\n') > 0) {
+ // Response type 1
// +UULOC: <date>,<time>,<lat>,<long>,<alt>,<uncertainty>,<speed>, <direction>,<vertical_acc>,<sensor_used>,<SV_used>,<antenna_status>, <jamming_status>
if (sscanf(urcBuf, ": %d/%d/%d,%d:%d:%d.%*d,%f,%f,%d,%d,%d,%d,%d,%d,%d,%*d,%*d",
&_loc[0].time.tm_mday, &_loc[0].time.tm_mon,
@@ -292,12 +293,14 @@
debug_if(_debug_trace_on, "Position found at index 0\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_year -= 1900;
_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++;
+ // Response type 2, sensor used 1
// +UULOC: <sol>,<num>,<sensor_used>,<date>,<time>,<lat>,<long>,<alt>,<uncertainty>,<speed>, <direction>,<vertical_acc>,,<SV_used>,<antenna_status>, <jamming_status>
} else if (sscanf(urcBuf, ": %d,%d,%d,%d/%d/%d,%d:%d:%d.%*d,%f,%f,%d,%d,%d,%d,%d,%d,%*d,%*d",
&a, &_locExpPos, &b,
@@ -322,12 +325,14 @@
_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_year -= 1900;
_loc[a].time.tm_mon -= 1;
_loc[a].time.tm_wday = 0;
_loc[a].time.tm_yday = 0;
_loc[a].validData = true;
_locRcvPos++;
}
+ // Response type 2, sensor used 2
//+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(urcBuf, ": %d,%d,%d,%d/%d/%d,%d:%d:%d.%*d,%f,%f,%d,%*f,%*f,%d,%*d,%*d,%*d",
&a, &_locExpPos, &b,
@@ -349,9 +354,47 @@
_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_year -= 1900;
_loc[a].time.tm_mon -= 1;
_loc[a].time.tm_wday = 0;
_loc[a].time.tm_yday = 0;
+ _loc[a].speed = 0;
+ _loc[a].direction = 0;
+ _loc[a].verticalAcc = 0;
+ _loc[a].svUsed = 0;
+ _loc[a].validData = true;
+ _locRcvPos++;
+ }
+ // Response type 2, sensor used 0
+ //+UULOC: <sol>,<num>,<sensor_used>,<date>,<time>,<lat>,<long>,<alt>,<uncertainty>
+ } else if (sscanf(urcBuf, ": %d,%d,%d,%d/%d/%d,%d:%d:%d.%*d,%f,%f,%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].altitude,
+ &_loc[CELL_MAX_HYP - 1].uncertainty) == 13) {
+ if (--a >= 0) {
+
+ debug_if(_debug_trace_on, "Position found at index %d\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_year -= 1900;
+ _loc[a].time.tm_mon -= 1;
+ _loc[a].time.tm_wday = 0;
+ _loc[a].time.tm_yday = 0;
+ _loc[a].speed = 0;
+ _loc[a].direction = 0;
+ _loc[a].verticalAcc = 0;
+ _loc[a].svUsed = 0;
_loc[a].validData = true;
_locRcvPos++;
}
--- a/UbloxATCellularInterfaceExt.h Mon Jun 05 12:58:04 2017 +0000
+++ b/UbloxATCellularInterfaceExt.h Wed Jun 07 23:52:33 2017 +0100
@@ -423,6 +423,10 @@
*
* This function is non-blocking, the result is retrieved using cellLocGetxxx.
*
+ * Note: none of the CellLocate methods switch on the GNSS receiver chip.
+ * That should be done by instantiating the GnssSerial or GnssI2C classes and
+ * calling the init() method.
+ *
* Note: during the location process, unsolicited result codes will be returned
* by the modem indicating progress and potentially flagging interesting errors.
* In order to see these errors, instantiate this class with debugOn set to true.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ublox-cellular-driver-gen.lib Wed Jun 07 23:52:33 2017 +0100 @@ -0,0 +1,1 @@ +https://mbed.org/teams/ublox/code/ublox-cellular-driver-gen/#458e1b3d460c \ No newline at end of file