* Parses an NMEA 0183 sentence into the predefined array structure. * * NMEA sentence structure: * $AACCC,field1,field2,...,fieldN*CS * * $ - Start delimiter * AA - Talker ID (GP=GPS, GL=GLONASS, etc.) * CCC - Sentence formatter (GGA, RMC, etc.) * fields - Comma-separat
(frame)
| 177 | * @returns {array} Array of values mapped according to sentenceTypeMap |
| 178 | */ |
| 179 | function parse(frame) { |
| 180 | frame = frame.trim(); |
| 181 | |
| 182 | if (frame.charAt(0) !== '$') |
| 183 | return parsedValues; |
| 184 | |
| 185 | // Validate checksum when present |
| 186 | if (frame.indexOf('*') !== -1 && !validateChecksum(frame)) { |
| 187 | console.error("NMEA checksum validation failed"); |
| 188 | return parsedValues; |
| 189 | } |
| 190 | |
| 191 | // Strip checksum suffix for field parsing |
| 192 | var starPos = frame.indexOf('*'); |
| 193 | var dataStr = (starPos !== -1) ? frame.substring(0, starPos) : frame; |
| 194 | var fields = dataStr.split(','); |
| 195 | |
| 196 | // Extract sentence type: "$GPGGA,..." → "GPGGA" |
| 197 | var sentenceId = fields[0].substring(1); |
| 198 | |
| 199 | if (!sentenceTypeMap.hasOwnProperty(sentenceId)) |
| 200 | return parsedValues; |
| 201 | |
| 202 | var config = sentenceTypeMap[sentenceId]; |
| 203 | |
| 204 | try { |
| 205 | var values = config.parser(fields); |
| 206 | for (var i = 0; i < values.length && i < config.indices.length; i++) |
| 207 | parsedValues[config.indices[i]] = values[i]; |
| 208 | } |
| 209 | catch (e) { |
| 210 | console.error("NMEA parsing error:", e.message); |
| 211 | } |
| 212 | |
| 213 | return parsedValues; |
| 214 | } |
nothing calls this directly
no test coverage detected