@@ -4121,17 +4121,23 @@ void DevUBLOXGNSS::processUBXpacket(ubxPacket *msg)
41214121 packetUBXRXMSFRBX->moduleQueried = true;
41224122
41234123 // Check if we need to copy the data for the callback
4124- if ((packetUBXRXMSFRBX->callbackData != nullptr) // If RAM has been allocated for the copy of the data
4125- && (packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackCopyValid == false)) // AND the data is stale
4124+ if (packetUBXRXMSFRBX->callbackData != nullptr) // If RAM has been allocated for the copies of the data
41264125 {
4127- memcpy(&packetUBXRXMSFRBX->callbackData->gnssId, &packetUBXRXMSFRBX->data.gnssId, sizeof(UBX_RXM_SFRBX_data_t));
4128- packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackCopyValid = true;
4126+ for (uint32_t i = 0; i < UBX_RXM_SFRBX_CALLBACK_BUFFERS; i++) // Check all available buffers
4127+ {
4128+ if ((packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackCopyValid & (1 << i)) == 0) // AND the buffer is empty
4129+ {
4130+ memcpy(&packetUBXRXMSFRBX->callbackData[i].gnssId, &packetUBXRXMSFRBX->data.gnssId, sizeof(UBX_RXM_SFRBX_data_t));
4131+ packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackCopyValid |= (1 << i);
4132+ break; // Only copy once - into first available buffer
4133+ }
4134+ }
41294135 }
41304136
41314137 // 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
4138+ if (packetUBXRXMSFRBX->callbackMessageData != nullptr) // If RAM has been allocated for the copies of the data
41334139 {
4134- for (uint16_t i = 0; i < UBX_RXM_SFRBX_MESSAGE_CALLBACK_BUFFERS ; i++) // Check all available buffers
4140+ for (uint32_t i = 0; i < UBX_RXM_SFRBX_CALLBACK_BUFFERS ; i++) // Check all available buffers
41354141 {
41364142 if ((packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackMessageCopyValid & (1 << i)) == 0) // AND the buffer is empty
41374143 {
@@ -4142,13 +4148,13 @@ void DevUBLOXGNSS::processUBXpacket(ubxPacket *msg)
41424148 packetUBXRXMSFRBX->callbackMessageData[i].lengthLSB = msg->len & 0xFF;
41434149 packetUBXRXMSFRBX->callbackMessageData[i].lengthMSB = msg->len >> 8;
41444150
4145- memcpy(packetUBXRXMSFRBX->callbackMessageData[i].payload, msg->payload, msg->len);
4151+ memcpy(& packetUBXRXMSFRBX->callbackMessageData[i].payload, msg->payload, msg->len);
41464152
41474153 packetUBXRXMSFRBX->callbackMessageData[i].checksumA = msg->checksumA;
41484154 packetUBXRXMSFRBX->callbackMessageData[i].checksumB = msg->checksumB;
41494155
41504156 packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackMessageCopyValid |= (1 << i);
4151- break; // abort when added
4157+ break; // Only copy once - into first available buffer
41524158 }
41534159 }
41544160 }
@@ -5820,22 +5826,25 @@ void DevUBLOXGNSS::checkCallbacks(void)
58205826
58215827 if (packetUBXRXMSFRBX != nullptr) // If RAM has been allocated for message storage
58225828 {
5823- if (packetUBXRXMSFRBX->callbackData != nullptr) // If RAM has been allocated for the copy of the data
5829+ if (packetUBXRXMSFRBX->callbackData != nullptr) // If RAM has been allocated for the copies of the data
58245830 {
5825- if (packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackCopyValid == true) // If the copy of the data is valid
5831+ for (uint32_t i = 0; i < UBX_RXM_SFRBX_CALLBACK_BUFFERS; i++)
58265832 {
5827- if (packetUBXRXMSFRBX->callbackPointerPtr != nullptr ) // If the pointer to the callback has been defined
5833+ if (( packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackCopyValid & (1 << i)) != 0 ) // If the copy of the data is valid
58285834 {
5829- packetUBXRXMSFRBX->callbackPointerPtr(packetUBXRXMSFRBX->callbackData); // Call the callback
5835+ if (packetUBXRXMSFRBX->callbackPointerPtr != nullptr) // If the pointer to the callback has been defined
5836+ {
5837+ packetUBXRXMSFRBX->callbackPointerPtr(&packetUBXRXMSFRBX->callbackData[i]); // Call the callback
5838+ }
5839+ packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackCopyValid &= ~(1 << i); // Mark the data as stale
58305840 }
5831- packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackCopyValid = false; // Mark the data as stale
58325841 }
58335842 }
5834- if (packetUBXRXMSFRBX->callbackMessageData != nullptr) // If RAM has been allocated for the copy of the data
5843+ if (packetUBXRXMSFRBX->callbackMessageData != nullptr) // If RAM has been allocated for the copies of the data
58355844 {
5836- for (uint16_t i = 0; i < UBX_RXM_SFRBX_MESSAGE_CALLBACK_BUFFERS ; i++)
5845+ for (uint32_t i = 0; i < UBX_RXM_SFRBX_CALLBACK_BUFFERS ; i++)
58375846 {
5838- if ((packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackMessageCopyValid & (1 << i)) > 0) // If the copy of the data is valid
5847+ if ((packetUBXRXMSFRBX->automaticFlags.flags.bits.callbackMessageCopyValid & (1 << i)) != 0) // If the copy of the data is valid
58395848 {
58405849 if (packetUBXRXMSFRBX->callbackMessagePointerPtr != nullptr) // If the pointer to the callback has been defined
58415850 {
@@ -13163,7 +13172,7 @@ bool DevUBLOXGNSS::setAutoRXMSFRBXcallbackPtr(void (*callbackPointerPtr)(UBX_RXM
1316313172
1316413173 if (packetUBXRXMSFRBX->callbackData == nullptr) // Check if RAM has been allocated for the callback copy
1316513174 {
13166- packetUBXRXMSFRBX->callbackData = new UBX_RXM_SFRBX_data_t; // Allocate RAM for the main struct
13175+ packetUBXRXMSFRBX->callbackData = new UBX_RXM_SFRBX_data_t[UBX_RXM_SFRBX_CALLBACK_BUFFERS] ; // Allocate RAM for the main struct
1316713176 }
1316813177
1316913178 if (packetUBXRXMSFRBX->callbackData == nullptr)
@@ -13188,7 +13197,7 @@ bool DevUBLOXGNSS::setAutoRXMSFRBXmessageCallbackPtr(void (*callbackMessagePoint
1318813197
1318913198 if (packetUBXRXMSFRBX->callbackMessageData == nullptr) // Check if RAM has been allocated for the callback copy
1319013199 {
13191- packetUBXRXMSFRBX->callbackMessageData = new UBX_RXM_SFRBX_message_data_t[UBX_RXM_SFRBX_MESSAGE_CALLBACK_BUFFERS ]; // Allocate RAM for the main struct
13200+ packetUBXRXMSFRBX->callbackMessageData = new UBX_RXM_SFRBX_message_data_t[UBX_RXM_SFRBX_CALLBACK_BUFFERS ]; // Allocate RAM for the main struct
1319213201 }
1319313202
1319413203 if (packetUBXRXMSFRBX->callbackMessageData == nullptr)
0 commit comments