@@ -375,6 +375,10 @@ void DevUBLOXGNSS::end(void)
375375 {
376376 delete packetUBXRXMSFRBX->callbackData;
377377 }
378+ if (packetUBXRXMSFRBX->callbackMessageData != nullptr)
379+ {
380+ delete[] packetUBXRXMSFRBX->callbackMessageData;
381+ }
378382 delete packetUBXRXMSFRBX;
379383 packetUBXRXMSFRBX = nullptr;
380384 }
@@ -4124,6 +4128,31 @@ void DevUBLOXGNSS::processUBXpacket(ubxPacket *msg)
41244128 packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackCopyValid = true;
41254129 }
41264130
4131+ // Check if we need to copy the data for the message callbacks
4132+ if (packetUBXRXMSFRBX->callbackMessageData != nullptr) // If RAM has been allocated for the copy of the data
4133+ {
4134+ for (uint16_t i = 0; i < UBX_RXM_SFRBX_MESSAGE_CALLBACK_BUFFERS; i++) // Check all available buffers
4135+ {
4136+ if ((packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackMessageCopyValid & (1 << i)) == 0) // AND the buffer is empty
4137+ {
4138+ packetUBXRXMSFRBX->callbackMessageData[i].sync1 = UBX_SYNCH_1;
4139+ packetUBXRXMSFRBX->callbackMessageData[i].sync2 = UBX_SYNCH_2;
4140+ packetUBXRXMSFRBX->callbackMessageData[i].cls = UBX_CLASS_RXM;
4141+ packetUBXRXMSFRBX->callbackMessageData[i].ID = UBX_RXM_SFRBX;
4142+ packetUBXRXMSFRBX->callbackMessageData[i].lengthLSB = msg->len & 0xFF;
4143+ packetUBXRXMSFRBX->callbackMessageData[i].lengthMSB = msg->len >> 8;
4144+
4145+ memcpy(packetUBXRXMSFRBX->callbackMessageData[i].payload, msg->payload, msg->len);
4146+
4147+ packetUBXRXMSFRBX->callbackMessageData[i].checksumA = msg->checksumA;
4148+ packetUBXRXMSFRBX->callbackMessageData[i].checksumB = msg->checksumB;
4149+
4150+ packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackMessageCopyValid |= (1 << i);
4151+ break; // abort when added
4152+ }
4153+ }
4154+ }
4155+
41274156 // Check if we need to copy the data into the file buffer
41284157 if (packetUBXRXMSFRBX->automaticFlags.flags.bits.addToFileBuffer)
41294158 {
@@ -5789,8 +5818,10 @@ void DevUBLOXGNSS::checkCallbacks(void)
57895818 packetUBXRXMCOR->automaticFlags.flags.bits.callbackCopyValid = false; // Mark the data as stale
57905819 }
57915820
5792- if (packetUBXRXMSFRBX != nullptr) // If RAM has been allocated for message storage
5793- if (packetUBXRXMSFRBX->callbackData != nullptr) // If RAM has been allocated for the copy of the data
5821+ if (packetUBXRXMSFRBX != nullptr) // If RAM has been allocated for message storage
5822+ {
5823+ if (packetUBXRXMSFRBX->callbackData != nullptr) // If RAM has been allocated for the copy of the data
5824+ {
57945825 if (packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackCopyValid == true) // If the copy of the data is valid
57955826 {
57965827 if (packetUBXRXMSFRBX->callbackPointerPtr != nullptr) // If the pointer to the callback has been defined
@@ -5799,6 +5830,22 @@ void DevUBLOXGNSS::checkCallbacks(void)
57995830 }
58005831 packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackCopyValid = false; // Mark the data as stale
58015832 }
5833+ }
5834+ if (packetUBXRXMSFRBX->callbackMessageData != nullptr) // If RAM has been allocated for the copy of the data
5835+ {
5836+ for (uint16_t i = 0; i < UBX_RXM_SFRBX_MESSAGE_CALLBACK_BUFFERS; i++)
5837+ {
5838+ if ((packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackMessageCopyValid & (1 << i)) > 0) // If the copy of the data is valid
5839+ {
5840+ if (packetUBXRXMSFRBX->callbackMessagePointerPtr != nullptr) // If the pointer to the callback has been defined
5841+ {
5842+ packetUBXRXMSFRBX->callbackMessagePointerPtr(&packetUBXRXMSFRBX->callbackMessageData[i]); // Call the callback
5843+ }
5844+ packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackMessageCopyValid &= ~(1 << i); // Mark the data as stale
5845+ }
5846+ }
5847+ }
5848+ }
58025849
58035850 if (packetUBXRXMRAWX != nullptr) // If RAM has been allocated for message storage
58045851 if (packetUBXRXMRAWX->callbackData != nullptr) // If RAM has been allocated for the copy of the data
@@ -6107,7 +6154,7 @@ bool DevUBLOXGNSS::pushRawData(uint8_t *dataBytes, size_t numDataBytes, bool cal
61076154 bytesLeftToWrite -= (size_t)bytesToWrite;
61086155 dataBytes += bytesToWrite;
61096156
6110- if (callProcessBuffer) // Try and prevent data loss during large pushes by calling checkUbloxSerial between chunks
6157+ if (callProcessBuffer) // Try and prevent data loss during large pushes by calling checkUbloxSerial between chunks
61116158 checkUbloxSerial(&packetCfg, 0, 0); // Don't call checkUbloxInternal as we already have the lock!
61126159 }
61136160 }
@@ -9015,7 +9062,6 @@ const char *DevUBLOXGNSS::getUniqueChipIdStr(UBX_SEC_UNIQID_data_t *data, uint16
90159062 return ((const char *)uniqueId);
90169063}
90179064
9018-
90199065// CONFIGURATION INTERFACE (protocol v27 and above)
90209066
90219067// Given a key, load the payload with data that can then be extracted to 8, 16, or 32 bits
@@ -13132,6 +13178,31 @@ bool DevUBLOXGNSS::setAutoRXMSFRBXcallbackPtr(void (*callbackPointerPtr)(UBX_RXM
1313213178 packetUBXRXMSFRBX->callbackPointerPtr = callbackPointerPtr;
1313313179 return (true);
1313413180}
13181+ // Use this if you want all of the SFRBX message (including sync chars, checksum, etc.) to push to the PointPerfect Library
13182+ bool DevUBLOXGNSS::setAutoRXMSFRBXmessageCallbackPtr(void (*callbackMessagePointerPtr)(UBX_RXM_SFRBX_message_data_t *), uint8_t layer, uint16_t maxWait)
13183+ {
13184+ // Enable auto messages. Set implicitUpdate to false as we expect the user to call checkUblox manually.
13185+ bool result = setAutoRXMSFRBX(true, false, layer, maxWait);
13186+ if (!result)
13187+ return (result); // Bail if setAuto failed
13188+
13189+ if (packetUBXRXMSFRBX->callbackMessageData == nullptr) // Check if RAM has been allocated for the callback copy
13190+ {
13191+ packetUBXRXMSFRBX->callbackMessageData = new UBX_RXM_SFRBX_message_data_t[UBX_RXM_SFRBX_MESSAGE_CALLBACK_BUFFERS]; // Allocate RAM for the main struct
13192+ }
13193+
13194+ if (packetUBXRXMSFRBX->callbackMessageData == nullptr)
13195+ {
13196+ #ifndef SFE_UBLOX_REDUCED_PROG_MEM
13197+ if ((_printDebug == true) || (_printLimitedDebug == true)) // This is important. Print this if doing limited debugging
13198+ _debugSerial.println(F("setAutoRXMSFRBXmessageCallbackPtr: RAM alloc failed!"));
13199+ #endif
13200+ return (false);
13201+ }
13202+
13203+ packetUBXRXMSFRBX->callbackMessagePointerPtr = callbackMessagePointerPtr;
13204+ return (true);
13205+ }
1313513206
1313613207// In case no config access to the GNSS is possible and SFRBX is send cyclically already
1313713208// set config to suitable parameters
@@ -13166,6 +13237,8 @@ bool DevUBLOXGNSS::initPacketUBXRXMSFRBX()
1316613237 packetUBXRXMSFRBX->automaticFlags.flags.all = 0;
1316713238 packetUBXRXMSFRBX->callbackPointerPtr = nullptr;
1316813239 packetUBXRXMSFRBX->callbackData = nullptr;
13240+ packetUBXRXMSFRBX->callbackMessagePointerPtr = nullptr;
13241+ packetUBXRXMSFRBX->callbackMessageData = nullptr;
1316913242 packetUBXRXMSFRBX->moduleQueried = false;
1317013243 return (true);
1317113244}
@@ -17806,11 +17879,11 @@ bool DevUBLOXGNSS::setLNAMode(sfe_ublox_lna_mode_e mode, uint8_t layer, uint16_t
1780617879}
1780717880bool DevUBLOXGNSS::getGPSL5HealthOverride(bool *override, uint8_t layer, uint16_t maxWait)
1780817881{
17809- return getVal8(UBLOX_CFG_SIGNAL_GPS_L5_HEALTH_OVERRIDE, (uint8_t *)override, layer, maxWait); // Get the GPS L5 health override status
17882+ return getVal8(UBLOX_CFG_SIGNAL_GPS_L5_HEALTH_OVERRIDE, (uint8_t *) override, layer, maxWait); // Get the GPS L5 health override status
1781017883}
1781117884bool DevUBLOXGNSS::setGPSL5HealthOverride(bool override, uint8_t layer, uint16_t maxWait)
1781217885{
17813- return setVal8(UBLOX_CFG_SIGNAL_GPS_L5_HEALTH_OVERRIDE, (uint8_t)override, layer, maxWait); // Set the GPS L5 health override status
17886+ return setVal8(UBLOX_CFG_SIGNAL_GPS_L5_HEALTH_OVERRIDE, (uint8_t) override, layer, maxWait); // Set the GPS L5 health override status
1781417887}
1781517888
1781617889#ifndef SFE_UBLOX_DISABLE_ESF
0 commit comments