Merge pull request #145 from mazgch/mazgch-support-NEOD9C

Add basic support NEO-D9C
This commit is contained in:
Paul
2022-07-29 08:45:54 +01:00
committed by GitHub
4 changed files with 183 additions and 0 deletions
@@ -341,6 +341,16 @@ void SFE_UBLOX_GNSS::end(void)
packetUBXRXMPMPmessage = NULL; // Redundant?
}
if (packetUBXRXMQZSSL6message != NULL)
{
if (packetUBXRXMQZSSL6message->callbackData != NULL)
{
delete [] packetUBXRXMQZSSL6message->callbackData;
}
delete packetUBXRXMQZSSL6message;
packetUBXRXMQZSSL6message = NULL; // Redundant?
}
if (packetUBXRXMCOR != NULL)
{
if (packetUBXRXMCOR->callbackData != NULL)
@@ -1398,6 +1408,10 @@ bool SFE_UBLOX_GNSS::checkAutomatic(uint8_t Class, uint8_t ID)
if ((packetUBXRXMPMP != NULL) || (packetUBXRXMPMPmessage != NULL))
result = true;
break;
case UBX_RXM_QZSSL6:
if (packetUBXRXMQZSSL6message != NULL)
result = true;
break;
case UBX_RXM_COR:
if (packetUBXRXMCOR != NULL)
result = true;
@@ -1579,6 +1593,9 @@ uint16_t SFE_UBLOX_GNSS::getMaxPayloadSize(uint8_t Class, uint8_t ID)
case UBX_RXM_PMP:
maxSize = UBX_RXM_PMP_MAX_LEN;
break;
case UBX_RXM_QZSSL6:
maxSize = UBX_RXM_QZSSL6_MAX_LEN;
break;
case UBX_RXM_COR:
maxSize = UBX_RXM_COR_LEN;
break;
@@ -3923,6 +3940,31 @@ void SFE_UBLOX_GNSS::processUBXpacket(ubxPacket *msg)
packetUBXRXMPMPmessage->automaticFlags.flags.bits.callbackCopyValid = true; // Mark the data as valid
}
}
if (msg->id == UBX_RXM_QZSSL6)
// Note: length is variable with version 0x01
// Note: the field positions depend on the version
{
// Full QZSSL6 message, including Class, ID and checksum
for (int ch = 0; ch < UBX_RXM_QZSSL6_NUM_CHANNELS; ch ++) {
if (0 == (packetUBXRXMQZSSL6message->automaticFlags.flags.bits.callbackCopyValid & (1 << ch))) {
packetUBXRXMQZSSL6message->callbackData[ch].sync1 = UBX_SYNCH_1;
packetUBXRXMQZSSL6message->callbackData[ch].sync2 = UBX_SYNCH_2;
packetUBXRXMQZSSL6message->callbackData[ch].cls = UBX_CLASS_RXM;
packetUBXRXMQZSSL6message->callbackData[ch].ID = UBX_RXM_QZSSL6;
packetUBXRXMQZSSL6message->callbackData[ch].lengthLSB = msg->len & 0xFF;
packetUBXRXMQZSSL6message->callbackData[ch].lengthMSB = msg->len >> 8;
memcpy(packetUBXRXMQZSSL6message->callbackData[ch].payload, msg->payload, msg->len);
packetUBXRXMQZSSL6message->callbackData[ch].checksumA = msg->checksumA;
packetUBXRXMQZSSL6message->callbackData[ch].checksumB = msg->checksumB;
packetUBXRXMQZSSL6message->automaticFlags.flags.bits.callbackCopyValid |= (1 << ch);
break; // abort when added
}
}
}
else if (msg->id == UBX_RXM_COR)
{
// Parse various byte fields into storage - but only if we have memory allocated for it
@@ -5563,6 +5605,19 @@ void SFE_UBLOX_GNSS::checkCallbacks(void)
packetUBXRXMPMPmessage->callbackPointerPtr(packetUBXRXMPMPmessage->callbackData); // Call the callback
packetUBXRXMPMPmessage->automaticFlags.flags.bits.callbackCopyValid = false; // Mark the data as stale
}
if ((packetUBXRXMQZSSL6message != NULL) && // If RAM has been allocated for message storage
(packetUBXRXMQZSSL6message->callbackData != NULL) && // If RAM has been allocated for the copy of the data
(packetUBXRXMQZSSL6message->callbackPointerPtr != NULL)) // If the pointer to the callback has been defined
{
for (int ch = 0; ch < UBX_RXM_QZSSL6_NUM_CHANNELS; ch ++) {
if (packetUBXRXMQZSSL6message->automaticFlags.flags.bits.callbackCopyValid & (1 << ch)) // If the copy of the data is valid
{
packetUBXRXMQZSSL6message->callbackPointerPtr( &packetUBXRXMQZSSL6message->callbackData[ch] ); // Call the callback
packetUBXRXMQZSSL6message->automaticFlags.flags.bits.callbackCopyValid &= ~(1 << ch); // clear it
}
}
}
if ((packetUBXRXMCOR != NULL) // If RAM has been allocated for message storage
&& (packetUBXRXMCOR->callbackData != NULL) // If RAM has been allocated for the copy of the data
@@ -13029,6 +13084,53 @@ bool SFE_UBLOX_GNSS::initPacketUBXRXMPMPmessage()
return (true);
}
// ***** RXM QZSSL6 automatic support
// Callback receives a pointer to the data, instead of _all_ the data. Much kinder on the stack!
bool SFE_UBLOX_GNSS::setRXMQZSSL6messageCallbackPtr(void (*callbackPointer)(UBX_RXM_QZSSL6_message_data_t *))
{
if (packetUBXRXMQZSSL6message == NULL)
initPacketUBXRXMQZSSL6message(); // Check that RAM has been allocated for the data
if (packetUBXRXMQZSSL6message == NULL) // Only attempt this if RAM allocation was successful
return false;
if (packetUBXRXMQZSSL6message->callbackData == NULL) // Check if RAM has been allocated for the callback copy
{
packetUBXRXMQZSSL6message->callbackData = new UBX_RXM_QZSSL6_message_data_t[UBX_RXM_QZSSL6_NUM_CHANNELS]; // Allocate RAM for the main struct
}
if (packetUBXRXMQZSSL6message->callbackData == NULL)
{
#ifndef SFE_UBLOX_REDUCED_PROG_MEM
if ((_printDebug == true) || (_printLimitedDebug == true)) // This is important. Print this if doing limited debugging
_debugSerial->println(F("setAutoRXMQZSSL6messagecallbackPtr: RAM alloc failed!"));
#endif
return (false);
}
packetUBXRXMQZSSL6message->callbackPointerPtr = callbackPointer;
return (true);
}
// PRIVATE: Allocate RAM for packetUBXRXMQZSSL6message and initialize it
bool SFE_UBLOX_GNSS::initPacketUBXRXMQZSSL6message()
{
packetUBXRXMQZSSL6message = new UBX_RXM_QZSSL6_message_t; // Allocate RAM for the main struct
if (packetUBXRXMQZSSL6message == NULL)
{
#ifndef SFE_UBLOX_REDUCED_PROG_MEM
if ((_printDebug == true) || (_printLimitedDebug == true)) // This is important. Print this if doing limited debugging
_debugSerial->println(F("initPacketUBXRXMQZSSL6message: RAM alloc failed!"));
#endif
return (false);
}
packetUBXRXMQZSSL6message->automaticFlags.flags.all = 0;
packetUBXRXMQZSSL6message->callbackPointerPtr = NULL;
packetUBXRXMQZSSL6message->callbackData = NULL;
return (true);
}
bool SFE_UBLOX_GNSS::setRXMCORcallbackPtr(void (*callbackPointer)(UBX_RXM_COR_data_t *))
{
if (packetUBXRXMCOR == NULL)