Skip to content

Commit dfe859a

Browse files
authored
Merge pull request #9 from sparkfun/pcUpdates
v1.0.7
2 parents 7958d82 + f09a186 commit dfe859a

File tree

5 files changed

+91
-10
lines changed

5 files changed

+91
-10
lines changed

examples/6. Accuracy and Protection/Position.Errors/Position.Errors.ino

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ void loop()
6868
if (millis() - lastCheck > 1000)
6969
{
7070
lastCheck = millis();
71+
displayData();
7172
}
7273
}
7374

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=SparkFun LG290P Quadband RTK GNSS Arduino Library
2-
version=1.0.6
2+
version=1.0.7
33
author=SparkFun Electronics
44
maintainer=SparkFun Electronics <sparkfun.com>
55
sentence=Library for Serial Communication and Configuration of the LG290P

src/LG290P_structs.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ struct PvtDomain
3333
double groundSpeed = 0;
3434
double heading = 0;
3535

36+
double rmsPseudorangeResidual = 0; // GST
37+
double latitudeError = 0;
38+
double longitudeError = 0;
39+
double heightError = 0;
40+
3641
void clear() { *this = PvtDomain(); }
3742
};
3843

src/SparkFun_LG290P_GNSS.cpp

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,14 @@ bool LG290P::begin(HardwareSerial &serialPort, Print *parserDebug, Print *parser
127127
bool ok = isConnected();
128128
ok = ok && getMode(devState.mode);
129129
ok = ok && scanForMsgsEnabled();
130+
ok = ok && getFirmwareVersion(firmwareVersion);
130131

131132
if (ok)
132133
{
133-
debugPrintf("Starting with %s mode, GGA %d RMC %d EPE %d PVT %d PL %d SVIN %d GSV %d",
134+
debugPrintf("Firmware version is %02d%s", firmwareVersion, firmwareVersion == 0 ? " (Unknown)" : "");
135+
debugPrintf("Starting with %s mode, GGA %d RMC %d EPE %d PVT %d PL %d SVIN %d GSV %d GST %d",
134136
devState.mode == BASEMODE ? "BASE" : "ROVER", devState.ggaRate, devState.rmcRate, devState.epeRate,
135-
devState.pvtRate, devState.plRate, devState.svinstatusRate, devState.gsvRate);
137+
devState.pvtRate, devState.plRate, devState.svinstatusRate, devState.gsvRate, devState.gstRate);
136138
}
137139
else
138140
{
@@ -450,15 +452,15 @@ bool LG290P::getMode(int &mode)
450452
bool LG290P::setPortBaudrate(int port, uint32_t newBaud)
451453
{
452454
char parms[50];
453-
snprintf(parms, sizeof parms, ",W,%d,%d", port, newBaud);
455+
snprintf(parms, sizeof parms, ",W,%d,%d", port, (int)newBaud);
454456
return sendOkCommand("PQTMCFGUART", parms);
455457
}
456458

457459
// Set baud rate on current port
458460
bool LG290P::setBaudrate(uint32_t newBaud)
459461
{
460462
char parms[50];
461-
snprintf(parms, sizeof parms, ",W,%d", newBaud);
463+
snprintf(parms, sizeof parms, ",W,%d", (int)newBaud);
462464
return sendOkCommand("PQTMCFGUART", parms);
463465
}
464466

@@ -588,6 +590,26 @@ bool LG290P::getVersionInfo(std::string &version, std::string &buildDate, std::s
588590
return ret;
589591
}
590592

593+
bool LG290P::getFirmwareVersion(int &version)
594+
{
595+
version = 0; // Unknown
596+
597+
std::string ver, buildDate, buildTime;
598+
bool ret = getVersionInfo(ver, buildDate, buildTime);
599+
if (ret && (ver.length() > strlen(firmwareVersionPrefix)))
600+
{
601+
char *spot = strstr(ver.c_str(), firmwareVersionPrefix);
602+
if (spot != NULL)
603+
{
604+
spot += strlen(firmwareVersionPrefix);
605+
version = atoi(spot);
606+
return (version > 0);
607+
}
608+
}
609+
610+
return false;
611+
}
612+
591613
bool LG290P::getFixInterval(uint16_t &fixInterval)
592614
{
593615
bool ret = sendCommand("PQTMCFGFIXRATE", ",R");
@@ -624,6 +646,7 @@ bool LG290P::setMessageRate(const char *msgName, int rate, int msgVer)
624646
else if (str == "PQTMSVINSTATUS") devState.svinstatusRate = rate;
625647
else if (str == "PQTMEPE") devState.epeRate = rate;
626648
else if (str == "GSV") devState.gsvRate = rate;
649+
else if (str == "GST") devState.gstRate = rate;
627650
}
628651
return ret;
629652
}
@@ -648,6 +671,7 @@ bool LG290P::setMessageRateOnPort(const char *msgName, int rate, int portNumber,
648671
else if (str == "PQTMSVINSTATUS") devState.svinstatusRate = rate;
649672
else if (str == "PQTMEPE") devState.epeRate = rate;
650673
else if (str == "GSV") devState.gsvRate = rate;
674+
else if (str == "GST") devState.gstRate = rate;
651675
}
652676
return ret;
653677
}
@@ -735,6 +759,9 @@ bool LG290P::scanForMsgsEnabled()
735759
ok = ok && getMessageRate("PQTMPL", devState.plRate, 1);
736760
ok = ok && getMessageRate("GSV", devState.gsvRate);
737761

762+
// GST is not available on firmware < 4
763+
getMessageRate("GST", devState.gstRate);
764+
738765
// this is a special message. getMessageRate might fail if in ROVER mode
739766
getMessageRate("PQTMSVINSTATUS", devState.svinstatusRate, 1);
740767
return ok;
@@ -1131,6 +1158,16 @@ void LG290P::nmeaHandler(SEMP_PARSE_STATE *parse)
11311158
nmea.processGGA(ptrLG290P->pvtDomain);
11321159
}
11331160

1161+
else if (id == "GST")
1162+
{
1163+
lastUpdatePvtDomain = millis(); // Update stale marker
1164+
PvtDomain &pvt = ptrLG290P->pvtDomain;
1165+
pvt.rmsPseudorangeResidual = strtod(nmea[2].c_str(), NULL);
1166+
pvt.latitudeError = strtod(nmea[6].c_str(), NULL);
1167+
pvt.longitudeError = strtod(nmea[7].c_str(), NULL);
1168+
pvt.heightError = strtod(nmea[8].c_str(), NULL);
1169+
}
1170+
11341171
else if (id == "GSV")
11351172
{
11361173
uint16_t msgNo = (uint16_t)strtoul(nmea[2].c_str(), NULL, 10);

src/SparkFun_LG290P_GNSS.h

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class LG290P
6666
struct
6767
{
6868
int mode = -1, ggaRate = -1, rmcRate = -1, pvtRate = -1, plRate = -1, epeRate = -1, svinstatusRate = -1,
69-
gsvRate = -1;
69+
gsvRate = -1, gstRate = -1;
7070
} devState;
7171
enum
7272
{
@@ -436,6 +436,15 @@ class LG290P
436436
*/
437437
bool getVersionInfo(std::string &version, std::string &buildDate, std::string &buildTime);
438438

439+
/**
440+
* @brief Gets the firmware version of the device.
441+
* @details Uses the PQTMVERNO command
442+
* @param version Reference to an int where the version will be stored.
443+
* @return true if successful, false otherwise.
444+
* @note version will be set to 0 if the get fails.
445+
*/
446+
bool getFirmwareVersion(int &version);
447+
439448
/**
440449
* @brief Gets the current fix interval.
441450
* @details Uses the PQTMCFGFIXRATE command.
@@ -1077,22 +1086,42 @@ class LG290P
10771086

10781087
/**
10791088
* @brief Returns the Estimated 2D Positioning Error
1089+
* @note This is based on what SWMaps displays - the greater of the lat and lon errors as delta-H
10801090
* @return Error in meters
10811091
*/
10821092
double get2DError()
10831093
{
1084-
ensureEpeEnabled();
1085-
return epeDomain.error2D;
1094+
if (firmwareVersion >= 4)
1095+
{
1096+
ensureGstEnabled();
1097+
if (pvtDomain.latitudeError > pvtDomain.longitudeError)
1098+
return pvtDomain.latitudeError;
1099+
return pvtDomain.longitudeError;
1100+
}
1101+
else
1102+
{
1103+
ensureEpeEnabled();
1104+
return epeDomain.error2D;
1105+
}
10861106
}
10871107

10881108
/**
10891109
* @brief Returns the Estimated 3D Positioning Error
1110+
* @note This is based on what SWMaps displays - the height error as delta-V
10901111
* @return Error in meters
10911112
*/
10921113
double get3DError()
10931114
{
1094-
ensureEpeEnabled();
1095-
return epeDomain.error3D;
1115+
if (firmwareVersion >= 4)
1116+
{
1117+
ensureGstEnabled();
1118+
return pvtDomain.heightError;
1119+
}
1120+
else
1121+
{
1122+
ensureEpeEnabled();
1123+
return epeDomain.error3D;
1124+
}
10961125
}
10971126

10981127
/**
@@ -1287,6 +1316,10 @@ class LG290P
12871316
#endif
12881317

12891318
private:
1319+
// Firmware version
1320+
int firmwareVersion = 0;
1321+
const char *firmwareVersionPrefix = "LG290P03AANR01A";
1322+
12901323
// Update times
12911324
unsigned long lastUpdatePvtDomain = 0;
12921325
unsigned long lastUpdateEcef = 0;
@@ -1336,6 +1369,11 @@ class LG290P
13361369
{
13371370
ensureMsgEnabled(devState.gsvRate > 0, "GSV");
13381371
}
1372+
void ensureGstEnabled()
1373+
{
1374+
if (firmwareVersion >= 4)
1375+
ensureMsgEnabled(devState.gstRate > 0, "GST");
1376+
}
13391377
void clearAll();
13401378
bool genericReset(const char *resetCmd);
13411379

0 commit comments

Comments
 (0)