Skip to content

Commit e394ae0

Browse files
committed
Step_6.5
1 parent b53bffa commit e394ae0

File tree

1 file changed

+160
-0
lines changed

1 file changed

+160
-0
lines changed

src/SparkFun_u-blox_GNSS_Arduino_Library.cpp

+160
Original file line numberDiff line numberDiff line change
@@ -8785,6 +8785,166 @@ void SFE_UBLOX_GNSS::logNAVHPPOSLLH(bool enabled)
87858785
packetUBXNAVHPPOSLLH->automaticFlags.flags.bits.addToFileBuffer = (uint8_t)enabled;
87868786
}
87878787

8788+
// ***** PVAT automatic support
8789+
8790+
//Get the latest Position/Velocity/Time solution and fill all global variables
8791+
bool SFE_UBLOX_GNSS::getNAVPVAT(uint16_t maxWait)
8792+
{
8793+
if (packetUBXNAVPVAT == NULL) initPacketUBXNAVPVAT(); //Check that RAM has been allocated for the PVAT data
8794+
if (packetUBXNAVPVAT == NULL) //Bail if the RAM allocation failed
8795+
return (false);
8796+
8797+
if (packetUBXNAVPVAT->automaticFlags.flags.bits.automatic && packetUBXNAVPVAT->automaticFlags.flags.bits.implicitUpdate)
8798+
{
8799+
checkUbloxInternal(&packetCfg, UBX_CLASS_NAV, UBX_NAV_PVAT);
8800+
return packetUBXNAVPVAT->moduleQueried.moduleQueried1.bits.all;
8801+
}
8802+
else if (packetUBXNAVPVAT->automaticFlags.flags.bits.automatic && !packetUBXNAVPVAT->automaticFlags.flags.bits.implicitUpdate)
8803+
{
8804+
//Someone else has to call checkUblox for us...
8805+
return (false);
8806+
}
8807+
else
8808+
{
8809+
//The GPS is not automatically reporting navigation position so we have to poll explicitly
8810+
packetCfg.cls = UBX_CLASS_NAV;
8811+
packetCfg.id = UBX_NAV_PVAT;
8812+
packetCfg.len = 0;
8813+
packetCfg.startingSpot = 0;
8814+
//packetCfg.startingSpot = 20; //Begin listening at spot 20 so we can record up to 20+packetCfgPayloadSize = 84 bytes Note:now hard-coded in processUBX
8815+
8816+
//The data is parsed as part of processing the response
8817+
sfe_ublox_status_e retVal = sendCommand(&packetCfg, maxWait);
8818+
8819+
if (retVal == SFE_UBLOX_STATUS_DATA_RECEIVED)
8820+
return (true);
8821+
8822+
if (retVal == SFE_UBLOX_STATUS_DATA_OVERWRITTEN)
8823+
{
8824+
return (true);
8825+
}
8826+
8827+
return (false);
8828+
}
8829+
}
8830+
8831+
//Enable or disable automatic navigation message generation by the GNSS. This changes the way getPVAT
8832+
//works.
8833+
bool SFE_UBLOX_GNSS::setAutoNAVPVAT(bool enable, uint16_t maxWait)
8834+
{
8835+
return setAutoNAVPVATrate(enable ? 1 : 0, true, maxWait);
8836+
}
8837+
8838+
//Enable or disable automatic navigation message generation by the GNSS. This changes the way getPVAT
8839+
//works.
8840+
bool SFE_UBLOX_GNSS::setAutoNAVPVAT(bool enable, bool implicitUpdate, uint16_t maxWait)
8841+
{
8842+
return setAutoNAVPVATrate(enable ? 1 : 0, implicitUpdate, maxWait);
8843+
}
8844+
8845+
//Enable or disable automatic navigation message generation by the GNSS. This changes the way getPVAT
8846+
//works.
8847+
bool SFE_UBLOX_GNSS::setAutoNAVPVATrate(uint8_t rate, bool implicitUpdate, uint16_t maxWait)
8848+
{
8849+
if (packetUBXNAVPVAT == NULL) initPacketUBXNAVPVAT(); //Check that RAM has been allocated for the PVAT data
8850+
if (packetUBXNAVPVAT == NULL) //Only attempt this if RAM allocation was successful
8851+
return false;
8852+
8853+
if (rate > 127) rate = 127;
8854+
8855+
packetCfg.cls = UBX_CLASS_CFG;
8856+
packetCfg.id = UBX_CFG_MSG;
8857+
packetCfg.len = 3;
8858+
packetCfg.startingSpot = 0;
8859+
payloadCfg[0] = UBX_CLASS_NAV;
8860+
payloadCfg[1] = UBX_NAV_PVAT;
8861+
payloadCfg[2] = rate; // rate relative to navigation freq.
8862+
8863+
bool ok = ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK
8864+
if (ok)
8865+
{
8866+
packetUBXNAVPVAT->automaticFlags.flags.bits.automatic = (rate > 0);
8867+
packetUBXNAVPVAT->automaticFlags.flags.bits.implicitUpdate = implicitUpdate;
8868+
}
8869+
packetUBXNAVPVAT->moduleQueried.moduleQueried1.bits.all = false;
8870+
return ok;
8871+
}
8872+
8873+
//Enable automatic navigation message generation by the GNSS. This changes the way getPVAT works.
8874+
bool SFE_UBLOX_GNSS::setAutoNAVPVATcallback(void (*callbackPointer)(UBX_NAV_PVAT_data_t), uint16_t maxWait)
8875+
{
8876+
// Enable auto messages. Set implicitUpdate to false as we expect the user to call checkUblox manually.
8877+
bool result = setAutoNAVPVAT(true, false, maxWait);
8878+
if (!result)
8879+
return (result); // Bail if setAutoPVAT failed
8880+
8881+
if (packetUBXNAVPVAT->callbackData == NULL) //Check if RAM has been allocated for the callback copy
8882+
{
8883+
packetUBXNAVPVAT->callbackData = new UBX_NAV_PVAT_data_t; //Allocate RAM for the main struct
8884+
}
8885+
8886+
if (packetUBXNAVPVAT->callbackData == NULL)
8887+
{
8888+
if ((_printDebug == true) || (_printLimitedDebug == true)) // This is important. Print this if doing limited debugging
8889+
_debugSerial->println(F("setAutoNAVPVATcallback: RAM alloc failed!"));
8890+
return (false);
8891+
}
8892+
8893+
packetUBXNAVPVAT->callbackPointer = callbackPointer; // RAM has been allocated so now update the pointer
8894+
8895+
return (true);
8896+
}
8897+
8898+
//In case no config access to the GNSS is possible and PVAT is send cyclically already
8899+
//set config to suitable parameters
8900+
bool SFE_UBLOX_GNSS::assumeAutoNAVPVAT(bool enabled, bool implicitUpdate)
8901+
{
8902+
if (packetUBXNAVPVAT == NULL) initPacketUBXNAVPVAT(); //Check that RAM has been allocated for the PVAT data
8903+
if (packetUBXNAVPVAT == NULL) //Only attempt this if RAM allocation was successful
8904+
return false;
8905+
8906+
bool changes = packetUBXNAVPVAT->automaticFlags.flags.bits.automatic != enabled || packetUBXNAVPVAT->automaticFlags.flags.bits.implicitUpdate != implicitUpdate;
8907+
if (changes)
8908+
{
8909+
packetUBXNAVPVAT->automaticFlags.flags.bits.automatic = enabled;
8910+
packetUBXNAVPVAT->automaticFlags.flags.bits.implicitUpdate = implicitUpdate;
8911+
}
8912+
return changes;
8913+
}
8914+
8915+
// PRIVATE: Allocate RAM for packetUBXNAVPVAT and initialize it
8916+
bool SFE_UBLOX_GNSS::initPacketUBXNAVPVAT()
8917+
{
8918+
packetUBXNAVPVAT = new UBX_NAV_PVAT_t; //Allocate RAM for the main struct
8919+
if (packetUBXNAVPVAT == NULL)
8920+
{
8921+
if ((_printDebug == true) || (_printLimitedDebug == true)) // This is important. Print this if doing limited debugging
8922+
_debugSerial->println(F("initPacketUBXNAVPVAT: RAM alloc failed!"));
8923+
return (false);
8924+
}
8925+
packetUBXNAVPVAT->automaticFlags.flags.all = 0;
8926+
packetUBXNAVPVAT->callbackPointer = NULL;
8927+
packetUBXNAVPVAT->callbackData = NULL;
8928+
packetUBXNAVPVAT->moduleQueried.moduleQueried1.all = 0;
8929+
packetUBXNAVPVAT->moduleQueried.moduleQueried2.all = 0;
8930+
return (true);
8931+
}
8932+
8933+
//Mark all the PVAT data as read/stale. This is handy to get data alignment after CRC failure
8934+
void SFE_UBLOX_GNSS::flushNAVPVAT()
8935+
{
8936+
if (packetUBXNAVPVAT == NULL) return; // Bail if RAM has not been allocated (otherwise we could be writing anywhere!)
8937+
packetUBXNAVPVAT->moduleQueried.moduleQueried1.all = 0; //Mark all datums as stale (read before)
8938+
packetUBXNAVPVAT->moduleQueried.moduleQueried2.all = 0;
8939+
}
8940+
8941+
//Log this data in file buffer
8942+
void SFE_UBLOX_GNSS::logNAVPVAT(bool enabled)
8943+
{
8944+
if (packetUBXNAVPVAT == NULL) return; // Bail if RAM has not been allocated (otherwise we could be writing anywhere!)
8945+
packetUBXNAVPVAT->automaticFlags.flags.bits.addToFileBuffer = (uint8_t)enabled;
8946+
}
8947+
87888948
// ***** NAV CLOCK automatic support
87898949

87908950
bool SFE_UBLOX_GNSS::getNAVCLOCK(uint16_t maxWait)

0 commit comments

Comments
 (0)