A porting of a GPS decoding and presenting program within the mbos RTOS. It is not a definitive application but a study program to test NMEA full decoding library and a first approach to an RTOS. Many thanks to Andrew Levido for his support and his patience on teaching me the RTOS principles from the other side of the Earth. It uses NMEA library by Tim (xtimor@gmail.com) ported by Ken Todotani (http://mbed.org/users/todotani/) on public mbed library (http://mbed.org/users/todotani/programs/GPS_nmeaLib/5yo4h) also available, as original universal C library, on http://nmea.sourceforge.net

Dependencies:   mbos Watchdog TextLCD mbed ConfigFile

Committer:
guiott
Date:
Fri Feb 03 16:29:52 2012 +0000
Revision:
3:a2f9eb3b8a16
Parent:
0:d177c0087d1f

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
guiott 0:d177c0087d1f 1 /*
guiott 0:d177c0087d1f 2 *
guiott 0:d177c0087d1f 3 * NMEA library
guiott 0:d177c0087d1f 4 * URL: http://nmea.sourceforge.net
guiott 0:d177c0087d1f 5 * Author: Tim (xtimor@gmail.com)
guiott 0:d177c0087d1f 6 * Licence: http://www.gnu.org/licenses/lgpl.html
guiott 0:d177c0087d1f 7 * $Id: parser.c 17 2008-03-11 11:56:11Z xtimor $
guiott 0:d177c0087d1f 8 *
guiott 0:d177c0087d1f 9 */
guiott 0:d177c0087d1f 10
guiott 0:d177c0087d1f 11 /**
guiott 0:d177c0087d1f 12 * \file parser.h
guiott 0:d177c0087d1f 13 */
guiott 0:d177c0087d1f 14
guiott 0:d177c0087d1f 15 #include "nmea/tok.h"
guiott 0:d177c0087d1f 16 #include "nmea/parse.h"
guiott 0:d177c0087d1f 17 #include "nmea/parser.h"
guiott 0:d177c0087d1f 18 #include "nmea/context.h"
guiott 0:d177c0087d1f 19
guiott 0:d177c0087d1f 20 #include <string.h>
guiott 0:d177c0087d1f 21 #include <stdlib.h>
guiott 0:d177c0087d1f 22
guiott 0:d177c0087d1f 23 typedef struct _nmeaParserNODE
guiott 0:d177c0087d1f 24 {
guiott 0:d177c0087d1f 25 int packType;
guiott 0:d177c0087d1f 26 void *pack;
guiott 0:d177c0087d1f 27 struct _nmeaParserNODE *next_node;
guiott 0:d177c0087d1f 28
guiott 0:d177c0087d1f 29 } nmeaParserNODE;
guiott 0:d177c0087d1f 30
guiott 0:d177c0087d1f 31 /*
guiott 0:d177c0087d1f 32 * high level
guiott 0:d177c0087d1f 33 */
guiott 0:d177c0087d1f 34
guiott 0:d177c0087d1f 35 /**
guiott 0:d177c0087d1f 36 * \brief Initialization of parser object
guiott 0:d177c0087d1f 37 * @return true (1) - success or false (0) - fail
guiott 0:d177c0087d1f 38 */
guiott 0:d177c0087d1f 39 int nmea_parser_init(nmeaPARSER *parser)
guiott 0:d177c0087d1f 40 {
guiott 0:d177c0087d1f 41 int resv = 0;
guiott 0:d177c0087d1f 42 int buff_size = nmea_property()->parse_buff_size;
guiott 0:d177c0087d1f 43
guiott 0:d177c0087d1f 44 NMEA_ASSERT(parser);
guiott 0:d177c0087d1f 45
guiott 0:d177c0087d1f 46 if(buff_size < NMEA_MIN_PARSEBUFF)
guiott 0:d177c0087d1f 47 buff_size = NMEA_MIN_PARSEBUFF;
guiott 0:d177c0087d1f 48
guiott 0:d177c0087d1f 49 memset(parser, 0, sizeof(nmeaPARSER));
guiott 0:d177c0087d1f 50
guiott 0:d177c0087d1f 51 if(0 == (parser->buffer = (unsigned char *)malloc(buff_size)))
guiott 0:d177c0087d1f 52 nmea_error("Insufficient memory!");
guiott 0:d177c0087d1f 53 else
guiott 0:d177c0087d1f 54 {
guiott 0:d177c0087d1f 55 parser->buff_size = buff_size;
guiott 0:d177c0087d1f 56 resv = 1;
guiott 0:d177c0087d1f 57 }
guiott 0:d177c0087d1f 58
guiott 0:d177c0087d1f 59 return resv;
guiott 0:d177c0087d1f 60 }
guiott 0:d177c0087d1f 61
guiott 0:d177c0087d1f 62 /**
guiott 0:d177c0087d1f 63 * \brief Destroy parser object
guiott 0:d177c0087d1f 64 */
guiott 0:d177c0087d1f 65 void nmea_parser_destroy(nmeaPARSER *parser)
guiott 0:d177c0087d1f 66 {
guiott 0:d177c0087d1f 67 NMEA_ASSERT(parser && parser->buffer);
guiott 0:d177c0087d1f 68 free(parser->buffer);
guiott 0:d177c0087d1f 69 nmea_parser_queue_clear(parser);
guiott 0:d177c0087d1f 70 memset(parser, 0, sizeof(nmeaPARSER));
guiott 0:d177c0087d1f 71 }
guiott 0:d177c0087d1f 72
guiott 0:d177c0087d1f 73 /**
guiott 0:d177c0087d1f 74 * \brief Analysis of buffer and put results to information structure
guiott 0:d177c0087d1f 75 * @return Number of packets wos parsed
guiott 0:d177c0087d1f 76 */
guiott 0:d177c0087d1f 77 int nmea_parse(
guiott 0:d177c0087d1f 78 nmeaPARSER *parser,
guiott 0:d177c0087d1f 79 const char *buff, int buff_sz,
guiott 0:d177c0087d1f 80 nmeaINFO *info
guiott 0:d177c0087d1f 81 )
guiott 0:d177c0087d1f 82 {
guiott 0:d177c0087d1f 83 int ptype, nread = 0;
guiott 0:d177c0087d1f 84 void *pack = 0;
guiott 0:d177c0087d1f 85
guiott 0:d177c0087d1f 86 NMEA_ASSERT(parser && parser->buffer);
guiott 0:d177c0087d1f 87
guiott 0:d177c0087d1f 88 nmea_parser_push(parser, buff, buff_sz);
guiott 0:d177c0087d1f 89
guiott 0:d177c0087d1f 90 while(GPNON != (ptype = nmea_parser_pop(parser, &pack)))
guiott 0:d177c0087d1f 91 {
guiott 0:d177c0087d1f 92 nread++;
guiott 0:d177c0087d1f 93
guiott 0:d177c0087d1f 94 switch(ptype)
guiott 0:d177c0087d1f 95 {
guiott 0:d177c0087d1f 96 case GPGGA:
guiott 0:d177c0087d1f 97 nmea_GPGGA2info((nmeaGPGGA *)pack, info);
guiott 0:d177c0087d1f 98 break;
guiott 0:d177c0087d1f 99 case GPGSA:
guiott 0:d177c0087d1f 100 nmea_GPGSA2info((nmeaGPGSA *)pack, info);
guiott 0:d177c0087d1f 101 break;
guiott 0:d177c0087d1f 102 case GPGSV:
guiott 0:d177c0087d1f 103 nmea_GPGSV2info((nmeaGPGSV *)pack, info);
guiott 0:d177c0087d1f 104 break;
guiott 0:d177c0087d1f 105 case GPRMC:
guiott 0:d177c0087d1f 106 nmea_GPRMC2info((nmeaGPRMC *)pack, info);
guiott 0:d177c0087d1f 107 break;
guiott 0:d177c0087d1f 108 case GPVTG:
guiott 0:d177c0087d1f 109 nmea_GPVTG2info((nmeaGPVTG *)pack, info);
guiott 0:d177c0087d1f 110 break;
guiott 0:d177c0087d1f 111 };
guiott 0:d177c0087d1f 112
guiott 0:d177c0087d1f 113 free(pack);
guiott 0:d177c0087d1f 114 }
guiott 0:d177c0087d1f 115
guiott 0:d177c0087d1f 116 return nread;
guiott 0:d177c0087d1f 117 }
guiott 0:d177c0087d1f 118
guiott 0:d177c0087d1f 119 /*
guiott 0:d177c0087d1f 120 * low level
guiott 0:d177c0087d1f 121 */
guiott 0:d177c0087d1f 122
guiott 0:d177c0087d1f 123 int nmea_parser_real_push(nmeaPARSER *parser, const char *buff, int buff_sz)
guiott 0:d177c0087d1f 124 {
guiott 0:d177c0087d1f 125 int nparsed = 0, crc, sen_sz, ptype;
guiott 0:d177c0087d1f 126 nmeaParserNODE *node = 0;
guiott 0:d177c0087d1f 127
guiott 0:d177c0087d1f 128 NMEA_ASSERT(parser && parser->buffer);
guiott 0:d177c0087d1f 129
guiott 0:d177c0087d1f 130 /* clear unuse buffer (for debug) */
guiott 0:d177c0087d1f 131 /*
guiott 0:d177c0087d1f 132 memset(
guiott 0:d177c0087d1f 133 parser->buffer + parser->buff_use, 0,
guiott 0:d177c0087d1f 134 parser->buff_size - parser->buff_use
guiott 0:d177c0087d1f 135 );
guiott 0:d177c0087d1f 136 */
guiott 0:d177c0087d1f 137
guiott 0:d177c0087d1f 138 /* add */
guiott 0:d177c0087d1f 139 if(parser->buff_use + buff_sz >= parser->buff_size)
guiott 0:d177c0087d1f 140 nmea_parser_buff_clear(parser);
guiott 0:d177c0087d1f 141
guiott 0:d177c0087d1f 142 memcpy(parser->buffer + parser->buff_use, buff, buff_sz);
guiott 0:d177c0087d1f 143 parser->buff_use += buff_sz;
guiott 0:d177c0087d1f 144
guiott 0:d177c0087d1f 145 /* parse */
guiott 0:d177c0087d1f 146 for(;;node = 0)
guiott 0:d177c0087d1f 147 {
guiott 0:d177c0087d1f 148 sen_sz = nmea_find_tail(
guiott 0:d177c0087d1f 149 (const char *)parser->buffer + nparsed,
guiott 0:d177c0087d1f 150 (int)parser->buff_use - nparsed, &crc);
guiott 0:d177c0087d1f 151
guiott 0:d177c0087d1f 152 if(!sen_sz)
guiott 0:d177c0087d1f 153 {
guiott 0:d177c0087d1f 154 if(nparsed)
guiott 0:d177c0087d1f 155 {
guiott 0:d177c0087d1f 156 memcpy(
guiott 0:d177c0087d1f 157 parser->buffer,
guiott 0:d177c0087d1f 158 parser->buffer + nparsed,
guiott 0:d177c0087d1f 159 parser->buff_use -= nparsed);
guiott 0:d177c0087d1f 160 break;
guiott 0:d177c0087d1f 161 }
guiott 0:d177c0087d1f 162 }
guiott 0:d177c0087d1f 163 else if(crc >= 0)
guiott 0:d177c0087d1f 164 {
guiott 0:d177c0087d1f 165 ptype = nmea_pack_type(
guiott 0:d177c0087d1f 166 (const char *)parser->buffer + nparsed + 1,
guiott 0:d177c0087d1f 167 parser->buff_use - nparsed - 1);
guiott 0:d177c0087d1f 168
guiott 0:d177c0087d1f 169 if(0 == (node = (nmeaParserNODE *)malloc(sizeof(nmeaParserNODE))))
guiott 0:d177c0087d1f 170 goto mem_fail;
guiott 0:d177c0087d1f 171
guiott 0:d177c0087d1f 172 node->pack = 0;
guiott 0:d177c0087d1f 173
guiott 0:d177c0087d1f 174 switch(ptype)
guiott 0:d177c0087d1f 175 {
guiott 0:d177c0087d1f 176 case GPGGA:
guiott 0:d177c0087d1f 177 if(0 == (node->pack = malloc(sizeof(nmeaGPGGA))))
guiott 0:d177c0087d1f 178 goto mem_fail;
guiott 0:d177c0087d1f 179 node->packType = GPGGA;
guiott 0:d177c0087d1f 180 if(!nmea_parse_GPGGA(
guiott 0:d177c0087d1f 181 (const char *)parser->buffer + nparsed,
guiott 0:d177c0087d1f 182 sen_sz, (nmeaGPGGA *)node->pack))
guiott 0:d177c0087d1f 183 {
guiott 0:d177c0087d1f 184 free(node);
guiott 0:d177c0087d1f 185 node = 0;
guiott 0:d177c0087d1f 186 }
guiott 0:d177c0087d1f 187 break;
guiott 0:d177c0087d1f 188 case GPGSA:
guiott 0:d177c0087d1f 189 if(0 == (node->pack = malloc(sizeof(nmeaGPGSA))))
guiott 0:d177c0087d1f 190 goto mem_fail;
guiott 0:d177c0087d1f 191 node->packType = GPGSA;
guiott 0:d177c0087d1f 192 if(!nmea_parse_GPGSA(
guiott 0:d177c0087d1f 193 (const char *)parser->buffer + nparsed,
guiott 0:d177c0087d1f 194 sen_sz, (nmeaGPGSA *)node->pack))
guiott 0:d177c0087d1f 195 {
guiott 0:d177c0087d1f 196 free(node);
guiott 0:d177c0087d1f 197 node = 0;
guiott 0:d177c0087d1f 198 }
guiott 0:d177c0087d1f 199 break;
guiott 0:d177c0087d1f 200 case GPGSV:
guiott 0:d177c0087d1f 201 if(0 == (node->pack = malloc(sizeof(nmeaGPGSV))))
guiott 0:d177c0087d1f 202 goto mem_fail;
guiott 0:d177c0087d1f 203 node->packType = GPGSV;
guiott 0:d177c0087d1f 204 if(!nmea_parse_GPGSV(
guiott 0:d177c0087d1f 205 (const char *)parser->buffer + nparsed,
guiott 0:d177c0087d1f 206 sen_sz, (nmeaGPGSV *)node->pack))
guiott 0:d177c0087d1f 207 {
guiott 0:d177c0087d1f 208 free(node);
guiott 0:d177c0087d1f 209 node = 0;
guiott 0:d177c0087d1f 210 }
guiott 0:d177c0087d1f 211 break;
guiott 0:d177c0087d1f 212 case GPRMC:
guiott 0:d177c0087d1f 213 if(0 == (node->pack = malloc(sizeof(nmeaGPRMC))))
guiott 0:d177c0087d1f 214 goto mem_fail;
guiott 0:d177c0087d1f 215 node->packType = GPRMC;
guiott 0:d177c0087d1f 216 if(!nmea_parse_GPRMC(
guiott 0:d177c0087d1f 217 (const char *)parser->buffer + nparsed,
guiott 0:d177c0087d1f 218 sen_sz, (nmeaGPRMC *)node->pack))
guiott 0:d177c0087d1f 219 {
guiott 0:d177c0087d1f 220 free(node);
guiott 0:d177c0087d1f 221 node = 0;
guiott 0:d177c0087d1f 222 }
guiott 0:d177c0087d1f 223 break;
guiott 0:d177c0087d1f 224 case GPVTG:
guiott 0:d177c0087d1f 225 if(0 == (node->pack = malloc(sizeof(nmeaGPVTG))))
guiott 0:d177c0087d1f 226 goto mem_fail;
guiott 0:d177c0087d1f 227 node->packType = GPVTG;
guiott 0:d177c0087d1f 228 if(!nmea_parse_GPVTG(
guiott 0:d177c0087d1f 229 (const char *)parser->buffer + nparsed,
guiott 0:d177c0087d1f 230 sen_sz, (nmeaGPVTG *)node->pack))
guiott 0:d177c0087d1f 231 {
guiott 0:d177c0087d1f 232 free(node);
guiott 0:d177c0087d1f 233 node = 0;
guiott 0:d177c0087d1f 234 }
guiott 0:d177c0087d1f 235 break;
guiott 0:d177c0087d1f 236 default:
guiott 0:d177c0087d1f 237 free(node);
guiott 0:d177c0087d1f 238 node = 0;
guiott 0:d177c0087d1f 239 break;
guiott 0:d177c0087d1f 240 };
guiott 0:d177c0087d1f 241
guiott 0:d177c0087d1f 242 if(node)
guiott 0:d177c0087d1f 243 {
guiott 0:d177c0087d1f 244 if(parser->end_node)
guiott 0:d177c0087d1f 245 ((nmeaParserNODE *)parser->end_node)->next_node = node;
guiott 0:d177c0087d1f 246 parser->end_node = node;
guiott 0:d177c0087d1f 247 if(!parser->top_node)
guiott 0:d177c0087d1f 248 parser->top_node = node;
guiott 0:d177c0087d1f 249 node->next_node = 0;
guiott 0:d177c0087d1f 250 }
guiott 0:d177c0087d1f 251 }
guiott 0:d177c0087d1f 252
guiott 0:d177c0087d1f 253 nparsed += sen_sz;
guiott 0:d177c0087d1f 254 }
guiott 0:d177c0087d1f 255
guiott 0:d177c0087d1f 256 return nparsed;
guiott 0:d177c0087d1f 257
guiott 0:d177c0087d1f 258 mem_fail:
guiott 0:d177c0087d1f 259 if(node)
guiott 0:d177c0087d1f 260 free(node);
guiott 0:d177c0087d1f 261
guiott 0:d177c0087d1f 262 nmea_error("Insufficient memory!");
guiott 0:d177c0087d1f 263
guiott 0:d177c0087d1f 264 return -1;
guiott 0:d177c0087d1f 265 }
guiott 0:d177c0087d1f 266
guiott 0:d177c0087d1f 267 /**
guiott 0:d177c0087d1f 268 * \brief Analysis of buffer and keep results into parser
guiott 0:d177c0087d1f 269 * @return Number of bytes wos parsed from buffer
guiott 0:d177c0087d1f 270 */
guiott 0:d177c0087d1f 271 int nmea_parser_push(nmeaPARSER *parser, const char *buff, int buff_sz)
guiott 0:d177c0087d1f 272 {
guiott 0:d177c0087d1f 273 int nparse, nparsed = 0;
guiott 0:d177c0087d1f 274
guiott 0:d177c0087d1f 275 do
guiott 0:d177c0087d1f 276 {
guiott 0:d177c0087d1f 277 if(buff_sz > parser->buff_size)
guiott 0:d177c0087d1f 278 nparse = parser->buff_size;
guiott 0:d177c0087d1f 279 else
guiott 0:d177c0087d1f 280 nparse = buff_sz;
guiott 0:d177c0087d1f 281
guiott 0:d177c0087d1f 282 nparsed += nmea_parser_real_push(
guiott 0:d177c0087d1f 283 parser, buff, nparse);
guiott 0:d177c0087d1f 284
guiott 0:d177c0087d1f 285 buff_sz -= nparse;
guiott 0:d177c0087d1f 286
guiott 0:d177c0087d1f 287 } while(buff_sz);
guiott 0:d177c0087d1f 288
guiott 0:d177c0087d1f 289 return nparsed;
guiott 0:d177c0087d1f 290 }
guiott 0:d177c0087d1f 291
guiott 0:d177c0087d1f 292 /**
guiott 0:d177c0087d1f 293 * \brief Get type of top packet keeped into parser
guiott 0:d177c0087d1f 294 * @return Type of packet
guiott 0:d177c0087d1f 295 * @see nmeaPACKTYPE
guiott 0:d177c0087d1f 296 */
guiott 0:d177c0087d1f 297 int nmea_parser_top(nmeaPARSER *parser)
guiott 0:d177c0087d1f 298 {
guiott 0:d177c0087d1f 299 int retval = GPNON;
guiott 0:d177c0087d1f 300 nmeaParserNODE *node = (nmeaParserNODE *)parser->top_node;
guiott 0:d177c0087d1f 301
guiott 0:d177c0087d1f 302 NMEA_ASSERT(parser && parser->buffer);
guiott 0:d177c0087d1f 303
guiott 0:d177c0087d1f 304 if(node)
guiott 0:d177c0087d1f 305 retval = node->packType;
guiott 0:d177c0087d1f 306
guiott 0:d177c0087d1f 307 return retval;
guiott 0:d177c0087d1f 308 }
guiott 0:d177c0087d1f 309
guiott 0:d177c0087d1f 310 /**
guiott 0:d177c0087d1f 311 * \brief Withdraw top packet from parser
guiott 0:d177c0087d1f 312 * @return Received packet type
guiott 0:d177c0087d1f 313 * @see nmeaPACKTYPE
guiott 0:d177c0087d1f 314 */
guiott 0:d177c0087d1f 315 int nmea_parser_pop(nmeaPARSER *parser, void **pack_ptr)
guiott 0:d177c0087d1f 316 {
guiott 0:d177c0087d1f 317 int retval = GPNON;
guiott 0:d177c0087d1f 318 nmeaParserNODE *node = (nmeaParserNODE *)parser->top_node;
guiott 0:d177c0087d1f 319
guiott 0:d177c0087d1f 320 NMEA_ASSERT(parser && parser->buffer);
guiott 0:d177c0087d1f 321
guiott 0:d177c0087d1f 322 if(node)
guiott 0:d177c0087d1f 323 {
guiott 0:d177c0087d1f 324 *pack_ptr = node->pack;
guiott 0:d177c0087d1f 325 retval = node->packType;
guiott 0:d177c0087d1f 326 parser->top_node = node->next_node;
guiott 0:d177c0087d1f 327 if(!parser->top_node)
guiott 0:d177c0087d1f 328 parser->end_node = 0;
guiott 0:d177c0087d1f 329 free(node);
guiott 0:d177c0087d1f 330 }
guiott 0:d177c0087d1f 331
guiott 0:d177c0087d1f 332 return retval;
guiott 0:d177c0087d1f 333 }
guiott 0:d177c0087d1f 334
guiott 0:d177c0087d1f 335 /**
guiott 0:d177c0087d1f 336 * \brief Get top packet from parser without withdraw
guiott 0:d177c0087d1f 337 * @return Received packet type
guiott 0:d177c0087d1f 338 * @see nmeaPACKTYPE
guiott 0:d177c0087d1f 339 */
guiott 0:d177c0087d1f 340 int nmea_parser_peek(nmeaPARSER *parser, void **pack_ptr)
guiott 0:d177c0087d1f 341 {
guiott 0:d177c0087d1f 342 int retval = GPNON;
guiott 0:d177c0087d1f 343 nmeaParserNODE *node = (nmeaParserNODE *)parser->top_node;
guiott 0:d177c0087d1f 344
guiott 0:d177c0087d1f 345 NMEA_ASSERT(parser && parser->buffer);
guiott 0:d177c0087d1f 346
guiott 0:d177c0087d1f 347 if(node)
guiott 0:d177c0087d1f 348 {
guiott 0:d177c0087d1f 349 *pack_ptr = node->pack;
guiott 0:d177c0087d1f 350 retval = node->packType;
guiott 0:d177c0087d1f 351 }
guiott 0:d177c0087d1f 352
guiott 0:d177c0087d1f 353 return retval;
guiott 0:d177c0087d1f 354 }
guiott 0:d177c0087d1f 355
guiott 0:d177c0087d1f 356 /**
guiott 0:d177c0087d1f 357 * \brief Delete top packet from parser
guiott 0:d177c0087d1f 358 * @return Deleted packet type
guiott 0:d177c0087d1f 359 * @see nmeaPACKTYPE
guiott 0:d177c0087d1f 360 */
guiott 0:d177c0087d1f 361 int nmea_parser_drop(nmeaPARSER *parser)
guiott 0:d177c0087d1f 362 {
guiott 0:d177c0087d1f 363 int retval = GPNON;
guiott 0:d177c0087d1f 364 nmeaParserNODE *node = (nmeaParserNODE *)parser->top_node;
guiott 0:d177c0087d1f 365
guiott 0:d177c0087d1f 366 NMEA_ASSERT(parser && parser->buffer);
guiott 0:d177c0087d1f 367
guiott 0:d177c0087d1f 368 if(node)
guiott 0:d177c0087d1f 369 {
guiott 0:d177c0087d1f 370 if(node->pack)
guiott 0:d177c0087d1f 371 free(node->pack);
guiott 0:d177c0087d1f 372 retval = node->packType;
guiott 0:d177c0087d1f 373 parser->top_node = node->next_node;
guiott 0:d177c0087d1f 374 if(!parser->top_node)
guiott 0:d177c0087d1f 375 parser->end_node = 0;
guiott 0:d177c0087d1f 376 free(node);
guiott 0:d177c0087d1f 377 }
guiott 0:d177c0087d1f 378
guiott 0:d177c0087d1f 379 return retval;
guiott 0:d177c0087d1f 380 }
guiott 0:d177c0087d1f 381
guiott 0:d177c0087d1f 382 /**
guiott 0:d177c0087d1f 383 * \brief Clear cache of parser
guiott 0:d177c0087d1f 384 * @return true (1) - success
guiott 0:d177c0087d1f 385 */
guiott 0:d177c0087d1f 386 int nmea_parser_buff_clear(nmeaPARSER *parser)
guiott 0:d177c0087d1f 387 {
guiott 0:d177c0087d1f 388 NMEA_ASSERT(parser && parser->buffer);
guiott 0:d177c0087d1f 389 parser->buff_use = 0;
guiott 0:d177c0087d1f 390 return 1;
guiott 0:d177c0087d1f 391 }
guiott 0:d177c0087d1f 392
guiott 0:d177c0087d1f 393 /**
guiott 0:d177c0087d1f 394 * \brief Clear packets queue into parser
guiott 0:d177c0087d1f 395 * @return true (1) - success
guiott 0:d177c0087d1f 396 */
guiott 0:d177c0087d1f 397 int nmea_parser_queue_clear(nmeaPARSER *parser)
guiott 0:d177c0087d1f 398 {
guiott 0:d177c0087d1f 399 NMEA_ASSERT(parser);
guiott 0:d177c0087d1f 400 while(parser->top_node)
guiott 0:d177c0087d1f 401 nmea_parser_drop(parser);
guiott 0:d177c0087d1f 402 return 1;
guiott 0:d177c0087d1f 403 }