@@ -8785,6 +8785,166 @@ void SFE_UBLOX_GNSS::logNAVHPPOSLLH(bool enabled)
8785
8785
packetUBXNAVHPPOSLLH->automaticFlags.flags.bits.addToFileBuffer = (uint8_t)enabled;
8786
8786
}
8787
8787
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
+
8788
8948
// ***** NAV CLOCK automatic support
8789
8949
8790
8950
bool SFE_UBLOX_GNSS::getNAVCLOCK(uint16_t maxWait)
0 commit comments