Skip to content

Commit 080af6c

Browse files
authored
Merge pull request #24 from sparkfun/release_candidate
Update UBX Integrity Checker
2 parents e077f91 + 9d5191d commit 080af6c

File tree

1 file changed

+44
-1
lines changed

1 file changed

+44
-1
lines changed

Utils/UBX_Integrity_Checker.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
# Checks the integrity of u-blox binary files
22

33
# Written by: Paul Clark
4-
# Last update: February 21st, 2023
4+
# Last update: May 10th, 2023
55

66
# Reads a UBX file and checks the integrity of UBX, NMEA and RTCM data
77
# Will rewind and re-sync if an error is found
88
# Will create a repaired file if desired
9+
# Will print any GNTXT messages if desired
910

1011
# SparkFun code, firmware, and software is released under the MIT License (http://opensource.org/licenses/MIT)
1112
#
@@ -106,6 +107,13 @@ def crc24q(byte, sum):
106107
else:
107108
repairFilename = filename + '.repair'
108109

110+
# Ask user if GNTXT is to be printed
111+
printGNTXT = False
112+
if containsNMEA == True:
113+
response = input('Do you want to print any GNTXT messages found? (y/N): ') # Get the response
114+
if (response == 'Y') or (response == 'y'):
115+
printGNTXT = True
116+
109117
print()
110118
print('Processing',filename)
111119
print()
@@ -262,11 +270,13 @@ def crc24q(byte, sum):
262270
if (c == 0xB5): # Have we found Sync Char 1 (0xB5) if we were expecting one?
263271
if (ubx_nmea_state == sync_lost):
264272
print("UBX Sync Char 1 (0xB5) found at byte "+str(processed))
273+
print()
265274
ubx_nmea_state = looking_for_62 # Now look for Sync Char 2 (0x62)
266275
message_start_byte = processed # Record the message start byte for resync reporting
267276
elif (c == 0x24) and (containsNMEA == True): # Have we found an NMEA '$' if we were expecting one?
268277
if (ubx_nmea_state == sync_lost):
269278
print("NMEA $ found at byte "+str(processed))
279+
print()
270280
ubx_nmea_state = looking_for_asterix # Now keep going until we receive an asterix
271281
nmea_length = 0 # Reset nmea_length then use it to check for excessive message length
272282
nmea_csum = 0 # Reset the nmea_csum. Update it as each character arrives
@@ -276,9 +286,13 @@ def crc24q(byte, sum):
276286
nmea_char_4 = 0x30
277287
nmea_char_5 = 0x30
278288
message_start_byte = processed # Record the message start byte for resync reporting
289+
nmea_string = None
290+
if printGNTXT == True:
291+
nmea_string = '$'
279292
elif (c == 0xD3) and (containsRTCM == True): # Have we found 0xD3 if we were expecting one?
280293
if (ubx_nmea_state == sync_lost):
281294
print("RTCM 0xD3 found at byte "+str(processed))
295+
print()
282296
ubx_nmea_state = looking_for_RTCM_len1 # Now keep going until we receive the checksum
283297
rtcm_expected_csum = 0 # Reset the RTCM csum with a seed of 0. Update it as each character arrives
284298
rtcm_expected_csum = crc24q(c, rtcm_expected_csum) # Update expected checksum
@@ -287,8 +301,10 @@ def crc24q(byte, sum):
287301
#print("Was expecting Sync Char 0xB5, NMEA $ or RTCM 0xD3 but did not receive one!")
288302
if (c == 0x24):
289303
print("Warning: * found at byte "+str(processed)+"! Are you sure this file does not contain NMEA messages?")
304+
print()
290305
if (c == 0xD3):
291306
print("Warning: 0xD3 found at byte "+str(processed)+"! Are you sure this file does not contain RTCM messages?")
307+
print()
292308
sync_lost_at = processed
293309
ubx_nmea_state = sync_lost
294310

@@ -301,6 +317,7 @@ def crc24q(byte, sum):
301317
else:
302318
print("Panic!! Was expecting Sync Char 2 (0x62) but did not receive one!")
303319
print("Sync lost at byte "+str(processed)+". Attemting to re-sync")
320+
print()
304321
sync_lost_at = processed
305322
resync_in_progress = True
306323
ubx_nmea_state = sync_lost
@@ -344,6 +361,7 @@ def crc24q(byte, sum):
344361
if ((ubx_expected_checksum_A != ubx_checksum_A) or (ubx_expected_checksum_B != ubx_checksum_B)):
345362
print("Panic!! UBX checksum error!")
346363
print("Sync lost at byte "+str(processed)+". Attemting to re-sync.")
364+
print()
347365
sync_lost_at = processed
348366
resync_in_progress = True
349367
ubx_nmea_state = sync_lost
@@ -377,12 +395,16 @@ def crc24q(byte, sum):
377395
# NMEA messages
378396
elif (ubx_nmea_state == looking_for_asterix):
379397
nmea_length = nmea_length + 1 # Increase the message length count
398+
if nmea_string is not None:
399+
nmea_string += chr(c)
380400
if (nmea_length > max_nmea_len): # If the length is greater than max_nmea_len, something bad must have happened (sync_lost)
381401
print("Panic!! Excessive NMEA message length!")
382402
print("Sync lost at byte "+str(processed)+". Attemting to re-sync")
403+
print()
383404
sync_lost_at = processed
384405
resync_in_progress = True
385406
ubx_nmea_state = sync_lost
407+
nmea_string = None
386408
continue
387409
# If this is one of the first five characters, store it
388410
if (nmea_length <= 5):
@@ -400,6 +422,8 @@ def crc24q(byte, sum):
400422
message_type = chr(nmea_char_1) + chr(nmea_char_2) + chr(nmea_char_3) + chr(nmea_char_4) + chr(nmea_char_5) # Record the message type
401423
if (message_type == "PUBX,"): # Remove the comma from PUBX
402424
message_type = "PUBX"
425+
if (message_type != "GNTXT"): # Reset nmea_string if this is not GNTXT
426+
nmea_string = None
403427
# Now check if this is an '*'
404428
if (c == 0x2A):
405429
# Asterix received
@@ -420,6 +444,8 @@ def crc24q(byte, sum):
420444
elif (ubx_nmea_state == looking_for_csum1):
421445
# Store the first NMEA checksum character
422446
nmea_csum1 = c
447+
if nmea_string is not None:
448+
nmea_string += chr(c)
423449
ubx_nmea_state = looking_for_csum2
424450
elif (ubx_nmea_state == looking_for_csum2):
425451
# Store the second NMEA checksum character
@@ -429,30 +455,40 @@ def crc24q(byte, sum):
429455
# The checksum does not match so sync_lost
430456
print("Panic!! NMEA checksum error!")
431457
print("Sync lost at byte "+str(processed)+". Attemting to re-sync")
458+
print()
432459
sync_lost_at = processed
433460
resync_in_progress = True
434461
ubx_nmea_state = sync_lost
462+
nmea_string = None
435463
else:
436464
# Checksum was valid so wait for the terminators
465+
if nmea_string is not None:
466+
nmea_string += chr(c)
437467
ubx_nmea_state = looking_for_term1
438468
elif (ubx_nmea_state == looking_for_term1):
439469
# Check if this is CR
440470
if (c != 0x0D):
441471
print("Panic!! NMEA CR not found!")
442472
print("Sync lost at byte "+str(processed)+". Attemting to re-sync")
473+
print()
443474
sync_lost_at = processed
444475
resync_in_progress = True
445476
ubx_nmea_state = sync_lost
477+
nmea_string = None
446478
else:
479+
if nmea_string is not None:
480+
nmea_string += chr(c)
447481
ubx_nmea_state = looking_for_term2
448482
elif (ubx_nmea_state == looking_for_term2):
449483
# Check if this is LF
450484
if (c != 0x0A):
451485
print("Panic!! NMEA LF not found!")
452486
print("Sync lost at byte "+str(processed)+". Attemting to re-sync")
487+
print()
453488
sync_lost_at = processed
454489
resync_in_progress = True
455490
ubx_nmea_state = sync_lost
491+
nmea_string = None
456492
else:
457493
# Valid NMEA message was received. Check if we have seen this message type before
458494
if message_type in messages:
@@ -461,6 +497,11 @@ def crc24q(byte, sum):
461497
messages[message_type] = 1 # if we have not, set its count to 1
462498
if (nmea_length > longest_NMEA): # Update the longest NMEA message length
463499
longest_NMEA = nmea_length
500+
# Print GNTXT
501+
if nmea_string is not None and printGNTXT == True:
502+
nmea_string += chr(c)
503+
print(nmea_string)
504+
nmea_string = None
464505
# LF was received so go back to looking for B5 or a $
465506
ubx_nmea_state = looking_for_B5_dollar_D3
466507
rewind_in_progress = False # Clear rewind_in_progress
@@ -542,6 +583,7 @@ def crc24q(byte, sum):
542583
if (rtcm_expected_csum != rtcm_actual_csum):
543584
print("Panic!! RTCM checksum error!")
544585
print("Sync lost at byte "+str(processed)+". Attemting to re-sync.")
586+
print()
545587
sync_lost_at = processed
546588
resync_in_progress = True
547589
ubx_nmea_state = sync_lost
@@ -587,6 +629,7 @@ def crc24q(byte, sum):
587629
keepGoing = False
588630
else:
589631
print("Sync has been lost. Currently processing byte "+str(processed)+". Rewinding to byte "+str(rewind_to))
632+
print()
590633
fi.seek(rewind_to) # Rewind the file
591634
processed = rewind_to - 1 # Rewind processed too! (-1 is needed as processed is incremented at the start of the loop)
592635
rewind_in_progress = True # Flag that a rewind is in progress

0 commit comments

Comments
 (0)