An implementation of the Sirf Binary and NMEA Protocol for gps devices using the SiRFstarIII chipset
Diff: BinaryPackets.h
- Revision:
- 0:43da35949666
diff -r 000000000000 -r 43da35949666 BinaryPackets.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BinaryPackets.h Thu Jun 28 21:17:29 2012 +0000 @@ -0,0 +1,268 @@ +#ifndef SIRF_PROTOCOL_BINARY_PACKETS +#define SIRF_PROTOCOL_BINARY_PACKETS + +namespace SirfStarIII { + +namespace BinaryPacket { + +enum PacketNames { + //inbound + ID_MeasuredTrackingData = 4, + ID_DGPSStatus = 27, + ID_GeodeticNavigationData = 41, + //outbound + ID_ConfigureNMEA = 129, + ID_SetBinarySerialPort = 134, + ID_SetProtocol = 135 +}; + +class SetProtocol : public SimpleSerialProtocol::Packet { +public: + SetProtocol(uint8_t _protocol) { + interface.protocol = _protocol; + } + +#pragma pack(push, 1) + struct Interface { + Interface() { + message_id = ID_SetProtocol; + } + uint8_t message_id; + uint8_t protocol; + } interface; +#pragma pack(pop) + +}; + +class SetBinarySerialPort : public SimpleSerialProtocol::Packet { +public: + SetBinarySerialPort(uint32_t _bitrate) { + interface.bitrate = swapEndian(_bitrate); + } +#pragma pack(push, 1) + struct Interface { + Interface() { + message_id = ID_SetBinarySerialPort; + data_bits = 8; + stop_bit = 1; + parity = 0; + } + uint8_t message_id; + uint32_t bitrate; + uint8_t data_bits; + uint8_t stop_bit; + uint8_t parity; + uint8_t padding; + } interface; +#pragma pack(pop) +}; + +class ConfigureNMEA : public SimpleSerialProtocol::Packet { +public: + ConfigureNMEA(uint16_t _bitrate) { + interface.bitrate = swapEndian(_bitrate);; + } + +#pragma pack(push, 1) + struct Interface { + Interface() { + message_id = ID_ConfigureNMEA; + mode = 2; + gga_message = 0; + gga_checksum = 1; + gll_message = 0; + gll_checksum = 1; + gsa_message = 0; + gsa_checksum = 1; + gsv_message = 0; + gsv_checksum = 1; + rmc_message = 1; + rmc_checksum = 1; + vtg_message = 0; + vtg_checksum = 1; + mss_message = 0; + mss_checksum = 1; + epe_message = 0; + epe_checksum = 0; + zda_message = 0; + zda_checksum = 1; + padding = 0; + } + uint8_t message_id; + uint8_t mode; + uint8_t gga_message; + uint8_t gga_checksum; + uint8_t gll_message; + uint8_t gll_checksum; + uint8_t gsa_message; + uint8_t gsa_checksum; + uint8_t gsv_message; + uint8_t gsv_checksum; + uint8_t rmc_message; + uint8_t rmc_checksum; + uint8_t vtg_message; + uint8_t vtg_checksum; + uint8_t mss_message; + uint8_t mss_checksum; + uint8_t epe_message; + uint8_t epe_checksum; + uint8_t zda_message; + uint8_t zda_checksum; + uint16_t padding; + uint16_t bitrate; + } interface; +#pragma pack(pop) + +}; + +class MeasuredTrackingData : public SimpleSerialProtocol::Packet { +public: + MeasuredTrackingData() {} + +#pragma pack(push, 1) + struct Interface { + uint8_t message_id; + int16_t gps_week; + uint32_t gps_time_of_week; + uint8_t channels; + struct { + uint8_t svid; + uint8_t azimuth; + uint8_t elevation; + uint16_t state; + uint8_t c_no_1; + uint8_t c_no_2; + uint8_t c_no_3; + uint8_t c_no_4; + uint8_t c_no_5; + uint8_t c_no_6; + uint8_t c_no_7; + uint8_t c_no_8; + uint8_t c_no_9; + uint8_t c_no_10; + } channel_data[12]; + }; +#pragma pack(pop) + + static void swapByteOrder(Interface* interface) { + interface->gps_week = swapEndian(interface->gps_week); + interface->gps_time_of_week = swapEndian(interface->gps_time_of_week); + for (int i = 0; i < 12; i++) { + interface->channel_data[i].state = swapEndian(interface->channel_data[i].state); + } + } +}; + +class DGPSStatus : public SimpleSerialProtocol::Packet { +public: +#pragma pack(push, 1) + struct Interface { + uint8_t message_id; + uint8_t dgps_source; + union { + struct { + int32_t beacon_frequency; + uint8_t beacon_bitrate; + uint8_t status; + int32_t signal_magnitude; + int16_t signal_strength; + int16_t signal_noise_ratio; + }; + struct { + uint8_t correction_age[12]; + uint16_t reserved; + }; + }; + struct { + uint8_t satalite_prn_code; + int16_t dgps_correction; + } satalite_corrections[12]; + }; +#pragma pack(pop) + + static void swapByteOrder(Interface* interface) { + for (int i = 0; i < 12; i++) { + interface->satalite_corrections[i].dgps_correction = swapEndian(interface->satalite_corrections[i].dgps_correction); + } + } +}; + +class GeodeticNavigationData : public SimpleSerialProtocol::Packet { +public: +#pragma pack(push, 1) + struct Interface { + uint8_t message_id; + uint16_t nav_valid; + uint16_t nav_type; + uint16_t week_number; + uint32_t time_of_week; + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t hour; + uint8_t minute; + uint16_t second; + uint32_t satalite_id_list; + int32_t latitude; + int32_t longitude; + int32_t altitude_elipsoid; + int32_t altitude_MSL; + int8_t map_datum; + uint16_t speed_over_ground; + uint16_t course_over_ground; + int16_t magnetic_variation; + int16_t climb_rate; + int16_t heading_rate; + uint32_t est_h_position_error; + uint32_t est_v_position_error; + uint32_t est_time_error; + uint16_t est_h_velocity_error; + int32_t clock_bias; + uint32_t clock_bias_error; + int32_t clock_drift; + uint32_t clock_drift_error; + uint32_t distance; + uint16_t distance_error; + uint16_t heading_error; + uint8_t satalites_in_fix; + uint8_t horizontal_dilution_of_presision; + uint8_t additional_mode_info; + }; +#pragma pack(pop) + + static void swapByteOrder(Interface* interface) { + interface->nav_valid = swapEndian(interface->nav_valid); + interface->nav_type = swapEndian(interface->nav_type); + interface->week_number = swapEndian(interface->week_number); + interface->time_of_week = swapEndian(interface->time_of_week); + interface->year = swapEndian(interface->year); + interface->second = swapEndian(interface->second); + interface->satalite_id_list = swapEndian(interface->satalite_id_list); + interface->latitude = swapEndian(interface->latitude); + interface->longitude = swapEndian(interface->longitude); + interface->altitude_elipsoid = swapEndian(interface->altitude_elipsoid); + interface->altitude_MSL = swapEndian(interface->altitude_MSL); + interface->speed_over_ground = swapEndian(interface->speed_over_ground); + interface->course_over_ground = swapEndian(interface->course_over_ground); + interface->magnetic_variation = swapEndian(interface->magnetic_variation); + interface->climb_rate = swapEndian(interface->climb_rate); + interface->heading_rate = swapEndian(interface->heading_rate); + interface->est_h_position_error = swapEndian(interface->est_h_position_error); + interface->est_v_position_error = swapEndian(interface->est_v_position_error); + interface->est_time_error = swapEndian(interface->est_time_error); + interface->est_h_velocity_error = swapEndian(interface->est_h_velocity_error); + interface->clock_bias = swapEndian(interface->clock_bias); + interface->clock_bias_error = swapEndian(interface->clock_bias_error); + interface->clock_drift = swapEndian(interface->clock_drift); + interface->clock_drift_error = swapEndian(interface->clock_drift_error); + interface->distance = swapEndian(interface->distance); + interface->distance_error = swapEndian(interface->distance_error); + interface->heading_error = swapEndian(interface->heading_error); + } +}; + +} + +} + +#endif \ No newline at end of file