@@ -26,6 +26,27 @@ int pin_UART1_TX = 4;
2626int  pin_UART1_RX = 13 ;
2727
2828#include  < SparkFun_Unicore_GNSS_Arduino_Library.h> // http://librarymanager/All#SparkFun_Unicore_GNSS
29+ #include  < SparkFun_Extensible_Message_Parser.h> // http://librarymanager/All#SparkFun_Extensible_Message_Parser
30+ 
31+ #define  NMEA_PARSER_INDEX            0 
32+ #define  RTCM_PARSER_INDEX            1 
33+ 
34+ //  Build the table listing all of the parsers
35+ SEMP_PARSE_ROUTINE const  parserTable[] =
36+ {
37+     sempNmeaPreamble,
38+     sempRtcmPreamble,
39+ };
40+ const  int  parserCount = sizeof (parserTable) / sizeof (parserTable[0 ]);
41+ 
42+ const  char  * const  parserNames[] =
43+ {
44+     " NMEA Parser" 
45+     " RTCM Parser" 
46+ };
47+ const  int  parserNameCount = sizeof (parserNames) / sizeof (parserNames[0 ]);
48+ 
49+ SEMP_PARSE_STATE *parse;               //  State of the parsers
2950
3051UM980 myGNSS;
3152
@@ -84,13 +105,94 @@ void setup()
84105
85106  myGNSS.saveConfiguration (); // Save the current configuration into non-volatile memory (NVM)
86107
87-   Serial.println (" Output will be a mix of NMEA and binary RTCM non-visible characters" 
108+   //  Initialize the parser
109+   parse = sempBeginParser (parserTable, parserCount,
110+                           parserNames, parserNameCount,
111+                           0 , 3000 , processMessage, " Example 17 Parser" 
112+   if  (!parse)
113+     while  (1 )
114+     {
115+       Serial.println (" HALTED: Failed to initialize the parser!" 
116+       sleep (15 );
117+     }
118+ 
119+   Serial.println (" Output will be a mix of NMEA and binary RTCM" 
88120}
89121
90122void  loop ()
91123{
92-   // Read in NMEA from  the UM980 
93-   // RTCM is binary and will appear as random characters. 
124+   //   Read the raw data one byte at a time and update  the parser state 
125+   //  based on the incoming byte 
94126  while  (SerialGNSS.available ())
95-     Serial.write (SerialGNSS.read ());
127+   {
128+     //  Read the byte from the UM980
129+     uint8_t  incoming = SerialGNSS.read ();
130+ 
131+     //  Parse this byte
132+     sempParseNextByte (parse, incoming);
133+   }
134+ }
135+ 
136+ //  Call back from within parser, for end of message
137+ //  Process a complete message incoming from parser
138+ void  processMessage (SEMP_PARSE_STATE *parse, uint16_t  type)
139+ {
140+   SEMP_SCRATCH_PAD *scratchPad = (SEMP_SCRATCH_PAD *)parse->scratchPad ;
141+   char  *typeName;
142+ 
143+   //  Display the raw message
144+   //  The type value is the index into the raw data array
145+   Serial.println ();
146+   Serial.printf (" Valid %s message: 0x%04x (%d) bytes\r\n " 
147+                 parserNames[type], parse->length , parse->length );
148+   dumpBuffer (parse->buffer , parse->length );
149+ }
150+ 
151+ //  Display the contents of a buffer
152+ void  dumpBuffer (const  uint8_t  *buffer, uint16_t  length)
153+ {
154+   int  bytes;
155+   const  uint8_t  *end;
156+   int  index;
157+   char  line[128 ];
158+   uint16_t  offset;
159+ 
160+   end = &buffer[length];
161+   offset = 0 ;
162+   while  (buffer < end)
163+   {
164+     //  Determine the number of bytes to display on the line
165+     bytes = end - buffer;
166+     if  (bytes > (16  - (offset & 0xf )))
167+       bytes = 16  - (offset & 0xf );
168+ 
169+     //  Display the offset
170+     sprintf (line, " 0x%08lx: " 
171+ 
172+     //  Skip leading bytes
173+     for  (index = 0 ; index < (offset & 0xf ); index++)
174+       sprintf (&line[strlen (line)], "    " 
175+ 
176+     //  Display the data bytes
177+     for  (index = 0 ; index < bytes; index++)
178+       sprintf (&line[strlen (line)], " %02x " 
179+ 
180+     //  Separate the data bytes from the ASCII
181+     for  (; index < (16  - (offset & 0xf )); index++)
182+       sprintf (&line[strlen (line)], "    " 
183+     sprintf (&line[strlen (line)], "  " 
184+ 
185+     //  Skip leading bytes
186+     for  (index = 0 ; index < (offset & 0xf ); index++)
187+       sprintf (&line[strlen (line)], "  " 
188+ 
189+     //  Display the ASCII values
190+     for  (index = 0 ; index < bytes; index++)
191+       sprintf (&line[strlen (line)], " %c" '  ' 0x7f )) ? ' .' 
192+     Serial.println (line);
193+ 
194+     //  Set the next line of data
195+     buffer += bytes;
196+     offset += bytes;
197+   }
96198}
0 commit comments