bool GPS_UBLOX_newFrame(uint8_t data){ bool parsed = false; printf("%c",data); switch(_step) { case 1: if (PREAMBLE2 == data) { _step++; break; } _step = 0; case 0: if(PREAMBLE1 == data) _step++; break; case 2: _step++; //_class = data; _ck_b = _ck_a = data; // reset the checksum accumulators break; case 3: _step++; _ck_b += (_ck_a += data); // checksum byte _msg_id = data; break; case 4: _step++; _ck_b += (_ck_a += data); // checksum byte _payload_length = data; // payload length low byte break; case 5: _step++; _ck_b += (_ck_a += data); // checksum byte _payload_length += (uint16_t)(data<<8); if (_payload_length > 512) { _payload_length = 0; _step = 0; } _payload_counter = 0; // prepare to receive payload break; case 6: _ck_b += (_ck_a += data); // checksum byte if (_payload_counter < sizeof(_buffer)) { _buffer.bytes[_payload_counter] = data; } if (++_payload_counter == _payload_length) _step++; break; case 7: _step++; if (_ck_a != data) _step = 0; // bad checksum break; case 8: _step = 0; if (_ck_b != data) break; // bad checksum GPS_Info.GPS_Present = 1; if (UBLOX_parse_gps()) { parsed = true; } } //end switch return parsed; }
static bool gpsNewFrameUBLOX(uint8_t data) { bool parsed = false; switch (_step) { case 0: // Sync char 1 (0xB5) if (PREAMBLE1 == data) { _skip_packet = false; _step++; } else { GPS_garbageByteCount++; } break; case 1: // Sync char 2 (0x62) if (PREAMBLE2 != data) { _step = 0; break; } _step++; break; case 2: // Class _step++; _class = data; _ck_b = _ck_a = data; // reset the checksum accumulators break; case 3: // Id _step++; _ck_b += (_ck_a += data); // checksum byte _msg_id = data; break; case 4: // Payload length (part 1) _step++; _ck_b += (_ck_a += data); // checksum byte _payload_length = data; // payload length low byte break; case 5: // Payload length (part 2) _step++; _ck_b += (_ck_a += data); // checksum byte _payload_length |= (uint16_t)(data << 8); if (_payload_length > MAX_UBLOX_PAYLOAD_SIZE ) { // we can't receive the whole packet, just log the error and start searching for the next packet. shiftPacketLog(); *gpsPacketLogChar = LOG_SKIPPED; gpsData.errors++; _step = 0; break; } if (_payload_length > UBLOX_BUFFER_SIZE) { _skip_packet = true; } // prepare to receive payload _payload_counter = 0; if (_payload_length == 0) { _step = 7; } break; case 6: _ck_b += (_ck_a += data); // checksum byte if (_payload_counter < UBLOX_BUFFER_SIZE) { _buffer.bytes[_payload_counter] = data; } // NOTE: check counter BEFORE increasing so that a payload_size of 65535 is correctly handled. This can happen if garbage data is received. if (_payload_counter == _payload_length - 1) { _step++; } _payload_counter++; break; case 7: _step++; if (_ck_a != data) { _skip_packet = true; // bad checksum gpsData.errors++; } break; case 8: _step = 0; shiftPacketLog(); if (_ck_b != data) { *gpsPacketLogChar = LOG_ERROR; gpsData.errors++; break; // bad checksum } GPS_packetCount++; if (_skip_packet) { *gpsPacketLogChar = LOG_SKIPPED; break; } if (UBLOX_parse_gps()) { parsed = true; } } return parsed; }
static bool gpsNewFrameUBLOX(uint8_t data) { bool parsed = false; switch (_step) { case 0: // Sync char 1 (0xB5) if (PREAMBLE1 == data) { _skip_packet = false; _step++; } break; case 1: // Sync char 2 (0x62) if (PREAMBLE2 != data) { _step = 0; break; } _step++; break; case 2: // Class _step++; _class = data; _ck_b = _ck_a = data; // reset the checksum accumulators break; case 3: // Id _step++; _ck_b += (_ck_a += data); // checksum byte _msg_id = data; break; case 4: // Payload length (part 1) _step++; _ck_b += (_ck_a += data); // checksum byte _payload_length = data; // payload length low byte break; case 5: // Payload length (part 2) _step++; _ck_b += (_ck_a += data); // checksum byte _payload_length += (uint16_t)(data << 8); if (_payload_length > UBLOX_PAYLOAD_SIZE) { _skip_packet = true; } _payload_counter = 0; // prepare to receive payload if (_payload_length == 0) { _step = 7; } break; case 6: _ck_b += (_ck_a += data); // checksum byte if (_payload_counter < UBLOX_PAYLOAD_SIZE) { _buffer.bytes[_payload_counter] = data; } if (++_payload_counter >= _payload_length) { _step++; } break; case 7: _step++; if (_ck_a != data) { _skip_packet = true; // bad checksum gpsData.errors++; } break; case 8: _step = 0; shiftPacketLog(); if (_ck_b != data) { *gpsPacketLogChar = LOG_ERROR; gpsData.errors++; break; // bad checksum } GPS_packetCount++; if (_skip_packet) { *gpsPacketLogChar = LOG_SKIPPED; break; } if (UBLOX_parse_gps()) { parsed = true; } } return parsed; }