* Parses a UBX message frame into the predefined array structure. * * UBX message structure: * Bytes 0-1: Sync characters (0xB5 0x62) * Byte 2: Message class * Byte 3: Message ID * Bytes 4-5: Payload length (little-endian) * Bytes 6-n: Payload * Byte n+1: Checksum A
(frame)
| 186 | * @returns {array} Array of values mapped according to messageMap |
| 187 | */ |
| 188 | function parse(frame) { |
| 189 | if (frame.length < 6) |
| 190 | return parsedValues; |
| 191 | |
| 192 | var msgClass = frame[0]; |
| 193 | var msgId = frame[1]; |
| 194 | var payloadLength = frame[2] | (frame[3] << 8); |
| 195 | |
| 196 | if (frame.length < 4 + payloadLength + 2) { |
| 197 | console.error("Incomplete UBX frame"); |
| 198 | return parsedValues; |
| 199 | } |
| 200 | |
| 201 | var payload = []; |
| 202 | for (var i = 0; i < payloadLength; i++) |
| 203 | payload.push(frame[4 + i]); |
| 204 | |
| 205 | var ckA = frame[4 + payloadLength]; |
| 206 | var ckB = frame[4 + payloadLength + 1]; |
| 207 | |
| 208 | if (!validateChecksum(msgClass, msgId, payloadLength, payload, ckA, ckB)) { |
| 209 | console.error("UBX checksum validation failed"); |
| 210 | return parsedValues; |
| 211 | } |
| 212 | |
| 213 | var messageKey = "0x" + msgClass.toString(16).padStart(2, '0') + |
| 214 | "-0x" + msgId.toString(16).padStart(2, '0'); |
| 215 | |
| 216 | if (!messageMap.hasOwnProperty(messageKey)) |
| 217 | return parsedValues; |
| 218 | |
| 219 | var config = messageMap[messageKey]; |
| 220 | |
| 221 | try { |
| 222 | var values = config.parser(payload); |
| 223 | for (var i = 0; i < values.length && i < config.indices.length; i++) |
| 224 | parsedValues[config.indices[i]] = values[i]; |
| 225 | } |
| 226 | catch (e) { |
| 227 | console.error("UBX parsing error:", e.message); |
| 228 | } |
| 229 | |
| 230 | return parsedValues; |
| 231 | } |
nothing calls this directly
no test coverage detected