diff --git a/src/TinyGsmClientSIM7000.h b/src/TinyGsmClientSIM7000.h index ea31940..4c70e96 100644 --- a/src/TinyGsmClientSIM7000.h +++ b/src/TinyGsmClientSIM7000.h @@ -431,7 +431,7 @@ class TinyGsmSim7000 : public TinyGsmModem, float ilat = 0; float ilon = 0; float ispeed = 0; - int ialt = 0; + float ialt = 0; int ivsat = 0; int iusat = 0; float iaccuracy = 0; @@ -473,7 +473,7 @@ class TinyGsmSim7000 : public TinyGsmModem, if (lat != NULL) *lat = ilat; if (lon != NULL) *lon = ilon; if (speed != NULL) *speed = ispeed; - if (alt != NULL) *alt = ialt; + if (alt != NULL) *alt = static_cast(ialt); if (vsat != NULL) *vsat = ivsat; if (usat != NULL) *usat = iusat; if (accuracy != NULL) *accuracy = iaccuracy; diff --git a/src/TinyGsmClientSIM7600.h b/src/TinyGsmClientSIM7600.h index a34b2ce..f3b50f8 100644 --- a/src/TinyGsmClientSIM7600.h +++ b/src/TinyGsmClientSIM7600.h @@ -440,18 +440,18 @@ class TinyGsmSim7600 : public TinyGsmModem, // TODO(?) Can 1 be returned if (fixMode == 1 || fixMode == 2 || fixMode == 3) { // init variables - float ilat = 0; - float ilon = 0; - float ispeed = 0; - int ialt = 0; - int ivsat = 0; - int iusat = 0; - float iaccuracy = 0; - int iyear = 0; - int imonth = 0; - int iday = 0; - int ihour = 0; - int imin = 0; + float ilat = 0; + float ilon = 0; + float ispeed = 0; + float ialt = 0; + int ivsat = 0; + int iusat = 0; + float iaccuracy = 0; + int iyear = 0; + int imonth = 0; + int iday = 0; + int ihour = 0; + int imin = 0; float secondWithSS = 0; streamSkipUntil(','); // GPS satellite valid numbers @@ -463,13 +463,13 @@ class TinyGsmSim7600 : public TinyGsmModem, streamSkipUntil(','); // E/W Indicator, E=east or W=west // Date. Output format is ddmmyy - iday = streamGetInt(static_cast(2)); // Two digit day + iday = streamGetInt(static_cast(2)); // Two digit day imonth = streamGetInt(static_cast(2)); // Two digit month - iyear = streamGetInt(','); // Two digit year + iyear = streamGetInt(','); // Two digit year // UTC Time. Output format is hhmmss.s - ihour = streamGetInt(static_cast(2)); // Two digit hour - imin = streamGetInt(static_cast(2)); // Two digit minute + ihour = streamGetInt(static_cast(2)); // Two digit hour + imin = streamGetInt(static_cast(2)); // Two digit minute secondWithSS = streamGetFloat(','); // 4 digit second with subseconds ialt = streamGetFloat(','); // MSL Altitude. Unit is meters @@ -485,7 +485,7 @@ class TinyGsmSim7600 : public TinyGsmModem, if (lat != NULL) *lat = ilat; if (lon != NULL) *lon = ilon; if (speed != NULL) *speed = ispeed; - if (alt != NULL) *alt = ialt; + if (alt != NULL) *alt = static_cast(ialt); if (vsat != NULL) *vsat = ivsat; if (usat != NULL) *usat = iusat; if (accuracy != NULL) *accuracy = iaccuracy; diff --git a/src/TinyGsmClientSIM808.h b/src/TinyGsmClientSIM808.h index e228836..528aa16 100644 --- a/src/TinyGsmClientSIM808.h +++ b/src/TinyGsmClientSIM808.h @@ -63,7 +63,7 @@ class TinyGsmSim808 : public TinyGsmSim800, public TinyGsmGPS { float ilat = 0; float ilon = 0; float ispeed = 0; - int ialt = 0; + float ialt = 0; int ivsat = 0; int iusat = 0; float iaccuracy = 0; @@ -105,7 +105,7 @@ class TinyGsmSim808 : public TinyGsmSim800, public TinyGsmGPS { if (lat != NULL) *lat = ilat; if (lon != NULL) *lon = ilon; if (speed != NULL) *speed = ispeed; - if (alt != NULL) *alt = ialt; + if (alt != NULL) *alt = static_cast(ialt); if (vsat != NULL) *vsat = ivsat; if (usat != NULL) *usat = iusat; if (accuracy != NULL) *accuracy = iaccuracy; diff --git a/src/TinyGsmClientSaraR4.h b/src/TinyGsmClientSaraR4.h index cef7bcf..a1b65b9 100644 --- a/src/TinyGsmClientSaraR4.h +++ b/src/TinyGsmClientSaraR4.h @@ -428,7 +428,9 @@ class TinyGsmSaraR4 * GSM/GPS/GNSS/GLONASS Location functions * NOTE: u-blox modules use the same function to get location data from both * GSM tower triangulation and from dedicated GPS/GNSS/GLONASS receivers. The - * only difference in which sensor the data is requested from. + * only difference in which sensor the data is requested from. If a GNSS + * location is requested from a modem without a GNSS receiver installed on the + * I2C port, the GSM-based "Cell Locate" location will be returned instead. */ protected: bool enableGPSImpl() { @@ -475,11 +477,12 @@ class TinyGsmSaraR4 return getUbloxLocationRaw(1); } - bool inline getUbloxLocation(int8_t sensor, float* lat, float* lon, float* speed = 0, - int* alt = 0, int* vsat = 0, int* usat = 0, - float* accuracy = 0, int* year = 0, int* month = 0, - int* day = 0, int* hour = 0, int* minute = 0, - int* second = 0) { + bool inline getUbloxLocation(int8_t sensor, float* lat, float* lon, + float* speed = 0, int* alt = 0, int* vsat = 0, + int* usat = 0, float* accuracy = 0, + int* year = 0, int* month = 0, int* day = 0, + int* hour = 0, int* minute = 0, + int* second = 0) { // AT+ULOC=,,,, // - 2: single shot position // - 2: use cellular CellLocate location information @@ -506,7 +509,7 @@ class TinyGsmSaraR4 float ilat = 0; float ilon = 0; float ispeed = 0; - int ialt = 0; + float ialt = 0; int iusat = 0; float iaccuracy = 0; int iyear = 0; @@ -526,23 +529,26 @@ class TinyGsmSaraR4 ilat = streamGetFloat(','); // Estimated latitude, in degrees ilon = streamGetFloat(','); // Estimated longitude, in degrees - ialt = streamGetFloat(','); // Estimated altitude, in meters - only for - iaccuracy = streamGetFloat( - ','); // Maximum possible error, in meters (0 - 20000000) - ispeed = streamGetFloat(','); // Speed over ground m/s3 - streamSkipUntil(','); // Course over ground in degree (0 deg - 360 deg) - streamSkipUntil(','); // Vertical accuracy, in meters - streamSkipUntil(','); // Sensor used for the position calculation - iusat = streamGetInt( - ','); // Number of satellite used to calculate the position - streamSkipUntil(','); // Antenna status - streamSkipUntil('\n'); // Jamming status + ialt = streamGetFloat(','); // Estimated altitude, in meters - only forGNSS + // positioning, 0 in case of CellLocate + if (ialt != 0) { // values not returned for CellLocate + iaccuracy = streamGetFloat(','); // Maximum possible error, in meters + ispeed = streamGetFloat(','); // Speed over ground m/s3 + streamSkipUntil(','); // Course over ground in degree (0 deg - 360 deg) + streamSkipUntil(','); // Vertical accuracy, in meters + streamSkipUntil(','); // Sensor used for the position calculation + iusat = streamGetInt(','); // Number of satellite used + streamSkipUntil(','); // Antenna status + streamSkipUntil('\n'); // Jamming status + } else { + iaccuracy = streamGetFloat('\n'); // Maximum possible error, in meters + } // Set pointers if (lat != NULL) *lat = ilat; if (lon != NULL) *lon = ilon; if (speed != NULL) *speed = ispeed; - if (alt != NULL) *alt = ialt; + if (alt != NULL) *alt = static_cast(ialt); if (vsat != NULL) *vsat = 0; // Number of satellites viewed not reported; if (usat != NULL) *usat = iusat; if (accuracy != NULL) *accuracy = iaccuracy; diff --git a/src/TinyGsmClientUBLOX.h b/src/TinyGsmClientUBLOX.h index e9287f2..ab46f5a 100644 --- a/src/TinyGsmClientUBLOX.h +++ b/src/TinyGsmClientUBLOX.h @@ -395,7 +395,9 @@ class TinyGsmUBLOX * GSM/GPS/GNSS/GLONASS Location functions * NOTE: u-blox modules use the same function to get location data from both * GSM tower triangulation and from dedicated GPS/GNSS/GLONASS receivers. The - * only difference in which sensor the data is requested from. + * only difference in which sensor the data is requested from. If a GNSS + * location is requested from a modem without a GNSS receiver installed on the + * I2C port, the GSM-based "Cell Locate" location will be returned instead. */ protected: bool enableGPSImpl() { @@ -442,11 +444,12 @@ class TinyGsmUBLOX return getUbloxLocationRaw(1); } - bool inline getUbloxLocation(int8_t sensor, float* lat, float* lon, float* speed = 0, - int* alt = 0, int* vsat = 0, int* usat = 0, - float* accuracy = 0, int* year = 0, int* month = 0, - int* day = 0, int* hour = 0, int* minute = 0, - int* second = 0) { + bool inline getUbloxLocation(int8_t sensor, float* lat, float* lon, + float* speed = 0, int* alt = 0, int* vsat = 0, + int* usat = 0, float* accuracy = 0, + int* year = 0, int* month = 0, int* day = 0, + int* hour = 0, int* minute = 0, + int* second = 0) { // AT+ULOC=,,,, // - 2: single shot position // - 2: use cellular CellLocate location information @@ -473,7 +476,7 @@ class TinyGsmUBLOX float ilat = 0; float ilon = 0; float ispeed = 0; - int ialt = 0; + float ialt = 0; int iusat = 0; float iaccuracy = 0; int iyear = 0; @@ -493,23 +496,26 @@ class TinyGsmUBLOX ilat = streamGetFloat(','); // Estimated latitude, in degrees ilon = streamGetFloat(','); // Estimated longitude, in degrees - ialt = streamGetFloat(','); // Estimated altitude, in meters - only for - iaccuracy = streamGetFloat( - ','); // Maximum possible error, in meters (0 - 20000000) - ispeed = streamGetFloat(','); // Speed over ground m/s3 - streamSkipUntil(','); // Course over ground in degree (0 deg - 360 deg) - streamSkipUntil(','); // Vertical accuracy, in meters - streamSkipUntil(','); // Sensor used for the position calculation - iusat = streamGetInt( - ','); // Number of satellite used to calculate the position - streamSkipUntil(','); // Antenna status - streamSkipUntil('\n'); // Jamming status + ialt = streamGetFloat(','); // Estimated altitude, in meters - only forGNSS + // positioning, 0 in case of CellLocate + if (ialt != 0) { // values not returned for CellLocate + iaccuracy = streamGetFloat(','); // Maximum possible error, in meters + ispeed = streamGetFloat(','); // Speed over ground m/s3 + streamSkipUntil(','); // Course over ground in degree (0 deg - 360 deg) + streamSkipUntil(','); // Vertical accuracy, in meters + streamSkipUntil(','); // Sensor used for the position calculation + iusat = streamGetInt(','); // Number of satellite used + streamSkipUntil(','); // Antenna status + streamSkipUntil('\n'); // Jamming status + } else { + iaccuracy = streamGetFloat('\n'); // Maximum possible error, in meters + } // Set pointers if (lat != NULL) *lat = ilat; if (lon != NULL) *lon = ilon; if (speed != NULL) *speed = ispeed; - if (alt != NULL) *alt = ialt; + if (alt != NULL) *alt = static_cast(ialt); if (vsat != NULL) *vsat = 0; // Number of satellites viewed not reported; if (usat != NULL) *usat = iusat; if (accuracy != NULL) *accuracy = iaccuracy; diff --git a/src/TinyGsmGSMLocation.tpp b/src/TinyGsmGSMLocation.tpp index 55203f4..9872154 100644 --- a/src/TinyGsmGSMLocation.tpp +++ b/src/TinyGsmGSMLocation.tpp @@ -122,7 +122,7 @@ class TinyGsmGSMLocation { if (lon != NULL) *lon = ilon; if (accuracy != NULL) *accuracy = iaccuracy; if (iyear < 2000) iyear += 2000; - if (year != NULL) *year = iyear; + if (year != NULL) *year = iyear; if (month != NULL) *month = imonth; if (day != NULL) *day = iday; if (hour != NULL) *hour = ihour; diff --git a/src/TinyGsmModem.tpp b/src/TinyGsmModem.tpp index 9823763..237a941 100644 --- a/src/TinyGsmModem.tpp +++ b/src/TinyGsmModem.tpp @@ -274,7 +274,8 @@ class TinyGsmModem { size_t bytesRead = thisModem().stream.readBytesUntil( lastChar, buf, static_cast(6)); if (bytesRead) { - int16_t res = atoi(buf); + buf[bytesRead] = '\0'; + int16_t res = atoi(buf); return res; } else { return -9999; @@ -282,8 +283,9 @@ class TinyGsmModem { } float inline streamGetFloat(int8_t numChars) { - char buf[12]; + char buf[16]; size_t bytesRead = thisModem().stream.readBytes(buf, numChars); + DBG("### bytesRead:", bytesRead); if (bytesRead) { buf[numChars] = '\0'; int16_t res = atof(buf); @@ -296,11 +298,13 @@ class TinyGsmModem { template // calling with template only to prevent promotion of char to int float inline streamGetFloat(T lastChar) { - char buf[12]; + char buf[16]; size_t bytesRead = thisModem().stream.readBytesUntil( - lastChar, buf, static_cast(12)); + lastChar, buf, static_cast(16)); + DBG("### TEMPL bytesRead:", bytesRead); if (bytesRead) { - float res = atof(buf); + buf[bytesRead] = '\0'; + float res = atof(buf); return res; } else { return static_cast(-9999);