@@ -2413,10 +2413,11 @@ void SFE_UBLOX_GNSS::processUBXpacket(ubxPacket *msg)
2413
2413
packetUBXNAVSAT->data.header.version = extractByte(msg, 4);
2414
2414
packetUBXNAVSAT->data.header.numSvs = extractByte(msg, 5);
2415
2415
2416
- for (uint8_t i = 0; (i < UBX_NAV_SAT_MAX_BLOCKS) && (i < packetUBXNAVSAT->data.header.numSvs)
2417
- && ((((uint16_t)i) * 12) < (msg->len - 8)); i++)
2416
+ // The NAV SAT message could contain data for 255 SVs max. (numSvs is uint8_t. UBX_NAV_SAT_MAX_BLOCKS is 255)
2417
+ for (uint16_t i = 0; (i < UBX_NAV_SAT_MAX_BLOCKS) && (i < ((uint16_t)packetUBXNAVSAT->data.header.numSvs))
2418
+ && ((i * 12) < (msg->len - 8)); i++)
2418
2419
{
2419
- uint16_t offset = (((uint16_t)i) * 12) + 8;
2420
+ uint16_t offset = (i * 12) + 8;
2420
2421
packetUBXNAVSAT->data.blocks[i].gnssId = extractByte(msg, offset + 0);
2421
2422
packetUBXNAVSAT->data.blocks[i].svId = extractByte(msg, offset + 1);
2422
2423
packetUBXNAVSAT->data.blocks[i].cno = extractByte(msg, offset + 2);
@@ -4217,7 +4218,7 @@ size_t SFE_UBLOX_GNSS::pushAssistNowDataInternal(size_t offset, bool skipTime, c
4217
4218
{
4218
4219
size_t dataPtr = offset; // Pointer into dataBytes
4219
4220
4220
- if (( offset >= numDataBytes) || (offset < 0) ) // Sanity check. Return now if offset is invalid.
4221
+ if (offset >= numDataBytes) // Sanity check. Return now if offset is invalid.
4221
4222
{
4222
4223
#ifndef SFE_UBLOX_REDUCED_PROG_MEM
4223
4224
if ((_printDebug == true) || (_printLimitedDebug == true)) // This is important. Print this if doing limited debugging
@@ -4230,17 +4231,6 @@ size_t SFE_UBLOX_GNSS::pushAssistNowDataInternal(size_t offset, bool skipTime, c
4230
4231
return ((size_t)0);
4231
4232
}
4232
4233
4233
- if (numDataBytes < 0) // Sanity check. Return now if numDataBytes is negative.
4234
- {
4235
- #ifndef SFE_UBLOX_REDUCED_PROG_MEM
4236
- if ((_printDebug == true) || (_printLimitedDebug == true)) // This is important. Print this if doing limited debugging
4237
- {
4238
- _debugSerial->println(F("pushAssistNowData: numDataBytes is negative! Aborting..."));
4239
- }
4240
- #endif
4241
- return ((size_t)0);
4242
- }
4243
-
4244
4234
size_t packetsProcessed = 0; // Keep count of how many packets have been processed
4245
4235
size_t bytesPushed = 0; // Keep count
4246
4236
@@ -4894,14 +4884,15 @@ size_t SFE_UBLOX_GNSS::readNavigationDatabase(uint8_t *dataBytes, size_t maxNumD
4894
4884
while (packetUBXMGAACK->head != packetUBXMGAACK->tail) // Does the MGA ACK ringbuffer contain any data?
4895
4885
{
4896
4886
// Check if we've received the correct ACK
4887
+ bool idMatch = (packetUBXMGAACK->data[packetUBXMGAACK->tail].msgId == UBX_MGA_DBD); // Check if the message ID matches
4888
+
4897
4889
bool dataAckd = true;
4898
- dataAckd &= (packetUBXMGAACK->data[packetUBXMGAACK->tail].msgId == UBX_MGA_DBD); // Check if the message ID matches
4899
4890
dataAckd &= (packetUBXMGAACK->data[packetUBXMGAACK->tail].msgPayloadStart[0] == (uint8_t)(databaseEntriesRX & 0xFF)); // Check if the ACK contents match databaseEntriesRX
4900
4891
dataAckd &= (packetUBXMGAACK->data[packetUBXMGAACK->tail].msgPayloadStart[1] == (uint8_t)((databaseEntriesRX >> 8) & 0xFF));
4901
4892
dataAckd &= (packetUBXMGAACK->data[packetUBXMGAACK->tail].msgPayloadStart[2] == (uint8_t)((databaseEntriesRX >> 16) & 0xFF));
4902
4893
dataAckd &= (packetUBXMGAACK->data[packetUBXMGAACK->tail].msgPayloadStart[3] == (uint8_t)((databaseEntriesRX >> 24) & 0xFF));
4903
4894
4904
- if (dataAckd) // Is the ACK valid?
4895
+ if (idMatch && dataAckd) // Is the ACK valid?
4905
4896
{
4906
4897
#ifndef SFE_UBLOX_REDUCED_PROG_MEM
4907
4898
if ((_printDebug == true) || (_printLimitedDebug == true)) // This is important. Print this if doing limited debugging
@@ -4917,6 +4908,25 @@ size_t SFE_UBLOX_GNSS::readNavigationDatabase(uint8_t *dataBytes, size_t maxNumD
4917
4908
#endif
4918
4909
keepGoing = false;
4919
4910
}
4911
+ else if (idMatch)
4912
+ {
4913
+ #ifndef SFE_UBLOX_REDUCED_PROG_MEM
4914
+ if ((_printDebug == true) || (_printLimitedDebug == true)) // This is important. Print this if doing limited debugging
4915
+ {
4916
+ _debugSerial->print(F("readNavigationDatabase: unexpected ACK received. databaseEntriesRX is 0x"));
4917
+ _debugSerial->print(databaseEntriesRX, HEX);
4918
+ _debugSerial->print(F(". msgPayloadStart is 0x"));
4919
+ for (uint8_t i = 4; i > 0; i--)
4920
+ {
4921
+ if (packetUBXMGAACK->data[packetUBXMGAACK->tail].msgPayloadStart[i - 1] < 0x10)
4922
+ _debugSerial->print(F("0"));
4923
+ _debugSerial->print(packetUBXMGAACK->data[packetUBXMGAACK->tail].msgPayloadStart[i - 1], HEX);
4924
+ }
4925
+ _debugSerial->println();
4926
+ }
4927
+ #endif
4928
+ }
4929
+
4920
4930
// Increment the tail
4921
4931
packetUBXMGAACK->tail++;
4922
4932
if (packetUBXMGAACK->tail == UBX_MGA_ACK_DATA0_RINGBUFFER_LEN)
0 commit comments