Skip to content

Commit cc6fe31

Browse files
authored
Merge pull request #147 from LeeLeahy2/process-rtcm
Make processRTCMframe weak
2 parents e8b03e7 + a1142c2 commit cc6fe31

File tree

2 files changed

+26
-29
lines changed

2 files changed

+26
-29
lines changed

src/SparkFun_u-blox_GNSS_Arduino_Library.cpp

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ void SFE_UBLOX_GNSS::end(void)
350350
delete packetUBXRXMQZSSL6message;
351351
packetUBXRXMQZSSL6message = NULL; // Redundant?
352352
}
353-
353+
354354
if (packetUBXRXMCOR != NULL)
355355
{
356356
if (packetUBXRXMCOR->callbackData != NULL)
@@ -2114,7 +2114,7 @@ void SFE_UBLOX_GNSS::process(uint8_t incoming, ubxPacket *incomingUBX, uint8_t r
21142114
}
21152115
else if (currentSentence == RTCM)
21162116
{
2117-
processRTCMframe(incoming); // Deal with RTCM bytes
2117+
currentSentence = processRTCMframe(incoming, &rtcmFrameCounter); // Deal with RTCM bytes
21182118
}
21192119
}
21202120

@@ -2876,13 +2876,15 @@ nmeaAutomaticFlags *SFE_UBLOX_GNSS::getNMEAFlagsPtr()
28762876
// Byte 2: 10-bits of length of this packet including the first two-ish header bytes, + 6.
28772877
// byte 3 + 4 bits: Msg type 12 bits
28782878
// Example: D3 00 7C 43 F0 ... / 0x7C = 124+6 = 130 bytes in this packet, 0x43F = Msg type 1087
2879-
void SFE_UBLOX_GNSS::processRTCMframe(uint8_t incoming)
2879+
SFE_UBLOX_GNSS::SentenceTypes SFE_UBLOX_GNSS::processRTCMframe(uint8_t incoming, uint16_t * rtcmFrameCounter)
28802880
{
2881-
if (rtcmFrameCounter == 1)
2881+
static uint16_t rtcmLen = 0;
2882+
2883+
if (*rtcmFrameCounter == 1)
28822884
{
28832885
rtcmLen = (incoming & 0x03) << 8; // Get the last two bits of this byte. Bits 8&9 of 10-bit length
28842886
}
2885-
else if (rtcmFrameCounter == 2)
2887+
else if (*rtcmFrameCounter == 2)
28862888
{
28872889
rtcmLen |= incoming; // Bits 0-7 of packet length
28882890
rtcmLen += 6; // There are 6 additional bytes of what we presume is header, msgType, CRC, and stuff
@@ -2896,15 +2898,12 @@ void SFE_UBLOX_GNSS::processRTCMframe(uint8_t incoming)
28962898
rtcmMsgType |= (incoming >> 4); //Message Type, bits 0-7
28972899
}*/
28982900

2899-
rtcmFrameCounter++;
2901+
*rtcmFrameCounter++;
29002902

29012903
processRTCM(incoming); // Here is where we expose this byte to the user
29022904

2903-
if (rtcmFrameCounter == rtcmLen)
2904-
{
2905-
// We're done!
2906-
currentSentence = NONE; // Reset and start looking for next sentence type
2907-
}
2905+
// Reset and start looking for next sentence type when done
2906+
return (*rtcmFrameCounter == rtcmLen) ? NONE : RTCM;
29082907
}
29092908

29102909
// This function is called for each byte of an RTCM frame
@@ -3944,10 +3943,10 @@ void SFE_UBLOX_GNSS::processUBXpacket(ubxPacket *msg)
39443943
// Note: length is variable with version 0x01
39453944
// Note: the field positions depend on the version
39463945
{
3947-
// Full QZSSL6 message, including Class, ID and checksum
3946+
// Full QZSSL6 message, including Class, ID and checksum
39483947
for (int ch = 0; ch < UBX_RXM_QZSSL6_NUM_CHANNELS; ch ++) {
39493948
if (0 == (packetUBXRXMQZSSL6message->automaticFlags.flags.bits.callbackCopyValid & (1 << ch))) {
3950-
3949+
39513950
packetUBXRXMQZSSL6message->callbackData[ch].sync1 = UBX_SYNCH_1;
39523951
packetUBXRXMQZSSL6message->callbackData[ch].sync2 = UBX_SYNCH_2;
39533952
packetUBXRXMQZSSL6message->callbackData[ch].cls = UBX_CLASS_RXM;
@@ -3958,12 +3957,12 @@ void SFE_UBLOX_GNSS::processUBXpacket(ubxPacket *msg)
39583957
memcpy(packetUBXRXMQZSSL6message->callbackData[ch].payload, msg->payload, msg->len);
39593958

39603959
packetUBXRXMQZSSL6message->callbackData[ch].checksumA = msg->checksumA;
3961-
packetUBXRXMQZSSL6message->callbackData[ch].checksumB = msg->checksumB;
3960+
packetUBXRXMQZSSL6message->callbackData[ch].checksumB = msg->checksumB;
39623961

39633962
packetUBXRXMQZSSL6message->automaticFlags.flags.bits.callbackCopyValid |= (1 << ch);
39643963
break; // abort when added
39653964
}
3966-
}
3965+
}
39673966
}
39683967
else if (msg->id == UBX_RXM_COR)
39693968
{
@@ -5605,7 +5604,7 @@ void SFE_UBLOX_GNSS::checkCallbacks(void)
56055604
packetUBXRXMPMPmessage->callbackPointerPtr(packetUBXRXMPMPmessage->callbackData); // Call the callback
56065605
packetUBXRXMPMPmessage->automaticFlags.flags.bits.callbackCopyValid = false; // Mark the data as stale
56075606
}
5608-
5607+
56095608
if ((packetUBXRXMQZSSL6message != NULL) && // If RAM has been allocated for message storage
56105609
(packetUBXRXMQZSSL6message->callbackData != NULL) && // If RAM has been allocated for the copy of the data
56115610
(packetUBXRXMQZSSL6message->callbackPointerPtr != NULL)) // If the pointer to the callback has been defined

src/SparkFun_u-blox_GNSS_Arduino_Library.h

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,15 @@ class SFE_UBLOX_GNSS
646646
SFE_UBLOX_GNSS(void);
647647
~SFE_UBLOX_GNSS(void);
648648

649+
// Depending on the sentence type the processor will load characters into different arrays
650+
enum SentenceTypes
651+
{
652+
NONE = 0,
653+
NMEA,
654+
UBX,
655+
RTCM
656+
} currentSentence = NONE;
657+
649658
// A default of 250ms for maxWait seems fine for I2C but is not enough for SerialUSB.
650659
// If you know you are only going to be using I2C / Qwiic communication, you can
651660
// safely reduce defaultMaxWait to 250.
@@ -738,7 +747,7 @@ class SFE_UBLOX_GNSS
738747

739748
void process(uint8_t incoming, ubxPacket *incomingUBX, uint8_t requestedClass, uint8_t requestedID); // Processes NMEA and UBX binary sentences one byte at a time
740749
void processNMEA(char incoming) __attribute__((weak)); // Given a NMEA character, do something with it. User can overwrite if desired to use something like tinyGPS or MicroNMEA libraries
741-
void processRTCMframe(uint8_t incoming); // Monitor the incoming bytes for start and length bytes
750+
SentenceTypes processRTCMframe(uint8_t incoming, uint16_t * rtcmFrameCounter) __attribute__((weak)); // Monitor the incoming bytes for start and length bytes
742751
void processRTCM(uint8_t incoming) __attribute__((weak)); // Given rtcm byte, do something with it. User can overwrite if desired to pipe bytes to radio, internet, etc.
743752
void processUBX(uint8_t incoming, ubxPacket *incomingUBX, uint8_t requestedClass, uint8_t requestedID); // Given a character, file it away into the uxb packet structure
744753
void processUBXpacket(ubxPacket *msg); // Once a packet has been received and validated, identify this packet's class/id and update internal flags
@@ -1187,7 +1196,7 @@ class SFE_UBLOX_GNSS
11871196
// You can disable them by calling (e.g.) setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_I2C, 0)
11881197
// The NEO-D9C does not support UBX-CFG-MSG
11891198
bool setRXMQZSSL6messageCallbackPtr(void (*callbackPointerPtr)(UBX_RXM_QZSSL6_message_data_t *)); // Use this if you want all of the QZSSL6 message (including sync chars, checksum, etc.) to push to a GNSS
1190-
1199+
11911200
bool setRXMCORcallbackPtr(void (*callbackPointerPtr)(UBX_RXM_COR_data_t *)); // RXM COR
11921201

11931202
bool getRXMSFRBX(uint16_t maxWait = defaultMaxWait); // RXM SFRBX
@@ -1582,15 +1591,6 @@ class SFE_UBLOX_GNSS
15821591
uint16_t rtcmFrameCounter = 0; // Tracks the type of incoming byte inside RTCM frame
15831592

15841593
private:
1585-
// Depending on the sentence type the processor will load characters into different arrays
1586-
enum SentenceTypes
1587-
{
1588-
NONE = 0,
1589-
NMEA,
1590-
UBX,
1591-
RTCM
1592-
} currentSentence = NONE;
1593-
15941594
// Depending on the ubx binary response class, store binary responses into different places
15951595
enum classTypes
15961596
{
@@ -1761,8 +1761,6 @@ class SFE_UBLOX_GNSS
17611761
uint8_t getNMEAMaxLength(); // Get the maximum length of this NMEA message
17621762
nmeaAutomaticFlags *getNMEAFlagsPtr(); // Get a pointer to the flags
17631763

1764-
uint16_t rtcmLen = 0;
1765-
17661764
// Flag to prevent reentry into checkCallbacks
17671765
// Prevent badness if the user accidentally calls checkCallbacks from inside a callback
17681766
volatile bool checkCallbacksReentrant = false;

0 commit comments

Comments
 (0)