diff --git a/c/include/libsbp/cpp/message_traits.h b/c/include/libsbp/cpp/message_traits.h index 8d52117656..e21b46abaf 100644 --- a/c/include/libsbp/cpp/message_traits.h +++ b/c/include/libsbp/cpp/message_traits.h @@ -5658,6 +5658,47 @@ struct MessageTraits { } }; +template <> +struct MessageTraits { + static constexpr sbp_msg_type_t id = SbpMsgSsrGriddedCorrectionBounds; + static const sbp_msg_ssr_gridded_correction_bounds_t &get( + const sbp_msg_t &msg) { + return msg.ssr_gridded_correction_bounds; + } + static sbp_msg_ssr_gridded_correction_bounds_t &get(sbp_msg_t &msg) { + return msg.ssr_gridded_correction_bounds; + } + static void to_sbp_msg(const sbp_msg_ssr_gridded_correction_bounds_t &msg, + sbp_msg_t *sbp_msg) { + sbp_msg->ssr_gridded_correction_bounds = msg; + } + static sbp_msg_t to_sbp_msg( + const sbp_msg_ssr_gridded_correction_bounds_t &msg) { + sbp_msg_t sbp_msg; + sbp_msg.ssr_gridded_correction_bounds = msg; + return sbp_msg; + } + static s8 send(sbp_state_t *state, u16 sender_id, + const sbp_msg_ssr_gridded_correction_bounds_t &msg, + sbp_write_fn_t write) { + return sbp_msg_ssr_gridded_correction_bounds_send(state, sender_id, &msg, + write); + } + static s8 encode(uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_msg_ssr_gridded_correction_bounds_t &msg) { + return sbp_msg_ssr_gridded_correction_bounds_encode(buf, len, n_written, + &msg); + } + static s8 decode(const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_msg_ssr_gridded_correction_bounds_t *msg) { + return sbp_msg_ssr_gridded_correction_bounds_decode(buf, len, n_read, msg); + } + static size_t encoded_len( + const sbp_msg_ssr_gridded_correction_bounds_t &msg) { + return sbp_msg_ssr_gridded_correction_bounds_encoded_len(&msg); + } +}; + template <> struct MessageTraits { static constexpr sbp_msg_type_t id = SbpMsgSsrGriddedCorrectionDepA; @@ -5991,6 +6032,42 @@ struct MessageTraits { } }; +template <> +struct MessageTraits { + static constexpr sbp_msg_type_t id = SbpMsgSsrStecCorrectionDep; + static const sbp_msg_ssr_stec_correction_dep_t &get(const sbp_msg_t &msg) { + return msg.ssr_stec_correction_dep; + } + static sbp_msg_ssr_stec_correction_dep_t &get(sbp_msg_t &msg) { + return msg.ssr_stec_correction_dep; + } + static void to_sbp_msg(const sbp_msg_ssr_stec_correction_dep_t &msg, + sbp_msg_t *sbp_msg) { + sbp_msg->ssr_stec_correction_dep = msg; + } + static sbp_msg_t to_sbp_msg(const sbp_msg_ssr_stec_correction_dep_t &msg) { + sbp_msg_t sbp_msg; + sbp_msg.ssr_stec_correction_dep = msg; + return sbp_msg; + } + static s8 send(sbp_state_t *state, u16 sender_id, + const sbp_msg_ssr_stec_correction_dep_t &msg, + sbp_write_fn_t write) { + return sbp_msg_ssr_stec_correction_dep_send(state, sender_id, &msg, write); + } + static s8 encode(uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_msg_ssr_stec_correction_dep_t &msg) { + return sbp_msg_ssr_stec_correction_dep_encode(buf, len, n_written, &msg); + } + static s8 decode(const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_msg_ssr_stec_correction_dep_t *msg) { + return sbp_msg_ssr_stec_correction_dep_decode(buf, len, n_read, msg); + } + static size_t encoded_len(const sbp_msg_ssr_stec_correction_dep_t &msg) { + return sbp_msg_ssr_stec_correction_dep_encoded_len(&msg); + } +}; + template <> struct MessageTraits { static constexpr sbp_msg_type_t id = SbpMsgSsrStecCorrection; @@ -6027,6 +6104,42 @@ struct MessageTraits { } }; +template <> +struct MessageTraits { + static constexpr sbp_msg_type_t id = SbpMsgSsrTileDefinitionDep; + static const sbp_msg_ssr_tile_definition_dep_t &get(const sbp_msg_t &msg) { + return msg.ssr_tile_definition_dep; + } + static sbp_msg_ssr_tile_definition_dep_t &get(sbp_msg_t &msg) { + return msg.ssr_tile_definition_dep; + } + static void to_sbp_msg(const sbp_msg_ssr_tile_definition_dep_t &msg, + sbp_msg_t *sbp_msg) { + sbp_msg->ssr_tile_definition_dep = msg; + } + static sbp_msg_t to_sbp_msg(const sbp_msg_ssr_tile_definition_dep_t &msg) { + sbp_msg_t sbp_msg; + sbp_msg.ssr_tile_definition_dep = msg; + return sbp_msg; + } + static s8 send(sbp_state_t *state, u16 sender_id, + const sbp_msg_ssr_tile_definition_dep_t &msg, + sbp_write_fn_t write) { + return sbp_msg_ssr_tile_definition_dep_send(state, sender_id, &msg, write); + } + static s8 encode(uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_msg_ssr_tile_definition_dep_t &msg) { + return sbp_msg_ssr_tile_definition_dep_encode(buf, len, n_written, &msg); + } + static s8 decode(const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_msg_ssr_tile_definition_dep_t *msg) { + return sbp_msg_ssr_tile_definition_dep_decode(buf, len, n_read, msg); + } + static size_t encoded_len(const sbp_msg_ssr_tile_definition_dep_t &msg) { + return sbp_msg_ssr_tile_definition_dep_encoded_len(&msg); + } +}; + template <> struct MessageTraits { static constexpr sbp_msg_type_t id = SbpMsgSsrTileDefinition; diff --git a/c/include/libsbp/legacy/cpp/message_traits.h b/c/include/libsbp/legacy/cpp/message_traits.h index c712ef6f39..21ffb84dbd 100644 --- a/c/include/libsbp/legacy/cpp/message_traits.h +++ b/c/include/libsbp/legacy/cpp/message_traits.h @@ -985,11 +985,17 @@ struct MessageTraits { template<> -struct MessageTraits { +struct MessageTraits { static constexpr u16 id = 1526; }; +template<> +struct MessageTraits { + static constexpr u16 id = 1527; +}; + + template<> struct MessageTraits { static constexpr u16 id = 1530; @@ -997,7 +1003,7 @@ struct MessageTraits { template<> -struct MessageTraits { +struct MessageTraits { static constexpr u16 id = 1531; }; @@ -1008,6 +1014,18 @@ struct MessageTraits { }; +template<> +struct MessageTraits { + static constexpr u16 id = 1533; +}; + + +template<> +struct MessageTraits { + static constexpr u16 id = 1534; +}; + + template<> struct MessageTraits { static constexpr u16 id = 1540; diff --git a/c/include/libsbp/legacy/ssr.h b/c/include/libsbp/legacy/ssr.h index fdab10cfbb..6b3439712e 100644 --- a/c/include/libsbp/legacy/ssr.h +++ b/c/include/libsbp/legacy/ssr.h @@ -267,6 +267,27 @@ typedef struct SBP_ATTR_PACKED { stec_sat_element_t stec_sat_list[0]; /**< Array of STEC polynomial coefficients for each space vehicle. */ +} msg_ssr_stec_correction_dep_t; + +typedef struct SBP_ATTR_PACKED { + gps_time_sec_t time; /**< GNSS reference time of the bound */ + u8 num_msgs; /**< Number of messages in the dataset */ + u8 seq_num; /**< Position of this message in the dataset */ + u8 update_interval; /**< Update interval between consecutive bounds. + Similar to RTCM DF391. */ + u8 sol_id; /**< SSR Solution ID. */ +} bounds_header_t; + +typedef struct SBP_ATTR_PACKED { + bounds_header_t header; /**< Header of a STEC correction with + bounds message. */ + u8 ssr_iod_atmo; /**< IOD of the SSR atmospheric correction */ + u16 tile_set_id; /**< Tile set ID */ + u16 tile_id; /**< Tile ID */ + u8 n_sats; /**< Number of satellites. */ + stec_sat_element_t stec_sat_list[0]; /**< Array of STEC polynomial + coefficients for each space + vehicle. */ } msg_ssr_stec_correction_t; /** Gridded troposphere and STEC correction residuals @@ -292,6 +313,128 @@ typedef struct SBP_ATTR_PACKED { satellite (mean, stddev). */ } msg_ssr_gridded_correction_t; +/** None + * + * STEC polynomial and bounds for the given satellite. + */ + +typedef struct SBP_ATTR_PACKED { + stec_residual_t stec_residual; /**< STEC residuals (mean, stddev) */ + u8 stec_bound_mu; /**< STEC Error Bound Mean (range 0-17.5) i<= 200, + mean = 0.01i 200230, mean=5+0.5(i-230) [m] */ + u8 stec_bound_sig; /**< STEC Error Bound Standard Deviation (range + 0-17.5) i<= 200, mean = 0.01i 200230, mean=5+0.5(i-230) [m] */ + u8 stec_bound_mu_dot; /**< STEC Error Bound Mean First derivative + degradation parameter(range 0-0.01275) [0.00005 + m/s] */ + u8 stec_bound_sig_dot; /**< STEC Error Bound Standard Deviation First + derivative degradation parameter (range + 0-0.01275) [0.00005 m/s] */ +} stec_sat_element_integrity_t; + +typedef struct SBP_ATTR_PACKED { + bounds_header_t header; /**< Header of a bounds message. */ + u8 ssr_iod_atmo; /**< IOD of the SSR atmospheric correction. */ + u16 tile_set_id; /**< Unique identifier of the set this tile + belongs to. */ + u16 tile_id; /**< Unique identifier of this tile in the + tile set. */ + u8 tropo_qi; /**< Tropo Quality Indicator. Similar to RTCM + DF389. */ + u16 grid_point_id; /**< Index of the Grid Point. */ + tropospheric_delay_correction_t tropo_delay_correction; /**< Tropospheric + delay at + grid point. */ + u8 tropo_bound_mu; /**< Troposphere Error Bound Mean (range + 0-1.275). [0.005 m] */ + u8 tropo_bound_sig; /**< Troposphere Error Bound Standard + Deviation (range 0-1.275) [0.005 m] */ + u8 n_sats; /**< Number of satellites. */ + stec_sat_element_integrity_t stec_sat_list[0]; /**< Array of STEC + polynomial + coefficients + and its bounds + for each space + vehicle. */ +} msg_ssr_gridded_correction_bounds_t; + +/** Definition of a SSR atmospheric correction tile. + + * + * Provides the correction point coordinates for the atmospheric correction + * values in the MSG_SSR_STEC_CORRECTION_DEP and MSG_SSR_GRIDDED_CORRECTION + * messages. + * + * Based on ETSI TS 137 355 V16.1.0 (LTE Positioning Protocol) information + * element GNSS-SSR-CorrectionPoints. SBP only supports gridded arrays of + * correction points, not lists of points. + */ + +typedef struct SBP_ATTR_PACKED { + u16 tile_set_id; /**< Unique identifier of the tile set this tile + belongs to. */ + u16 tile_id; /**< Unique identifier of this tile in the tile set. + See GNSS-SSR-ArrayOfCorrectionPoints field + correctionPointSetID. */ + s16 corner_nw_lat; /**< North-West corner correction point latitude. + + The relation between the latitude X in the range + [-90, 90] and the coded number N is: + + N = floor((X / 90) * 2^14) + + See GNSS-SSR-ArrayOfCorrectionPoints field + referencePointLatitude. [encoded degrees] */ + s16 corner_nw_lon; /**< North-West corner correction point longitude. + + The relation between the longitude X in the range + [-180, 180] and the coded number N is: + + N = floor((X / 180) * 2^15) + + See GNSS-SSR-ArrayOfCorrectionPoints field + referencePointLongitude. [encoded degrees] */ + u16 spacing_lat; /**< Spacing of the correction points in the latitude + direction. + + See GNSS-SSR-ArrayOfCorrectionPoints field + stepOfLatitude. [0.01 degrees] */ + u16 spacing_lon; /**< Spacing of the correction points in the longitude + direction. + + See GNSS-SSR-ArrayOfCorrectionPoints field + stepOfLongitude. [0.01 degrees] */ + u16 rows; /**< Number of steps in the latitude direction. + + See GNSS-SSR-ArrayOfCorrectionPoints field + numberOfStepsLatitude. */ + u16 cols; /**< Number of steps in the longitude direction. + + See GNSS-SSR-ArrayOfCorrectionPoints field + numberOfStepsLongitude. */ + u64 bitmask; /**< Specifies the availability of correction data at + the correction points in the array. + + If a specific bit is enabled (set to 1), the + correction is not available. Only the first rows + * cols bits are used, the remainder are set to 0. + If there are more then 64 correction points the + remaining corrections are always available. + + Starting with the northwest corner of the array + (top left on a north oriented map) the correction + points are enumerated with row precedence - first + row west to east, second row west to east, until + last row west to east - ending with the southeast + corner of the array. + + See GNSS-SSR-ArrayOfCorrectionPoints field + bitmaskOfGrids but note the definition of the + bits is inverted. */ +} msg_ssr_tile_definition_dep_t; + /** Definition of a SSR atmospheric correction tile. * @@ -305,6 +448,7 @@ typedef struct SBP_ATTR_PACKED { */ typedef struct SBP_ATTR_PACKED { + u8 ssr_sol_id; /**< SSR Solution ID. */ u16 tile_set_id; /**< Unique identifier of the tile set this tile belongs to. */ u16 tile_id; /**< Unique identifier of this tile in the tile set. @@ -520,15 +664,6 @@ typedef struct SBP_ATTR_PACKED { are encoded as u8 integers. */ } msg_ssr_grid_definition_dep_a_t; -typedef struct SBP_ATTR_PACKED { - gps_time_sec_t time; /**< GNSS reference time of the bound */ - u8 num_msgs; /**< Number of messages in the dataset */ - u8 seq_num; /**< Position of this message in the dataset */ - u8 update_interval; /**< Update interval between consecutive bounds. - Similar to RTCM DF391. */ - u8 sol_id; /**< SSR Solution ID. */ -} bounds_header_t; - /** None * * Orbit and clock bound. diff --git a/c/include/libsbp/sbp_msg_type.h b/c/include/libsbp/sbp_msg_type.h index c89c996544..ebc7284848 100644 --- a/c/include/libsbp/sbp_msg_type.h +++ b/c/include/libsbp/sbp_msg_type.h @@ -210,6 +210,7 @@ typedef enum { SbpMsgSsrCodeBiases = SBP_MSG_SSR_CODE_BIASES, SbpMsgSsrCodePhaseBiasesBounds = SBP_MSG_SSR_CODE_PHASE_BIASES_BOUNDS, SbpMsgSsrGridDefinitionDepA = SBP_MSG_SSR_GRID_DEFINITION_DEP_A, + SbpMsgSsrGriddedCorrectionBounds = SBP_MSG_SSR_GRIDDED_CORRECTION_BOUNDS, SbpMsgSsrGriddedCorrectionDepA = SBP_MSG_SSR_GRIDDED_CORRECTION_DEP_A, SbpMsgSsrGriddedCorrectionNoStdDepA = SBP_MSG_SSR_GRIDDED_CORRECTION_NO_STD_DEP_A, @@ -220,7 +221,9 @@ typedef enum { SbpMsgSsrPhaseBiases = SBP_MSG_SSR_PHASE_BIASES, SbpMsgSsrSatelliteApc = SBP_MSG_SSR_SATELLITE_APC, SbpMsgSsrStecCorrectionDepA = SBP_MSG_SSR_STEC_CORRECTION_DEP_A, + SbpMsgSsrStecCorrectionDep = SBP_MSG_SSR_STEC_CORRECTION_DEP, SbpMsgSsrStecCorrection = SBP_MSG_SSR_STEC_CORRECTION, + SbpMsgSsrTileDefinitionDep = SBP_MSG_SSR_TILE_DEFINITION_DEP, SbpMsgSsrTileDefinition = SBP_MSG_SSR_TILE_DEFINITION, SbpMsgStartup = SBP_MSG_STARTUP, SbpMsgStatusJournal = SBP_MSG_STATUS_JOURNAL, diff --git a/c/include/libsbp/ssr_macros.h b/c/include/libsbp/ssr_macros.h index 0e9022ab72..2f7592eebd 100644 --- a/c/include/libsbp/ssr_macros.h +++ b/c/include/libsbp/ssr_macros.h @@ -132,7 +132,37 @@ */ #define SBP_MSG_SSR_PHASE_BIASES_ENCODED_OVERHEAD 15u -#define SBP_MSG_SSR_STEC_CORRECTION 0x05FB +#define SBP_MSG_SSR_STEC_CORRECTION_DEP 0x05FB +/** + * The maximum number of items that can be stored in + * sbp_msg_ssr_stec_correction_dep_t::stec_sat_list (V4 API) or + * msg_ssr_stec_correction_dep_t::stec_sat_list (legacy API) before the maximum + * SBP message size is exceeded + */ +#define SBP_MSG_SSR_STEC_CORRECTION_DEP_STEC_SAT_LIST_MAX 21u + +/** + * Encoded length of sbp_msg_ssr_stec_correction_dep_t (V4 API) and + * msg_ssr_stec_correction_dep_t (legacy API) + * + * This type is not fixed size and an instance of this message may be longer + * than the value indicated by this symbol. Users of the V4 API should call + * #sbp_msg_ssr_stec_correction_dep_encoded_len to determine the actual size of + * an instance of this message. Users of the legacy API are required to track + * the encoded message length when interacting with the legacy type. + * + * See the documentation for libsbp for more details regarding the message + * structure and its variable length component(s) + */ +#define SBP_MSG_SSR_STEC_CORRECTION_DEP_ENCODED_OVERHEAD 14u + +/** + * Encoded length of sbp_bounds_header_t (V4 API) and + * bounds_header_t (legacy API) + */ +#define SBP_BOUNDS_HEADER_ENCODED_LEN 10u + +#define SBP_MSG_SSR_STEC_CORRECTION 0x05FD /** * The maximum number of items that can be stored in * sbp_msg_ssr_stec_correction_t::stec_sat_list (V4 API) or @@ -154,7 +184,7 @@ * See the documentation for libsbp for more details regarding the message * structure and its variable length component(s) */ -#define SBP_MSG_SSR_STEC_CORRECTION_ENCODED_OVERHEAD 14u +#define SBP_MSG_SSR_STEC_CORRECTION_ENCODED_OVERHEAD 16u #define SBP_MSG_SSR_GRIDDED_CORRECTION 0x05FC /** @@ -180,12 +210,49 @@ */ #define SBP_MSG_SSR_GRIDDED_CORRECTION_ENCODED_OVERHEAD 23u -#define SBP_MSG_SSR_TILE_DEFINITION 0x05F6 +/** + * Encoded length of sbp_stec_sat_element_integrity_t (V4 API) and + * stec_sat_element_integrity_t (legacy API) + */ +#define SBP_STEC_SAT_ELEMENT_INTEGRITY_ENCODED_LEN 9u + +#define SBP_MSG_SSR_GRIDDED_CORRECTION_BOUNDS 0x05FE +/** + * The maximum number of items that can be stored in + * sbp_msg_ssr_gridded_correction_bounds_t::stec_sat_list (V4 API) or + * msg_ssr_gridded_correction_bounds_t::stec_sat_list (legacy API) before the + * maximum SBP message size is exceeded + */ +#define SBP_MSG_SSR_GRIDDED_CORRECTION_BOUNDS_STEC_SAT_LIST_MAX 25u + +/** + * Encoded length of sbp_msg_ssr_gridded_correction_bounds_t (V4 API) and + * msg_ssr_gridded_correction_bounds_t (legacy API) + * + * This type is not fixed size and an instance of this message may be longer + * than the value indicated by this symbol. Users of the V4 API should call + * #sbp_msg_ssr_gridded_correction_bounds_encoded_len to determine the actual + * size of an instance of this message. Users of the legacy API are required to + * track the encoded message length when interacting with the legacy type. + * + * See the documentation for libsbp for more details regarding the message + * structure and its variable length component(s) + */ +#define SBP_MSG_SSR_GRIDDED_CORRECTION_BOUNDS_ENCODED_OVERHEAD 25u + +#define SBP_MSG_SSR_TILE_DEFINITION_DEP 0x05F6 +/** + * Encoded length of sbp_msg_ssr_tile_definition_dep_t (V4 API) and + * msg_ssr_tile_definition_dep_t (legacy API) + */ +#define SBP_MSG_SSR_TILE_DEFINITION_DEP_ENCODED_LEN 24u + +#define SBP_MSG_SSR_TILE_DEFINITION 0x05F7 /** * Encoded length of sbp_msg_ssr_tile_definition_t (V4 API) and * msg_ssr_tile_definition_t (legacy API) */ -#define SBP_MSG_SSR_TILE_DEFINITION_ENCODED_LEN 24u +#define SBP_MSG_SSR_TILE_DEFINITION_ENCODED_LEN 25u #define SBP_SATELLITEAPC_SATELLITE_TYPE_MASK (0x1fu) #define SBP_SATELLITEAPC_SATELLITE_TYPE_SHIFT (0u) @@ -385,12 +452,6 @@ */ #define SBP_MSG_SSR_GRID_DEFINITION_DEP_A_ENCODED_OVERHEAD 9u -/** - * Encoded length of sbp_bounds_header_t (V4 API) and - * bounds_header_t (legacy API) - */ -#define SBP_BOUNDS_HEADER_ENCODED_LEN 10u - /** * Encoded length of sbp_orbit_clock_bound_t (V4 API) and * orbit_clock_bound_t (legacy API) diff --git a/c/include/libsbp/v4/sbp_msg.h b/c/include/libsbp/v4/sbp_msg.h index c7dadfe941..a2636175dc 100644 --- a/c/include/libsbp/v4/sbp_msg.h +++ b/c/include/libsbp/v4/sbp_msg.h @@ -216,6 +216,7 @@ typedef union { sbp_msg_ssr_code_biases_t ssr_code_biases; sbp_msg_ssr_code_phase_biases_bounds_t ssr_code_phase_biases_bounds; sbp_msg_ssr_grid_definition_dep_a_t ssr_grid_definition_dep_a; + sbp_msg_ssr_gridded_correction_bounds_t ssr_gridded_correction_bounds; sbp_msg_ssr_gridded_correction_dep_a_t ssr_gridded_correction_dep_a; sbp_msg_ssr_gridded_correction_no_std_dep_a_t ssr_gridded_correction_no_std_dep_a; @@ -226,7 +227,9 @@ typedef union { sbp_msg_ssr_phase_biases_t ssr_phase_biases; sbp_msg_ssr_satellite_apc_t ssr_satellite_apc; sbp_msg_ssr_stec_correction_dep_a_t ssr_stec_correction_dep_a; + sbp_msg_ssr_stec_correction_dep_t ssr_stec_correction_dep; sbp_msg_ssr_stec_correction_t ssr_stec_correction; + sbp_msg_ssr_tile_definition_dep_t ssr_tile_definition_dep; sbp_msg_ssr_tile_definition_t ssr_tile_definition; sbp_msg_startup_t startup; sbp_msg_status_journal_t status_journal; @@ -714,6 +717,9 @@ static inline s8 sbp_message_encode(uint8_t *buf, uint8_t len, case SbpMsgSsrGridDefinitionDepA: return sbp_msg_ssr_grid_definition_dep_a_encode( buf, len, n_written, &msg->ssr_grid_definition_dep_a); + case SbpMsgSsrGriddedCorrectionBounds: + return sbp_msg_ssr_gridded_correction_bounds_encode( + buf, len, n_written, &msg->ssr_gridded_correction_bounds); case SbpMsgSsrGriddedCorrectionDepA: return sbp_msg_ssr_gridded_correction_dep_a_encode( buf, len, n_written, &msg->ssr_gridded_correction_dep_a); @@ -741,9 +747,15 @@ static inline s8 sbp_message_encode(uint8_t *buf, uint8_t len, case SbpMsgSsrStecCorrectionDepA: return sbp_msg_ssr_stec_correction_dep_a_encode( buf, len, n_written, &msg->ssr_stec_correction_dep_a); + case SbpMsgSsrStecCorrectionDep: + return sbp_msg_ssr_stec_correction_dep_encode( + buf, len, n_written, &msg->ssr_stec_correction_dep); case SbpMsgSsrStecCorrection: return sbp_msg_ssr_stec_correction_encode(buf, len, n_written, &msg->ssr_stec_correction); + case SbpMsgSsrTileDefinitionDep: + return sbp_msg_ssr_tile_definition_dep_encode( + buf, len, n_written, &msg->ssr_tile_definition_dep); case SbpMsgSsrTileDefinition: return sbp_msg_ssr_tile_definition_encode(buf, len, n_written, &msg->ssr_tile_definition); @@ -1290,6 +1302,9 @@ static inline s8 sbp_message_decode(const uint8_t *buf, uint8_t len, case SbpMsgSsrGridDefinitionDepA: return sbp_msg_ssr_grid_definition_dep_a_decode( buf, len, n_read, &msg->ssr_grid_definition_dep_a); + case SbpMsgSsrGriddedCorrectionBounds: + return sbp_msg_ssr_gridded_correction_bounds_decode( + buf, len, n_read, &msg->ssr_gridded_correction_bounds); case SbpMsgSsrGriddedCorrectionDepA: return sbp_msg_ssr_gridded_correction_dep_a_decode( buf, len, n_read, &msg->ssr_gridded_correction_dep_a); @@ -1317,9 +1332,15 @@ static inline s8 sbp_message_decode(const uint8_t *buf, uint8_t len, case SbpMsgSsrStecCorrectionDepA: return sbp_msg_ssr_stec_correction_dep_a_decode( buf, len, n_read, &msg->ssr_stec_correction_dep_a); + case SbpMsgSsrStecCorrectionDep: + return sbp_msg_ssr_stec_correction_dep_decode( + buf, len, n_read, &msg->ssr_stec_correction_dep); case SbpMsgSsrStecCorrection: return sbp_msg_ssr_stec_correction_decode(buf, len, n_read, &msg->ssr_stec_correction); + case SbpMsgSsrTileDefinitionDep: + return sbp_msg_ssr_tile_definition_dep_decode( + buf, len, n_read, &msg->ssr_tile_definition_dep); case SbpMsgSsrTileDefinition: return sbp_msg_ssr_tile_definition_decode(buf, len, n_read, &msg->ssr_tile_definition); @@ -1779,6 +1800,9 @@ static inline size_t sbp_message_encoded_len(sbp_msg_type_t msg_type, case SbpMsgSsrGridDefinitionDepA: return sbp_msg_ssr_grid_definition_dep_a_encoded_len( &msg->ssr_grid_definition_dep_a); + case SbpMsgSsrGriddedCorrectionBounds: + return sbp_msg_ssr_gridded_correction_bounds_encoded_len( + &msg->ssr_gridded_correction_bounds); case SbpMsgSsrGriddedCorrectionDepA: return sbp_msg_ssr_gridded_correction_dep_a_encoded_len( &msg->ssr_gridded_correction_dep_a); @@ -1803,8 +1827,14 @@ static inline size_t sbp_message_encoded_len(sbp_msg_type_t msg_type, case SbpMsgSsrStecCorrectionDepA: return sbp_msg_ssr_stec_correction_dep_a_encoded_len( &msg->ssr_stec_correction_dep_a); + case SbpMsgSsrStecCorrectionDep: + return sbp_msg_ssr_stec_correction_dep_encoded_len( + &msg->ssr_stec_correction_dep); case SbpMsgSsrStecCorrection: return sbp_msg_ssr_stec_correction_encoded_len(&msg->ssr_stec_correction); + case SbpMsgSsrTileDefinitionDep: + return sbp_msg_ssr_tile_definition_dep_encoded_len( + &msg->ssr_tile_definition_dep); case SbpMsgSsrTileDefinition: return sbp_msg_ssr_tile_definition_encoded_len(&msg->ssr_tile_definition); case SbpMsgStartup: @@ -2304,6 +2334,9 @@ static inline int sbp_message_cmp(sbp_msg_type_t msg_type, const sbp_msg_t *a, case SbpMsgSsrGridDefinitionDepA: return sbp_msg_ssr_grid_definition_dep_a_cmp( &a->ssr_grid_definition_dep_a, &b->ssr_grid_definition_dep_a); + case SbpMsgSsrGriddedCorrectionBounds: + return sbp_msg_ssr_gridded_correction_bounds_cmp( + &a->ssr_gridded_correction_bounds, &b->ssr_gridded_correction_bounds); case SbpMsgSsrGriddedCorrectionDepA: return sbp_msg_ssr_gridded_correction_dep_a_cmp( &a->ssr_gridded_correction_dep_a, &b->ssr_gridded_correction_dep_a); @@ -2332,9 +2365,15 @@ static inline int sbp_message_cmp(sbp_msg_type_t msg_type, const sbp_msg_t *a, case SbpMsgSsrStecCorrectionDepA: return sbp_msg_ssr_stec_correction_dep_a_cmp( &a->ssr_stec_correction_dep_a, &b->ssr_stec_correction_dep_a); + case SbpMsgSsrStecCorrectionDep: + return sbp_msg_ssr_stec_correction_dep_cmp(&a->ssr_stec_correction_dep, + &b->ssr_stec_correction_dep); case SbpMsgSsrStecCorrection: return sbp_msg_ssr_stec_correction_cmp(&a->ssr_stec_correction, &b->ssr_stec_correction); + case SbpMsgSsrTileDefinitionDep: + return sbp_msg_ssr_tile_definition_dep_cmp(&a->ssr_tile_definition_dep, + &b->ssr_tile_definition_dep); case SbpMsgSsrTileDefinition: return sbp_msg_ssr_tile_definition_cmp(&a->ssr_tile_definition, &b->ssr_tile_definition); diff --git a/c/include/libsbp/v4/ssr.h b/c/include/libsbp/v4/ssr.h index 221c794181..a7bea6ab47 100644 --- a/c/include/libsbp/v4/ssr.h +++ b/c/include/libsbp/v4/ssr.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -35,8 +36,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -44,6 +47,7 @@ #include #include #include +#include #include #include #include diff --git a/c/include/libsbp/v4/ssr/MSG_SSR_GRIDDED_CORRECTION_BOUNDS.h b/c/include/libsbp/v4/ssr/MSG_SSR_GRIDDED_CORRECTION_BOUNDS.h new file mode 100644 index 0000000000..423f50bb84 --- /dev/null +++ b/c/include/libsbp/v4/ssr/MSG_SSR_GRIDDED_CORRECTION_BOUNDS.h @@ -0,0 +1,241 @@ +/* + * Copyright (C) 2015-2021 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +/***************************************************************************** + * Automatically generated from yaml/swiftnav/sbp/ssr.yaml + * with generate.py. Please do not hand edit! + *****************************************************************************/ + +#ifndef LIBSBP_V4_SSR_MSG_SSR_GRIDDED_CORRECTION_BOUNDS_H +#define LIBSBP_V4_SSR_MSG_SSR_GRIDDED_CORRECTION_BOUNDS_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * + * SBP_MSG_SSR_GRIDDED_CORRECTION_BOUNDS + * + *****************************************************************************/ +typedef struct { + /** + * Header of a bounds message. + */ + sbp_bounds_header_t header; + + /** + * IOD of the SSR atmospheric correction. + */ + u8 ssr_iod_atmo; + + /** + * Unique identifier of the set this tile belongs to. + */ + u16 tile_set_id; + + /** + * Unique identifier of this tile in the tile set. + */ + u16 tile_id; + + /** + * Tropo Quality Indicator. Similar to RTCM DF389. + */ + u8 tropo_qi; + + /** + * Index of the Grid Point. + */ + u16 grid_point_id; + + /** + * Tropospheric delay at grid point. + */ + sbp_tropospheric_delay_correction_t tropo_delay_correction; + + /** + * Troposphere Error Bound Mean (range 0-1.275). [0.005 m] + */ + u8 tropo_bound_mu; + + /** + * Troposphere Error Bound Standard Deviation (range 0-1.275) [0.005 m] + */ + u8 tropo_bound_sig; + + /** + * Number of satellites. + */ + u8 n_sats; + + /** + * Array of STEC polynomial coefficients and its bounds for each space + * vehicle. + */ + sbp_stec_sat_element_integrity_t + stec_sat_list[SBP_MSG_SSR_GRIDDED_CORRECTION_BOUNDS_STEC_SAT_LIST_MAX]; +} sbp_msg_ssr_gridded_correction_bounds_t; + +/** + * Get encoded size of an instance of sbp_msg_ssr_gridded_correction_bounds_t + * + * @param msg sbp_msg_ssr_gridded_correction_bounds_t instance + * @return Length of on-wire representation + */ +static inline size_t sbp_msg_ssr_gridded_correction_bounds_encoded_len( + const sbp_msg_ssr_gridded_correction_bounds_t *msg) { + return SBP_MSG_SSR_GRIDDED_CORRECTION_BOUNDS_ENCODED_OVERHEAD + + (msg->n_sats * SBP_STEC_SAT_ELEMENT_INTEGRITY_ENCODED_LEN); +} + +/** + * Encode an instance of sbp_msg_ssr_gridded_correction_bounds_t to wire + * representation + * + * This function encodes the given instance in to the user provided buffer. The + * buffer provided to this function must be large enough to store the encoded + * message otherwise it will return SBP_ENCODE_ERROR without writing anything to + * the buffer. + * + * Specify the length of the destination buffer in the \p len parameter. If + * non-null the number of bytes written to the buffer will be returned in \p + * n_written. + * + * @param buf Destination buffer + * @param len Length of \p buf + * @param n_written If not null, on success will be set to the number of bytes + * written to \p buf + * @param msg Instance of sbp_msg_ssr_gridded_correction_bounds_t to encode + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 sbp_msg_ssr_gridded_correction_bounds_encode( + uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_msg_ssr_gridded_correction_bounds_t *msg); + +/** + * Decode an instance of sbp_msg_ssr_gridded_correction_bounds_t from wire + * representation + * + * This function decodes the wire representation of a + * sbp_msg_ssr_gridded_correction_bounds_t message to the given instance. The + * caller must specify the length of the buffer in the \p len parameter. If + * non-null the number of bytes read from the buffer will be returned in \p + * n_read. + * + * @param buf Wire representation of the sbp_msg_ssr_gridded_correction_bounds_t + * instance + * @param len Length of \p buf + * @param n_read If not null, on success will be set to the number of bytes read + * from \p buf + * @param msg Destination + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 sbp_msg_ssr_gridded_correction_bounds_decode( + const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_msg_ssr_gridded_correction_bounds_t *msg); +/** + * Send an instance of sbp_msg_ssr_gridded_correction_bounds_t with the given + * write function + * + * An equivalent of #sbp_message_send which operates specifically on + * sbp_msg_ssr_gridded_correction_bounds_t + * + * The given message will be encoded to wire representation and passed in to the + * given write function callback. The write callback will be called several + * times for each invocation of this function. + * + * @param s SBP state + * @param sender_id SBP sender id + * @param msg Message to send + * @param write Write function + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 sbp_msg_ssr_gridded_correction_bounds_send( + sbp_state_t *s, u16 sender_id, + const sbp_msg_ssr_gridded_correction_bounds_t *msg, sbp_write_fn_t write); + +/** + * Compare two instances of sbp_msg_ssr_gridded_correction_bounds_t + * + * The two instances will be compared and a value returned consistent with the + * return codes of comparison functions from the C standard library + * + * 0 will be returned if \p a and \p b are considered equal + * A value less than 0 will be returned if \p a is considered to be less than \p + * b A value greater than 0 will be returned if \p b is considered to be greater + * than \p b + * + * @param a sbp_msg_ssr_gridded_correction_bounds_t instance + * @param b sbp_msg_ssr_gridded_correction_bounds_t instance + * @return 0, <0, >0 + */ +SBP_EXPORT int sbp_msg_ssr_gridded_correction_bounds_cmp( + const sbp_msg_ssr_gridded_correction_bounds_t *a, + const sbp_msg_ssr_gridded_correction_bounds_t *b); + +#ifdef __cplusplus +} + +static inline bool operator==( + const sbp_msg_ssr_gridded_correction_bounds_t &lhs, + const sbp_msg_ssr_gridded_correction_bounds_t &rhs) { + return sbp_msg_ssr_gridded_correction_bounds_cmp(&lhs, &rhs) == 0; +} + +static inline bool operator!=( + const sbp_msg_ssr_gridded_correction_bounds_t &lhs, + const sbp_msg_ssr_gridded_correction_bounds_t &rhs) { + return sbp_msg_ssr_gridded_correction_bounds_cmp(&lhs, &rhs) != 0; +} + +static inline bool operator<( + const sbp_msg_ssr_gridded_correction_bounds_t &lhs, + const sbp_msg_ssr_gridded_correction_bounds_t &rhs) { + return sbp_msg_ssr_gridded_correction_bounds_cmp(&lhs, &rhs) < 0; +} + +static inline bool operator<=( + const sbp_msg_ssr_gridded_correction_bounds_t &lhs, + const sbp_msg_ssr_gridded_correction_bounds_t &rhs) { + return sbp_msg_ssr_gridded_correction_bounds_cmp(&lhs, &rhs) <= 0; +} + +static inline bool operator>( + const sbp_msg_ssr_gridded_correction_bounds_t &lhs, + const sbp_msg_ssr_gridded_correction_bounds_t &rhs) { + return sbp_msg_ssr_gridded_correction_bounds_cmp(&lhs, &rhs) > 0; +} + +static inline bool operator>=( + const sbp_msg_ssr_gridded_correction_bounds_t &lhs, + const sbp_msg_ssr_gridded_correction_bounds_t &rhs) { + return sbp_msg_ssr_gridded_correction_bounds_cmp(&lhs, &rhs) >= 0; +} + +#endif // ifdef __cplusplus + +#endif /* LIBSBP_V4_SSR_MSG_SSR_GRIDDED_CORRECTION_BOUNDS_H */ diff --git a/c/include/libsbp/v4/ssr/MSG_SSR_STEC_CORRECTION.h b/c/include/libsbp/v4/ssr/MSG_SSR_STEC_CORRECTION.h index 3c884a91cd..7d386a5e49 100644 --- a/c/include/libsbp/v4/ssr/MSG_SSR_STEC_CORRECTION.h +++ b/c/include/libsbp/v4/ssr/MSG_SSR_STEC_CORRECTION.h @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include @@ -40,36 +40,37 @@ extern "C" { * SBP_MSG_SSR_STEC_CORRECTION * *****************************************************************************/ -/** STEC correction polynomial coefficients - * - * The Slant Total Electron Content per space vehicle, given as polynomial - * approximation for a given tile. This should be combined with the - * MSG_SSR_GRIDDED_CORRECTION message to get the state space representation of - * the atmospheric delay. - * - */ typedef struct { /** - * Header of a STEC polynomial coefficient message. + * Header of a STEC correction with bounds message. + */ + sbp_bounds_header_t header; + + /** + * IOD of the SSR atmospheric correction + */ + u8 ssr_iod_atmo; + + /** + * Tile set ID */ - sbp_stec_header_t header; + u16 tile_set_id; + + /** + * Tile ID + */ + u16 tile_id; + + /** + * Number of satellites. + */ + u8 n_sats; /** * Array of STEC polynomial coefficients for each space vehicle. */ sbp_stec_sat_element_t stec_sat_list[SBP_MSG_SSR_STEC_CORRECTION_STEC_SAT_LIST_MAX]; - /** - * Number of elements in stec_sat_list - * - * When sending a message fill in this field with the number elements set in - * stec_sat_list before calling an appropriate libsbp send function - * - * When receiving a message query this field for the number of elements in - * stec_sat_list. The value of any elements beyond the index specified in this - * field is undefined - */ - u8 n_stec_sat_list; } sbp_msg_ssr_stec_correction_t; /** @@ -81,7 +82,7 @@ typedef struct { static inline size_t sbp_msg_ssr_stec_correction_encoded_len( const sbp_msg_ssr_stec_correction_t *msg) { return SBP_MSG_SSR_STEC_CORRECTION_ENCODED_OVERHEAD + - (msg->n_stec_sat_list * SBP_STEC_SAT_ELEMENT_ENCODED_LEN); + (msg->n_sats * SBP_STEC_SAT_ELEMENT_ENCODED_LEN); } /** diff --git a/c/include/libsbp/v4/ssr/MSG_SSR_STEC_CORRECTION_DEP.h b/c/include/libsbp/v4/ssr/MSG_SSR_STEC_CORRECTION_DEP.h new file mode 100644 index 0000000000..4d9a0af5b6 --- /dev/null +++ b/c/include/libsbp/v4/ssr/MSG_SSR_STEC_CORRECTION_DEP.h @@ -0,0 +1,206 @@ +/* + * Copyright (C) 2015-2021 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +/***************************************************************************** + * Automatically generated from yaml/swiftnav/sbp/ssr.yaml + * with generate.py. Please do not hand edit! + *****************************************************************************/ + +#ifndef LIBSBP_V4_SSR_MSG_SSR_STEC_CORRECTION_DEP_H +#define LIBSBP_V4_SSR_MSG_SSR_STEC_CORRECTION_DEP_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * + * SBP_MSG_SSR_STEC_CORRECTION_DEP + * + *****************************************************************************/ +/** STEC correction polynomial coefficients + * + * The Slant Total Electron Content per space vehicle, given as polynomial + * approximation for a given tile. This should be combined with the + * MSG_SSR_GRIDDED_CORRECTION message to get the state space representation of + * the atmospheric delay. + * + */ +typedef struct { + /** + * Header of a STEC polynomial coefficient message. + */ + sbp_stec_header_t header; + + /** + * Array of STEC polynomial coefficients for each space vehicle. + */ + sbp_stec_sat_element_t + stec_sat_list[SBP_MSG_SSR_STEC_CORRECTION_DEP_STEC_SAT_LIST_MAX]; + /** + * Number of elements in stec_sat_list + * + * When sending a message fill in this field with the number elements set in + * stec_sat_list before calling an appropriate libsbp send function + * + * When receiving a message query this field for the number of elements in + * stec_sat_list. The value of any elements beyond the index specified in this + * field is undefined + */ + u8 n_stec_sat_list; +} sbp_msg_ssr_stec_correction_dep_t; + +/** + * Get encoded size of an instance of sbp_msg_ssr_stec_correction_dep_t + * + * @param msg sbp_msg_ssr_stec_correction_dep_t instance + * @return Length of on-wire representation + */ +static inline size_t sbp_msg_ssr_stec_correction_dep_encoded_len( + const sbp_msg_ssr_stec_correction_dep_t *msg) { + return SBP_MSG_SSR_STEC_CORRECTION_DEP_ENCODED_OVERHEAD + + (msg->n_stec_sat_list * SBP_STEC_SAT_ELEMENT_ENCODED_LEN); +} + +/** + * Encode an instance of sbp_msg_ssr_stec_correction_dep_t to wire + * representation + * + * This function encodes the given instance in to the user provided buffer. The + * buffer provided to this function must be large enough to store the encoded + * message otherwise it will return SBP_ENCODE_ERROR without writing anything to + * the buffer. + * + * Specify the length of the destination buffer in the \p len parameter. If + * non-null the number of bytes written to the buffer will be returned in \p + * n_written. + * + * @param buf Destination buffer + * @param len Length of \p buf + * @param n_written If not null, on success will be set to the number of bytes + * written to \p buf + * @param msg Instance of sbp_msg_ssr_stec_correction_dep_t to encode + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 sbp_msg_ssr_stec_correction_dep_encode( + uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_msg_ssr_stec_correction_dep_t *msg); + +/** + * Decode an instance of sbp_msg_ssr_stec_correction_dep_t from wire + * representation + * + * This function decodes the wire representation of a + * sbp_msg_ssr_stec_correction_dep_t message to the given instance. The caller + * must specify the length of the buffer in the \p len parameter. If non-null + * the number of bytes read from the buffer will be returned in \p n_read. + * + * @param buf Wire representation of the sbp_msg_ssr_stec_correction_dep_t + * instance + * @param len Length of \p buf + * @param n_read If not null, on success will be set to the number of bytes read + * from \p buf + * @param msg Destination + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 sbp_msg_ssr_stec_correction_dep_decode( + const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_msg_ssr_stec_correction_dep_t *msg); +/** + * Send an instance of sbp_msg_ssr_stec_correction_dep_t with the given write + * function + * + * An equivalent of #sbp_message_send which operates specifically on + * sbp_msg_ssr_stec_correction_dep_t + * + * The given message will be encoded to wire representation and passed in to the + * given write function callback. The write callback will be called several + * times for each invocation of this function. + * + * @param s SBP state + * @param sender_id SBP sender id + * @param msg Message to send + * @param write Write function + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 sbp_msg_ssr_stec_correction_dep_send( + sbp_state_t *s, u16 sender_id, const sbp_msg_ssr_stec_correction_dep_t *msg, + sbp_write_fn_t write); + +/** + * Compare two instances of sbp_msg_ssr_stec_correction_dep_t + * + * The two instances will be compared and a value returned consistent with the + * return codes of comparison functions from the C standard library + * + * 0 will be returned if \p a and \p b are considered equal + * A value less than 0 will be returned if \p a is considered to be less than \p + * b A value greater than 0 will be returned if \p b is considered to be greater + * than \p b + * + * @param a sbp_msg_ssr_stec_correction_dep_t instance + * @param b sbp_msg_ssr_stec_correction_dep_t instance + * @return 0, <0, >0 + */ +SBP_EXPORT int sbp_msg_ssr_stec_correction_dep_cmp( + const sbp_msg_ssr_stec_correction_dep_t *a, + const sbp_msg_ssr_stec_correction_dep_t *b); + +#ifdef __cplusplus +} + +static inline bool operator==(const sbp_msg_ssr_stec_correction_dep_t &lhs, + const sbp_msg_ssr_stec_correction_dep_t &rhs) { + return sbp_msg_ssr_stec_correction_dep_cmp(&lhs, &rhs) == 0; +} + +static inline bool operator!=(const sbp_msg_ssr_stec_correction_dep_t &lhs, + const sbp_msg_ssr_stec_correction_dep_t &rhs) { + return sbp_msg_ssr_stec_correction_dep_cmp(&lhs, &rhs) != 0; +} + +static inline bool operator<(const sbp_msg_ssr_stec_correction_dep_t &lhs, + const sbp_msg_ssr_stec_correction_dep_t &rhs) { + return sbp_msg_ssr_stec_correction_dep_cmp(&lhs, &rhs) < 0; +} + +static inline bool operator<=(const sbp_msg_ssr_stec_correction_dep_t &lhs, + const sbp_msg_ssr_stec_correction_dep_t &rhs) { + return sbp_msg_ssr_stec_correction_dep_cmp(&lhs, &rhs) <= 0; +} + +static inline bool operator>(const sbp_msg_ssr_stec_correction_dep_t &lhs, + const sbp_msg_ssr_stec_correction_dep_t &rhs) { + return sbp_msg_ssr_stec_correction_dep_cmp(&lhs, &rhs) > 0; +} + +static inline bool operator>=(const sbp_msg_ssr_stec_correction_dep_t &lhs, + const sbp_msg_ssr_stec_correction_dep_t &rhs) { + return sbp_msg_ssr_stec_correction_dep_cmp(&lhs, &rhs) >= 0; +} + +#endif // ifdef __cplusplus + +#endif /* LIBSBP_V4_SSR_MSG_SSR_STEC_CORRECTION_DEP_H */ diff --git a/c/include/libsbp/v4/ssr/MSG_SSR_TILE_DEFINITION.h b/c/include/libsbp/v4/ssr/MSG_SSR_TILE_DEFINITION.h index d7d02b89d2..fceb2b1a97 100644 --- a/c/include/libsbp/v4/ssr/MSG_SSR_TILE_DEFINITION.h +++ b/c/include/libsbp/v4/ssr/MSG_SSR_TILE_DEFINITION.h @@ -46,6 +46,11 @@ extern "C" { * */ typedef struct { + /** + * SSR Solution ID. + */ + u8 ssr_sol_id; + /** * Unique identifier of the tile set this tile belongs to. */ diff --git a/c/include/libsbp/v4/ssr/MSG_SSR_TILE_DEFINITION_DEP.h b/c/include/libsbp/v4/ssr/MSG_SSR_TILE_DEFINITION_DEP.h new file mode 100644 index 0000000000..e8eea9d93d --- /dev/null +++ b/c/include/libsbp/v4/ssr/MSG_SSR_TILE_DEFINITION_DEP.h @@ -0,0 +1,266 @@ +/* + * Copyright (C) 2015-2021 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +/***************************************************************************** + * Automatically generated from yaml/swiftnav/sbp/ssr.yaml + * with generate.py. Please do not hand edit! + *****************************************************************************/ + +#ifndef LIBSBP_V4_SSR_MSG_SSR_TILE_DEFINITION_DEP_H +#define LIBSBP_V4_SSR_MSG_SSR_TILE_DEFINITION_DEP_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * + * SBP_MSG_SSR_TILE_DEFINITION_DEP + * + *****************************************************************************/ +/** Definition of a SSR atmospheric correction tile. + + * + * Provides the correction point coordinates for the atmospheric correction + values in the MSG_SSR_STEC_CORRECTION_DEP and MSG_SSR_GRIDDED_CORRECTION + messages. + * + */ +typedef struct { + /** + * Unique identifier of the tile set this tile belongs to. + */ + u16 tile_set_id; + + /** + * Unique identifier of this tile in the tile set. + * See GNSS-SSR-ArrayOfCorrectionPoints field correctionPointSetID. + */ + u16 tile_id; + + /** + * North-West corner correction point latitude. + * + * The relation between the latitude X in the range [-90, 90] and the coded + * number N is: + * + * N = floor((X / 90) * 2^14) + * + * See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLatitude. [encoded + * degrees] + */ + s16 corner_nw_lat; + + /** + * North-West corner correction point longitude. + * + * The relation between the longitude X in the range [-180, 180] and the coded + * number N is: + * + * N = floor((X / 180) * 2^15) + * + * See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLongitude. + * [encoded degrees] + */ + s16 corner_nw_lon; + + /** + * Spacing of the correction points in the latitude direction. + * + * See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLatitude. [0.01 degrees] + */ + u16 spacing_lat; + + /** + * Spacing of the correction points in the longitude direction. + * + * See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLongitude. [0.01 degrees] + */ + u16 spacing_lon; + + /** + * Number of steps in the latitude direction. + * + * See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLatitude. + */ + u16 rows; + + /** + * Number of steps in the longitude direction. + * + * See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLongitude. + */ + u16 cols; + + /** + * Specifies the availability of correction data at the correction points in + * the array. + * + * If a specific bit is enabled (set to 1), the correction is not available. + * Only the first rows * cols bits are used, the remainder are set to 0. If + * there are more then 64 correction points the remaining corrections are + * always available. + * + * Starting with the northwest corner of the array (top left on a north + * oriented map) the correction points are enumerated with row precedence - + * first row west to east, second row west to east, until last row west to + * east - ending with the southeast corner of the array. + * + * See GNSS-SSR-ArrayOfCorrectionPoints field bitmaskOfGrids but note the + * definition of the bits is inverted. + */ + u64 bitmask; +} sbp_msg_ssr_tile_definition_dep_t; + +/** + * Get encoded size of an instance of sbp_msg_ssr_tile_definition_dep_t + * + * @param msg sbp_msg_ssr_tile_definition_dep_t instance + * @return Length of on-wire representation + */ +static inline size_t sbp_msg_ssr_tile_definition_dep_encoded_len( + const sbp_msg_ssr_tile_definition_dep_t *msg) { + (void)msg; + return SBP_MSG_SSR_TILE_DEFINITION_DEP_ENCODED_LEN; +} + +/** + * Encode an instance of sbp_msg_ssr_tile_definition_dep_t to wire + * representation + * + * This function encodes the given instance in to the user provided buffer. The + * buffer provided to this function must be large enough to store the encoded + * message otherwise it will return SBP_ENCODE_ERROR without writing anything to + * the buffer. + * + * Specify the length of the destination buffer in the \p len parameter. If + * non-null the number of bytes written to the buffer will be returned in \p + * n_written. + * + * @param buf Destination buffer + * @param len Length of \p buf + * @param n_written If not null, on success will be set to the number of bytes + * written to \p buf + * @param msg Instance of sbp_msg_ssr_tile_definition_dep_t to encode + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 sbp_msg_ssr_tile_definition_dep_encode( + uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_msg_ssr_tile_definition_dep_t *msg); + +/** + * Decode an instance of sbp_msg_ssr_tile_definition_dep_t from wire + * representation + * + * This function decodes the wire representation of a + * sbp_msg_ssr_tile_definition_dep_t message to the given instance. The caller + * must specify the length of the buffer in the \p len parameter. If non-null + * the number of bytes read from the buffer will be returned in \p n_read. + * + * @param buf Wire representation of the sbp_msg_ssr_tile_definition_dep_t + * instance + * @param len Length of \p buf + * @param n_read If not null, on success will be set to the number of bytes read + * from \p buf + * @param msg Destination + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 sbp_msg_ssr_tile_definition_dep_decode( + const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_msg_ssr_tile_definition_dep_t *msg); +/** + * Send an instance of sbp_msg_ssr_tile_definition_dep_t with the given write + * function + * + * An equivalent of #sbp_message_send which operates specifically on + * sbp_msg_ssr_tile_definition_dep_t + * + * The given message will be encoded to wire representation and passed in to the + * given write function callback. The write callback will be called several + * times for each invocation of this function. + * + * @param s SBP state + * @param sender_id SBP sender id + * @param msg Message to send + * @param write Write function + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 sbp_msg_ssr_tile_definition_dep_send( + sbp_state_t *s, u16 sender_id, const sbp_msg_ssr_tile_definition_dep_t *msg, + sbp_write_fn_t write); + +/** + * Compare two instances of sbp_msg_ssr_tile_definition_dep_t + * + * The two instances will be compared and a value returned consistent with the + * return codes of comparison functions from the C standard library + * + * 0 will be returned if \p a and \p b are considered equal + * A value less than 0 will be returned if \p a is considered to be less than \p + * b A value greater than 0 will be returned if \p b is considered to be greater + * than \p b + * + * @param a sbp_msg_ssr_tile_definition_dep_t instance + * @param b sbp_msg_ssr_tile_definition_dep_t instance + * @return 0, <0, >0 + */ +SBP_EXPORT int sbp_msg_ssr_tile_definition_dep_cmp( + const sbp_msg_ssr_tile_definition_dep_t *a, + const sbp_msg_ssr_tile_definition_dep_t *b); + +#ifdef __cplusplus +} + +static inline bool operator==(const sbp_msg_ssr_tile_definition_dep_t &lhs, + const sbp_msg_ssr_tile_definition_dep_t &rhs) { + return sbp_msg_ssr_tile_definition_dep_cmp(&lhs, &rhs) == 0; +} + +static inline bool operator!=(const sbp_msg_ssr_tile_definition_dep_t &lhs, + const sbp_msg_ssr_tile_definition_dep_t &rhs) { + return sbp_msg_ssr_tile_definition_dep_cmp(&lhs, &rhs) != 0; +} + +static inline bool operator<(const sbp_msg_ssr_tile_definition_dep_t &lhs, + const sbp_msg_ssr_tile_definition_dep_t &rhs) { + return sbp_msg_ssr_tile_definition_dep_cmp(&lhs, &rhs) < 0; +} + +static inline bool operator<=(const sbp_msg_ssr_tile_definition_dep_t &lhs, + const sbp_msg_ssr_tile_definition_dep_t &rhs) { + return sbp_msg_ssr_tile_definition_dep_cmp(&lhs, &rhs) <= 0; +} + +static inline bool operator>(const sbp_msg_ssr_tile_definition_dep_t &lhs, + const sbp_msg_ssr_tile_definition_dep_t &rhs) { + return sbp_msg_ssr_tile_definition_dep_cmp(&lhs, &rhs) > 0; +} + +static inline bool operator>=(const sbp_msg_ssr_tile_definition_dep_t &lhs, + const sbp_msg_ssr_tile_definition_dep_t &rhs) { + return sbp_msg_ssr_tile_definition_dep_cmp(&lhs, &rhs) >= 0; +} + +#endif // ifdef __cplusplus + +#endif /* LIBSBP_V4_SSR_MSG_SSR_TILE_DEFINITION_DEP_H */ diff --git a/c/include/libsbp/v4/ssr/STECSatElementIntegrity.h b/c/include/libsbp/v4/ssr/STECSatElementIntegrity.h new file mode 100644 index 0000000000..3b9b0ed049 --- /dev/null +++ b/c/include/libsbp/v4/ssr/STECSatElementIntegrity.h @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2015-2021 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +/***************************************************************************** + * Automatically generated from yaml/swiftnav/sbp/ssr.yaml + * with generate.py. Please do not hand edit! + *****************************************************************************/ + +#ifndef LIBSBP_V4_SSR_STECSATELEMENTINTEGRITY_H +#define LIBSBP_V4_SSR_STECSATELEMENTINTEGRITY_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * + * SBP_STECSATELEMENTINTEGRITY + * + *****************************************************************************/ +/** None + * + * STEC polynomial and bounds for the given satellite. + */ +typedef struct { + /** + * STEC residuals (mean, stddev) + */ + sbp_stec_residual_t stec_residual; + + /** + * STEC Error Bound Mean (range 0-17.5) i<= 200, mean = 0.01i 200230, mean=5+0.5(i-230) [m] + */ + u8 stec_bound_mu; + + /** + * STEC Error Bound Standard Deviation (range 0-17.5) i<= 200, mean = 0.01i + * 200230, mean=5+0.5(i-230) [m] + */ + u8 stec_bound_sig; + + /** + * STEC Error Bound Mean First derivative degradation parameter(range + * 0-0.01275) [0.00005 m/s] + */ + u8 stec_bound_mu_dot; + + /** + * STEC Error Bound Standard Deviation First derivative degradation parameter + * (range 0-0.01275) [0.00005 m/s] + */ + u8 stec_bound_sig_dot; +} sbp_stec_sat_element_integrity_t; + +/** + * Get encoded size of an instance of sbp_stec_sat_element_integrity_t + * + * @param msg sbp_stec_sat_element_integrity_t instance + * @return Length of on-wire representation + */ +static inline size_t sbp_stec_sat_element_integrity_encoded_len( + const sbp_stec_sat_element_integrity_t *msg) { + (void)msg; + return SBP_STEC_SAT_ELEMENT_INTEGRITY_ENCODED_LEN; +} + +/** + * Encode an instance of sbp_stec_sat_element_integrity_t to wire representation + * + * This function encodes the given instance in to the user provided buffer. The + * buffer provided to this function must be large enough to store the encoded + * message otherwise it will return SBP_ENCODE_ERROR without writing anything to + * the buffer. + * + * Specify the length of the destination buffer in the \p len parameter. If + * non-null the number of bytes written to the buffer will be returned in \p + * n_written. + * + * @param buf Destination buffer + * @param len Length of \p buf + * @param n_written If not null, on success will be set to the number of bytes + * written to \p buf + * @param msg Instance of sbp_stec_sat_element_integrity_t to encode + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 sbp_stec_sat_element_integrity_encode( + uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_stec_sat_element_integrity_t *msg); + +/** + * Decode an instance of sbp_stec_sat_element_integrity_t from wire + * representation + * + * This function decodes the wire representation of a + * sbp_stec_sat_element_integrity_t message to the given instance. The caller + * must specify the length of the buffer in the \p len parameter. If non-null + * the number of bytes read from the buffer will be returned in \p n_read. + * + * @param buf Wire representation of the sbp_stec_sat_element_integrity_t + * instance + * @param len Length of \p buf + * @param n_read If not null, on success will be set to the number of bytes read + * from \p buf + * @param msg Destination + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 sbp_stec_sat_element_integrity_decode( + const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_stec_sat_element_integrity_t *msg); + +/** + * Compare two instances of sbp_stec_sat_element_integrity_t + * + * The two instances will be compared and a value returned consistent with the + * return codes of comparison functions from the C standard library + * + * 0 will be returned if \p a and \p b are considered equal + * A value less than 0 will be returned if \p a is considered to be less than \p + * b A value greater than 0 will be returned if \p b is considered to be greater + * than \p b + * + * @param a sbp_stec_sat_element_integrity_t instance + * @param b sbp_stec_sat_element_integrity_t instance + * @return 0, <0, >0 + */ +SBP_EXPORT int sbp_stec_sat_element_integrity_cmp( + const sbp_stec_sat_element_integrity_t *a, + const sbp_stec_sat_element_integrity_t *b); + +#ifdef __cplusplus +} + +static inline bool operator==(const sbp_stec_sat_element_integrity_t &lhs, + const sbp_stec_sat_element_integrity_t &rhs) { + return sbp_stec_sat_element_integrity_cmp(&lhs, &rhs) == 0; +} + +static inline bool operator!=(const sbp_stec_sat_element_integrity_t &lhs, + const sbp_stec_sat_element_integrity_t &rhs) { + return sbp_stec_sat_element_integrity_cmp(&lhs, &rhs) != 0; +} + +static inline bool operator<(const sbp_stec_sat_element_integrity_t &lhs, + const sbp_stec_sat_element_integrity_t &rhs) { + return sbp_stec_sat_element_integrity_cmp(&lhs, &rhs) < 0; +} + +static inline bool operator<=(const sbp_stec_sat_element_integrity_t &lhs, + const sbp_stec_sat_element_integrity_t &rhs) { + return sbp_stec_sat_element_integrity_cmp(&lhs, &rhs) <= 0; +} + +static inline bool operator>(const sbp_stec_sat_element_integrity_t &lhs, + const sbp_stec_sat_element_integrity_t &rhs) { + return sbp_stec_sat_element_integrity_cmp(&lhs, &rhs) > 0; +} + +static inline bool operator>=(const sbp_stec_sat_element_integrity_t &lhs, + const sbp_stec_sat_element_integrity_t &rhs) { + return sbp_stec_sat_element_integrity_cmp(&lhs, &rhs) >= 0; +} + +#endif // ifdef __cplusplus + +#endif /* LIBSBP_V4_SSR_STECSATELEMENTINTEGRITY_H */ diff --git a/c/src/include/libsbp/internal/v4/ssr.h b/c/src/include/libsbp/internal/v4/ssr.h index bbb33a112d..1c829816e6 100644 --- a/c/src/include/libsbp/internal/v4/ssr.h +++ b/c/src/include/libsbp/internal/v4/ssr.h @@ -269,6 +269,46 @@ bool sbp_msg_ssr_phase_biases_encode_internal( bool sbp_msg_ssr_phase_biases_decode_internal(sbp_decode_ctx_t *ctx, sbp_msg_ssr_phase_biases_t *msg); +/** + * Internal function to encode an SBP type to a buffer + * + * @param ctx Encode context + * @param msg SBP type instance + * @return true on success, false otherwise + */ +bool sbp_msg_ssr_stec_correction_dep_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_msg_ssr_stec_correction_dep_t *msg); + +/** + * Internal function to decode an SBP type from a buffer + * + * @param ctx Decode context + * @param msg SBP type instance + * @return true on success, false otherwise + */ +bool sbp_msg_ssr_stec_correction_dep_decode_internal( + sbp_decode_ctx_t *ctx, sbp_msg_ssr_stec_correction_dep_t *msg); + +/** + * Internal function to encode an SBP type to a buffer + * + * @param ctx Encode context + * @param msg SBP type instance + * @return true on success, false otherwise + */ +bool sbp_bounds_header_encode_internal(sbp_encode_ctx_t *ctx, + const sbp_bounds_header_t *msg); + +/** + * Internal function to decode an SBP type from a buffer + * + * @param ctx Decode context + * @param msg SBP type instance + * @return true on success, false otherwise + */ +bool sbp_bounds_header_decode_internal(sbp_decode_ctx_t *ctx, + sbp_bounds_header_t *msg); + /** * Internal function to encode an SBP type to a buffer * @@ -309,6 +349,66 @@ bool sbp_msg_ssr_gridded_correction_encode_internal( bool sbp_msg_ssr_gridded_correction_decode_internal( sbp_decode_ctx_t *ctx, sbp_msg_ssr_gridded_correction_t *msg); +/** + * Internal function to encode an SBP type to a buffer + * + * @param ctx Encode context + * @param msg SBP type instance + * @return true on success, false otherwise + */ +bool sbp_stec_sat_element_integrity_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_stec_sat_element_integrity_t *msg); + +/** + * Internal function to decode an SBP type from a buffer + * + * @param ctx Decode context + * @param msg SBP type instance + * @return true on success, false otherwise + */ +bool sbp_stec_sat_element_integrity_decode_internal( + sbp_decode_ctx_t *ctx, sbp_stec_sat_element_integrity_t *msg); + +/** + * Internal function to encode an SBP type to a buffer + * + * @param ctx Encode context + * @param msg SBP type instance + * @return true on success, false otherwise + */ +bool sbp_msg_ssr_gridded_correction_bounds_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_msg_ssr_gridded_correction_bounds_t *msg); + +/** + * Internal function to decode an SBP type from a buffer + * + * @param ctx Decode context + * @param msg SBP type instance + * @return true on success, false otherwise + */ +bool sbp_msg_ssr_gridded_correction_bounds_decode_internal( + sbp_decode_ctx_t *ctx, sbp_msg_ssr_gridded_correction_bounds_t *msg); + +/** + * Internal function to encode an SBP type to a buffer + * + * @param ctx Encode context + * @param msg SBP type instance + * @return true on success, false otherwise + */ +bool sbp_msg_ssr_tile_definition_dep_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_msg_ssr_tile_definition_dep_t *msg); + +/** + * Internal function to decode an SBP type from a buffer + * + * @param ctx Decode context + * @param msg SBP type instance + * @return true on success, false otherwise + */ +bool sbp_msg_ssr_tile_definition_dep_decode_internal( + sbp_decode_ctx_t *ctx, sbp_msg_ssr_tile_definition_dep_t *msg); + /** * Internal function to encode an SBP type to a buffer * @@ -530,26 +630,6 @@ bool sbp_msg_ssr_grid_definition_dep_a_encode_internal( bool sbp_msg_ssr_grid_definition_dep_a_decode_internal( sbp_decode_ctx_t *ctx, sbp_msg_ssr_grid_definition_dep_a_t *msg); -/** - * Internal function to encode an SBP type to a buffer - * - * @param ctx Encode context - * @param msg SBP type instance - * @return true on success, false otherwise - */ -bool sbp_bounds_header_encode_internal(sbp_encode_ctx_t *ctx, - const sbp_bounds_header_t *msg); - -/** - * Internal function to decode an SBP type from a buffer - * - * @param ctx Decode context - * @param msg SBP type instance - * @return true on success, false otherwise - */ -bool sbp_bounds_header_decode_internal(sbp_decode_ctx_t *ctx, - sbp_bounds_header_t *msg); - /** * Internal function to encode an SBP type to a buffer * diff --git a/c/src/v4/ssr.c b/c/src/v4/ssr.c index 84dfe1ae2f..aea6df0b07 100644 --- a/c/src/v4/ssr.c +++ b/c/src/v4/ssr.c @@ -1348,8 +1348,8 @@ int sbp_msg_ssr_phase_biases_cmp(const sbp_msg_ssr_phase_biases_t *a, return ret; } -bool sbp_msg_ssr_stec_correction_encode_internal( - sbp_encode_ctx_t *ctx, const sbp_msg_ssr_stec_correction_t *msg) { +bool sbp_msg_ssr_stec_correction_dep_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_msg_ssr_stec_correction_dep_t *msg) { if (!sbp_stec_header_encode_internal(ctx, &msg->header)) { return false; } @@ -1361,6 +1361,213 @@ bool sbp_msg_ssr_stec_correction_encode_internal( return true; } +s8 sbp_msg_ssr_stec_correction_dep_encode( + uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_msg_ssr_stec_correction_dep_t *msg) { + sbp_encode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_msg_ssr_stec_correction_dep_encode_internal(&ctx, msg)) { + return SBP_ENCODE_ERROR; + } + if (n_written != NULL) { + *n_written = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +bool sbp_msg_ssr_stec_correction_dep_decode_internal( + sbp_decode_ctx_t *ctx, sbp_msg_ssr_stec_correction_dep_t *msg) { + if (!sbp_stec_header_decode_internal(ctx, &msg->header)) { + return false; + } + msg->n_stec_sat_list = (uint8_t)((ctx->buf_len - ctx->offset) / + SBP_STEC_SAT_ELEMENT_ENCODED_LEN); + for (uint8_t i = 0; i < msg->n_stec_sat_list; i++) { + if (!sbp_stec_sat_element_decode_internal(ctx, &msg->stec_sat_list[i])) { + return false; + } + } + return true; +} + +s8 sbp_msg_ssr_stec_correction_dep_decode( + const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_msg_ssr_stec_correction_dep_t *msg) { + sbp_decode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_msg_ssr_stec_correction_dep_decode_internal(&ctx, msg)) { + return SBP_DECODE_ERROR; + } + if (n_read != NULL) { + *n_read = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +s8 sbp_msg_ssr_stec_correction_dep_send( + sbp_state_t *s, u16 sender_id, const sbp_msg_ssr_stec_correction_dep_t *msg, + sbp_write_fn_t write) { + uint8_t payload[SBP_MAX_PAYLOAD_LEN]; + uint8_t payload_len; + s8 ret = sbp_msg_ssr_stec_correction_dep_encode(payload, sizeof(payload), + &payload_len, msg); + if (ret != SBP_OK) { + return ret; + } + return sbp_payload_send(s, SBP_MSG_SSR_STEC_CORRECTION_DEP, sender_id, + payload_len, payload, write); +} + +int sbp_msg_ssr_stec_correction_dep_cmp( + const sbp_msg_ssr_stec_correction_dep_t *a, + const sbp_msg_ssr_stec_correction_dep_t *b) { + int ret = 0; + + ret = sbp_stec_header_cmp(&a->header, &b->header); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->n_stec_sat_list, &b->n_stec_sat_list); + for (uint8_t i = 0; ret == 0 && i < a->n_stec_sat_list; i++) { + ret = sbp_stec_sat_element_cmp(&a->stec_sat_list[i], &b->stec_sat_list[i]); + } + if (ret != 0) { + return ret; + } + return ret; +} + +bool sbp_bounds_header_encode_internal(sbp_encode_ctx_t *ctx, + const sbp_bounds_header_t *msg) { + if (!sbp_gps_time_sec_encode_internal(ctx, &msg->time)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->num_msgs)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->seq_num)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->update_interval)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->sol_id)) { + return false; + } + return true; +} + +s8 sbp_bounds_header_encode(uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_bounds_header_t *msg) { + sbp_encode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_bounds_header_encode_internal(&ctx, msg)) { + return SBP_ENCODE_ERROR; + } + if (n_written != NULL) { + *n_written = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +bool sbp_bounds_header_decode_internal(sbp_decode_ctx_t *ctx, + sbp_bounds_header_t *msg) { + if (!sbp_gps_time_sec_decode_internal(ctx, &msg->time)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->num_msgs)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->seq_num)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->update_interval)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->sol_id)) { + return false; + } + return true; +} + +s8 sbp_bounds_header_decode(const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_bounds_header_t *msg) { + sbp_decode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_bounds_header_decode_internal(&ctx, msg)) { + return SBP_DECODE_ERROR; + } + if (n_read != NULL) { + *n_read = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +int sbp_bounds_header_cmp(const sbp_bounds_header_t *a, + const sbp_bounds_header_t *b) { + int ret = 0; + + ret = sbp_gps_time_sec_cmp(&a->time, &b->time); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->num_msgs, &b->num_msgs); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->seq_num, &b->seq_num); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->update_interval, &b->update_interval); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->sol_id, &b->sol_id); + if (ret != 0) { + return ret; + } + return ret; +} + +bool sbp_msg_ssr_stec_correction_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_msg_ssr_stec_correction_t *msg) { + if (!sbp_bounds_header_encode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->ssr_iod_atmo)) { + return false; + } + if (!sbp_u16_encode(ctx, &msg->tile_set_id)) { + return false; + } + if (!sbp_u16_encode(ctx, &msg->tile_id)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->n_sats)) { + return false; + } + for (size_t i = 0; i < msg->n_sats; i++) { + if (!sbp_stec_sat_element_encode_internal(ctx, &msg->stec_sat_list[i])) { + return false; + } + } + return true; +} + s8 sbp_msg_ssr_stec_correction_encode( uint8_t *buf, uint8_t len, uint8_t *n_written, const sbp_msg_ssr_stec_correction_t *msg) { @@ -1379,12 +1586,24 @@ s8 sbp_msg_ssr_stec_correction_encode( bool sbp_msg_ssr_stec_correction_decode_internal( sbp_decode_ctx_t *ctx, sbp_msg_ssr_stec_correction_t *msg) { - if (!sbp_stec_header_decode_internal(ctx, &msg->header)) { + if (!sbp_bounds_header_decode_internal(ctx, &msg->header)) { return false; } - msg->n_stec_sat_list = (uint8_t)((ctx->buf_len - ctx->offset) / - SBP_STEC_SAT_ELEMENT_ENCODED_LEN); - for (uint8_t i = 0; i < msg->n_stec_sat_list; i++) { + if (!sbp_u8_decode(ctx, &msg->ssr_iod_atmo)) { + return false; + } + if (!sbp_u16_decode(ctx, &msg->tile_set_id)) { + return false; + } + if (!sbp_u16_decode(ctx, &msg->tile_id)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->n_sats)) { + return false; + } + msg->n_sats = (uint8_t)((ctx->buf_len - ctx->offset) / + SBP_STEC_SAT_ELEMENT_ENCODED_LEN); + for (uint8_t i = 0; i < msg->n_sats; i++) { if (!sbp_stec_sat_element_decode_internal(ctx, &msg->stec_sat_list[i])) { return false; } @@ -1402,38 +1621,480 @@ s8 sbp_msg_ssr_stec_correction_decode(const uint8_t *buf, uint8_t len, if (!sbp_msg_ssr_stec_correction_decode_internal(&ctx, msg)) { return SBP_DECODE_ERROR; } - if (n_read != NULL) { - *n_read = (uint8_t)ctx.offset; + if (n_read != NULL) { + *n_read = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +s8 sbp_msg_ssr_stec_correction_send(sbp_state_t *s, u16 sender_id, + const sbp_msg_ssr_stec_correction_t *msg, + sbp_write_fn_t write) { + uint8_t payload[SBP_MAX_PAYLOAD_LEN]; + uint8_t payload_len; + s8 ret = sbp_msg_ssr_stec_correction_encode(payload, sizeof(payload), + &payload_len, msg); + if (ret != SBP_OK) { + return ret; + } + return sbp_payload_send(s, SBP_MSG_SSR_STEC_CORRECTION, sender_id, + payload_len, payload, write); +} + +int sbp_msg_ssr_stec_correction_cmp(const sbp_msg_ssr_stec_correction_t *a, + const sbp_msg_ssr_stec_correction_t *b) { + int ret = 0; + + ret = sbp_bounds_header_cmp(&a->header, &b->header); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->ssr_iod_atmo, &b->ssr_iod_atmo); + if (ret != 0) { + return ret; + } + + ret = sbp_u16_cmp(&a->tile_set_id, &b->tile_set_id); + if (ret != 0) { + return ret; + } + + ret = sbp_u16_cmp(&a->tile_id, &b->tile_id); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->n_sats, &b->n_sats); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->n_sats, &b->n_sats); + for (uint8_t i = 0; ret == 0 && i < a->n_sats; i++) { + ret = sbp_stec_sat_element_cmp(&a->stec_sat_list[i], &b->stec_sat_list[i]); + } + if (ret != 0) { + return ret; + } + return ret; +} + +bool sbp_msg_ssr_gridded_correction_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_msg_ssr_gridded_correction_t *msg) { + if (!sbp_gridded_correction_header_encode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u16_encode(ctx, &msg->index)) { + return false; + } + if (!sbp_tropospheric_delay_correction_encode_internal( + ctx, &msg->tropo_delay_correction)) { + return false; + } + for (size_t i = 0; i < msg->n_stec_residuals; i++) { + if (!sbp_stec_residual_encode_internal(ctx, &msg->stec_residuals[i])) { + return false; + } + } + return true; +} + +s8 sbp_msg_ssr_gridded_correction_encode( + uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_msg_ssr_gridded_correction_t *msg) { + sbp_encode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_msg_ssr_gridded_correction_encode_internal(&ctx, msg)) { + return SBP_ENCODE_ERROR; + } + if (n_written != NULL) { + *n_written = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +bool sbp_msg_ssr_gridded_correction_decode_internal( + sbp_decode_ctx_t *ctx, sbp_msg_ssr_gridded_correction_t *msg) { + if (!sbp_gridded_correction_header_decode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u16_decode(ctx, &msg->index)) { + return false; + } + if (!sbp_tropospheric_delay_correction_decode_internal( + ctx, &msg->tropo_delay_correction)) { + return false; + } + msg->n_stec_residuals = + (uint8_t)((ctx->buf_len - ctx->offset) / SBP_STEC_RESIDUAL_ENCODED_LEN); + for (uint8_t i = 0; i < msg->n_stec_residuals; i++) { + if (!sbp_stec_residual_decode_internal(ctx, &msg->stec_residuals[i])) { + return false; + } + } + return true; +} + +s8 sbp_msg_ssr_gridded_correction_decode( + const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_msg_ssr_gridded_correction_t *msg) { + sbp_decode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_msg_ssr_gridded_correction_decode_internal(&ctx, msg)) { + return SBP_DECODE_ERROR; + } + if (n_read != NULL) { + *n_read = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +s8 sbp_msg_ssr_gridded_correction_send( + sbp_state_t *s, u16 sender_id, const sbp_msg_ssr_gridded_correction_t *msg, + sbp_write_fn_t write) { + uint8_t payload[SBP_MAX_PAYLOAD_LEN]; + uint8_t payload_len; + s8 ret = sbp_msg_ssr_gridded_correction_encode(payload, sizeof(payload), + &payload_len, msg); + if (ret != SBP_OK) { + return ret; + } + return sbp_payload_send(s, SBP_MSG_SSR_GRIDDED_CORRECTION, sender_id, + payload_len, payload, write); +} + +int sbp_msg_ssr_gridded_correction_cmp( + const sbp_msg_ssr_gridded_correction_t *a, + const sbp_msg_ssr_gridded_correction_t *b) { + int ret = 0; + + ret = sbp_gridded_correction_header_cmp(&a->header, &b->header); + if (ret != 0) { + return ret; + } + + ret = sbp_u16_cmp(&a->index, &b->index); + if (ret != 0) { + return ret; + } + + ret = sbp_tropospheric_delay_correction_cmp(&a->tropo_delay_correction, + &b->tropo_delay_correction); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->n_stec_residuals, &b->n_stec_residuals); + for (uint8_t i = 0; ret == 0 && i < a->n_stec_residuals; i++) { + ret = sbp_stec_residual_cmp(&a->stec_residuals[i], &b->stec_residuals[i]); + } + if (ret != 0) { + return ret; + } + return ret; +} + +bool sbp_stec_sat_element_integrity_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_stec_sat_element_integrity_t *msg) { + if (!sbp_stec_residual_encode_internal(ctx, &msg->stec_residual)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->stec_bound_mu)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->stec_bound_sig)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->stec_bound_mu_dot)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->stec_bound_sig_dot)) { + return false; + } + return true; +} + +s8 sbp_stec_sat_element_integrity_encode( + uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_stec_sat_element_integrity_t *msg) { + sbp_encode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_stec_sat_element_integrity_encode_internal(&ctx, msg)) { + return SBP_ENCODE_ERROR; + } + if (n_written != NULL) { + *n_written = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +bool sbp_stec_sat_element_integrity_decode_internal( + sbp_decode_ctx_t *ctx, sbp_stec_sat_element_integrity_t *msg) { + if (!sbp_stec_residual_decode_internal(ctx, &msg->stec_residual)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->stec_bound_mu)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->stec_bound_sig)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->stec_bound_mu_dot)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->stec_bound_sig_dot)) { + return false; + } + return true; +} + +s8 sbp_stec_sat_element_integrity_decode( + const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_stec_sat_element_integrity_t *msg) { + sbp_decode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_stec_sat_element_integrity_decode_internal(&ctx, msg)) { + return SBP_DECODE_ERROR; + } + if (n_read != NULL) { + *n_read = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +int sbp_stec_sat_element_integrity_cmp( + const sbp_stec_sat_element_integrity_t *a, + const sbp_stec_sat_element_integrity_t *b) { + int ret = 0; + + ret = sbp_stec_residual_cmp(&a->stec_residual, &b->stec_residual); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->stec_bound_mu, &b->stec_bound_mu); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->stec_bound_sig, &b->stec_bound_sig); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->stec_bound_mu_dot, &b->stec_bound_mu_dot); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->stec_bound_sig_dot, &b->stec_bound_sig_dot); + if (ret != 0) { + return ret; + } + return ret; +} + +bool sbp_msg_ssr_gridded_correction_bounds_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_msg_ssr_gridded_correction_bounds_t *msg) { + if (!sbp_bounds_header_encode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->ssr_iod_atmo)) { + return false; + } + if (!sbp_u16_encode(ctx, &msg->tile_set_id)) { + return false; + } + if (!sbp_u16_encode(ctx, &msg->tile_id)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->tropo_qi)) { + return false; + } + if (!sbp_u16_encode(ctx, &msg->grid_point_id)) { + return false; + } + if (!sbp_tropospheric_delay_correction_encode_internal( + ctx, &msg->tropo_delay_correction)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->tropo_bound_mu)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->tropo_bound_sig)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->n_sats)) { + return false; + } + for (size_t i = 0; i < msg->n_sats; i++) { + if (!sbp_stec_sat_element_integrity_encode_internal( + ctx, &msg->stec_sat_list[i])) { + return false; + } + } + return true; +} + +s8 sbp_msg_ssr_gridded_correction_bounds_encode( + uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_msg_ssr_gridded_correction_bounds_t *msg) { + sbp_encode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_msg_ssr_gridded_correction_bounds_encode_internal(&ctx, msg)) { + return SBP_ENCODE_ERROR; + } + if (n_written != NULL) { + *n_written = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +bool sbp_msg_ssr_gridded_correction_bounds_decode_internal( + sbp_decode_ctx_t *ctx, sbp_msg_ssr_gridded_correction_bounds_t *msg) { + if (!sbp_bounds_header_decode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->ssr_iod_atmo)) { + return false; + } + if (!sbp_u16_decode(ctx, &msg->tile_set_id)) { + return false; + } + if (!sbp_u16_decode(ctx, &msg->tile_id)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->tropo_qi)) { + return false; + } + if (!sbp_u16_decode(ctx, &msg->grid_point_id)) { + return false; + } + if (!sbp_tropospheric_delay_correction_decode_internal( + ctx, &msg->tropo_delay_correction)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->tropo_bound_mu)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->tropo_bound_sig)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->n_sats)) { + return false; + } + msg->n_sats = (uint8_t)((ctx->buf_len - ctx->offset) / + SBP_STEC_SAT_ELEMENT_INTEGRITY_ENCODED_LEN); + for (uint8_t i = 0; i < msg->n_sats; i++) { + if (!sbp_stec_sat_element_integrity_decode_internal( + ctx, &msg->stec_sat_list[i])) { + return false; + } + } + return true; +} + +s8 sbp_msg_ssr_gridded_correction_bounds_decode( + const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_msg_ssr_gridded_correction_bounds_t *msg) { + sbp_decode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_msg_ssr_gridded_correction_bounds_decode_internal(&ctx, msg)) { + return SBP_DECODE_ERROR; + } + if (n_read != NULL) { + *n_read = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +s8 sbp_msg_ssr_gridded_correction_bounds_send( + sbp_state_t *s, u16 sender_id, + const sbp_msg_ssr_gridded_correction_bounds_t *msg, sbp_write_fn_t write) { + uint8_t payload[SBP_MAX_PAYLOAD_LEN]; + uint8_t payload_len; + s8 ret = sbp_msg_ssr_gridded_correction_bounds_encode( + payload, sizeof(payload), &payload_len, msg); + if (ret != SBP_OK) { + return ret; + } + return sbp_payload_send(s, SBP_MSG_SSR_GRIDDED_CORRECTION_BOUNDS, sender_id, + payload_len, payload, write); +} + +int sbp_msg_ssr_gridded_correction_bounds_cmp( + const sbp_msg_ssr_gridded_correction_bounds_t *a, + const sbp_msg_ssr_gridded_correction_bounds_t *b) { + int ret = 0; + + ret = sbp_bounds_header_cmp(&a->header, &b->header); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->ssr_iod_atmo, &b->ssr_iod_atmo); + if (ret != 0) { + return ret; + } + + ret = sbp_u16_cmp(&a->tile_set_id, &b->tile_set_id); + if (ret != 0) { + return ret; + } + + ret = sbp_u16_cmp(&a->tile_id, &b->tile_id); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->tropo_qi, &b->tropo_qi); + if (ret != 0) { + return ret; + } + + ret = sbp_u16_cmp(&a->grid_point_id, &b->grid_point_id); + if (ret != 0) { + return ret; + } + + ret = sbp_tropospheric_delay_correction_cmp(&a->tropo_delay_correction, + &b->tropo_delay_correction); + if (ret != 0) { + return ret; } - return SBP_OK; -} -s8 sbp_msg_ssr_stec_correction_send(sbp_state_t *s, u16 sender_id, - const sbp_msg_ssr_stec_correction_t *msg, - sbp_write_fn_t write) { - uint8_t payload[SBP_MAX_PAYLOAD_LEN]; - uint8_t payload_len; - s8 ret = sbp_msg_ssr_stec_correction_encode(payload, sizeof(payload), - &payload_len, msg); - if (ret != SBP_OK) { + ret = sbp_u8_cmp(&a->tropo_bound_mu, &b->tropo_bound_mu); + if (ret != 0) { return ret; } - return sbp_payload_send(s, SBP_MSG_SSR_STEC_CORRECTION, sender_id, - payload_len, payload, write); -} -int sbp_msg_ssr_stec_correction_cmp(const sbp_msg_ssr_stec_correction_t *a, - const sbp_msg_ssr_stec_correction_t *b) { - int ret = 0; + ret = sbp_u8_cmp(&a->tropo_bound_sig, &b->tropo_bound_sig); + if (ret != 0) { + return ret; + } - ret = sbp_stec_header_cmp(&a->header, &b->header); + ret = sbp_u8_cmp(&a->n_sats, &b->n_sats); if (ret != 0) { return ret; } - ret = sbp_u8_cmp(&a->n_stec_sat_list, &b->n_stec_sat_list); - for (uint8_t i = 0; ret == 0 && i < a->n_stec_sat_list; i++) { - ret = sbp_stec_sat_element_cmp(&a->stec_sat_list[i], &b->stec_sat_list[i]); + ret = sbp_u8_cmp(&a->n_sats, &b->n_sats); + for (uint8_t i = 0; ret == 0 && i < a->n_sats; i++) { + ret = sbp_stec_sat_element_integrity_cmp(&a->stec_sat_list[i], + &b->stec_sat_list[i]); } if (ret != 0) { return ret; @@ -1441,34 +2102,46 @@ int sbp_msg_ssr_stec_correction_cmp(const sbp_msg_ssr_stec_correction_t *a, return ret; } -bool sbp_msg_ssr_gridded_correction_encode_internal( - sbp_encode_ctx_t *ctx, const sbp_msg_ssr_gridded_correction_t *msg) { - if (!sbp_gridded_correction_header_encode_internal(ctx, &msg->header)) { +bool sbp_msg_ssr_tile_definition_dep_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_msg_ssr_tile_definition_dep_t *msg) { + if (!sbp_u16_encode(ctx, &msg->tile_set_id)) { return false; } - if (!sbp_u16_encode(ctx, &msg->index)) { + if (!sbp_u16_encode(ctx, &msg->tile_id)) { return false; } - if (!sbp_tropospheric_delay_correction_encode_internal( - ctx, &msg->tropo_delay_correction)) { + if (!sbp_s16_encode(ctx, &msg->corner_nw_lat)) { return false; } - for (size_t i = 0; i < msg->n_stec_residuals; i++) { - if (!sbp_stec_residual_encode_internal(ctx, &msg->stec_residuals[i])) { - return false; - } + if (!sbp_s16_encode(ctx, &msg->corner_nw_lon)) { + return false; + } + if (!sbp_u16_encode(ctx, &msg->spacing_lat)) { + return false; + } + if (!sbp_u16_encode(ctx, &msg->spacing_lon)) { + return false; + } + if (!sbp_u16_encode(ctx, &msg->rows)) { + return false; + } + if (!sbp_u16_encode(ctx, &msg->cols)) { + return false; + } + if (!sbp_u64_encode(ctx, &msg->bitmask)) { + return false; } return true; } -s8 sbp_msg_ssr_gridded_correction_encode( +s8 sbp_msg_ssr_tile_definition_dep_encode( uint8_t *buf, uint8_t len, uint8_t *n_written, - const sbp_msg_ssr_gridded_correction_t *msg) { + const sbp_msg_ssr_tile_definition_dep_t *msg) { sbp_encode_ctx_t ctx; ctx.buf = buf; ctx.buf_len = len; ctx.offset = 0; - if (!sbp_msg_ssr_gridded_correction_encode_internal(&ctx, msg)) { + if (!sbp_msg_ssr_tile_definition_dep_encode_internal(&ctx, msg)) { return SBP_ENCODE_ERROR; } if (n_written != NULL) { @@ -1477,36 +2150,46 @@ s8 sbp_msg_ssr_gridded_correction_encode( return SBP_OK; } -bool sbp_msg_ssr_gridded_correction_decode_internal( - sbp_decode_ctx_t *ctx, sbp_msg_ssr_gridded_correction_t *msg) { - if (!sbp_gridded_correction_header_decode_internal(ctx, &msg->header)) { +bool sbp_msg_ssr_tile_definition_dep_decode_internal( + sbp_decode_ctx_t *ctx, sbp_msg_ssr_tile_definition_dep_t *msg) { + if (!sbp_u16_decode(ctx, &msg->tile_set_id)) { return false; } - if (!sbp_u16_decode(ctx, &msg->index)) { + if (!sbp_u16_decode(ctx, &msg->tile_id)) { return false; } - if (!sbp_tropospheric_delay_correction_decode_internal( - ctx, &msg->tropo_delay_correction)) { + if (!sbp_s16_decode(ctx, &msg->corner_nw_lat)) { return false; } - msg->n_stec_residuals = - (uint8_t)((ctx->buf_len - ctx->offset) / SBP_STEC_RESIDUAL_ENCODED_LEN); - for (uint8_t i = 0; i < msg->n_stec_residuals; i++) { - if (!sbp_stec_residual_decode_internal(ctx, &msg->stec_residuals[i])) { - return false; - } + if (!sbp_s16_decode(ctx, &msg->corner_nw_lon)) { + return false; + } + if (!sbp_u16_decode(ctx, &msg->spacing_lat)) { + return false; + } + if (!sbp_u16_decode(ctx, &msg->spacing_lon)) { + return false; + } + if (!sbp_u16_decode(ctx, &msg->rows)) { + return false; + } + if (!sbp_u16_decode(ctx, &msg->cols)) { + return false; + } + if (!sbp_u64_decode(ctx, &msg->bitmask)) { + return false; } return true; } -s8 sbp_msg_ssr_gridded_correction_decode( +s8 sbp_msg_ssr_tile_definition_dep_decode( const uint8_t *buf, uint8_t len, uint8_t *n_read, - sbp_msg_ssr_gridded_correction_t *msg) { + sbp_msg_ssr_tile_definition_dep_t *msg) { sbp_decode_ctx_t ctx; ctx.buf = buf; ctx.buf_len = len; ctx.offset = 0; - if (!sbp_msg_ssr_gridded_correction_decode_internal(&ctx, msg)) { + if (!sbp_msg_ssr_tile_definition_dep_decode_internal(&ctx, msg)) { return SBP_DECODE_ERROR; } if (n_read != NULL) { @@ -1515,45 +2198,66 @@ s8 sbp_msg_ssr_gridded_correction_decode( return SBP_OK; } -s8 sbp_msg_ssr_gridded_correction_send( - sbp_state_t *s, u16 sender_id, const sbp_msg_ssr_gridded_correction_t *msg, +s8 sbp_msg_ssr_tile_definition_dep_send( + sbp_state_t *s, u16 sender_id, const sbp_msg_ssr_tile_definition_dep_t *msg, sbp_write_fn_t write) { uint8_t payload[SBP_MAX_PAYLOAD_LEN]; uint8_t payload_len; - s8 ret = sbp_msg_ssr_gridded_correction_encode(payload, sizeof(payload), - &payload_len, msg); + s8 ret = sbp_msg_ssr_tile_definition_dep_encode(payload, sizeof(payload), + &payload_len, msg); if (ret != SBP_OK) { return ret; } - return sbp_payload_send(s, SBP_MSG_SSR_GRIDDED_CORRECTION, sender_id, + return sbp_payload_send(s, SBP_MSG_SSR_TILE_DEFINITION_DEP, sender_id, payload_len, payload, write); } -int sbp_msg_ssr_gridded_correction_cmp( - const sbp_msg_ssr_gridded_correction_t *a, - const sbp_msg_ssr_gridded_correction_t *b) { +int sbp_msg_ssr_tile_definition_dep_cmp( + const sbp_msg_ssr_tile_definition_dep_t *a, + const sbp_msg_ssr_tile_definition_dep_t *b) { int ret = 0; - ret = sbp_gridded_correction_header_cmp(&a->header, &b->header); + ret = sbp_u16_cmp(&a->tile_set_id, &b->tile_set_id); if (ret != 0) { return ret; } - ret = sbp_u16_cmp(&a->index, &b->index); + ret = sbp_u16_cmp(&a->tile_id, &b->tile_id); if (ret != 0) { return ret; } - ret = sbp_tropospheric_delay_correction_cmp(&a->tropo_delay_correction, - &b->tropo_delay_correction); + ret = sbp_s16_cmp(&a->corner_nw_lat, &b->corner_nw_lat); if (ret != 0) { return ret; } - ret = sbp_u8_cmp(&a->n_stec_residuals, &b->n_stec_residuals); - for (uint8_t i = 0; ret == 0 && i < a->n_stec_residuals; i++) { - ret = sbp_stec_residual_cmp(&a->stec_residuals[i], &b->stec_residuals[i]); + ret = sbp_s16_cmp(&a->corner_nw_lon, &b->corner_nw_lon); + if (ret != 0) { + return ret; + } + + ret = sbp_u16_cmp(&a->spacing_lat, &b->spacing_lat); + if (ret != 0) { + return ret; + } + + ret = sbp_u16_cmp(&a->spacing_lon, &b->spacing_lon); + if (ret != 0) { + return ret; + } + + ret = sbp_u16_cmp(&a->rows, &b->rows); + if (ret != 0) { + return ret; + } + + ret = sbp_u16_cmp(&a->cols, &b->cols); + if (ret != 0) { + return ret; } + + ret = sbp_u64_cmp(&a->bitmask, &b->bitmask); if (ret != 0) { return ret; } @@ -1562,6 +2266,9 @@ int sbp_msg_ssr_gridded_correction_cmp( bool sbp_msg_ssr_tile_definition_encode_internal( sbp_encode_ctx_t *ctx, const sbp_msg_ssr_tile_definition_t *msg) { + if (!sbp_u8_encode(ctx, &msg->ssr_sol_id)) { + return false; + } if (!sbp_u16_encode(ctx, &msg->tile_set_id)) { return false; } @@ -1610,6 +2317,9 @@ s8 sbp_msg_ssr_tile_definition_encode( bool sbp_msg_ssr_tile_definition_decode_internal( sbp_decode_ctx_t *ctx, sbp_msg_ssr_tile_definition_t *msg) { + if (!sbp_u8_decode(ctx, &msg->ssr_sol_id)) { + return false; + } if (!sbp_u16_decode(ctx, &msg->tile_set_id)) { return false; } @@ -1674,6 +2384,11 @@ int sbp_msg_ssr_tile_definition_cmp(const sbp_msg_ssr_tile_definition_t *a, const sbp_msg_ssr_tile_definition_t *b) { int ret = 0; + ret = sbp_u8_cmp(&a->ssr_sol_id, &b->ssr_sol_id); + if (ret != 0) { + return ret; + } + ret = sbp_u16_cmp(&a->tile_set_id, &b->tile_set_id); if (ret != 0) { return ret; @@ -2895,107 +3610,6 @@ int sbp_msg_ssr_grid_definition_dep_a_cmp( return ret; } -bool sbp_bounds_header_encode_internal(sbp_encode_ctx_t *ctx, - const sbp_bounds_header_t *msg) { - if (!sbp_gps_time_sec_encode_internal(ctx, &msg->time)) { - return false; - } - if (!sbp_u8_encode(ctx, &msg->num_msgs)) { - return false; - } - if (!sbp_u8_encode(ctx, &msg->seq_num)) { - return false; - } - if (!sbp_u8_encode(ctx, &msg->update_interval)) { - return false; - } - if (!sbp_u8_encode(ctx, &msg->sol_id)) { - return false; - } - return true; -} - -s8 sbp_bounds_header_encode(uint8_t *buf, uint8_t len, uint8_t *n_written, - const sbp_bounds_header_t *msg) { - sbp_encode_ctx_t ctx; - ctx.buf = buf; - ctx.buf_len = len; - ctx.offset = 0; - if (!sbp_bounds_header_encode_internal(&ctx, msg)) { - return SBP_ENCODE_ERROR; - } - if (n_written != NULL) { - *n_written = (uint8_t)ctx.offset; - } - return SBP_OK; -} - -bool sbp_bounds_header_decode_internal(sbp_decode_ctx_t *ctx, - sbp_bounds_header_t *msg) { - if (!sbp_gps_time_sec_decode_internal(ctx, &msg->time)) { - return false; - } - if (!sbp_u8_decode(ctx, &msg->num_msgs)) { - return false; - } - if (!sbp_u8_decode(ctx, &msg->seq_num)) { - return false; - } - if (!sbp_u8_decode(ctx, &msg->update_interval)) { - return false; - } - if (!sbp_u8_decode(ctx, &msg->sol_id)) { - return false; - } - return true; -} - -s8 sbp_bounds_header_decode(const uint8_t *buf, uint8_t len, uint8_t *n_read, - sbp_bounds_header_t *msg) { - sbp_decode_ctx_t ctx; - ctx.buf = buf; - ctx.buf_len = len; - ctx.offset = 0; - if (!sbp_bounds_header_decode_internal(&ctx, msg)) { - return SBP_DECODE_ERROR; - } - if (n_read != NULL) { - *n_read = (uint8_t)ctx.offset; - } - return SBP_OK; -} - -int sbp_bounds_header_cmp(const sbp_bounds_header_t *a, - const sbp_bounds_header_t *b) { - int ret = 0; - - ret = sbp_gps_time_sec_cmp(&a->time, &b->time); - if (ret != 0) { - return ret; - } - - ret = sbp_u8_cmp(&a->num_msgs, &b->num_msgs); - if (ret != 0) { - return ret; - } - - ret = sbp_u8_cmp(&a->seq_num, &b->seq_num); - if (ret != 0) { - return ret; - } - - ret = sbp_u8_cmp(&a->update_interval, &b->update_interval); - if (ret != 0) { - return ret; - } - - ret = sbp_u8_cmp(&a->sol_id, &b->sol_id); - if (ret != 0) { - return ret; - } - return ret; -} - bool sbp_orbit_clock_bound_encode_internal(sbp_encode_ctx_t *ctx, const sbp_orbit_clock_bound_t *msg) { if (!sbp_u8_encode(ctx, &msg->sat_id)) { diff --git a/c/test/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.c b/c/test/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.c new file mode 100644 index 0000000000..be074e3df7 --- /dev/null +++ b/c/test/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.c @@ -0,0 +1,466 @@ +/* + * Copyright (C) 2015-2021 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +// This file was auto-generated from +// spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml by +// generate.py. Do not modify by hand! + +#include +#include +#include +#include // for debugging +#include // for malloc + +static struct { + u32 n_callbacks_logged; + u16 sender_id; + sbp_msg_type_t msg_type; + sbp_msg_t msg; + void *context; +} last_msg; + +static u32 dummy_wr = 0; +static u32 dummy_rd = 0; +static u8 dummy_buff[1024]; +static void *last_io_context; + +static void *DUMMY_MEMORY_FOR_CALLBACKS = (void *)0xdeadbeef; +static void *DUMMY_MEMORY_FOR_IO = (void *)0xdead0000; + +static void dummy_reset() { + dummy_rd = dummy_wr = 0; + memset(dummy_buff, 0, sizeof(dummy_buff)); +} + +static s32 dummy_write(u8 *buff, u32 n, void *context) { + last_io_context = context; + u32 real_n = n; //(dummy_n > n) ? n : dummy_n; + memcpy(dummy_buff + dummy_wr, buff, real_n); + dummy_wr += real_n; + return (s32)real_n; +} + +static s32 dummy_read(u8 *buff, u32 n, void *context) { + last_io_context = context; + u32 real_n = n; //(dummy_n > n) ? n : dummy_n; + memcpy(buff, dummy_buff + dummy_rd, real_n); + dummy_rd += real_n; + return (s32)real_n; +} + +static void logging_reset() { memset(&last_msg, 0, sizeof(last_msg)); } + +static void msg_callback(u16 sender_id, sbp_msg_type_t msg_type, + const sbp_msg_t *msg, void *context) { + last_msg.n_callbacks_logged++; + last_msg.sender_id = sender_id; + last_msg.msg_type = msg_type; + last_msg.msg = *msg; + last_msg.context = context; +} + +START_TEST(test_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds) { + static sbp_msg_callbacks_node_t n; + + // State of the SBP message parser. + // Must be statically allocated. + sbp_state_t sbp_state; + + // + // Run tests: + // + // Test successful parsing of a message + { + // SBP parser state must be initialized before sbp_process is called. + // We re-initialize before every test so that callbacks for the same message + // types can be + // allocated multiple times across different tests. + sbp_state_init(&sbp_state); + + sbp_state_set_io_context(&sbp_state, &DUMMY_MEMORY_FOR_IO); + + logging_reset(); + + sbp_callback_register(&sbp_state, 1534, &msg_callback, + &DUMMY_MEMORY_FOR_CALLBACKS, &n); + + u8 encoded_frame[] = { + 85, 254, 5, 66, 0, 43, 180, 0, 0, 0, 3, 0, 1, + 1, 10, 0, 15, 1, 0, 10, 0, 39, 232, 3, 244, 1, + 100, 200, 150, 100, 2, 5, 10, 16, 0, 17, 18, 19, 20, + 21, 6, 10, 22, 0, 23, 24, 25, 26, 27, 112, 145, + }; + + dummy_reset(); + + sbp_msg_t test_msg; + memset(&test_msg, 0, sizeof(test_msg)); + + test_msg.ssr_gridded_correction_bounds.grid_point_id = 1000; + + test_msg.ssr_gridded_correction_bounds.header.num_msgs = 1; + + test_msg.ssr_gridded_correction_bounds.header.seq_num = 1; + + test_msg.ssr_gridded_correction_bounds.header.sol_id = 0; + + test_msg.ssr_gridded_correction_bounds.header.time.tow = 180; + + test_msg.ssr_gridded_correction_bounds.header.time.wn = 3; + + test_msg.ssr_gridded_correction_bounds.header.update_interval = 10; + + test_msg.ssr_gridded_correction_bounds.n_sats = 2; + + test_msg.ssr_gridded_correction_bounds.ssr_iod_atmo = 15; + + test_msg.ssr_gridded_correction_bounds.stec_sat_list[0].stec_bound_mu = 18; + + test_msg.ssr_gridded_correction_bounds.stec_sat_list[0].stec_bound_mu_dot = + 20; + + test_msg.ssr_gridded_correction_bounds.stec_sat_list[0].stec_bound_sig = 19; + + test_msg.ssr_gridded_correction_bounds.stec_sat_list[0].stec_bound_sig_dot = + 21; + + test_msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_residual.residual = 16; + + test_msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_residual.stddev = 17; + + test_msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_residual.sv_id.constellation = 10; + + test_msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_residual.sv_id.satId = 5; + + test_msg.ssr_gridded_correction_bounds.stec_sat_list[1].stec_bound_mu = 24; + + test_msg.ssr_gridded_correction_bounds.stec_sat_list[1].stec_bound_mu_dot = + 26; + + test_msg.ssr_gridded_correction_bounds.stec_sat_list[1].stec_bound_sig = 25; + + test_msg.ssr_gridded_correction_bounds.stec_sat_list[1].stec_bound_sig_dot = + 27; + + test_msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_residual.residual = 22; + + test_msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_residual.stddev = 23; + + test_msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_residual.sv_id.constellation = 10; + + test_msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_residual.sv_id.satId = 6; + + test_msg.ssr_gridded_correction_bounds.tile_id = 10; + + test_msg.ssr_gridded_correction_bounds.tile_set_id = 1; + + test_msg.ssr_gridded_correction_bounds.tropo_bound_mu = 150; + + test_msg.ssr_gridded_correction_bounds.tropo_bound_sig = 100; + + test_msg.ssr_gridded_correction_bounds.tropo_delay_correction.hydro = 500; + + test_msg.ssr_gridded_correction_bounds.tropo_delay_correction.stddev = 200; + + test_msg.ssr_gridded_correction_bounds.tropo_delay_correction.wet = 100; + + test_msg.ssr_gridded_correction_bounds.tropo_qi = 39; + + sbp_message_send(&sbp_state, SbpMsgSsrGriddedCorrectionBounds, 66, + &test_msg, &dummy_write); + + ck_assert_msg(dummy_wr == sizeof(encoded_frame), + "not enough data was written to dummy_buff (expected: %zu, " + "actual: %zu)", + sizeof(encoded_frame), dummy_wr); + ck_assert_msg(memcmp(dummy_buff, encoded_frame, sizeof(encoded_frame)) == 0, + "frame was not encoded properly"); + + while (dummy_rd < dummy_wr) { + ck_assert_msg(sbp_process(&sbp_state, &dummy_read) >= SBP_OK, + "sbp_process threw an error!"); + } + + ck_assert_msg(last_msg.n_callbacks_logged == 1, + "msg_callback: one callback should have been logged"); + ck_assert_msg(last_msg.sender_id == 66, + "msg_callback: sender_id decoded incorrectly"); + + ck_assert_msg(sbp_message_cmp(SbpMsgSsrGriddedCorrectionBounds, + &last_msg.msg, &test_msg) == 0, + "Sent and received messages did not compare equal"); + + ck_assert_msg( + last_msg.msg.ssr_gridded_correction_bounds.grid_point_id == 1000, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.grid_point_id, expected " + "1000, is %d", + last_msg.msg.ssr_gridded_correction_bounds.grid_point_id); + + ck_assert_msg( + last_msg.msg.ssr_gridded_correction_bounds.header.num_msgs == 1, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.header.num_msgs, expected " + "1, is %d", + last_msg.msg.ssr_gridded_correction_bounds.header.num_msgs); + + ck_assert_msg( + last_msg.msg.ssr_gridded_correction_bounds.header.seq_num == 1, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.header.seq_num, expected " + "1, is %d", + last_msg.msg.ssr_gridded_correction_bounds.header.seq_num); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.header.sol_id == 0, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.header.sol_id, " + "expected 0, is %d", + last_msg.msg.ssr_gridded_correction_bounds.header.sol_id); + + ck_assert_msg( + last_msg.msg.ssr_gridded_correction_bounds.header.time.tow == 180, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.header.time.tow, expected " + "180, is %d", + last_msg.msg.ssr_gridded_correction_bounds.header.time.tow); + + ck_assert_msg( + last_msg.msg.ssr_gridded_correction_bounds.header.time.wn == 3, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.header.time.wn, expected " + "3, is %d", + last_msg.msg.ssr_gridded_correction_bounds.header.time.wn); + + ck_assert_msg( + last_msg.msg.ssr_gridded_correction_bounds.header.update_interval == 10, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.header.update_interval, " + "expected 10, is %d", + last_msg.msg.ssr_gridded_correction_bounds.header.update_interval); + + ck_assert_msg( + last_msg.msg.ssr_gridded_correction_bounds.n_sats == 2, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.n_sats, expected 2, is %d", + last_msg.msg.ssr_gridded_correction_bounds.n_sats); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.ssr_iod_atmo == 15, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.ssr_iod_atmo, " + "expected 15, is %d", + last_msg.msg.ssr_gridded_correction_bounds.ssr_iod_atmo); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_bound_mu == 18, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0]." + "stec_bound_mu, expected 18, is %d", + last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_bound_mu); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_bound_mu_dot == 20, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0]." + "stec_bound_mu_dot, expected 20, is %d", + last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_bound_mu_dot); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_bound_sig == 19, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0]." + "stec_bound_sig, expected 19, is %d", + last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_bound_sig); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_bound_sig_dot == 21, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0]." + "stec_bound_sig_dot, expected 21, is %d", + last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_bound_sig_dot); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_residual.residual == 16, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0]." + "stec_residual.residual, expected 16, is %d", + last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_residual.residual); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_residual.stddev == 17, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0]." + "stec_residual.stddev, expected 17, is %d", + last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_residual.stddev); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_residual.sv_id.constellation == 10, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0]." + "stec_residual.sv_id.constellation, expected 10, is %d", + last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_residual.sv_id.constellation); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_residual.sv_id.satId == 5, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0]." + "stec_residual.sv_id.satId, expected 5, is %d", + last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_residual.sv_id.satId); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_bound_mu == 24, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1]." + "stec_bound_mu, expected 24, is %d", + last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_bound_mu); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_bound_mu_dot == 26, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1]." + "stec_bound_mu_dot, expected 26, is %d", + last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_bound_mu_dot); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_bound_sig == 25, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1]." + "stec_bound_sig, expected 25, is %d", + last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_bound_sig); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_bound_sig_dot == 27, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1]." + "stec_bound_sig_dot, expected 27, is %d", + last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_bound_sig_dot); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_residual.residual == 22, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1]." + "stec_residual.residual, expected 22, is %d", + last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_residual.residual); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_residual.stddev == 23, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1]." + "stec_residual.stddev, expected 23, is %d", + last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_residual.stddev); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_residual.sv_id.constellation == 10, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1]." + "stec_residual.sv_id.constellation, expected 10, is %d", + last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_residual.sv_id.constellation); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_residual.sv_id.satId == 6, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1]." + "stec_residual.sv_id.satId, expected 6, is %d", + last_msg.msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_residual.sv_id.satId); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.tile_id == 10, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.tile_id, " + "expected 10, is %d", + last_msg.msg.ssr_gridded_correction_bounds.tile_id); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.tile_set_id == 1, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.tile_set_id, " + "expected 1, is %d", + last_msg.msg.ssr_gridded_correction_bounds.tile_set_id); + + ck_assert_msg( + last_msg.msg.ssr_gridded_correction_bounds.tropo_bound_mu == 150, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.tropo_bound_mu, expected " + "150, is %d", + last_msg.msg.ssr_gridded_correction_bounds.tropo_bound_mu); + + ck_assert_msg( + last_msg.msg.ssr_gridded_correction_bounds.tropo_bound_sig == 100, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.tropo_bound_sig, expected " + "100, is %d", + last_msg.msg.ssr_gridded_correction_bounds.tropo_bound_sig); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds + .tropo_delay_correction.hydro == 500, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.tropo_delay_" + "correction.hydro, expected 500, is %d", + last_msg.msg.ssr_gridded_correction_bounds + .tropo_delay_correction.hydro); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds + .tropo_delay_correction.stddev == 200, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.tropo_delay_" + "correction.stddev, expected 200, is %d", + last_msg.msg.ssr_gridded_correction_bounds + .tropo_delay_correction.stddev); + + ck_assert_msg( + last_msg.msg.ssr_gridded_correction_bounds.tropo_delay_correction.wet == + 100, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.tropo_delay_correction.wet," + " expected 100, is %d", + last_msg.msg.ssr_gridded_correction_bounds.tropo_delay_correction.wet); + + ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.tropo_qi == 39, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.tropo_qi, " + "expected 39, is %d", + last_msg.msg.ssr_gridded_correction_bounds.tropo_qi); + } +} +END_TEST + +Suite *auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds_suite(void) { + Suite *s = suite_create( + "SBP generated test suite: " + "auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds"); + TCase *tc_acq = tcase_create( + "Automated_Suite_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds"); + tcase_add_test(tc_acq, test_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds); + suite_add_tcase(s, tc_acq); + return s; +} \ No newline at end of file diff --git a/c/test/auto_check_sbp_ssr_MsgSsrStecCorrection.c b/c/test/auto_check_sbp_ssr_MsgSsrStecCorrection.c new file mode 100644 index 0000000000..0614e5844b --- /dev/null +++ b/c/test/auto_check_sbp_ssr_MsgSsrStecCorrection.c @@ -0,0 +1,345 @@ +/* + * Copyright (C) 2015-2021 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +// This file was auto-generated from +// spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrection.yaml by +// generate.py. Do not modify by hand! + +#include +#include +#include +#include // for debugging +#include // for malloc + +static struct { + u32 n_callbacks_logged; + u16 sender_id; + sbp_msg_type_t msg_type; + sbp_msg_t msg; + void *context; +} last_msg; + +static u32 dummy_wr = 0; +static u32 dummy_rd = 0; +static u8 dummy_buff[1024]; +static void *last_io_context; + +static void *DUMMY_MEMORY_FOR_CALLBACKS = (void *)0xdeadbeef; +static void *DUMMY_MEMORY_FOR_IO = (void *)0xdead0000; + +static void dummy_reset() { + dummy_rd = dummy_wr = 0; + memset(dummy_buff, 0, sizeof(dummy_buff)); +} + +static s32 dummy_write(u8 *buff, u32 n, void *context) { + last_io_context = context; + u32 real_n = n; //(dummy_n > n) ? n : dummy_n; + memcpy(dummy_buff + dummy_wr, buff, real_n); + dummy_wr += real_n; + return (s32)real_n; +} + +static s32 dummy_read(u8 *buff, u32 n, void *context) { + last_io_context = context; + u32 real_n = n; //(dummy_n > n) ? n : dummy_n; + memcpy(buff, dummy_buff + dummy_rd, real_n); + dummy_rd += real_n; + return (s32)real_n; +} + +static void logging_reset() { memset(&last_msg, 0, sizeof(last_msg)); } + +static void msg_callback(u16 sender_id, sbp_msg_type_t msg_type, + const sbp_msg_t *msg, void *context) { + last_msg.n_callbacks_logged++; + last_msg.sender_id = sender_id; + last_msg.msg_type = msg_type; + last_msg.msg = *msg; + last_msg.context = context; +} + +START_TEST(test_auto_check_sbp_ssr_MsgSsrStecCorrection) { + static sbp_msg_callbacks_node_t n; + + // State of the SBP message parser. + // Must be statically allocated. + sbp_state_t sbp_state; + + // + // Run tests: + // + // Test successful parsing of a message + { + // SBP parser state must be initialized before sbp_process is called. + // We re-initialize before every test so that callbacks for the same message + // types can be + // allocated multiple times across different tests. + sbp_state_init(&sbp_state); + + sbp_state_set_io_context(&sbp_state, &DUMMY_MEMORY_FOR_IO); + + logging_reset(); + + sbp_callback_register(&sbp_state, 1533, &msg_callback, + &DUMMY_MEMORY_FOR_CALLBACKS, &n); + + u8 encoded_frame[] = { + 85, 253, 5, 66, 0, 38, 180, 0, 0, 0, 3, 0, 1, 1, 10, 0, + 15, 1, 0, 10, 0, 2, 1, 1, 1, 63, 0, 62, 0, 61, 0, 60, + 0, 31, 15, 5, 63, 0, 64, 0, 65, 0, 66, 0, 119, 50, + }; + + dummy_reset(); + + sbp_msg_t test_msg; + memset(&test_msg, 0, sizeof(test_msg)); + + test_msg.ssr_stec_correction.header.num_msgs = 1; + + test_msg.ssr_stec_correction.header.seq_num = 1; + + test_msg.ssr_stec_correction.header.sol_id = 0; + + test_msg.ssr_stec_correction.header.time.tow = 180; + + test_msg.ssr_stec_correction.header.time.wn = 3; + + test_msg.ssr_stec_correction.header.update_interval = 10; + + test_msg.ssr_stec_correction.n_sats = 2; + + test_msg.ssr_stec_correction.ssr_iod_atmo = 15; + + test_msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[0] = 63; + + test_msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[1] = 62; + + test_msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[2] = 61; + + test_msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[3] = 60; + + test_msg.ssr_stec_correction.stec_sat_list[0].stec_quality_indicator = 1; + + test_msg.ssr_stec_correction.stec_sat_list[0].sv_id.constellation = 1; + + test_msg.ssr_stec_correction.stec_sat_list[0].sv_id.satId = 1; + + test_msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[0] = 63; + + test_msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[1] = 64; + + test_msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[2] = 65; + + test_msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[3] = 66; + + test_msg.ssr_stec_correction.stec_sat_list[1].stec_quality_indicator = 5; + + test_msg.ssr_stec_correction.stec_sat_list[1].sv_id.constellation = 15; + + test_msg.ssr_stec_correction.stec_sat_list[1].sv_id.satId = 31; + + test_msg.ssr_stec_correction.tile_id = 10; + + test_msg.ssr_stec_correction.tile_set_id = 1; + + sbp_message_send(&sbp_state, SbpMsgSsrStecCorrection, 66, &test_msg, + &dummy_write); + + ck_assert_msg(dummy_wr == sizeof(encoded_frame), + "not enough data was written to dummy_buff (expected: %zu, " + "actual: %zu)", + sizeof(encoded_frame), dummy_wr); + ck_assert_msg(memcmp(dummy_buff, encoded_frame, sizeof(encoded_frame)) == 0, + "frame was not encoded properly"); + + while (dummy_rd < dummy_wr) { + ck_assert_msg(sbp_process(&sbp_state, &dummy_read) >= SBP_OK, + "sbp_process threw an error!"); + } + + ck_assert_msg(last_msg.n_callbacks_logged == 1, + "msg_callback: one callback should have been logged"); + ck_assert_msg(last_msg.sender_id == 66, + "msg_callback: sender_id decoded incorrectly"); + + ck_assert_msg( + sbp_message_cmp(SbpMsgSsrStecCorrection, &last_msg.msg, &test_msg) == 0, + "Sent and received messages did not compare equal"); + + ck_assert_msg( + last_msg.msg.ssr_stec_correction.header.num_msgs == 1, + "incorrect value for last_msg.msg.ssr_stec_correction.header.num_msgs, " + "expected 1, is %d", + last_msg.msg.ssr_stec_correction.header.num_msgs); + + ck_assert_msg( + last_msg.msg.ssr_stec_correction.header.seq_num == 1, + "incorrect value for last_msg.msg.ssr_stec_correction.header.seq_num, " + "expected 1, is %d", + last_msg.msg.ssr_stec_correction.header.seq_num); + + ck_assert_msg( + last_msg.msg.ssr_stec_correction.header.sol_id == 0, + "incorrect value for last_msg.msg.ssr_stec_correction.header.sol_id, " + "expected 0, is %d", + last_msg.msg.ssr_stec_correction.header.sol_id); + + ck_assert_msg( + last_msg.msg.ssr_stec_correction.header.time.tow == 180, + "incorrect value for last_msg.msg.ssr_stec_correction.header.time.tow, " + "expected 180, is %d", + last_msg.msg.ssr_stec_correction.header.time.tow); + + ck_assert_msg( + last_msg.msg.ssr_stec_correction.header.time.wn == 3, + "incorrect value for last_msg.msg.ssr_stec_correction.header.time.wn, " + "expected 3, is %d", + last_msg.msg.ssr_stec_correction.header.time.wn); + + ck_assert_msg(last_msg.msg.ssr_stec_correction.header.update_interval == 10, + "incorrect value for " + "last_msg.msg.ssr_stec_correction.header.update_interval, " + "expected 10, is %d", + last_msg.msg.ssr_stec_correction.header.update_interval); + + ck_assert_msg(last_msg.msg.ssr_stec_correction.n_sats == 2, + "incorrect value for " + "last_msg.msg.ssr_stec_correction.n_sats, expected 2, is %d", + last_msg.msg.ssr_stec_correction.n_sats); + + ck_assert_msg( + last_msg.msg.ssr_stec_correction.ssr_iod_atmo == 15, + "incorrect value for last_msg.msg.ssr_stec_correction.ssr_iod_atmo, " + "expected 15, is %d", + last_msg.msg.ssr_stec_correction.ssr_iod_atmo); + + ck_assert_msg( + last_msg.msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[0] == 63, + "incorrect value for " + "last_msg.msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[0], " + "expected 63, is %d", + last_msg.msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[0]); + ck_assert_msg( + last_msg.msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[1] == 62, + "incorrect value for " + "last_msg.msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[1], " + "expected 62, is %d", + last_msg.msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[1]); + ck_assert_msg( + last_msg.msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[2] == 61, + "incorrect value for " + "last_msg.msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[2], " + "expected 61, is %d", + last_msg.msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[2]); + ck_assert_msg( + last_msg.msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[3] == 60, + "incorrect value for " + "last_msg.msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[3], " + "expected 60, is %d", + last_msg.msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[3]); + + ck_assert_msg(last_msg.msg.ssr_stec_correction.stec_sat_list[0] + .stec_quality_indicator == 1, + "incorrect value for " + "last_msg.msg.ssr_stec_correction.stec_sat_list[0].stec_" + "quality_indicator, expected 1, is %d", + last_msg.msg.ssr_stec_correction.stec_sat_list[0] + .stec_quality_indicator); + + ck_assert_msg( + last_msg.msg.ssr_stec_correction.stec_sat_list[0].sv_id.constellation == + 1, + "incorrect value for " + "last_msg.msg.ssr_stec_correction.stec_sat_list[0].sv_id.constellation," + " expected 1, is %d", + last_msg.msg.ssr_stec_correction.stec_sat_list[0].sv_id.constellation); + + ck_assert_msg( + last_msg.msg.ssr_stec_correction.stec_sat_list[0].sv_id.satId == 1, + "incorrect value for " + "last_msg.msg.ssr_stec_correction.stec_sat_list[0].sv_id.satId, " + "expected 1, is %d", + last_msg.msg.ssr_stec_correction.stec_sat_list[0].sv_id.satId); + + ck_assert_msg( + last_msg.msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[0] == 63, + "incorrect value for " + "last_msg.msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[0], " + "expected 63, is %d", + last_msg.msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[0]); + ck_assert_msg( + last_msg.msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[1] == 64, + "incorrect value for " + "last_msg.msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[1], " + "expected 64, is %d", + last_msg.msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[1]); + ck_assert_msg( + last_msg.msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[2] == 65, + "incorrect value for " + "last_msg.msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[2], " + "expected 65, is %d", + last_msg.msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[2]); + ck_assert_msg( + last_msg.msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[3] == 66, + "incorrect value for " + "last_msg.msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[3], " + "expected 66, is %d", + last_msg.msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[3]); + + ck_assert_msg(last_msg.msg.ssr_stec_correction.stec_sat_list[1] + .stec_quality_indicator == 5, + "incorrect value for " + "last_msg.msg.ssr_stec_correction.stec_sat_list[1].stec_" + "quality_indicator, expected 5, is %d", + last_msg.msg.ssr_stec_correction.stec_sat_list[1] + .stec_quality_indicator); + + ck_assert_msg( + last_msg.msg.ssr_stec_correction.stec_sat_list[1].sv_id.constellation == + 15, + "incorrect value for " + "last_msg.msg.ssr_stec_correction.stec_sat_list[1].sv_id.constellation," + " expected 15, is %d", + last_msg.msg.ssr_stec_correction.stec_sat_list[1].sv_id.constellation); + + ck_assert_msg( + last_msg.msg.ssr_stec_correction.stec_sat_list[1].sv_id.satId == 31, + "incorrect value for " + "last_msg.msg.ssr_stec_correction.stec_sat_list[1].sv_id.satId, " + "expected 31, is %d", + last_msg.msg.ssr_stec_correction.stec_sat_list[1].sv_id.satId); + + ck_assert_msg( + last_msg.msg.ssr_stec_correction.tile_id == 10, + "incorrect value for last_msg.msg.ssr_stec_correction.tile_id, " + "expected 10, is %d", + last_msg.msg.ssr_stec_correction.tile_id); + + ck_assert_msg( + last_msg.msg.ssr_stec_correction.tile_set_id == 1, + "incorrect value for last_msg.msg.ssr_stec_correction.tile_set_id, " + "expected 1, is %d", + last_msg.msg.ssr_stec_correction.tile_set_id); + } +} +END_TEST + +Suite *auto_check_sbp_ssr_MsgSsrStecCorrection_suite(void) { + Suite *s = suite_create( + "SBP generated test suite: auto_check_sbp_ssr_MsgSsrStecCorrection"); + TCase *tc_acq = + tcase_create("Automated_Suite_auto_check_sbp_ssr_MsgSsrStecCorrection"); + tcase_add_test(tc_acq, test_auto_check_sbp_ssr_MsgSsrStecCorrection); + suite_add_tcase(s, tc_acq); + return s; +} \ No newline at end of file diff --git a/c/test/auto_check_sbp_ssr_MsgSsrTileDefinition.c b/c/test/auto_check_sbp_ssr_MsgSsrTileDefinition.c new file mode 100644 index 0000000000..d705b2d803 --- /dev/null +++ b/c/test/auto_check_sbp_ssr_MsgSsrTileDefinition.c @@ -0,0 +1,219 @@ +/* + * Copyright (C) 2015-2021 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +// This file was auto-generated from +// spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinition.yaml by +// generate.py. Do not modify by hand! + +#include +#include +#include +#include // for debugging +#include // for malloc + +static struct { + u32 n_callbacks_logged; + u16 sender_id; + sbp_msg_type_t msg_type; + sbp_msg_t msg; + void *context; +} last_msg; + +static u32 dummy_wr = 0; +static u32 dummy_rd = 0; +static u8 dummy_buff[1024]; +static void *last_io_context; + +static void *DUMMY_MEMORY_FOR_CALLBACKS = (void *)0xdeadbeef; +static void *DUMMY_MEMORY_FOR_IO = (void *)0xdead0000; + +static void dummy_reset() { + dummy_rd = dummy_wr = 0; + memset(dummy_buff, 0, sizeof(dummy_buff)); +} + +static s32 dummy_write(u8 *buff, u32 n, void *context) { + last_io_context = context; + u32 real_n = n; //(dummy_n > n) ? n : dummy_n; + memcpy(dummy_buff + dummy_wr, buff, real_n); + dummy_wr += real_n; + return (s32)real_n; +} + +static s32 dummy_read(u8 *buff, u32 n, void *context) { + last_io_context = context; + u32 real_n = n; //(dummy_n > n) ? n : dummy_n; + memcpy(buff, dummy_buff + dummy_rd, real_n); + dummy_rd += real_n; + return (s32)real_n; +} + +static void logging_reset() { memset(&last_msg, 0, sizeof(last_msg)); } + +static void msg_callback(u16 sender_id, sbp_msg_type_t msg_type, + const sbp_msg_t *msg, void *context) { + last_msg.n_callbacks_logged++; + last_msg.sender_id = sender_id; + last_msg.msg_type = msg_type; + last_msg.msg = *msg; + last_msg.context = context; +} + +START_TEST(test_auto_check_sbp_ssr_MsgSsrTileDefinition) { + static sbp_msg_callbacks_node_t n; + + // State of the SBP message parser. + // Must be statically allocated. + sbp_state_t sbp_state; + + // + // Run tests: + // + // Test successful parsing of a message + { + // SBP parser state must be initialized before sbp_process is called. + // We re-initialize before every test so that callbacks for the same message + // types can be + // allocated multiple times across different tests. + sbp_state_init(&sbp_state); + + sbp_state_set_io_context(&sbp_state, &DUMMY_MEMORY_FOR_IO); + + logging_reset(); + + sbp_callback_register(&sbp_state, 1527, &msg_callback, + &DUMMY_MEMORY_FOR_CALLBACKS, &n); + + u8 encoded_frame[] = { + 85, 247, 5, 66, 0, 25, 31, 0, 1, 0, 2, 0, 4, 0, 8, 0, 16, + 0, 32, 0, 64, 0, 128, 210, 2, 150, 73, 0, 0, 0, 0, 214, 71, + }; + + dummy_reset(); + + sbp_msg_t test_msg; + memset(&test_msg, 0, sizeof(test_msg)); + + test_msg.ssr_tile_definition.bitmask = 1234567890; + + test_msg.ssr_tile_definition.cols = 32768; + + test_msg.ssr_tile_definition.corner_nw_lat = 1024; + + test_msg.ssr_tile_definition.corner_nw_lon = 2048; + + test_msg.ssr_tile_definition.rows = 16384; + + test_msg.ssr_tile_definition.spacing_lat = 4096; + + test_msg.ssr_tile_definition.spacing_lon = 8192; + + test_msg.ssr_tile_definition.ssr_sol_id = 31; + + test_msg.ssr_tile_definition.tile_id = 512; + + test_msg.ssr_tile_definition.tile_set_id = 256; + + sbp_message_send(&sbp_state, SbpMsgSsrTileDefinition, 66, &test_msg, + &dummy_write); + + ck_assert_msg(dummy_wr == sizeof(encoded_frame), + "not enough data was written to dummy_buff (expected: %zu, " + "actual: %zu)", + sizeof(encoded_frame), dummy_wr); + ck_assert_msg(memcmp(dummy_buff, encoded_frame, sizeof(encoded_frame)) == 0, + "frame was not encoded properly"); + + while (dummy_rd < dummy_wr) { + ck_assert_msg(sbp_process(&sbp_state, &dummy_read) >= SBP_OK, + "sbp_process threw an error!"); + } + + ck_assert_msg(last_msg.n_callbacks_logged == 1, + "msg_callback: one callback should have been logged"); + ck_assert_msg(last_msg.sender_id == 66, + "msg_callback: sender_id decoded incorrectly"); + + ck_assert_msg( + sbp_message_cmp(SbpMsgSsrTileDefinition, &last_msg.msg, &test_msg) == 0, + "Sent and received messages did not compare equal"); + + ck_assert_msg( + last_msg.msg.ssr_tile_definition.bitmask == 1234567890, + "incorrect value for last_msg.msg.ssr_tile_definition.bitmask, " + "expected 1234567890, is %d", + last_msg.msg.ssr_tile_definition.bitmask); + + ck_assert_msg(last_msg.msg.ssr_tile_definition.cols == 32768, + "incorrect value for last_msg.msg.ssr_tile_definition.cols, " + "expected 32768, is %d", + last_msg.msg.ssr_tile_definition.cols); + + ck_assert_msg( + last_msg.msg.ssr_tile_definition.corner_nw_lat == 1024, + "incorrect value for last_msg.msg.ssr_tile_definition.corner_nw_lat, " + "expected 1024, is %d", + last_msg.msg.ssr_tile_definition.corner_nw_lat); + + ck_assert_msg( + last_msg.msg.ssr_tile_definition.corner_nw_lon == 2048, + "incorrect value for last_msg.msg.ssr_tile_definition.corner_nw_lon, " + "expected 2048, is %d", + last_msg.msg.ssr_tile_definition.corner_nw_lon); + + ck_assert_msg(last_msg.msg.ssr_tile_definition.rows == 16384, + "incorrect value for last_msg.msg.ssr_tile_definition.rows, " + "expected 16384, is %d", + last_msg.msg.ssr_tile_definition.rows); + + ck_assert_msg( + last_msg.msg.ssr_tile_definition.spacing_lat == 4096, + "incorrect value for last_msg.msg.ssr_tile_definition.spacing_lat, " + "expected 4096, is %d", + last_msg.msg.ssr_tile_definition.spacing_lat); + + ck_assert_msg( + last_msg.msg.ssr_tile_definition.spacing_lon == 8192, + "incorrect value for last_msg.msg.ssr_tile_definition.spacing_lon, " + "expected 8192, is %d", + last_msg.msg.ssr_tile_definition.spacing_lon); + + ck_assert_msg( + last_msg.msg.ssr_tile_definition.ssr_sol_id == 31, + "incorrect value for last_msg.msg.ssr_tile_definition.ssr_sol_id, " + "expected 31, is %d", + last_msg.msg.ssr_tile_definition.ssr_sol_id); + + ck_assert_msg( + last_msg.msg.ssr_tile_definition.tile_id == 512, + "incorrect value for last_msg.msg.ssr_tile_definition.tile_id, " + "expected 512, is %d", + last_msg.msg.ssr_tile_definition.tile_id); + + ck_assert_msg( + last_msg.msg.ssr_tile_definition.tile_set_id == 256, + "incorrect value for last_msg.msg.ssr_tile_definition.tile_set_id, " + "expected 256, is %d", + last_msg.msg.ssr_tile_definition.tile_set_id); + } +} +END_TEST + +Suite *auto_check_sbp_ssr_MsgSsrTileDefinition_suite(void) { + Suite *s = suite_create( + "SBP generated test suite: auto_check_sbp_ssr_MsgSsrTileDefinition"); + TCase *tc_acq = + tcase_create("Automated_Suite_auto_check_sbp_ssr_MsgSsrTileDefinition"); + tcase_add_test(tc_acq, test_auto_check_sbp_ssr_MsgSsrTileDefinition); + suite_add_tcase(s, tc_acq); + return s; +} \ No newline at end of file diff --git a/c/test/check_main.c b/c/test/check_main.c index 390c1e3a7a..e69b290a61 100644 --- a/c/test/check_main.c +++ b/c/test/check_main.c @@ -101,7 +101,11 @@ int main(void) { srunner_add_suite(sr, auto_check_sbp_settings_MsgSettingsReadByIndexResp_suite()); srunner_add_suite(sr, auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds_suite()); + srunner_add_suite(sr, + auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds_suite()); srunner_add_suite(sr, auto_check_sbp_ssr_MsgSsrOrbitClockBounds_suite()); + srunner_add_suite(sr, auto_check_sbp_ssr_MsgSsrStecCorrection_suite()); + srunner_add_suite(sr, auto_check_sbp_ssr_MsgSsrTileDefinition_suite()); srunner_add_suite(sr, auto_check_sbp_system_MsgDgnssStatus_suite()); srunner_add_suite(sr, auto_check_sbp_system_MsgGroupMeta_suite()); srunner_add_suite(sr, auto_check_sbp_system_MsgHeartbeat_suite()); diff --git a/c/test/check_main_legacy.c b/c/test/check_main_legacy.c index 3cd9d8c2b3..e8a64d1797 100644 --- a/c/test/check_main_legacy.c +++ b/c/test/check_main_legacy.c @@ -134,8 +134,12 @@ int main(void) { sr, legacy_auto_check_sbp_settings_MsgSettingsReadByIndexResp_suite()); srunner_add_suite( sr, legacy_auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds_suite()); + srunner_add_suite( + sr, legacy_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_ssr_MsgSsrOrbitClockBounds_suite()); + srunner_add_suite(sr, legacy_auto_check_sbp_ssr_MsgSsrStecCorrection_suite()); + srunner_add_suite(sr, legacy_auto_check_sbp_ssr_MsgSsrTileDefinition_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_system_MsgDgnssStatus_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_system_MsgGroupMeta_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_system_MsgHeartbeat_suite()); diff --git a/c/test/check_suites.h b/c/test/check_suites.h index e815114efa..35c517b930 100644 --- a/c/test/check_suites.h +++ b/c/test/check_suites.h @@ -91,7 +91,10 @@ Suite* auto_check_sbp_sbas_MsgSbasRaw_suite(void); Suite* auto_check_sbp_settings_MsgSettingsReadByIndexDone_suite(void); Suite* auto_check_sbp_settings_MsgSettingsReadByIndexResp_suite(void); Suite* auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds_suite(void); +Suite* auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds_suite(void); Suite* auto_check_sbp_ssr_MsgSsrOrbitClockBounds_suite(void); +Suite* auto_check_sbp_ssr_MsgSsrStecCorrection_suite(void); +Suite* auto_check_sbp_ssr_MsgSsrTileDefinition_suite(void); Suite* auto_check_sbp_system_MsgDgnssStatus_suite(void); Suite* auto_check_sbp_system_MsgGroupMeta_suite(void); Suite* auto_check_sbp_system_MsgHeartbeat_suite(void); diff --git a/c/test/check_suites_legacy.h b/c/test/check_suites_legacy.h index 0e7e1f0cdb..3bb8585716 100644 --- a/c/test/check_suites_legacy.h +++ b/c/test/check_suites_legacy.h @@ -91,7 +91,10 @@ Suite* legacy_auto_check_sbp_sbas_MsgSbasRaw_suite(void); Suite* legacy_auto_check_sbp_settings_MsgSettingsReadByIndexDone_suite(void); Suite* legacy_auto_check_sbp_settings_MsgSettingsReadByIndexResp_suite(void); Suite* legacy_auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds_suite(void); +Suite* legacy_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds_suite(void); Suite* legacy_auto_check_sbp_ssr_MsgSsrOrbitClockBounds_suite(void); +Suite* legacy_auto_check_sbp_ssr_MsgSsrStecCorrection_suite(void); +Suite* legacy_auto_check_sbp_ssr_MsgSsrTileDefinition_suite(void); Suite* legacy_auto_check_sbp_system_MsgDgnssStatus_suite(void); Suite* legacy_auto_check_sbp_system_MsgGroupMeta_suite(void); Suite* legacy_auto_check_sbp_system_MsgHeartbeat_suite(void); diff --git a/c/test/cpp/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc b/c/test/cpp/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc new file mode 100644 index 0000000000..7a118cdc63 --- /dev/null +++ b/c/test/cpp/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2015-2021 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +// This file was auto-generated from +// spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml by +// generate.py. Do not modify by hand! + +#include +#include +#include +#include +#include +class Test_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds0 + : public ::testing::Test, + public sbp::State, + public sbp::IReader, + public sbp::IWriter, + sbp::MessageHandler { + public: + Test_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds0() + : ::testing::Test(), + sbp::State(), + sbp::IReader(), + sbp::IWriter(), + sbp::MessageHandler(this), + last_msg_(), + last_msg_len_(), + last_sender_id_(), + n_callbacks_logged_(), + dummy_wr_(), + dummy_rd_(), + dummy_buff_() { + set_reader(this); + set_writer(this); + } + + s32 read(uint8_t *buf, const uint32_t n) override { + uint32_t real_n = n; + memcpy(buf, dummy_buff_ + dummy_rd_, real_n); + dummy_rd_ += real_n; + return (s32)real_n; + } + + s32 write(const uint8_t *buf, uint32_t n) override { + uint32_t real_n = n; + memcpy(dummy_buff_ + dummy_wr_, buf, real_n); + dummy_wr_ += real_n; + return (s32)real_n; + } + + protected: + void handle_sbp_msg( + uint16_t sender_id, + const sbp_msg_ssr_gridded_correction_bounds_t &msg) override { + last_msg_ = msg; + last_sender_id_ = sender_id; + n_callbacks_logged_++; + } + + sbp_msg_ssr_gridded_correction_bounds_t last_msg_; + uint8_t last_msg_len_; + uint16_t last_sender_id_; + size_t n_callbacks_logged_; + uint32_t dummy_wr_; + uint32_t dummy_rd_; + uint8_t dummy_buff_[1024]; +}; + +TEST_F(Test_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds0, Test) { + uint8_t encoded_frame[] = { + 85, 254, 5, 66, 0, 43, 180, 0, 0, 0, 3, 0, 1, + 1, 10, 0, 15, 1, 0, 10, 0, 39, 232, 3, 244, 1, + 100, 200, 150, 100, 2, 5, 10, 16, 0, 17, 18, 19, 20, + 21, 6, 10, 22, 0, 23, 24, 25, 26, 27, 112, 145, + }; + + sbp_msg_ssr_gridded_correction_bounds_t test_msg{}; + test_msg.grid_point_id = 1000; + test_msg.header.num_msgs = 1; + test_msg.header.seq_num = 1; + test_msg.header.sol_id = 0; + test_msg.header.time.tow = 180; + test_msg.header.time.wn = 3; + test_msg.header.update_interval = 10; + test_msg.n_sats = 2; + test_msg.ssr_iod_atmo = 15; + + test_msg.stec_sat_list[0].stec_bound_mu = 18; + test_msg.stec_sat_list[0].stec_bound_mu_dot = 20; + test_msg.stec_sat_list[0].stec_bound_sig = 19; + test_msg.stec_sat_list[0].stec_bound_sig_dot = 21; + test_msg.stec_sat_list[0].stec_residual.residual = 16; + test_msg.stec_sat_list[0].stec_residual.stddev = 17; + test_msg.stec_sat_list[0].stec_residual.sv_id.constellation = 10; + test_msg.stec_sat_list[0].stec_residual.sv_id.satId = 5; + + test_msg.stec_sat_list[1].stec_bound_mu = 24; + test_msg.stec_sat_list[1].stec_bound_mu_dot = 26; + test_msg.stec_sat_list[1].stec_bound_sig = 25; + test_msg.stec_sat_list[1].stec_bound_sig_dot = 27; + test_msg.stec_sat_list[1].stec_residual.residual = 22; + test_msg.stec_sat_list[1].stec_residual.stddev = 23; + test_msg.stec_sat_list[1].stec_residual.sv_id.constellation = 10; + test_msg.stec_sat_list[1].stec_residual.sv_id.satId = 6; + test_msg.tile_id = 10; + test_msg.tile_set_id = 1; + test_msg.tropo_bound_mu = 150; + test_msg.tropo_bound_sig = 100; + test_msg.tropo_delay_correction.hydro = 500; + test_msg.tropo_delay_correction.stddev = 200; + test_msg.tropo_delay_correction.wet = 100; + test_msg.tropo_qi = 39; + + EXPECT_EQ(send_message(66, test_msg), SBP_OK); + + EXPECT_EQ(dummy_wr_, sizeof(encoded_frame)); + EXPECT_EQ(memcmp(dummy_buff_, encoded_frame, sizeof(encoded_frame)), 0); + + while (dummy_rd_ < dummy_wr_) { + process(); + } + + EXPECT_EQ(n_callbacks_logged_, 1); + EXPECT_EQ(last_sender_id_, 66); + EXPECT_EQ(last_msg_, test_msg); + EXPECT_EQ(last_msg_.grid_point_id, 1000) + << "incorrect value for last_msg_.grid_point_id, expected 1000, is " + << last_msg_.grid_point_id; + EXPECT_EQ(last_msg_.header.num_msgs, 1) + << "incorrect value for last_msg_.header.num_msgs, expected 1, is " + << last_msg_.header.num_msgs; + EXPECT_EQ(last_msg_.header.seq_num, 1) + << "incorrect value for last_msg_.header.seq_num, expected 1, is " + << last_msg_.header.seq_num; + EXPECT_EQ(last_msg_.header.sol_id, 0) + << "incorrect value for last_msg_.header.sol_id, expected 0, is " + << last_msg_.header.sol_id; + EXPECT_EQ(last_msg_.header.time.tow, 180) + << "incorrect value for last_msg_.header.time.tow, expected 180, is " + << last_msg_.header.time.tow; + EXPECT_EQ(last_msg_.header.time.wn, 3) + << "incorrect value for last_msg_.header.time.wn, expected 3, is " + << last_msg_.header.time.wn; + EXPECT_EQ(last_msg_.header.update_interval, 10) + << "incorrect value for last_msg_.header.update_interval, expected 10, " + "is " + << last_msg_.header.update_interval; + EXPECT_EQ(last_msg_.n_sats, 2) + << "incorrect value for last_msg_.n_sats, expected 2, is " + << last_msg_.n_sats; + EXPECT_EQ(last_msg_.ssr_iod_atmo, 15) + << "incorrect value for last_msg_.ssr_iod_atmo, expected 15, is " + << last_msg_.ssr_iod_atmo; + EXPECT_EQ(last_msg_.stec_sat_list[0].stec_bound_mu, 18) + << "incorrect value for last_msg_.stec_sat_list[0].stec_bound_mu, " + "expected 18, is " + << last_msg_.stec_sat_list[0].stec_bound_mu; + EXPECT_EQ(last_msg_.stec_sat_list[0].stec_bound_mu_dot, 20) + << "incorrect value for last_msg_.stec_sat_list[0].stec_bound_mu_dot, " + "expected 20, is " + << last_msg_.stec_sat_list[0].stec_bound_mu_dot; + EXPECT_EQ(last_msg_.stec_sat_list[0].stec_bound_sig, 19) + << "incorrect value for last_msg_.stec_sat_list[0].stec_bound_sig, " + "expected 19, is " + << last_msg_.stec_sat_list[0].stec_bound_sig; + EXPECT_EQ(last_msg_.stec_sat_list[0].stec_bound_sig_dot, 21) + << "incorrect value for last_msg_.stec_sat_list[0].stec_bound_sig_dot, " + "expected 21, is " + << last_msg_.stec_sat_list[0].stec_bound_sig_dot; + EXPECT_EQ(last_msg_.stec_sat_list[0].stec_residual.residual, 16) + << "incorrect value for " + "last_msg_.stec_sat_list[0].stec_residual.residual, expected 16, is " + << last_msg_.stec_sat_list[0].stec_residual.residual; + EXPECT_EQ(last_msg_.stec_sat_list[0].stec_residual.stddev, 17) + << "incorrect value for last_msg_.stec_sat_list[0].stec_residual.stddev, " + "expected 17, is " + << last_msg_.stec_sat_list[0].stec_residual.stddev; + EXPECT_EQ(last_msg_.stec_sat_list[0].stec_residual.sv_id.constellation, 10) + << "incorrect value for " + "last_msg_.stec_sat_list[0].stec_residual.sv_id.constellation, " + "expected 10, is " + << last_msg_.stec_sat_list[0].stec_residual.sv_id.constellation; + EXPECT_EQ(last_msg_.stec_sat_list[0].stec_residual.sv_id.satId, 5) + << "incorrect value for " + "last_msg_.stec_sat_list[0].stec_residual.sv_id.satId, expected 5, is " + << last_msg_.stec_sat_list[0].stec_residual.sv_id.satId; + EXPECT_EQ(last_msg_.stec_sat_list[1].stec_bound_mu, 24) + << "incorrect value for last_msg_.stec_sat_list[1].stec_bound_mu, " + "expected 24, is " + << last_msg_.stec_sat_list[1].stec_bound_mu; + EXPECT_EQ(last_msg_.stec_sat_list[1].stec_bound_mu_dot, 26) + << "incorrect value for last_msg_.stec_sat_list[1].stec_bound_mu_dot, " + "expected 26, is " + << last_msg_.stec_sat_list[1].stec_bound_mu_dot; + EXPECT_EQ(last_msg_.stec_sat_list[1].stec_bound_sig, 25) + << "incorrect value for last_msg_.stec_sat_list[1].stec_bound_sig, " + "expected 25, is " + << last_msg_.stec_sat_list[1].stec_bound_sig; + EXPECT_EQ(last_msg_.stec_sat_list[1].stec_bound_sig_dot, 27) + << "incorrect value for last_msg_.stec_sat_list[1].stec_bound_sig_dot, " + "expected 27, is " + << last_msg_.stec_sat_list[1].stec_bound_sig_dot; + EXPECT_EQ(last_msg_.stec_sat_list[1].stec_residual.residual, 22) + << "incorrect value for " + "last_msg_.stec_sat_list[1].stec_residual.residual, expected 22, is " + << last_msg_.stec_sat_list[1].stec_residual.residual; + EXPECT_EQ(last_msg_.stec_sat_list[1].stec_residual.stddev, 23) + << "incorrect value for last_msg_.stec_sat_list[1].stec_residual.stddev, " + "expected 23, is " + << last_msg_.stec_sat_list[1].stec_residual.stddev; + EXPECT_EQ(last_msg_.stec_sat_list[1].stec_residual.sv_id.constellation, 10) + << "incorrect value for " + "last_msg_.stec_sat_list[1].stec_residual.sv_id.constellation, " + "expected 10, is " + << last_msg_.stec_sat_list[1].stec_residual.sv_id.constellation; + EXPECT_EQ(last_msg_.stec_sat_list[1].stec_residual.sv_id.satId, 6) + << "incorrect value for " + "last_msg_.stec_sat_list[1].stec_residual.sv_id.satId, expected 6, is " + << last_msg_.stec_sat_list[1].stec_residual.sv_id.satId; + EXPECT_EQ(last_msg_.tile_id, 10) + << "incorrect value for last_msg_.tile_id, expected 10, is " + << last_msg_.tile_id; + EXPECT_EQ(last_msg_.tile_set_id, 1) + << "incorrect value for last_msg_.tile_set_id, expected 1, is " + << last_msg_.tile_set_id; + EXPECT_EQ(last_msg_.tropo_bound_mu, 150) + << "incorrect value for last_msg_.tropo_bound_mu, expected 150, is " + << last_msg_.tropo_bound_mu; + EXPECT_EQ(last_msg_.tropo_bound_sig, 100) + << "incorrect value for last_msg_.tropo_bound_sig, expected 100, is " + << last_msg_.tropo_bound_sig; + EXPECT_EQ(last_msg_.tropo_delay_correction.hydro, 500) + << "incorrect value for last_msg_.tropo_delay_correction.hydro, expected " + "500, is " + << last_msg_.tropo_delay_correction.hydro; + EXPECT_EQ(last_msg_.tropo_delay_correction.stddev, 200) + << "incorrect value for last_msg_.tropo_delay_correction.stddev, " + "expected 200, is " + << last_msg_.tropo_delay_correction.stddev; + EXPECT_EQ(last_msg_.tropo_delay_correction.wet, 100) + << "incorrect value for last_msg_.tropo_delay_correction.wet, expected " + "100, is " + << last_msg_.tropo_delay_correction.wet; + EXPECT_EQ(last_msg_.tropo_qi, 39) + << "incorrect value for last_msg_.tropo_qi, expected 39, is " + << last_msg_.tropo_qi; +} diff --git a/c/test/cpp/auto_check_sbp_ssr_MsgSsrStecCorrection.cc b/c/test/cpp/auto_check_sbp_ssr_MsgSsrStecCorrection.cc new file mode 100644 index 0000000000..70a61b2b86 --- /dev/null +++ b/c/test/cpp/auto_check_sbp_ssr_MsgSsrStecCorrection.cc @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2015-2021 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +// This file was auto-generated from +// spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrection.yaml by +// generate.py. Do not modify by hand! + +#include +#include +#include +#include +#include +class Test_auto_check_sbp_ssr_MsgSsrStecCorrection0 + : public ::testing::Test, + public sbp::State, + public sbp::IReader, + public sbp::IWriter, + sbp::MessageHandler { + public: + Test_auto_check_sbp_ssr_MsgSsrStecCorrection0() + : ::testing::Test(), + sbp::State(), + sbp::IReader(), + sbp::IWriter(), + sbp::MessageHandler(this), + last_msg_(), + last_msg_len_(), + last_sender_id_(), + n_callbacks_logged_(), + dummy_wr_(), + dummy_rd_(), + dummy_buff_() { + set_reader(this); + set_writer(this); + } + + s32 read(uint8_t *buf, const uint32_t n) override { + uint32_t real_n = n; + memcpy(buf, dummy_buff_ + dummy_rd_, real_n); + dummy_rd_ += real_n; + return (s32)real_n; + } + + s32 write(const uint8_t *buf, uint32_t n) override { + uint32_t real_n = n; + memcpy(dummy_buff_ + dummy_wr_, buf, real_n); + dummy_wr_ += real_n; + return (s32)real_n; + } + + protected: + void handle_sbp_msg(uint16_t sender_id, + const sbp_msg_ssr_stec_correction_t &msg) override { + last_msg_ = msg; + last_sender_id_ = sender_id; + n_callbacks_logged_++; + } + + sbp_msg_ssr_stec_correction_t last_msg_; + uint8_t last_msg_len_; + uint16_t last_sender_id_; + size_t n_callbacks_logged_; + uint32_t dummy_wr_; + uint32_t dummy_rd_; + uint8_t dummy_buff_[1024]; +}; + +TEST_F(Test_auto_check_sbp_ssr_MsgSsrStecCorrection0, Test) { + uint8_t encoded_frame[] = { + 85, 253, 5, 66, 0, 38, 180, 0, 0, 0, 3, 0, 1, 1, 10, 0, + 15, 1, 0, 10, 0, 2, 1, 1, 1, 63, 0, 62, 0, 61, 0, 60, + 0, 31, 15, 5, 63, 0, 64, 0, 65, 0, 66, 0, 119, 50, + }; + + sbp_msg_ssr_stec_correction_t test_msg{}; + test_msg.header.num_msgs = 1; + test_msg.header.seq_num = 1; + test_msg.header.sol_id = 0; + test_msg.header.time.tow = 180; + test_msg.header.time.wn = 3; + test_msg.header.update_interval = 10; + test_msg.n_sats = 2; + test_msg.ssr_iod_atmo = 15; + + test_msg.stec_sat_list[0].stec_coeff[0] = 63; + + test_msg.stec_sat_list[0].stec_coeff[1] = 62; + + test_msg.stec_sat_list[0].stec_coeff[2] = 61; + + test_msg.stec_sat_list[0].stec_coeff[3] = 60; + test_msg.stec_sat_list[0].stec_quality_indicator = 1; + test_msg.stec_sat_list[0].sv_id.constellation = 1; + test_msg.stec_sat_list[0].sv_id.satId = 1; + + test_msg.stec_sat_list[1].stec_coeff[0] = 63; + + test_msg.stec_sat_list[1].stec_coeff[1] = 64; + + test_msg.stec_sat_list[1].stec_coeff[2] = 65; + + test_msg.stec_sat_list[1].stec_coeff[3] = 66; + test_msg.stec_sat_list[1].stec_quality_indicator = 5; + test_msg.stec_sat_list[1].sv_id.constellation = 15; + test_msg.stec_sat_list[1].sv_id.satId = 31; + test_msg.tile_id = 10; + test_msg.tile_set_id = 1; + + EXPECT_EQ(send_message(66, test_msg), SBP_OK); + + EXPECT_EQ(dummy_wr_, sizeof(encoded_frame)); + EXPECT_EQ(memcmp(dummy_buff_, encoded_frame, sizeof(encoded_frame)), 0); + + while (dummy_rd_ < dummy_wr_) { + process(); + } + + EXPECT_EQ(n_callbacks_logged_, 1); + EXPECT_EQ(last_sender_id_, 66); + EXPECT_EQ(last_msg_, test_msg); + EXPECT_EQ(last_msg_.header.num_msgs, 1) + << "incorrect value for last_msg_.header.num_msgs, expected 1, is " + << last_msg_.header.num_msgs; + EXPECT_EQ(last_msg_.header.seq_num, 1) + << "incorrect value for last_msg_.header.seq_num, expected 1, is " + << last_msg_.header.seq_num; + EXPECT_EQ(last_msg_.header.sol_id, 0) + << "incorrect value for last_msg_.header.sol_id, expected 0, is " + << last_msg_.header.sol_id; + EXPECT_EQ(last_msg_.header.time.tow, 180) + << "incorrect value for last_msg_.header.time.tow, expected 180, is " + << last_msg_.header.time.tow; + EXPECT_EQ(last_msg_.header.time.wn, 3) + << "incorrect value for last_msg_.header.time.wn, expected 3, is " + << last_msg_.header.time.wn; + EXPECT_EQ(last_msg_.header.update_interval, 10) + << "incorrect value for last_msg_.header.update_interval, expected 10, " + "is " + << last_msg_.header.update_interval; + EXPECT_EQ(last_msg_.n_sats, 2) + << "incorrect value for last_msg_.n_sats, expected 2, is " + << last_msg_.n_sats; + EXPECT_EQ(last_msg_.ssr_iod_atmo, 15) + << "incorrect value for last_msg_.ssr_iod_atmo, expected 15, is " + << last_msg_.ssr_iod_atmo; + EXPECT_EQ(last_msg_.stec_sat_list[0].stec_coeff[0], 63) + << "incorrect value for last_msg_.stec_sat_list[0].stec_coeff[0], " + "expected 63, is " + << last_msg_.stec_sat_list[0].stec_coeff[0]; + EXPECT_EQ(last_msg_.stec_sat_list[0].stec_coeff[1], 62) + << "incorrect value for last_msg_.stec_sat_list[0].stec_coeff[1], " + "expected 62, is " + << last_msg_.stec_sat_list[0].stec_coeff[1]; + EXPECT_EQ(last_msg_.stec_sat_list[0].stec_coeff[2], 61) + << "incorrect value for last_msg_.stec_sat_list[0].stec_coeff[2], " + "expected 61, is " + << last_msg_.stec_sat_list[0].stec_coeff[2]; + EXPECT_EQ(last_msg_.stec_sat_list[0].stec_coeff[3], 60) + << "incorrect value for last_msg_.stec_sat_list[0].stec_coeff[3], " + "expected 60, is " + << last_msg_.stec_sat_list[0].stec_coeff[3]; + EXPECT_EQ(last_msg_.stec_sat_list[0].stec_quality_indicator, 1) + << "incorrect value for " + "last_msg_.stec_sat_list[0].stec_quality_indicator, expected 1, is " + << last_msg_.stec_sat_list[0].stec_quality_indicator; + EXPECT_EQ(last_msg_.stec_sat_list[0].sv_id.constellation, 1) + << "incorrect value for last_msg_.stec_sat_list[0].sv_id.constellation, " + "expected 1, is " + << last_msg_.stec_sat_list[0].sv_id.constellation; + EXPECT_EQ(last_msg_.stec_sat_list[0].sv_id.satId, 1) + << "incorrect value for last_msg_.stec_sat_list[0].sv_id.satId, expected " + "1, is " + << last_msg_.stec_sat_list[0].sv_id.satId; + EXPECT_EQ(last_msg_.stec_sat_list[1].stec_coeff[0], 63) + << "incorrect value for last_msg_.stec_sat_list[1].stec_coeff[0], " + "expected 63, is " + << last_msg_.stec_sat_list[1].stec_coeff[0]; + EXPECT_EQ(last_msg_.stec_sat_list[1].stec_coeff[1], 64) + << "incorrect value for last_msg_.stec_sat_list[1].stec_coeff[1], " + "expected 64, is " + << last_msg_.stec_sat_list[1].stec_coeff[1]; + EXPECT_EQ(last_msg_.stec_sat_list[1].stec_coeff[2], 65) + << "incorrect value for last_msg_.stec_sat_list[1].stec_coeff[2], " + "expected 65, is " + << last_msg_.stec_sat_list[1].stec_coeff[2]; + EXPECT_EQ(last_msg_.stec_sat_list[1].stec_coeff[3], 66) + << "incorrect value for last_msg_.stec_sat_list[1].stec_coeff[3], " + "expected 66, is " + << last_msg_.stec_sat_list[1].stec_coeff[3]; + EXPECT_EQ(last_msg_.stec_sat_list[1].stec_quality_indicator, 5) + << "incorrect value for " + "last_msg_.stec_sat_list[1].stec_quality_indicator, expected 5, is " + << last_msg_.stec_sat_list[1].stec_quality_indicator; + EXPECT_EQ(last_msg_.stec_sat_list[1].sv_id.constellation, 15) + << "incorrect value for last_msg_.stec_sat_list[1].sv_id.constellation, " + "expected 15, is " + << last_msg_.stec_sat_list[1].sv_id.constellation; + EXPECT_EQ(last_msg_.stec_sat_list[1].sv_id.satId, 31) + << "incorrect value for last_msg_.stec_sat_list[1].sv_id.satId, expected " + "31, is " + << last_msg_.stec_sat_list[1].sv_id.satId; + EXPECT_EQ(last_msg_.tile_id, 10) + << "incorrect value for last_msg_.tile_id, expected 10, is " + << last_msg_.tile_id; + EXPECT_EQ(last_msg_.tile_set_id, 1) + << "incorrect value for last_msg_.tile_set_id, expected 1, is " + << last_msg_.tile_set_id; +} diff --git a/c/test/cpp/auto_check_sbp_ssr_MsgSsrTileDefinition.cc b/c/test/cpp/auto_check_sbp_ssr_MsgSsrTileDefinition.cc new file mode 100644 index 0000000000..47500d79b7 --- /dev/null +++ b/c/test/cpp/auto_check_sbp_ssr_MsgSsrTileDefinition.cc @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2015-2021 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +// This file was auto-generated from +// spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinition.yaml by +// generate.py. Do not modify by hand! + +#include +#include +#include +#include +#include +class Test_auto_check_sbp_ssr_MsgSsrTileDefinition0 + : public ::testing::Test, + public sbp::State, + public sbp::IReader, + public sbp::IWriter, + sbp::MessageHandler { + public: + Test_auto_check_sbp_ssr_MsgSsrTileDefinition0() + : ::testing::Test(), + sbp::State(), + sbp::IReader(), + sbp::IWriter(), + sbp::MessageHandler(this), + last_msg_(), + last_msg_len_(), + last_sender_id_(), + n_callbacks_logged_(), + dummy_wr_(), + dummy_rd_(), + dummy_buff_() { + set_reader(this); + set_writer(this); + } + + s32 read(uint8_t *buf, const uint32_t n) override { + uint32_t real_n = n; + memcpy(buf, dummy_buff_ + dummy_rd_, real_n); + dummy_rd_ += real_n; + return (s32)real_n; + } + + s32 write(const uint8_t *buf, uint32_t n) override { + uint32_t real_n = n; + memcpy(dummy_buff_ + dummy_wr_, buf, real_n); + dummy_wr_ += real_n; + return (s32)real_n; + } + + protected: + void handle_sbp_msg(uint16_t sender_id, + const sbp_msg_ssr_tile_definition_t &msg) override { + last_msg_ = msg; + last_sender_id_ = sender_id; + n_callbacks_logged_++; + } + + sbp_msg_ssr_tile_definition_t last_msg_; + uint8_t last_msg_len_; + uint16_t last_sender_id_; + size_t n_callbacks_logged_; + uint32_t dummy_wr_; + uint32_t dummy_rd_; + uint8_t dummy_buff_[1024]; +}; + +TEST_F(Test_auto_check_sbp_ssr_MsgSsrTileDefinition0, Test) { + uint8_t encoded_frame[] = { + 85, 247, 5, 66, 0, 25, 31, 0, 1, 0, 2, 0, 4, 0, 8, 0, 16, + 0, 32, 0, 64, 0, 128, 210, 2, 150, 73, 0, 0, 0, 0, 214, 71, + }; + + sbp_msg_ssr_tile_definition_t test_msg{}; + test_msg.bitmask = 1234567890; + test_msg.cols = 32768; + test_msg.corner_nw_lat = 1024; + test_msg.corner_nw_lon = 2048; + test_msg.rows = 16384; + test_msg.spacing_lat = 4096; + test_msg.spacing_lon = 8192; + test_msg.ssr_sol_id = 31; + test_msg.tile_id = 512; + test_msg.tile_set_id = 256; + + EXPECT_EQ(send_message(66, test_msg), SBP_OK); + + EXPECT_EQ(dummy_wr_, sizeof(encoded_frame)); + EXPECT_EQ(memcmp(dummy_buff_, encoded_frame, sizeof(encoded_frame)), 0); + + while (dummy_rd_ < dummy_wr_) { + process(); + } + + EXPECT_EQ(n_callbacks_logged_, 1); + EXPECT_EQ(last_sender_id_, 66); + EXPECT_EQ(last_msg_, test_msg); + EXPECT_EQ(last_msg_.bitmask, 1234567890) + << "incorrect value for last_msg_.bitmask, expected 1234567890, is " + << last_msg_.bitmask; + EXPECT_EQ(last_msg_.cols, 32768) + << "incorrect value for last_msg_.cols, expected 32768, is " + << last_msg_.cols; + EXPECT_EQ(last_msg_.corner_nw_lat, 1024) + << "incorrect value for last_msg_.corner_nw_lat, expected 1024, is " + << last_msg_.corner_nw_lat; + EXPECT_EQ(last_msg_.corner_nw_lon, 2048) + << "incorrect value for last_msg_.corner_nw_lon, expected 2048, is " + << last_msg_.corner_nw_lon; + EXPECT_EQ(last_msg_.rows, 16384) + << "incorrect value for last_msg_.rows, expected 16384, is " + << last_msg_.rows; + EXPECT_EQ(last_msg_.spacing_lat, 4096) + << "incorrect value for last_msg_.spacing_lat, expected 4096, is " + << last_msg_.spacing_lat; + EXPECT_EQ(last_msg_.spacing_lon, 8192) + << "incorrect value for last_msg_.spacing_lon, expected 8192, is " + << last_msg_.spacing_lon; + EXPECT_EQ(last_msg_.ssr_sol_id, 31) + << "incorrect value for last_msg_.ssr_sol_id, expected 31, is " + << last_msg_.ssr_sol_id; + EXPECT_EQ(last_msg_.tile_id, 512) + << "incorrect value for last_msg_.tile_id, expected 512, is " + << last_msg_.tile_id; + EXPECT_EQ(last_msg_.tile_set_id, 256) + << "incorrect value for last_msg_.tile_set_id, expected 256, is " + << last_msg_.tile_set_id; +} diff --git a/c/test/legacy/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.c b/c/test/legacy/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.c new file mode 100644 index 0000000000..0205b85b5c --- /dev/null +++ b/c/test/legacy/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.c @@ -0,0 +1,375 @@ +/* + * Copyright (C) 2015-2021 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +// This file was auto-generated from +// spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml by +// generate.py. Do not modify by hand! + +#include +#include +#include +#include // for debugging +#include // for malloc + +static struct { + u32 n_callbacks_logged; + u16 sender_id; + u8 len; + u8 msg[SBP_MAX_PAYLOAD_LEN]; + void *context; +} last_msg; + +static struct { + u32 n_callbacks_logged; + u16 sender_id; + u16 msg_type; + u8 msg_len; + u8 msg[SBP_MAX_PAYLOAD_LEN]; + u16 frame_len; + u8 frame[SBP_MAX_FRAME_LEN]; + void *context; +} last_frame; + +static u32 dummy_wr = 0; +static u32 dummy_rd = 0; +static u8 dummy_buff[1024]; +static void *last_io_context; + +static int DUMMY_MEMORY_FOR_CALLBACKS = 0xdeadbeef; +static int DUMMY_MEMORY_FOR_IO = 0xdead0000; + +static void dummy_reset() { + dummy_rd = dummy_wr = 0; + memset(dummy_buff, 0, sizeof(dummy_buff)); +} + +static s32 dummy_write(u8 *buff, u32 n, void *context) { + last_io_context = context; + u32 real_n = n; //(dummy_n > n) ? n : dummy_n; + memcpy(dummy_buff + dummy_wr, buff, real_n); + dummy_wr += real_n; + return real_n; +} + +static s32 dummy_read(u8 *buff, u32 n, void *context) { + last_io_context = context; + u32 real_n = n; //(dummy_n > n) ? n : dummy_n; + memcpy(buff, dummy_buff + dummy_rd, real_n); + dummy_rd += real_n; + return real_n; +} + +static void logging_reset() { + memset(&last_msg, 0, sizeof(last_msg)); + memset(&last_frame, 0, sizeof(last_frame)); +} + +static void msg_callback(u16 sender_id, u8 len, u8 msg[], void *context) { + last_msg.n_callbacks_logged++; + last_msg.sender_id = sender_id; + last_msg.len = len; + last_msg.context = context; + memcpy(last_msg.msg, msg, len); +} + +static void frame_callback(u16 sender_id, u16 msg_type, u8 msg_len, u8 msg[], + u16 frame_len, u8 frame[], void *context) { + last_frame.n_callbacks_logged++; + last_frame.sender_id = sender_id; + last_frame.msg_type = msg_type; + last_frame.msg_len = msg_len; + memcpy(last_frame.msg, msg, msg_len); + last_frame.frame_len = frame_len; + memcpy(last_frame.frame, frame, frame_len); + last_frame.context = context; +} + +START_TEST(test_legacy_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds) { + static sbp_msg_callbacks_node_t n; + static sbp_msg_callbacks_node_t n2; + + // State of the SBP message parser. + // Must be statically allocated. + sbp_state_t sbp_state; + + // + // Run tests: + // + // Test successful parsing of a message + { + // SBP parser state must be initialized before sbp_process is called. + // We re-initialize before every test so that callbacks for the same message + // types can be + // allocated multiple times across different tests. + sbp_state_init(&sbp_state); + + sbp_state_set_io_context(&sbp_state, &DUMMY_MEMORY_FOR_IO); + + logging_reset(); + + sbp_payload_callback_register(&sbp_state, 1534, &msg_callback, + &DUMMY_MEMORY_FOR_CALLBACKS, &n); + sbp_frame_callback_register(&sbp_state, 1534, &frame_callback, + &DUMMY_MEMORY_FOR_CALLBACKS, &n2); + + u8 encoded_frame[] = { + 85, 254, 5, 66, 0, 43, 180, 0, 0, 0, 3, 0, 1, + 1, 10, 0, 15, 1, 0, 10, 0, 39, 232, 3, 244, 1, + 100, 200, 150, 100, 2, 5, 10, 16, 0, 17, 18, 19, 20, + 21, 6, 10, 22, 0, 23, 24, 25, 26, 27, 112, 145, + }; + + dummy_reset(); + + u8 test_msg_storage[SBP_MAX_PAYLOAD_LEN]; + memset(test_msg_storage, 0, sizeof(test_msg_storage)); + u8 test_msg_len = 0; + msg_ssr_gridded_correction_bounds_t *test_msg = + (msg_ssr_gridded_correction_bounds_t *)test_msg_storage; + test_msg_len = sizeof(*test_msg); + test_msg->grid_point_id = 1000; + test_msg->header.num_msgs = 1; + test_msg->header.seq_num = 1; + test_msg->header.sol_id = 0; + test_msg->header.time.tow = 180; + test_msg->header.time.wn = 3; + test_msg->header.update_interval = 10; + test_msg->n_sats = 2; + test_msg->ssr_iod_atmo = 15; + if (sizeof(test_msg->stec_sat_list) == 0) { + // Cope with variable length arrays + test_msg_len += sizeof(test_msg->stec_sat_list[0]); + } + test_msg->stec_sat_list[0].stec_bound_mu = 18; + test_msg->stec_sat_list[0].stec_bound_mu_dot = 20; + test_msg->stec_sat_list[0].stec_bound_sig = 19; + test_msg->stec_sat_list[0].stec_bound_sig_dot = 21; + test_msg->stec_sat_list[0].stec_residual.residual = 16; + test_msg->stec_sat_list[0].stec_residual.stddev = 17; + test_msg->stec_sat_list[0].stec_residual.sv_id.constellation = 10; + test_msg->stec_sat_list[0].stec_residual.sv_id.satId = 5; + if (sizeof(test_msg->stec_sat_list) == 0) { + // Cope with variable length arrays + test_msg_len += sizeof(test_msg->stec_sat_list[0]); + } + test_msg->stec_sat_list[1].stec_bound_mu = 24; + test_msg->stec_sat_list[1].stec_bound_mu_dot = 26; + test_msg->stec_sat_list[1].stec_bound_sig = 25; + test_msg->stec_sat_list[1].stec_bound_sig_dot = 27; + test_msg->stec_sat_list[1].stec_residual.residual = 22; + test_msg->stec_sat_list[1].stec_residual.stddev = 23; + test_msg->stec_sat_list[1].stec_residual.sv_id.constellation = 10; + test_msg->stec_sat_list[1].stec_residual.sv_id.satId = 6; + test_msg->tile_id = 10; + test_msg->tile_set_id = 1; + test_msg->tropo_bound_mu = 150; + test_msg->tropo_bound_sig = 100; + test_msg->tropo_delay_correction.hydro = 500; + test_msg->tropo_delay_correction.stddev = 200; + test_msg->tropo_delay_correction.wet = 100; + test_msg->tropo_qi = 39; + sbp_payload_send(&sbp_state, 1534, 66, test_msg_len, test_msg_storage, + &dummy_write); + + ck_assert_msg( + test_msg_len == sizeof(encoded_frame) - 8, + "Test message has not been generated correctly, or the encoded frame " + "from the spec is badly defined. Check your test spec"); + + ck_assert_msg(dummy_wr == sizeof(encoded_frame), + "not enough data was written to dummy_buff"); + ck_assert_msg(memcmp(dummy_buff, encoded_frame, sizeof(encoded_frame)) == 0, + "frame was not encoded properly"); + + while (dummy_rd < dummy_wr) { + ck_assert_msg(sbp_process(&sbp_state, &dummy_read) >= SBP_OK, + "sbp_process threw an error!"); + } + + ck_assert_msg(last_msg.n_callbacks_logged == 1, + "msg_callback: one callback should have been logged"); + ck_assert_msg(last_msg.sender_id == 66, + "msg_callback: sender_id decoded incorrectly"); + ck_assert_msg(last_msg.len == sizeof(encoded_frame) - 8, + "msg_callback: len decoded incorrectly"); + ck_assert_msg( + memcmp(last_msg.msg, encoded_frame + 6, sizeof(encoded_frame) - 8) == 0, + "msg_callback: test data decoded incorrectly"); + ck_assert_msg(last_msg.context == &DUMMY_MEMORY_FOR_CALLBACKS, + "frame_callback: context pointer incorrectly passed"); + + ck_assert_msg(last_frame.n_callbacks_logged == 1, + "frame_callback: one callback should have been logged"); + ck_assert_msg(last_frame.sender_id == 66, + "frame_callback: sender_id decoded incorrectly"); + ck_assert_msg(last_frame.msg_type == 1534, + "frame_callback: msg_type decoded incorrectly"); + ck_assert_msg(last_frame.msg_len == sizeof(encoded_frame) - 8, + "frame_callback: msg_len decoded incorrectly"); + ck_assert_msg(memcmp(last_frame.msg, encoded_frame + 6, + sizeof(encoded_frame) - 8) == 0, + "frame_callback: test data decoded incorrectly"); + ck_assert_msg(last_frame.frame_len == sizeof(encoded_frame), + "frame_callback: frame_len decoded incorrectly"); + ck_assert_msg( + memcmp(last_frame.frame, encoded_frame, sizeof(encoded_frame)) == 0, + "frame_callback: frame decoded incorrectly"); + ck_assert_msg(last_frame.context == &DUMMY_MEMORY_FOR_CALLBACKS, + "frame_callback: context pointer incorrectly passed"); + + // Cast to expected message type - the +6 byte offset is where the payload + // starts + msg_ssr_gridded_correction_bounds_t *check_msg = + (msg_ssr_gridded_correction_bounds_t *)((void *)last_msg.msg); + // Run tests against fields + ck_assert_msg(check_msg != 0, "stub to prevent warnings if msg isn't used"); + ck_assert_msg(check_msg->grid_point_id == 1000, + "incorrect value for grid_point_id, expected 1000, is %d", + check_msg->grid_point_id); + ck_assert_msg(check_msg->header.num_msgs == 1, + "incorrect value for header.num_msgs, expected 1, is %d", + check_msg->header.num_msgs); + ck_assert_msg(check_msg->header.seq_num == 1, + "incorrect value for header.seq_num, expected 1, is %d", + check_msg->header.seq_num); + ck_assert_msg(check_msg->header.sol_id == 0, + "incorrect value for header.sol_id, expected 0, is %d", + check_msg->header.sol_id); + ck_assert_msg(check_msg->header.time.tow == 180, + "incorrect value for header.time.tow, expected 180, is %d", + check_msg->header.time.tow); + ck_assert_msg(check_msg->header.time.wn == 3, + "incorrect value for header.time.wn, expected 3, is %d", + check_msg->header.time.wn); + ck_assert_msg( + check_msg->header.update_interval == 10, + "incorrect value for header.update_interval, expected 10, is %d", + check_msg->header.update_interval); + ck_assert_msg(check_msg->n_sats == 2, + "incorrect value for n_sats, expected 2, is %d", + check_msg->n_sats); + ck_assert_msg(check_msg->ssr_iod_atmo == 15, + "incorrect value for ssr_iod_atmo, expected 15, is %d", + check_msg->ssr_iod_atmo); + ck_assert_msg(check_msg->stec_sat_list[0].stec_bound_mu == 18, + "incorrect value for stec_sat_list[0].stec_bound_mu, " + "expected 18, is %d", + check_msg->stec_sat_list[0].stec_bound_mu); + ck_assert_msg(check_msg->stec_sat_list[0].stec_bound_mu_dot == 20, + "incorrect value for stec_sat_list[0].stec_bound_mu_dot, " + "expected 20, is %d", + check_msg->stec_sat_list[0].stec_bound_mu_dot); + ck_assert_msg(check_msg->stec_sat_list[0].stec_bound_sig == 19, + "incorrect value for stec_sat_list[0].stec_bound_sig, " + "expected 19, is %d", + check_msg->stec_sat_list[0].stec_bound_sig); + ck_assert_msg(check_msg->stec_sat_list[0].stec_bound_sig_dot == 21, + "incorrect value for stec_sat_list[0].stec_bound_sig_dot, " + "expected 21, is %d", + check_msg->stec_sat_list[0].stec_bound_sig_dot); + ck_assert_msg(check_msg->stec_sat_list[0].stec_residual.residual == 16, + "incorrect value for " + "stec_sat_list[0].stec_residual.residual, expected 16, is %d", + check_msg->stec_sat_list[0].stec_residual.residual); + ck_assert_msg(check_msg->stec_sat_list[0].stec_residual.stddev == 17, + "incorrect value for stec_sat_list[0].stec_residual.stddev, " + "expected 17, is %d", + check_msg->stec_sat_list[0].stec_residual.stddev); + ck_assert_msg( + check_msg->stec_sat_list[0].stec_residual.sv_id.constellation == 10, + "incorrect value for " + "stec_sat_list[0].stec_residual.sv_id.constellation, expected 10, is " + "%d", + check_msg->stec_sat_list[0].stec_residual.sv_id.constellation); + ck_assert_msg( + check_msg->stec_sat_list[0].stec_residual.sv_id.satId == 5, + "incorrect value for stec_sat_list[0].stec_residual.sv_id.satId, " + "expected 5, is %d", + check_msg->stec_sat_list[0].stec_residual.sv_id.satId); + ck_assert_msg(check_msg->stec_sat_list[1].stec_bound_mu == 24, + "incorrect value for stec_sat_list[1].stec_bound_mu, " + "expected 24, is %d", + check_msg->stec_sat_list[1].stec_bound_mu); + ck_assert_msg(check_msg->stec_sat_list[1].stec_bound_mu_dot == 26, + "incorrect value for stec_sat_list[1].stec_bound_mu_dot, " + "expected 26, is %d", + check_msg->stec_sat_list[1].stec_bound_mu_dot); + ck_assert_msg(check_msg->stec_sat_list[1].stec_bound_sig == 25, + "incorrect value for stec_sat_list[1].stec_bound_sig, " + "expected 25, is %d", + check_msg->stec_sat_list[1].stec_bound_sig); + ck_assert_msg(check_msg->stec_sat_list[1].stec_bound_sig_dot == 27, + "incorrect value for stec_sat_list[1].stec_bound_sig_dot, " + "expected 27, is %d", + check_msg->stec_sat_list[1].stec_bound_sig_dot); + ck_assert_msg(check_msg->stec_sat_list[1].stec_residual.residual == 22, + "incorrect value for " + "stec_sat_list[1].stec_residual.residual, expected 22, is %d", + check_msg->stec_sat_list[1].stec_residual.residual); + ck_assert_msg(check_msg->stec_sat_list[1].stec_residual.stddev == 23, + "incorrect value for stec_sat_list[1].stec_residual.stddev, " + "expected 23, is %d", + check_msg->stec_sat_list[1].stec_residual.stddev); + ck_assert_msg( + check_msg->stec_sat_list[1].stec_residual.sv_id.constellation == 10, + "incorrect value for " + "stec_sat_list[1].stec_residual.sv_id.constellation, expected 10, is " + "%d", + check_msg->stec_sat_list[1].stec_residual.sv_id.constellation); + ck_assert_msg( + check_msg->stec_sat_list[1].stec_residual.sv_id.satId == 6, + "incorrect value for stec_sat_list[1].stec_residual.sv_id.satId, " + "expected 6, is %d", + check_msg->stec_sat_list[1].stec_residual.sv_id.satId); + ck_assert_msg(check_msg->tile_id == 10, + "incorrect value for tile_id, expected 10, is %d", + check_msg->tile_id); + ck_assert_msg(check_msg->tile_set_id == 1, + "incorrect value for tile_set_id, expected 1, is %d", + check_msg->tile_set_id); + ck_assert_msg(check_msg->tropo_bound_mu == 150, + "incorrect value for tropo_bound_mu, expected 150, is %d", + check_msg->tropo_bound_mu); + ck_assert_msg(check_msg->tropo_bound_sig == 100, + "incorrect value for tropo_bound_sig, expected 100, is %d", + check_msg->tropo_bound_sig); + ck_assert_msg( + check_msg->tropo_delay_correction.hydro == 500, + "incorrect value for tropo_delay_correction.hydro, expected 500, is %d", + check_msg->tropo_delay_correction.hydro); + ck_assert_msg(check_msg->tropo_delay_correction.stddev == 200, + "incorrect value for tropo_delay_correction.stddev, expected " + "200, is %d", + check_msg->tropo_delay_correction.stddev); + ck_assert_msg( + check_msg->tropo_delay_correction.wet == 100, + "incorrect value for tropo_delay_correction.wet, expected 100, is %d", + check_msg->tropo_delay_correction.wet); + ck_assert_msg(check_msg->tropo_qi == 39, + "incorrect value for tropo_qi, expected 39, is %d", + check_msg->tropo_qi); + } +} +END_TEST + +Suite *legacy_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds_suite(void) { + Suite *s = suite_create( + "SBP generated test suite: " + "legacy_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds"); + TCase *tc_acq = tcase_create( + "Automated_Suite_legacy_auto_check_sbp_ssr_" + "MsgSsrGriddedCorrectionBounds"); + tcase_add_test(tc_acq, + test_legacy_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds); + suite_add_tcase(s, tc_acq); + return s; +} \ No newline at end of file diff --git a/c/test/legacy/auto_check_sbp_ssr_MsgSsrStecCorrection.c b/c/test/legacy/auto_check_sbp_ssr_MsgSsrStecCorrection.c new file mode 100644 index 0000000000..1c1b35a394 --- /dev/null +++ b/c/test/legacy/auto_check_sbp_ssr_MsgSsrStecCorrection.c @@ -0,0 +1,357 @@ +/* + * Copyright (C) 2015-2021 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +// This file was auto-generated from +// spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrection.yaml by +// generate.py. Do not modify by hand! + +#include +#include +#include +#include // for debugging +#include // for malloc + +static struct { + u32 n_callbacks_logged; + u16 sender_id; + u8 len; + u8 msg[SBP_MAX_PAYLOAD_LEN]; + void *context; +} last_msg; + +static struct { + u32 n_callbacks_logged; + u16 sender_id; + u16 msg_type; + u8 msg_len; + u8 msg[SBP_MAX_PAYLOAD_LEN]; + u16 frame_len; + u8 frame[SBP_MAX_FRAME_LEN]; + void *context; +} last_frame; + +static u32 dummy_wr = 0; +static u32 dummy_rd = 0; +static u8 dummy_buff[1024]; +static void *last_io_context; + +static int DUMMY_MEMORY_FOR_CALLBACKS = 0xdeadbeef; +static int DUMMY_MEMORY_FOR_IO = 0xdead0000; + +static void dummy_reset() { + dummy_rd = dummy_wr = 0; + memset(dummy_buff, 0, sizeof(dummy_buff)); +} + +static s32 dummy_write(u8 *buff, u32 n, void *context) { + last_io_context = context; + u32 real_n = n; //(dummy_n > n) ? n : dummy_n; + memcpy(dummy_buff + dummy_wr, buff, real_n); + dummy_wr += real_n; + return real_n; +} + +static s32 dummy_read(u8 *buff, u32 n, void *context) { + last_io_context = context; + u32 real_n = n; //(dummy_n > n) ? n : dummy_n; + memcpy(buff, dummy_buff + dummy_rd, real_n); + dummy_rd += real_n; + return real_n; +} + +static void logging_reset() { + memset(&last_msg, 0, sizeof(last_msg)); + memset(&last_frame, 0, sizeof(last_frame)); +} + +static void msg_callback(u16 sender_id, u8 len, u8 msg[], void *context) { + last_msg.n_callbacks_logged++; + last_msg.sender_id = sender_id; + last_msg.len = len; + last_msg.context = context; + memcpy(last_msg.msg, msg, len); +} + +static void frame_callback(u16 sender_id, u16 msg_type, u8 msg_len, u8 msg[], + u16 frame_len, u8 frame[], void *context) { + last_frame.n_callbacks_logged++; + last_frame.sender_id = sender_id; + last_frame.msg_type = msg_type; + last_frame.msg_len = msg_len; + memcpy(last_frame.msg, msg, msg_len); + last_frame.frame_len = frame_len; + memcpy(last_frame.frame, frame, frame_len); + last_frame.context = context; +} + +START_TEST(test_legacy_auto_check_sbp_ssr_MsgSsrStecCorrection) { + static sbp_msg_callbacks_node_t n; + static sbp_msg_callbacks_node_t n2; + + // State of the SBP message parser. + // Must be statically allocated. + sbp_state_t sbp_state; + + // + // Run tests: + // + // Test successful parsing of a message + { + // SBP parser state must be initialized before sbp_process is called. + // We re-initialize before every test so that callbacks for the same message + // types can be + // allocated multiple times across different tests. + sbp_state_init(&sbp_state); + + sbp_state_set_io_context(&sbp_state, &DUMMY_MEMORY_FOR_IO); + + logging_reset(); + + sbp_payload_callback_register(&sbp_state, 1533, &msg_callback, + &DUMMY_MEMORY_FOR_CALLBACKS, &n); + sbp_frame_callback_register(&sbp_state, 1533, &frame_callback, + &DUMMY_MEMORY_FOR_CALLBACKS, &n2); + + u8 encoded_frame[] = { + 85, 253, 5, 66, 0, 38, 180, 0, 0, 0, 3, 0, 1, 1, 10, 0, + 15, 1, 0, 10, 0, 2, 1, 1, 1, 63, 0, 62, 0, 61, 0, 60, + 0, 31, 15, 5, 63, 0, 64, 0, 65, 0, 66, 0, 119, 50, + }; + + dummy_reset(); + + u8 test_msg_storage[SBP_MAX_PAYLOAD_LEN]; + memset(test_msg_storage, 0, sizeof(test_msg_storage)); + u8 test_msg_len = 0; + msg_ssr_stec_correction_t *test_msg = + (msg_ssr_stec_correction_t *)test_msg_storage; + test_msg_len = sizeof(*test_msg); + test_msg->header.num_msgs = 1; + test_msg->header.seq_num = 1; + test_msg->header.sol_id = 0; + test_msg->header.time.tow = 180; + test_msg->header.time.wn = 3; + test_msg->header.update_interval = 10; + test_msg->n_sats = 2; + test_msg->ssr_iod_atmo = 15; + if (sizeof(test_msg->stec_sat_list) == 0) { + // Cope with variable length arrays + test_msg_len += sizeof(test_msg->stec_sat_list[0]); + } + if (sizeof(test_msg->stec_sat_list[0].stec_coeff) == 0) { + // Cope with variable length arrays + test_msg_len += sizeof(test_msg->stec_sat_list[0].stec_coeff[0]); + } + test_msg->stec_sat_list[0].stec_coeff[0] = 63; + if (sizeof(test_msg->stec_sat_list[0].stec_coeff) == 0) { + // Cope with variable length arrays + test_msg_len += sizeof(test_msg->stec_sat_list[0].stec_coeff[0]); + } + test_msg->stec_sat_list[0].stec_coeff[1] = 62; + if (sizeof(test_msg->stec_sat_list[0].stec_coeff) == 0) { + // Cope with variable length arrays + test_msg_len += sizeof(test_msg->stec_sat_list[0].stec_coeff[0]); + } + test_msg->stec_sat_list[0].stec_coeff[2] = 61; + if (sizeof(test_msg->stec_sat_list[0].stec_coeff) == 0) { + // Cope with variable length arrays + test_msg_len += sizeof(test_msg->stec_sat_list[0].stec_coeff[0]); + } + test_msg->stec_sat_list[0].stec_coeff[3] = 60; + test_msg->stec_sat_list[0].stec_quality_indicator = 1; + test_msg->stec_sat_list[0].sv_id.constellation = 1; + test_msg->stec_sat_list[0].sv_id.satId = 1; + if (sizeof(test_msg->stec_sat_list) == 0) { + // Cope with variable length arrays + test_msg_len += sizeof(test_msg->stec_sat_list[0]); + } + if (sizeof(test_msg->stec_sat_list[1].stec_coeff) == 0) { + // Cope with variable length arrays + test_msg_len += sizeof(test_msg->stec_sat_list[1].stec_coeff[0]); + } + test_msg->stec_sat_list[1].stec_coeff[0] = 63; + if (sizeof(test_msg->stec_sat_list[1].stec_coeff) == 0) { + // Cope with variable length arrays + test_msg_len += sizeof(test_msg->stec_sat_list[1].stec_coeff[0]); + } + test_msg->stec_sat_list[1].stec_coeff[1] = 64; + if (sizeof(test_msg->stec_sat_list[1].stec_coeff) == 0) { + // Cope with variable length arrays + test_msg_len += sizeof(test_msg->stec_sat_list[1].stec_coeff[0]); + } + test_msg->stec_sat_list[1].stec_coeff[2] = 65; + if (sizeof(test_msg->stec_sat_list[1].stec_coeff) == 0) { + // Cope with variable length arrays + test_msg_len += sizeof(test_msg->stec_sat_list[1].stec_coeff[0]); + } + test_msg->stec_sat_list[1].stec_coeff[3] = 66; + test_msg->stec_sat_list[1].stec_quality_indicator = 5; + test_msg->stec_sat_list[1].sv_id.constellation = 15; + test_msg->stec_sat_list[1].sv_id.satId = 31; + test_msg->tile_id = 10; + test_msg->tile_set_id = 1; + sbp_payload_send(&sbp_state, 1533, 66, test_msg_len, test_msg_storage, + &dummy_write); + + ck_assert_msg( + test_msg_len == sizeof(encoded_frame) - 8, + "Test message has not been generated correctly, or the encoded frame " + "from the spec is badly defined. Check your test spec"); + + ck_assert_msg(dummy_wr == sizeof(encoded_frame), + "not enough data was written to dummy_buff"); + ck_assert_msg(memcmp(dummy_buff, encoded_frame, sizeof(encoded_frame)) == 0, + "frame was not encoded properly"); + + while (dummy_rd < dummy_wr) { + ck_assert_msg(sbp_process(&sbp_state, &dummy_read) >= SBP_OK, + "sbp_process threw an error!"); + } + + ck_assert_msg(last_msg.n_callbacks_logged == 1, + "msg_callback: one callback should have been logged"); + ck_assert_msg(last_msg.sender_id == 66, + "msg_callback: sender_id decoded incorrectly"); + ck_assert_msg(last_msg.len == sizeof(encoded_frame) - 8, + "msg_callback: len decoded incorrectly"); + ck_assert_msg( + memcmp(last_msg.msg, encoded_frame + 6, sizeof(encoded_frame) - 8) == 0, + "msg_callback: test data decoded incorrectly"); + ck_assert_msg(last_msg.context == &DUMMY_MEMORY_FOR_CALLBACKS, + "frame_callback: context pointer incorrectly passed"); + + ck_assert_msg(last_frame.n_callbacks_logged == 1, + "frame_callback: one callback should have been logged"); + ck_assert_msg(last_frame.sender_id == 66, + "frame_callback: sender_id decoded incorrectly"); + ck_assert_msg(last_frame.msg_type == 1533, + "frame_callback: msg_type decoded incorrectly"); + ck_assert_msg(last_frame.msg_len == sizeof(encoded_frame) - 8, + "frame_callback: msg_len decoded incorrectly"); + ck_assert_msg(memcmp(last_frame.msg, encoded_frame + 6, + sizeof(encoded_frame) - 8) == 0, + "frame_callback: test data decoded incorrectly"); + ck_assert_msg(last_frame.frame_len == sizeof(encoded_frame), + "frame_callback: frame_len decoded incorrectly"); + ck_assert_msg( + memcmp(last_frame.frame, encoded_frame, sizeof(encoded_frame)) == 0, + "frame_callback: frame decoded incorrectly"); + ck_assert_msg(last_frame.context == &DUMMY_MEMORY_FOR_CALLBACKS, + "frame_callback: context pointer incorrectly passed"); + + // Cast to expected message type - the +6 byte offset is where the payload + // starts + msg_ssr_stec_correction_t *check_msg = + (msg_ssr_stec_correction_t *)((void *)last_msg.msg); + // Run tests against fields + ck_assert_msg(check_msg != 0, "stub to prevent warnings if msg isn't used"); + ck_assert_msg(check_msg->header.num_msgs == 1, + "incorrect value for header.num_msgs, expected 1, is %d", + check_msg->header.num_msgs); + ck_assert_msg(check_msg->header.seq_num == 1, + "incorrect value for header.seq_num, expected 1, is %d", + check_msg->header.seq_num); + ck_assert_msg(check_msg->header.sol_id == 0, + "incorrect value for header.sol_id, expected 0, is %d", + check_msg->header.sol_id); + ck_assert_msg(check_msg->header.time.tow == 180, + "incorrect value for header.time.tow, expected 180, is %d", + check_msg->header.time.tow); + ck_assert_msg(check_msg->header.time.wn == 3, + "incorrect value for header.time.wn, expected 3, is %d", + check_msg->header.time.wn); + ck_assert_msg( + check_msg->header.update_interval == 10, + "incorrect value for header.update_interval, expected 10, is %d", + check_msg->header.update_interval); + ck_assert_msg(check_msg->n_sats == 2, + "incorrect value for n_sats, expected 2, is %d", + check_msg->n_sats); + ck_assert_msg(check_msg->ssr_iod_atmo == 15, + "incorrect value for ssr_iod_atmo, expected 15, is %d", + check_msg->ssr_iod_atmo); + ck_assert_msg(check_msg->stec_sat_list[0].stec_coeff[0] == 63, + "incorrect value for stec_sat_list[0].stec_coeff[0], " + "expected 63, is %d", + check_msg->stec_sat_list[0].stec_coeff[0]); + ck_assert_msg(check_msg->stec_sat_list[0].stec_coeff[1] == 62, + "incorrect value for stec_sat_list[0].stec_coeff[1], " + "expected 62, is %d", + check_msg->stec_sat_list[0].stec_coeff[1]); + ck_assert_msg(check_msg->stec_sat_list[0].stec_coeff[2] == 61, + "incorrect value for stec_sat_list[0].stec_coeff[2], " + "expected 61, is %d", + check_msg->stec_sat_list[0].stec_coeff[2]); + ck_assert_msg(check_msg->stec_sat_list[0].stec_coeff[3] == 60, + "incorrect value for stec_sat_list[0].stec_coeff[3], " + "expected 60, is %d", + check_msg->stec_sat_list[0].stec_coeff[3]); + ck_assert_msg(check_msg->stec_sat_list[0].stec_quality_indicator == 1, + "incorrect value for " + "stec_sat_list[0].stec_quality_indicator, expected 1, is %d", + check_msg->stec_sat_list[0].stec_quality_indicator); + ck_assert_msg(check_msg->stec_sat_list[0].sv_id.constellation == 1, + "incorrect value for stec_sat_list[0].sv_id.constellation, " + "expected 1, is %d", + check_msg->stec_sat_list[0].sv_id.constellation); + ck_assert_msg( + check_msg->stec_sat_list[0].sv_id.satId == 1, + "incorrect value for stec_sat_list[0].sv_id.satId, expected 1, is %d", + check_msg->stec_sat_list[0].sv_id.satId); + ck_assert_msg(check_msg->stec_sat_list[1].stec_coeff[0] == 63, + "incorrect value for stec_sat_list[1].stec_coeff[0], " + "expected 63, is %d", + check_msg->stec_sat_list[1].stec_coeff[0]); + ck_assert_msg(check_msg->stec_sat_list[1].stec_coeff[1] == 64, + "incorrect value for stec_sat_list[1].stec_coeff[1], " + "expected 64, is %d", + check_msg->stec_sat_list[1].stec_coeff[1]); + ck_assert_msg(check_msg->stec_sat_list[1].stec_coeff[2] == 65, + "incorrect value for stec_sat_list[1].stec_coeff[2], " + "expected 65, is %d", + check_msg->stec_sat_list[1].stec_coeff[2]); + ck_assert_msg(check_msg->stec_sat_list[1].stec_coeff[3] == 66, + "incorrect value for stec_sat_list[1].stec_coeff[3], " + "expected 66, is %d", + check_msg->stec_sat_list[1].stec_coeff[3]); + ck_assert_msg(check_msg->stec_sat_list[1].stec_quality_indicator == 5, + "incorrect value for " + "stec_sat_list[1].stec_quality_indicator, expected 5, is %d", + check_msg->stec_sat_list[1].stec_quality_indicator); + ck_assert_msg(check_msg->stec_sat_list[1].sv_id.constellation == 15, + "incorrect value for stec_sat_list[1].sv_id.constellation, " + "expected 15, is %d", + check_msg->stec_sat_list[1].sv_id.constellation); + ck_assert_msg( + check_msg->stec_sat_list[1].sv_id.satId == 31, + "incorrect value for stec_sat_list[1].sv_id.satId, expected 31, is %d", + check_msg->stec_sat_list[1].sv_id.satId); + ck_assert_msg(check_msg->tile_id == 10, + "incorrect value for tile_id, expected 10, is %d", + check_msg->tile_id); + ck_assert_msg(check_msg->tile_set_id == 1, + "incorrect value for tile_set_id, expected 1, is %d", + check_msg->tile_set_id); + } +} +END_TEST + +Suite *legacy_auto_check_sbp_ssr_MsgSsrStecCorrection_suite(void) { + Suite *s = suite_create( + "SBP generated test suite: " + "legacy_auto_check_sbp_ssr_MsgSsrStecCorrection"); + TCase *tc_acq = tcase_create( + "Automated_Suite_legacy_auto_check_sbp_ssr_MsgSsrStecCorrection"); + tcase_add_test(tc_acq, test_legacy_auto_check_sbp_ssr_MsgSsrStecCorrection); + suite_add_tcase(s, tc_acq); + return s; +} \ No newline at end of file diff --git a/c/test/legacy/auto_check_sbp_ssr_MsgSsrTileDefinition.c b/c/test/legacy/auto_check_sbp_ssr_MsgSsrTileDefinition.c new file mode 100644 index 0000000000..af108f61da --- /dev/null +++ b/c/test/legacy/auto_check_sbp_ssr_MsgSsrTileDefinition.c @@ -0,0 +1,245 @@ +/* + * Copyright (C) 2015-2021 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +// This file was auto-generated from +// spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinition.yaml by +// generate.py. Do not modify by hand! + +#include +#include +#include +#include // for debugging +#include // for malloc + +static struct { + u32 n_callbacks_logged; + u16 sender_id; + u8 len; + u8 msg[SBP_MAX_PAYLOAD_LEN]; + void *context; +} last_msg; + +static struct { + u32 n_callbacks_logged; + u16 sender_id; + u16 msg_type; + u8 msg_len; + u8 msg[SBP_MAX_PAYLOAD_LEN]; + u16 frame_len; + u8 frame[SBP_MAX_FRAME_LEN]; + void *context; +} last_frame; + +static u32 dummy_wr = 0; +static u32 dummy_rd = 0; +static u8 dummy_buff[1024]; +static void *last_io_context; + +static int DUMMY_MEMORY_FOR_CALLBACKS = 0xdeadbeef; +static int DUMMY_MEMORY_FOR_IO = 0xdead0000; + +static void dummy_reset() { + dummy_rd = dummy_wr = 0; + memset(dummy_buff, 0, sizeof(dummy_buff)); +} + +static s32 dummy_write(u8 *buff, u32 n, void *context) { + last_io_context = context; + u32 real_n = n; //(dummy_n > n) ? n : dummy_n; + memcpy(dummy_buff + dummy_wr, buff, real_n); + dummy_wr += real_n; + return real_n; +} + +static s32 dummy_read(u8 *buff, u32 n, void *context) { + last_io_context = context; + u32 real_n = n; //(dummy_n > n) ? n : dummy_n; + memcpy(buff, dummy_buff + dummy_rd, real_n); + dummy_rd += real_n; + return real_n; +} + +static void logging_reset() { + memset(&last_msg, 0, sizeof(last_msg)); + memset(&last_frame, 0, sizeof(last_frame)); +} + +static void msg_callback(u16 sender_id, u8 len, u8 msg[], void *context) { + last_msg.n_callbacks_logged++; + last_msg.sender_id = sender_id; + last_msg.len = len; + last_msg.context = context; + memcpy(last_msg.msg, msg, len); +} + +static void frame_callback(u16 sender_id, u16 msg_type, u8 msg_len, u8 msg[], + u16 frame_len, u8 frame[], void *context) { + last_frame.n_callbacks_logged++; + last_frame.sender_id = sender_id; + last_frame.msg_type = msg_type; + last_frame.msg_len = msg_len; + memcpy(last_frame.msg, msg, msg_len); + last_frame.frame_len = frame_len; + memcpy(last_frame.frame, frame, frame_len); + last_frame.context = context; +} + +START_TEST(test_legacy_auto_check_sbp_ssr_MsgSsrTileDefinition) { + static sbp_msg_callbacks_node_t n; + static sbp_msg_callbacks_node_t n2; + + // State of the SBP message parser. + // Must be statically allocated. + sbp_state_t sbp_state; + + // + // Run tests: + // + // Test successful parsing of a message + { + // SBP parser state must be initialized before sbp_process is called. + // We re-initialize before every test so that callbacks for the same message + // types can be + // allocated multiple times across different tests. + sbp_state_init(&sbp_state); + + sbp_state_set_io_context(&sbp_state, &DUMMY_MEMORY_FOR_IO); + + logging_reset(); + + sbp_payload_callback_register(&sbp_state, 1527, &msg_callback, + &DUMMY_MEMORY_FOR_CALLBACKS, &n); + sbp_frame_callback_register(&sbp_state, 1527, &frame_callback, + &DUMMY_MEMORY_FOR_CALLBACKS, &n2); + + u8 encoded_frame[] = { + 85, 247, 5, 66, 0, 25, 31, 0, 1, 0, 2, 0, 4, 0, 8, 0, 16, + 0, 32, 0, 64, 0, 128, 210, 2, 150, 73, 0, 0, 0, 0, 214, 71, + }; + + dummy_reset(); + + u8 test_msg_storage[SBP_MAX_PAYLOAD_LEN]; + memset(test_msg_storage, 0, sizeof(test_msg_storage)); + u8 test_msg_len = 0; + msg_ssr_tile_definition_t *test_msg = + (msg_ssr_tile_definition_t *)test_msg_storage; + test_msg_len = sizeof(*test_msg); + test_msg->bitmask = 1234567890; + test_msg->cols = 32768; + test_msg->corner_nw_lat = 1024; + test_msg->corner_nw_lon = 2048; + test_msg->rows = 16384; + test_msg->spacing_lat = 4096; + test_msg->spacing_lon = 8192; + test_msg->ssr_sol_id = 31; + test_msg->tile_id = 512; + test_msg->tile_set_id = 256; + sbp_payload_send(&sbp_state, 1527, 66, test_msg_len, test_msg_storage, + &dummy_write); + + ck_assert_msg( + test_msg_len == sizeof(encoded_frame) - 8, + "Test message has not been generated correctly, or the encoded frame " + "from the spec is badly defined. Check your test spec"); + + ck_assert_msg(dummy_wr == sizeof(encoded_frame), + "not enough data was written to dummy_buff"); + ck_assert_msg(memcmp(dummy_buff, encoded_frame, sizeof(encoded_frame)) == 0, + "frame was not encoded properly"); + + while (dummy_rd < dummy_wr) { + ck_assert_msg(sbp_process(&sbp_state, &dummy_read) >= SBP_OK, + "sbp_process threw an error!"); + } + + ck_assert_msg(last_msg.n_callbacks_logged == 1, + "msg_callback: one callback should have been logged"); + ck_assert_msg(last_msg.sender_id == 66, + "msg_callback: sender_id decoded incorrectly"); + ck_assert_msg(last_msg.len == sizeof(encoded_frame) - 8, + "msg_callback: len decoded incorrectly"); + ck_assert_msg( + memcmp(last_msg.msg, encoded_frame + 6, sizeof(encoded_frame) - 8) == 0, + "msg_callback: test data decoded incorrectly"); + ck_assert_msg(last_msg.context == &DUMMY_MEMORY_FOR_CALLBACKS, + "frame_callback: context pointer incorrectly passed"); + + ck_assert_msg(last_frame.n_callbacks_logged == 1, + "frame_callback: one callback should have been logged"); + ck_assert_msg(last_frame.sender_id == 66, + "frame_callback: sender_id decoded incorrectly"); + ck_assert_msg(last_frame.msg_type == 1527, + "frame_callback: msg_type decoded incorrectly"); + ck_assert_msg(last_frame.msg_len == sizeof(encoded_frame) - 8, + "frame_callback: msg_len decoded incorrectly"); + ck_assert_msg(memcmp(last_frame.msg, encoded_frame + 6, + sizeof(encoded_frame) - 8) == 0, + "frame_callback: test data decoded incorrectly"); + ck_assert_msg(last_frame.frame_len == sizeof(encoded_frame), + "frame_callback: frame_len decoded incorrectly"); + ck_assert_msg( + memcmp(last_frame.frame, encoded_frame, sizeof(encoded_frame)) == 0, + "frame_callback: frame decoded incorrectly"); + ck_assert_msg(last_frame.context == &DUMMY_MEMORY_FOR_CALLBACKS, + "frame_callback: context pointer incorrectly passed"); + + // Cast to expected message type - the +6 byte offset is where the payload + // starts + msg_ssr_tile_definition_t *check_msg = + (msg_ssr_tile_definition_t *)((void *)last_msg.msg); + // Run tests against fields + ck_assert_msg(check_msg != 0, "stub to prevent warnings if msg isn't used"); + ck_assert_msg(check_msg->bitmask == 1234567890, + "incorrect value for bitmask, expected 1234567890, is %d", + check_msg->bitmask); + ck_assert_msg(check_msg->cols == 32768, + "incorrect value for cols, expected 32768, is %d", + check_msg->cols); + ck_assert_msg(check_msg->corner_nw_lat == 1024, + "incorrect value for corner_nw_lat, expected 1024, is %d", + check_msg->corner_nw_lat); + ck_assert_msg(check_msg->corner_nw_lon == 2048, + "incorrect value for corner_nw_lon, expected 2048, is %d", + check_msg->corner_nw_lon); + ck_assert_msg(check_msg->rows == 16384, + "incorrect value for rows, expected 16384, is %d", + check_msg->rows); + ck_assert_msg(check_msg->spacing_lat == 4096, + "incorrect value for spacing_lat, expected 4096, is %d", + check_msg->spacing_lat); + ck_assert_msg(check_msg->spacing_lon == 8192, + "incorrect value for spacing_lon, expected 8192, is %d", + check_msg->spacing_lon); + ck_assert_msg(check_msg->ssr_sol_id == 31, + "incorrect value for ssr_sol_id, expected 31, is %d", + check_msg->ssr_sol_id); + ck_assert_msg(check_msg->tile_id == 512, + "incorrect value for tile_id, expected 512, is %d", + check_msg->tile_id); + ck_assert_msg(check_msg->tile_set_id == 256, + "incorrect value for tile_set_id, expected 256, is %d", + check_msg->tile_set_id); + } +} +END_TEST + +Suite *legacy_auto_check_sbp_ssr_MsgSsrTileDefinition_suite(void) { + Suite *s = suite_create( + "SBP generated test suite: " + "legacy_auto_check_sbp_ssr_MsgSsrTileDefinition"); + TCase *tc_acq = tcase_create( + "Automated_Suite_legacy_auto_check_sbp_ssr_MsgSsrTileDefinition"); + tcase_add_test(tc_acq, test_legacy_auto_check_sbp_ssr_MsgSsrTileDefinition); + suite_add_tcase(s, tc_acq); + return s; +} \ No newline at end of file diff --git a/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc new file mode 100644 index 0000000000..1bae53374d --- /dev/null +++ b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2015-2021 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +// This file was auto-generated from +// spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml by +// generate.py. Do not modify by hand! + +#include +#include +#include +#include +class Test_legacy_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds0 + : public ::testing::Test, + public sbp::State, + public sbp::IReader, + public sbp::IWriter, + sbp::PayloadHandler { + public: + Test_legacy_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds0() + : ::testing::Test(), + sbp::State(), + sbp::IReader(), + sbp::IWriter(), + sbp::PayloadHandler(this), + last_msg_storage_(), + last_msg_(reinterpret_cast( + last_msg_storage_)), + last_msg_len_(), + last_sender_id_(), + n_callbacks_logged_(), + dummy_wr_(), + dummy_rd_(), + dummy_buff_() { + set_reader(this); + set_writer(this); + } + + s32 read(uint8_t *buf, const uint32_t n) override { + uint32_t real_n = n; + memcpy(buf, dummy_buff_ + dummy_rd_, real_n); + dummy_rd_ += real_n; + return (s32)real_n; + } + + s32 write(const uint8_t *buf, uint32_t n) override { + uint32_t real_n = n; + memcpy(dummy_buff_ + dummy_wr_, buf, real_n); + dummy_wr_ += real_n; + return (s32)real_n; + } + + protected: + void handle_sbp_msg(uint16_t sender_id, uint8_t message_length, + const msg_ssr_gridded_correction_bounds_t &msg) override { + memcpy(last_msg_storage_, &msg, message_length); + last_msg_len_ = message_length; + last_sender_id_ = sender_id; + n_callbacks_logged_++; + } + + uint8_t last_msg_storage_[SBP_MAX_PAYLOAD_LEN]; + msg_ssr_gridded_correction_bounds_t *last_msg_; + uint8_t last_msg_len_; + uint16_t last_sender_id_; + size_t n_callbacks_logged_; + uint32_t dummy_wr_; + uint32_t dummy_rd_; + uint8_t dummy_buff_[1024]; +}; + +TEST_F(Test_legacy_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds0, Test) { + uint8_t encoded_frame[] = { + 85, 254, 5, 66, 0, 43, 180, 0, 0, 0, 3, 0, 1, + 1, 10, 0, 15, 1, 0, 10, 0, 39, 232, 3, 244, 1, + 100, 200, 150, 100, 2, 5, 10, 16, 0, 17, 18, 19, 20, + 21, 6, 10, 22, 0, 23, 24, 25, 26, 27, 112, 145, + }; + + uint8_t test_msg_storage[SBP_MAX_PAYLOAD_LEN]{}; + uint8_t test_msg_len = 0; + msg_ssr_gridded_correction_bounds_t *test_msg = + (msg_ssr_gridded_correction_bounds_t *)test_msg_storage; + test_msg_len = (uint8_t)sizeof(*test_msg); + test_msg->grid_point_id = 1000; + test_msg->header.num_msgs = 1; + test_msg->header.seq_num = 1; + test_msg->header.sol_id = 0; + test_msg->header.time.tow = 180; + test_msg->header.time.wn = 3; + test_msg->header.update_interval = 10; + test_msg->n_sats = 2; + test_msg->ssr_iod_atmo = 15; + if (sizeof(test_msg->stec_sat_list) == 0) { + // Cope with variable length arrays + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stec_sat_list[0])); + } + test_msg->stec_sat_list[0].stec_bound_mu = 18; + test_msg->stec_sat_list[0].stec_bound_mu_dot = 20; + test_msg->stec_sat_list[0].stec_bound_sig = 19; + test_msg->stec_sat_list[0].stec_bound_sig_dot = 21; + test_msg->stec_sat_list[0].stec_residual.residual = 16; + test_msg->stec_sat_list[0].stec_residual.stddev = 17; + test_msg->stec_sat_list[0].stec_residual.sv_id.constellation = 10; + test_msg->stec_sat_list[0].stec_residual.sv_id.satId = 5; + if (sizeof(test_msg->stec_sat_list) == 0) { + // Cope with variable length arrays + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stec_sat_list[0])); + } + test_msg->stec_sat_list[1].stec_bound_mu = 24; + test_msg->stec_sat_list[1].stec_bound_mu_dot = 26; + test_msg->stec_sat_list[1].stec_bound_sig = 25; + test_msg->stec_sat_list[1].stec_bound_sig_dot = 27; + test_msg->stec_sat_list[1].stec_residual.residual = 22; + test_msg->stec_sat_list[1].stec_residual.stddev = 23; + test_msg->stec_sat_list[1].stec_residual.sv_id.constellation = 10; + test_msg->stec_sat_list[1].stec_residual.sv_id.satId = 6; + test_msg->tile_id = 10; + test_msg->tile_set_id = 1; + test_msg->tropo_bound_mu = 150; + test_msg->tropo_bound_sig = 100; + test_msg->tropo_delay_correction.hydro = 500; + test_msg->tropo_delay_correction.stddev = 200; + test_msg->tropo_delay_correction.wet = 100; + test_msg->tropo_qi = 39; + + EXPECT_EQ(send_message(1534, 66, test_msg_len, test_msg_storage), SBP_OK); + + EXPECT_EQ(dummy_wr_, sizeof(encoded_frame)); + EXPECT_EQ(memcmp(dummy_buff_, encoded_frame, sizeof(encoded_frame)), 0); + + while (dummy_rd_ < dummy_wr_) { + process(); + } + + EXPECT_EQ(n_callbacks_logged_, 1); + EXPECT_EQ(last_sender_id_, 66); + EXPECT_EQ(last_msg_len_, test_msg_len); + EXPECT_EQ(last_msg_->grid_point_id, 1000) + << "incorrect value for grid_point_id, expected 1000, is " + << last_msg_->grid_point_id; + EXPECT_EQ(last_msg_->header.num_msgs, 1) + << "incorrect value for header.num_msgs, expected 1, is " + << last_msg_->header.num_msgs; + EXPECT_EQ(last_msg_->header.seq_num, 1) + << "incorrect value for header.seq_num, expected 1, is " + << last_msg_->header.seq_num; + EXPECT_EQ(last_msg_->header.sol_id, 0) + << "incorrect value for header.sol_id, expected 0, is " + << last_msg_->header.sol_id; + EXPECT_EQ(last_msg_->header.time.tow, 180) + << "incorrect value for header.time.tow, expected 180, is " + << last_msg_->header.time.tow; + EXPECT_EQ(last_msg_->header.time.wn, 3) + << "incorrect value for header.time.wn, expected 3, is " + << last_msg_->header.time.wn; + EXPECT_EQ(last_msg_->header.update_interval, 10) + << "incorrect value for header.update_interval, expected 10, is " + << last_msg_->header.update_interval; + EXPECT_EQ(last_msg_->n_sats, 2) + << "incorrect value for n_sats, expected 2, is " << last_msg_->n_sats; + EXPECT_EQ(last_msg_->ssr_iod_atmo, 15) + << "incorrect value for ssr_iod_atmo, expected 15, is " + << last_msg_->ssr_iod_atmo; + EXPECT_EQ(last_msg_->stec_sat_list[0].stec_bound_mu, 18) + << "incorrect value for stec_sat_list[0].stec_bound_mu, expected 18, is " + << last_msg_->stec_sat_list[0].stec_bound_mu; + EXPECT_EQ(last_msg_->stec_sat_list[0].stec_bound_mu_dot, 20) + << "incorrect value for stec_sat_list[0].stec_bound_mu_dot, expected 20, " + "is " + << last_msg_->stec_sat_list[0].stec_bound_mu_dot; + EXPECT_EQ(last_msg_->stec_sat_list[0].stec_bound_sig, 19) + << "incorrect value for stec_sat_list[0].stec_bound_sig, expected 19, is " + << last_msg_->stec_sat_list[0].stec_bound_sig; + EXPECT_EQ(last_msg_->stec_sat_list[0].stec_bound_sig_dot, 21) + << "incorrect value for stec_sat_list[0].stec_bound_sig_dot, expected " + "21, is " + << last_msg_->stec_sat_list[0].stec_bound_sig_dot; + EXPECT_EQ(last_msg_->stec_sat_list[0].stec_residual.residual, 16) + << "incorrect value for stec_sat_list[0].stec_residual.residual, " + "expected 16, is " + << last_msg_->stec_sat_list[0].stec_residual.residual; + EXPECT_EQ(last_msg_->stec_sat_list[0].stec_residual.stddev, 17) + << "incorrect value for stec_sat_list[0].stec_residual.stddev, expected " + "17, is " + << last_msg_->stec_sat_list[0].stec_residual.stddev; + EXPECT_EQ(last_msg_->stec_sat_list[0].stec_residual.sv_id.constellation, 10) + << "incorrect value for " + "stec_sat_list[0].stec_residual.sv_id.constellation, expected 10, is " + << last_msg_->stec_sat_list[0].stec_residual.sv_id.constellation; + EXPECT_EQ(last_msg_->stec_sat_list[0].stec_residual.sv_id.satId, 5) + << "incorrect value for stec_sat_list[0].stec_residual.sv_id.satId, " + "expected 5, is " + << last_msg_->stec_sat_list[0].stec_residual.sv_id.satId; + EXPECT_EQ(last_msg_->stec_sat_list[1].stec_bound_mu, 24) + << "incorrect value for stec_sat_list[1].stec_bound_mu, expected 24, is " + << last_msg_->stec_sat_list[1].stec_bound_mu; + EXPECT_EQ(last_msg_->stec_sat_list[1].stec_bound_mu_dot, 26) + << "incorrect value for stec_sat_list[1].stec_bound_mu_dot, expected 26, " + "is " + << last_msg_->stec_sat_list[1].stec_bound_mu_dot; + EXPECT_EQ(last_msg_->stec_sat_list[1].stec_bound_sig, 25) + << "incorrect value for stec_sat_list[1].stec_bound_sig, expected 25, is " + << last_msg_->stec_sat_list[1].stec_bound_sig; + EXPECT_EQ(last_msg_->stec_sat_list[1].stec_bound_sig_dot, 27) + << "incorrect value for stec_sat_list[1].stec_bound_sig_dot, expected " + "27, is " + << last_msg_->stec_sat_list[1].stec_bound_sig_dot; + EXPECT_EQ(last_msg_->stec_sat_list[1].stec_residual.residual, 22) + << "incorrect value for stec_sat_list[1].stec_residual.residual, " + "expected 22, is " + << last_msg_->stec_sat_list[1].stec_residual.residual; + EXPECT_EQ(last_msg_->stec_sat_list[1].stec_residual.stddev, 23) + << "incorrect value for stec_sat_list[1].stec_residual.stddev, expected " + "23, is " + << last_msg_->stec_sat_list[1].stec_residual.stddev; + EXPECT_EQ(last_msg_->stec_sat_list[1].stec_residual.sv_id.constellation, 10) + << "incorrect value for " + "stec_sat_list[1].stec_residual.sv_id.constellation, expected 10, is " + << last_msg_->stec_sat_list[1].stec_residual.sv_id.constellation; + EXPECT_EQ(last_msg_->stec_sat_list[1].stec_residual.sv_id.satId, 6) + << "incorrect value for stec_sat_list[1].stec_residual.sv_id.satId, " + "expected 6, is " + << last_msg_->stec_sat_list[1].stec_residual.sv_id.satId; + EXPECT_EQ(last_msg_->tile_id, 10) + << "incorrect value for tile_id, expected 10, is " << last_msg_->tile_id; + EXPECT_EQ(last_msg_->tile_set_id, 1) + << "incorrect value for tile_set_id, expected 1, is " + << last_msg_->tile_set_id; + EXPECT_EQ(last_msg_->tropo_bound_mu, 150) + << "incorrect value for tropo_bound_mu, expected 150, is " + << last_msg_->tropo_bound_mu; + EXPECT_EQ(last_msg_->tropo_bound_sig, 100) + << "incorrect value for tropo_bound_sig, expected 100, is " + << last_msg_->tropo_bound_sig; + EXPECT_EQ(last_msg_->tropo_delay_correction.hydro, 500) + << "incorrect value for tropo_delay_correction.hydro, expected 500, is " + << last_msg_->tropo_delay_correction.hydro; + EXPECT_EQ(last_msg_->tropo_delay_correction.stddev, 200) + << "incorrect value for tropo_delay_correction.stddev, expected 200, is " + << last_msg_->tropo_delay_correction.stddev; + EXPECT_EQ(last_msg_->tropo_delay_correction.wet, 100) + << "incorrect value for tropo_delay_correction.wet, expected 100, is " + << last_msg_->tropo_delay_correction.wet; + EXPECT_EQ(last_msg_->tropo_qi, 39) + << "incorrect value for tropo_qi, expected 39, is " + << last_msg_->tropo_qi; +} diff --git a/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrStecCorrection.cc b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrStecCorrection.cc new file mode 100644 index 0000000000..5457b264d4 --- /dev/null +++ b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrStecCorrection.cc @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2015-2021 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +// This file was auto-generated from +// spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrection.yaml by +// generate.py. Do not modify by hand! + +#include +#include +#include +#include +class Test_legacy_auto_check_sbp_ssr_MsgSsrStecCorrection0 + : public ::testing::Test, + public sbp::State, + public sbp::IReader, + public sbp::IWriter, + sbp::PayloadHandler { + public: + Test_legacy_auto_check_sbp_ssr_MsgSsrStecCorrection0() + : ::testing::Test(), + sbp::State(), + sbp::IReader(), + sbp::IWriter(), + sbp::PayloadHandler(this), + last_msg_storage_(), + last_msg_( + reinterpret_cast(last_msg_storage_)), + last_msg_len_(), + last_sender_id_(), + n_callbacks_logged_(), + dummy_wr_(), + dummy_rd_(), + dummy_buff_() { + set_reader(this); + set_writer(this); + } + + s32 read(uint8_t *buf, const uint32_t n) override { + uint32_t real_n = n; + memcpy(buf, dummy_buff_ + dummy_rd_, real_n); + dummy_rd_ += real_n; + return (s32)real_n; + } + + s32 write(const uint8_t *buf, uint32_t n) override { + uint32_t real_n = n; + memcpy(dummy_buff_ + dummy_wr_, buf, real_n); + dummy_wr_ += real_n; + return (s32)real_n; + } + + protected: + void handle_sbp_msg(uint16_t sender_id, uint8_t message_length, + const msg_ssr_stec_correction_t &msg) override { + memcpy(last_msg_storage_, &msg, message_length); + last_msg_len_ = message_length; + last_sender_id_ = sender_id; + n_callbacks_logged_++; + } + + uint8_t last_msg_storage_[SBP_MAX_PAYLOAD_LEN]; + msg_ssr_stec_correction_t *last_msg_; + uint8_t last_msg_len_; + uint16_t last_sender_id_; + size_t n_callbacks_logged_; + uint32_t dummy_wr_; + uint32_t dummy_rd_; + uint8_t dummy_buff_[1024]; +}; + +TEST_F(Test_legacy_auto_check_sbp_ssr_MsgSsrStecCorrection0, Test) { + uint8_t encoded_frame[] = { + 85, 253, 5, 66, 0, 38, 180, 0, 0, 0, 3, 0, 1, 1, 10, 0, + 15, 1, 0, 10, 0, 2, 1, 1, 1, 63, 0, 62, 0, 61, 0, 60, + 0, 31, 15, 5, 63, 0, 64, 0, 65, 0, 66, 0, 119, 50, + }; + + uint8_t test_msg_storage[SBP_MAX_PAYLOAD_LEN]{}; + uint8_t test_msg_len = 0; + msg_ssr_stec_correction_t *test_msg = + (msg_ssr_stec_correction_t *)test_msg_storage; + test_msg_len = (uint8_t)sizeof(*test_msg); + test_msg->header.num_msgs = 1; + test_msg->header.seq_num = 1; + test_msg->header.sol_id = 0; + test_msg->header.time.tow = 180; + test_msg->header.time.wn = 3; + test_msg->header.update_interval = 10; + test_msg->n_sats = 2; + test_msg->ssr_iod_atmo = 15; + if (sizeof(test_msg->stec_sat_list) == 0) { + // Cope with variable length arrays + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stec_sat_list[0])); + } + if (sizeof(test_msg->stec_sat_list[0].stec_coeff) == 0) { + // Cope with variable length arrays + test_msg_len = (uint8_t)(test_msg_len + + sizeof(test_msg->stec_sat_list[0].stec_coeff[0])); + } + test_msg->stec_sat_list[0].stec_coeff[0] = 63; + if (sizeof(test_msg->stec_sat_list[0].stec_coeff) == 0) { + // Cope with variable length arrays + test_msg_len = (uint8_t)(test_msg_len + + sizeof(test_msg->stec_sat_list[0].stec_coeff[0])); + } + test_msg->stec_sat_list[0].stec_coeff[1] = 62; + if (sizeof(test_msg->stec_sat_list[0].stec_coeff) == 0) { + // Cope with variable length arrays + test_msg_len = (uint8_t)(test_msg_len + + sizeof(test_msg->stec_sat_list[0].stec_coeff[0])); + } + test_msg->stec_sat_list[0].stec_coeff[2] = 61; + if (sizeof(test_msg->stec_sat_list[0].stec_coeff) == 0) { + // Cope with variable length arrays + test_msg_len = (uint8_t)(test_msg_len + + sizeof(test_msg->stec_sat_list[0].stec_coeff[0])); + } + test_msg->stec_sat_list[0].stec_coeff[3] = 60; + test_msg->stec_sat_list[0].stec_quality_indicator = 1; + test_msg->stec_sat_list[0].sv_id.constellation = 1; + test_msg->stec_sat_list[0].sv_id.satId = 1; + if (sizeof(test_msg->stec_sat_list) == 0) { + // Cope with variable length arrays + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stec_sat_list[0])); + } + if (sizeof(test_msg->stec_sat_list[1].stec_coeff) == 0) { + // Cope with variable length arrays + test_msg_len = (uint8_t)(test_msg_len + + sizeof(test_msg->stec_sat_list[1].stec_coeff[0])); + } + test_msg->stec_sat_list[1].stec_coeff[0] = 63; + if (sizeof(test_msg->stec_sat_list[1].stec_coeff) == 0) { + // Cope with variable length arrays + test_msg_len = (uint8_t)(test_msg_len + + sizeof(test_msg->stec_sat_list[1].stec_coeff[0])); + } + test_msg->stec_sat_list[1].stec_coeff[1] = 64; + if (sizeof(test_msg->stec_sat_list[1].stec_coeff) == 0) { + // Cope with variable length arrays + test_msg_len = (uint8_t)(test_msg_len + + sizeof(test_msg->stec_sat_list[1].stec_coeff[0])); + } + test_msg->stec_sat_list[1].stec_coeff[2] = 65; + if (sizeof(test_msg->stec_sat_list[1].stec_coeff) == 0) { + // Cope with variable length arrays + test_msg_len = (uint8_t)(test_msg_len + + sizeof(test_msg->stec_sat_list[1].stec_coeff[0])); + } + test_msg->stec_sat_list[1].stec_coeff[3] = 66; + test_msg->stec_sat_list[1].stec_quality_indicator = 5; + test_msg->stec_sat_list[1].sv_id.constellation = 15; + test_msg->stec_sat_list[1].sv_id.satId = 31; + test_msg->tile_id = 10; + test_msg->tile_set_id = 1; + + EXPECT_EQ(send_message(1533, 66, test_msg_len, test_msg_storage), SBP_OK); + + EXPECT_EQ(dummy_wr_, sizeof(encoded_frame)); + EXPECT_EQ(memcmp(dummy_buff_, encoded_frame, sizeof(encoded_frame)), 0); + + while (dummy_rd_ < dummy_wr_) { + process(); + } + + EXPECT_EQ(n_callbacks_logged_, 1); + EXPECT_EQ(last_sender_id_, 66); + EXPECT_EQ(last_msg_len_, test_msg_len); + EXPECT_EQ(last_msg_->header.num_msgs, 1) + << "incorrect value for header.num_msgs, expected 1, is " + << last_msg_->header.num_msgs; + EXPECT_EQ(last_msg_->header.seq_num, 1) + << "incorrect value for header.seq_num, expected 1, is " + << last_msg_->header.seq_num; + EXPECT_EQ(last_msg_->header.sol_id, 0) + << "incorrect value for header.sol_id, expected 0, is " + << last_msg_->header.sol_id; + EXPECT_EQ(last_msg_->header.time.tow, 180) + << "incorrect value for header.time.tow, expected 180, is " + << last_msg_->header.time.tow; + EXPECT_EQ(last_msg_->header.time.wn, 3) + << "incorrect value for header.time.wn, expected 3, is " + << last_msg_->header.time.wn; + EXPECT_EQ(last_msg_->header.update_interval, 10) + << "incorrect value for header.update_interval, expected 10, is " + << last_msg_->header.update_interval; + EXPECT_EQ(last_msg_->n_sats, 2) + << "incorrect value for n_sats, expected 2, is " << last_msg_->n_sats; + EXPECT_EQ(last_msg_->ssr_iod_atmo, 15) + << "incorrect value for ssr_iod_atmo, expected 15, is " + << last_msg_->ssr_iod_atmo; + EXPECT_EQ(last_msg_->stec_sat_list[0].stec_coeff[0], 63) + << "incorrect value for stec_sat_list[0].stec_coeff[0], expected 63, is " + << last_msg_->stec_sat_list[0].stec_coeff[0]; + EXPECT_EQ(last_msg_->stec_sat_list[0].stec_coeff[1], 62) + << "incorrect value for stec_sat_list[0].stec_coeff[1], expected 62, is " + << last_msg_->stec_sat_list[0].stec_coeff[1]; + EXPECT_EQ(last_msg_->stec_sat_list[0].stec_coeff[2], 61) + << "incorrect value for stec_sat_list[0].stec_coeff[2], expected 61, is " + << last_msg_->stec_sat_list[0].stec_coeff[2]; + EXPECT_EQ(last_msg_->stec_sat_list[0].stec_coeff[3], 60) + << "incorrect value for stec_sat_list[0].stec_coeff[3], expected 60, is " + << last_msg_->stec_sat_list[0].stec_coeff[3]; + EXPECT_EQ(last_msg_->stec_sat_list[0].stec_quality_indicator, 1) + << "incorrect value for stec_sat_list[0].stec_quality_indicator, " + "expected 1, is " + << last_msg_->stec_sat_list[0].stec_quality_indicator; + EXPECT_EQ(last_msg_->stec_sat_list[0].sv_id.constellation, 1) + << "incorrect value for stec_sat_list[0].sv_id.constellation, expected " + "1, is " + << last_msg_->stec_sat_list[0].sv_id.constellation; + EXPECT_EQ(last_msg_->stec_sat_list[0].sv_id.satId, 1) + << "incorrect value for stec_sat_list[0].sv_id.satId, expected 1, is " + << last_msg_->stec_sat_list[0].sv_id.satId; + EXPECT_EQ(last_msg_->stec_sat_list[1].stec_coeff[0], 63) + << "incorrect value for stec_sat_list[1].stec_coeff[0], expected 63, is " + << last_msg_->stec_sat_list[1].stec_coeff[0]; + EXPECT_EQ(last_msg_->stec_sat_list[1].stec_coeff[1], 64) + << "incorrect value for stec_sat_list[1].stec_coeff[1], expected 64, is " + << last_msg_->stec_sat_list[1].stec_coeff[1]; + EXPECT_EQ(last_msg_->stec_sat_list[1].stec_coeff[2], 65) + << "incorrect value for stec_sat_list[1].stec_coeff[2], expected 65, is " + << last_msg_->stec_sat_list[1].stec_coeff[2]; + EXPECT_EQ(last_msg_->stec_sat_list[1].stec_coeff[3], 66) + << "incorrect value for stec_sat_list[1].stec_coeff[3], expected 66, is " + << last_msg_->stec_sat_list[1].stec_coeff[3]; + EXPECT_EQ(last_msg_->stec_sat_list[1].stec_quality_indicator, 5) + << "incorrect value for stec_sat_list[1].stec_quality_indicator, " + "expected 5, is " + << last_msg_->stec_sat_list[1].stec_quality_indicator; + EXPECT_EQ(last_msg_->stec_sat_list[1].sv_id.constellation, 15) + << "incorrect value for stec_sat_list[1].sv_id.constellation, expected " + "15, is " + << last_msg_->stec_sat_list[1].sv_id.constellation; + EXPECT_EQ(last_msg_->stec_sat_list[1].sv_id.satId, 31) + << "incorrect value for stec_sat_list[1].sv_id.satId, expected 31, is " + << last_msg_->stec_sat_list[1].sv_id.satId; + EXPECT_EQ(last_msg_->tile_id, 10) + << "incorrect value for tile_id, expected 10, is " << last_msg_->tile_id; + EXPECT_EQ(last_msg_->tile_set_id, 1) + << "incorrect value for tile_set_id, expected 1, is " + << last_msg_->tile_set_id; +} diff --git a/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrTileDefinition.cc b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrTileDefinition.cc new file mode 100644 index 0000000000..850314925b --- /dev/null +++ b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrTileDefinition.cc @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2015-2021 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +// This file was auto-generated from +// spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinition.yaml by +// generate.py. Do not modify by hand! + +#include +#include +#include +#include +class Test_legacy_auto_check_sbp_ssr_MsgSsrTileDefinition0 + : public ::testing::Test, + public sbp::State, + public sbp::IReader, + public sbp::IWriter, + sbp::PayloadHandler { + public: + Test_legacy_auto_check_sbp_ssr_MsgSsrTileDefinition0() + : ::testing::Test(), + sbp::State(), + sbp::IReader(), + sbp::IWriter(), + sbp::PayloadHandler(this), + last_msg_storage_(), + last_msg_( + reinterpret_cast(last_msg_storage_)), + last_msg_len_(), + last_sender_id_(), + n_callbacks_logged_(), + dummy_wr_(), + dummy_rd_(), + dummy_buff_() { + set_reader(this); + set_writer(this); + } + + s32 read(uint8_t *buf, const uint32_t n) override { + uint32_t real_n = n; + memcpy(buf, dummy_buff_ + dummy_rd_, real_n); + dummy_rd_ += real_n; + return (s32)real_n; + } + + s32 write(const uint8_t *buf, uint32_t n) override { + uint32_t real_n = n; + memcpy(dummy_buff_ + dummy_wr_, buf, real_n); + dummy_wr_ += real_n; + return (s32)real_n; + } + + protected: + void handle_sbp_msg(uint16_t sender_id, uint8_t message_length, + const msg_ssr_tile_definition_t &msg) override { + memcpy(last_msg_storage_, &msg, message_length); + last_msg_len_ = message_length; + last_sender_id_ = sender_id; + n_callbacks_logged_++; + } + + uint8_t last_msg_storage_[SBP_MAX_PAYLOAD_LEN]; + msg_ssr_tile_definition_t *last_msg_; + uint8_t last_msg_len_; + uint16_t last_sender_id_; + size_t n_callbacks_logged_; + uint32_t dummy_wr_; + uint32_t dummy_rd_; + uint8_t dummy_buff_[1024]; +}; + +TEST_F(Test_legacy_auto_check_sbp_ssr_MsgSsrTileDefinition0, Test) { + uint8_t encoded_frame[] = { + 85, 247, 5, 66, 0, 25, 31, 0, 1, 0, 2, 0, 4, 0, 8, 0, 16, + 0, 32, 0, 64, 0, 128, 210, 2, 150, 73, 0, 0, 0, 0, 214, 71, + }; + + uint8_t test_msg_storage[SBP_MAX_PAYLOAD_LEN]{}; + uint8_t test_msg_len = 0; + msg_ssr_tile_definition_t *test_msg = + (msg_ssr_tile_definition_t *)test_msg_storage; + test_msg_len = (uint8_t)sizeof(*test_msg); + test_msg->bitmask = 1234567890; + test_msg->cols = 32768; + test_msg->corner_nw_lat = 1024; + test_msg->corner_nw_lon = 2048; + test_msg->rows = 16384; + test_msg->spacing_lat = 4096; + test_msg->spacing_lon = 8192; + test_msg->ssr_sol_id = 31; + test_msg->tile_id = 512; + test_msg->tile_set_id = 256; + + EXPECT_EQ(send_message(1527, 66, test_msg_len, test_msg_storage), SBP_OK); + + EXPECT_EQ(dummy_wr_, sizeof(encoded_frame)); + EXPECT_EQ(memcmp(dummy_buff_, encoded_frame, sizeof(encoded_frame)), 0); + + while (dummy_rd_ < dummy_wr_) { + process(); + } + + EXPECT_EQ(n_callbacks_logged_, 1); + EXPECT_EQ(last_sender_id_, 66); + EXPECT_EQ(last_msg_len_, test_msg_len); + EXPECT_EQ(last_msg_->bitmask, 1234567890) + << "incorrect value for bitmask, expected 1234567890, is " + << last_msg_->bitmask; + EXPECT_EQ(last_msg_->cols, 32768) + << "incorrect value for cols, expected 32768, is " << last_msg_->cols; + EXPECT_EQ(last_msg_->corner_nw_lat, 1024) + << "incorrect value for corner_nw_lat, expected 1024, is " + << last_msg_->corner_nw_lat; + EXPECT_EQ(last_msg_->corner_nw_lon, 2048) + << "incorrect value for corner_nw_lon, expected 2048, is " + << last_msg_->corner_nw_lon; + EXPECT_EQ(last_msg_->rows, 16384) + << "incorrect value for rows, expected 16384, is " << last_msg_->rows; + EXPECT_EQ(last_msg_->spacing_lat, 4096) + << "incorrect value for spacing_lat, expected 4096, is " + << last_msg_->spacing_lat; + EXPECT_EQ(last_msg_->spacing_lon, 8192) + << "incorrect value for spacing_lon, expected 8192, is " + << last_msg_->spacing_lon; + EXPECT_EQ(last_msg_->ssr_sol_id, 31) + << "incorrect value for ssr_sol_id, expected 31, is " + << last_msg_->ssr_sol_id; + EXPECT_EQ(last_msg_->tile_id, 512) + << "incorrect value for tile_id, expected 512, is " << last_msg_->tile_id; + EXPECT_EQ(last_msg_->tile_set_id, 256) + << "incorrect value for tile_set_id, expected 256, is " + << last_msg_->tile_set_id; +} diff --git a/docs/sbp.pdf b/docs/sbp.pdf index b84bf78676..b42d4273fa 100644 Binary files a/docs/sbp.pdf and b/docs/sbp.pdf differ diff --git a/haskell/src/SwiftNav/SBP/Msg.hs b/haskell/src/SwiftNav/SBP/Msg.hs index 6cd8d9fc6a..e2741214de 100644 --- a/haskell/src/SwiftNav/SBP/Msg.hs +++ b/haskell/src/SwiftNav/SBP/Msg.hs @@ -216,6 +216,7 @@ data SBPMsg = | SBPMsgSsrCodePhaseBiasesBounds MsgSsrCodePhaseBiasesBounds Msg | SBPMsgSsrGridDefinitionDepA MsgSsrGridDefinitionDepA Msg | SBPMsgSsrGriddedCorrection MsgSsrGriddedCorrection Msg + | SBPMsgSsrGriddedCorrectionBounds MsgSsrGriddedCorrectionBounds Msg | SBPMsgSsrGriddedCorrectionDepA MsgSsrGriddedCorrectionDepA Msg | SBPMsgSsrGriddedCorrectionNoStdDepA MsgSsrGriddedCorrectionNoStdDepA Msg | SBPMsgSsrOrbitClock MsgSsrOrbitClock Msg @@ -224,8 +225,10 @@ data SBPMsg = | SBPMsgSsrPhaseBiases MsgSsrPhaseBiases Msg | SBPMsgSsrSatelliteApc MsgSsrSatelliteApc Msg | SBPMsgSsrStecCorrection MsgSsrStecCorrection Msg + | SBPMsgSsrStecCorrectionDep MsgSsrStecCorrectionDep Msg | SBPMsgSsrStecCorrectionDepA MsgSsrStecCorrectionDepA Msg | SBPMsgSsrTileDefinition MsgSsrTileDefinition Msg + | SBPMsgSsrTileDefinitionDep MsgSsrTileDefinitionDep Msg | SBPMsgStartup MsgStartup Msg | SBPMsgStatusJournal MsgStatusJournal Msg | SBPMsgStatusReport MsgStatusReport Msg @@ -436,6 +439,7 @@ instance Binary SBPMsg where | _msgSBPType == msgSsrCodePhaseBiasesBounds = SBPMsgSsrCodePhaseBiasesBounds (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgSsrGridDefinitionDepA = SBPMsgSsrGridDefinitionDepA (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgSsrGriddedCorrection = SBPMsgSsrGriddedCorrection (decode (fromStrict (unBytes _msgSBPPayload))) m + | _msgSBPType == msgSsrGriddedCorrectionBounds = SBPMsgSsrGriddedCorrectionBounds (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgSsrGriddedCorrectionDepA = SBPMsgSsrGriddedCorrectionDepA (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgSsrGriddedCorrectionNoStdDepA = SBPMsgSsrGriddedCorrectionNoStdDepA (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgSsrOrbitClock = SBPMsgSsrOrbitClock (decode (fromStrict (unBytes _msgSBPPayload))) m @@ -444,8 +448,10 @@ instance Binary SBPMsg where | _msgSBPType == msgSsrPhaseBiases = SBPMsgSsrPhaseBiases (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgSsrSatelliteApc = SBPMsgSsrSatelliteApc (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgSsrStecCorrection = SBPMsgSsrStecCorrection (decode (fromStrict (unBytes _msgSBPPayload))) m + | _msgSBPType == msgSsrStecCorrectionDep = SBPMsgSsrStecCorrectionDep (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgSsrStecCorrectionDepA = SBPMsgSsrStecCorrectionDepA (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgSsrTileDefinition = SBPMsgSsrTileDefinition (decode (fromStrict (unBytes _msgSBPPayload))) m + | _msgSBPType == msgSsrTileDefinitionDep = SBPMsgSsrTileDefinitionDep (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgStartup = SBPMsgStartup (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgStatusJournal = SBPMsgStatusJournal (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgStatusReport = SBPMsgStatusReport (decode (fromStrict (unBytes _msgSBPPayload))) m @@ -648,6 +654,7 @@ instance Binary SBPMsg where encoder (SBPMsgSsrCodePhaseBiasesBounds _ m) = put m encoder (SBPMsgSsrGridDefinitionDepA _ m) = put m encoder (SBPMsgSsrGriddedCorrection _ m) = put m + encoder (SBPMsgSsrGriddedCorrectionBounds _ m) = put m encoder (SBPMsgSsrGriddedCorrectionDepA _ m) = put m encoder (SBPMsgSsrGriddedCorrectionNoStdDepA _ m) = put m encoder (SBPMsgSsrOrbitClock _ m) = put m @@ -656,8 +663,10 @@ instance Binary SBPMsg where encoder (SBPMsgSsrPhaseBiases _ m) = put m encoder (SBPMsgSsrSatelliteApc _ m) = put m encoder (SBPMsgSsrStecCorrection _ m) = put m + encoder (SBPMsgSsrStecCorrectionDep _ m) = put m encoder (SBPMsgSsrStecCorrectionDepA _ m) = put m encoder (SBPMsgSsrTileDefinition _ m) = put m + encoder (SBPMsgSsrTileDefinitionDep _ m) = put m encoder (SBPMsgStartup _ m) = put m encoder (SBPMsgStatusJournal _ m) = put m encoder (SBPMsgStatusReport _ m) = put m @@ -864,6 +873,7 @@ instance FromJSON SBPMsg where | msgType == msgSsrCodePhaseBiasesBounds = SBPMsgSsrCodePhaseBiasesBounds <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgSsrGridDefinitionDepA = SBPMsgSsrGridDefinitionDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgSsrGriddedCorrection = SBPMsgSsrGriddedCorrection <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj + | msgType == msgSsrGriddedCorrectionBounds = SBPMsgSsrGriddedCorrectionBounds <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgSsrGriddedCorrectionDepA = SBPMsgSsrGriddedCorrectionDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgSsrGriddedCorrectionNoStdDepA = SBPMsgSsrGriddedCorrectionNoStdDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgSsrOrbitClock = SBPMsgSsrOrbitClock <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj @@ -872,8 +882,10 @@ instance FromJSON SBPMsg where | msgType == msgSsrPhaseBiases = SBPMsgSsrPhaseBiases <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgSsrSatelliteApc = SBPMsgSsrSatelliteApc <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgSsrStecCorrection = SBPMsgSsrStecCorrection <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj + | msgType == msgSsrStecCorrectionDep = SBPMsgSsrStecCorrectionDep <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgSsrStecCorrectionDepA = SBPMsgSsrStecCorrectionDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgSsrTileDefinition = SBPMsgSsrTileDefinition <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj + | msgType == msgSsrTileDefinitionDep = SBPMsgSsrTileDefinitionDep <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgStartup = SBPMsgStartup <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgStatusJournal = SBPMsgStatusJournal <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgStatusReport = SBPMsgStatusReport <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj @@ -1081,6 +1093,7 @@ instance ToJSON SBPMsg where toJSON (SBPMsgSsrCodePhaseBiasesBounds n m) = toJSON n <<>> toJSON m toJSON (SBPMsgSsrGridDefinitionDepA n m) = toJSON n <<>> toJSON m toJSON (SBPMsgSsrGriddedCorrection n m) = toJSON n <<>> toJSON m + toJSON (SBPMsgSsrGriddedCorrectionBounds n m) = toJSON n <<>> toJSON m toJSON (SBPMsgSsrGriddedCorrectionDepA n m) = toJSON n <<>> toJSON m toJSON (SBPMsgSsrGriddedCorrectionNoStdDepA n m) = toJSON n <<>> toJSON m toJSON (SBPMsgSsrOrbitClock n m) = toJSON n <<>> toJSON m @@ -1089,8 +1102,10 @@ instance ToJSON SBPMsg where toJSON (SBPMsgSsrPhaseBiases n m) = toJSON n <<>> toJSON m toJSON (SBPMsgSsrSatelliteApc n m) = toJSON n <<>> toJSON m toJSON (SBPMsgSsrStecCorrection n m) = toJSON n <<>> toJSON m + toJSON (SBPMsgSsrStecCorrectionDep n m) = toJSON n <<>> toJSON m toJSON (SBPMsgSsrStecCorrectionDepA n m) = toJSON n <<>> toJSON m toJSON (SBPMsgSsrTileDefinition n m) = toJSON n <<>> toJSON m + toJSON (SBPMsgSsrTileDefinitionDep n m) = toJSON n <<>> toJSON m toJSON (SBPMsgStartup n m) = toJSON n <<>> toJSON m toJSON (SBPMsgStatusJournal n m) = toJSON n <<>> toJSON m toJSON (SBPMsgStatusReport n m) = toJSON n <<>> toJSON m @@ -1292,6 +1307,7 @@ instance HasMsg SBPMsg where msg f (SBPMsgSsrCodePhaseBiasesBounds n m) = SBPMsgSsrCodePhaseBiasesBounds n <$> f m msg f (SBPMsgSsrGridDefinitionDepA n m) = SBPMsgSsrGridDefinitionDepA n <$> f m msg f (SBPMsgSsrGriddedCorrection n m) = SBPMsgSsrGriddedCorrection n <$> f m + msg f (SBPMsgSsrGriddedCorrectionBounds n m) = SBPMsgSsrGriddedCorrectionBounds n <$> f m msg f (SBPMsgSsrGriddedCorrectionDepA n m) = SBPMsgSsrGriddedCorrectionDepA n <$> f m msg f (SBPMsgSsrGriddedCorrectionNoStdDepA n m) = SBPMsgSsrGriddedCorrectionNoStdDepA n <$> f m msg f (SBPMsgSsrOrbitClock n m) = SBPMsgSsrOrbitClock n <$> f m @@ -1300,8 +1316,10 @@ instance HasMsg SBPMsg where msg f (SBPMsgSsrPhaseBiases n m) = SBPMsgSsrPhaseBiases n <$> f m msg f (SBPMsgSsrSatelliteApc n m) = SBPMsgSsrSatelliteApc n <$> f m msg f (SBPMsgSsrStecCorrection n m) = SBPMsgSsrStecCorrection n <$> f m + msg f (SBPMsgSsrStecCorrectionDep n m) = SBPMsgSsrStecCorrectionDep n <$> f m msg f (SBPMsgSsrStecCorrectionDepA n m) = SBPMsgSsrStecCorrectionDepA n <$> f m msg f (SBPMsgSsrTileDefinition n m) = SBPMsgSsrTileDefinition n <$> f m + msg f (SBPMsgSsrTileDefinitionDep n m) = SBPMsgSsrTileDefinitionDep n <$> f m msg f (SBPMsgStartup n m) = SBPMsgStartup n <$> f m msg f (SBPMsgStatusJournal n m) = SBPMsgStatusJournal n <$> f m msg f (SBPMsgStatusReport n m) = SBPMsgStatusReport n <$> f m diff --git a/haskell/src/SwiftNav/SBP/Ssr.hs b/haskell/src/SwiftNav/SBP/Ssr.hs index 4ee440b5b9..7252944322 100644 --- a/haskell/src/SwiftNav/SBP/Ssr.hs +++ b/haskell/src/SwiftNav/SBP/Ssr.hs @@ -507,10 +507,10 @@ $(makeSBP 'msgSsrPhaseBiases ''MsgSsrPhaseBiases) $(makeJSON "_msgSsrPhaseBiases_" ''MsgSsrPhaseBiases) $(makeLenses ''MsgSsrPhaseBiases) -msgSsrStecCorrection :: Word16 -msgSsrStecCorrection = 0x05FB +msgSsrStecCorrectionDep :: Word16 +msgSsrStecCorrectionDep = 0x05FB --- | SBP class for message MSG_SSR_STEC_CORRECTION (0x05FB). +-- | SBP class for message MSG_SSR_STEC_CORRECTION_DEP (0x05FB). -- -- The Slant Total Electron Content per space vehicle, given as polynomial -- approximation for a given tile. This should be combined with the @@ -518,9 +518,73 @@ msgSsrStecCorrection = 0x05FB -- the atmospheric delay. -- -- It is typically equivalent to the QZSS CLAS Sub Type 8 messages. -data MsgSsrStecCorrection = MsgSsrStecCorrection - { _msgSsrStecCorrection_header :: !STECHeader +data MsgSsrStecCorrectionDep = MsgSsrStecCorrectionDep + { _msgSsrStecCorrectionDep_header :: !STECHeader -- ^ Header of a STEC polynomial coefficient message. + , _msgSsrStecCorrectionDep_stec_sat_list :: ![STECSatElement] + -- ^ Array of STEC polynomial coefficients for each space vehicle. + } deriving ( Show, Read, Eq ) + +instance Binary MsgSsrStecCorrectionDep where + get = do + _msgSsrStecCorrectionDep_header <- get + _msgSsrStecCorrectionDep_stec_sat_list <- whileM (not <$> isEmpty) get + pure MsgSsrStecCorrectionDep {..} + + put MsgSsrStecCorrectionDep {..} = do + put _msgSsrStecCorrectionDep_header + mapM_ put _msgSsrStecCorrectionDep_stec_sat_list + +$(makeSBP 'msgSsrStecCorrectionDep ''MsgSsrStecCorrectionDep) +$(makeJSON "_msgSsrStecCorrectionDep_" ''MsgSsrStecCorrectionDep) +$(makeLenses ''MsgSsrStecCorrectionDep) + +data BoundsHeader = BoundsHeader + { _boundsHeader_time :: !GpsTimeSec + -- ^ GNSS reference time of the bound + , _boundsHeader_num_msgs :: !Word8 + -- ^ Number of messages in the dataset + , _boundsHeader_seq_num :: !Word8 + -- ^ Position of this message in the dataset + , _boundsHeader_update_interval :: !Word8 + -- ^ Update interval between consecutive bounds. Similar to RTCM DF391. + , _boundsHeader_sol_id :: !Word8 + -- ^ SSR Solution ID. + } deriving ( Show, Read, Eq ) + +instance Binary BoundsHeader where + get = do + _boundsHeader_time <- get + _boundsHeader_num_msgs <- getWord8 + _boundsHeader_seq_num <- getWord8 + _boundsHeader_update_interval <- getWord8 + _boundsHeader_sol_id <- getWord8 + pure BoundsHeader {..} + + put BoundsHeader {..} = do + put _boundsHeader_time + putWord8 _boundsHeader_num_msgs + putWord8 _boundsHeader_seq_num + putWord8 _boundsHeader_update_interval + putWord8 _boundsHeader_sol_id + +$(makeJSON "_boundsHeader_" ''BoundsHeader) +$(makeLenses ''BoundsHeader) + +msgSsrStecCorrection :: Word16 +msgSsrStecCorrection = 0x05FD + +data MsgSsrStecCorrection = MsgSsrStecCorrection + { _msgSsrStecCorrection_header :: !BoundsHeader + -- ^ Header of a STEC correction with bounds message. + , _msgSsrStecCorrection_ssr_iod_atmo :: !Word8 + -- ^ IOD of the SSR atmospheric correction + , _msgSsrStecCorrection_tile_set_id :: !Word16 + -- ^ Tile set ID + , _msgSsrStecCorrection_tile_id :: !Word16 + -- ^ Tile ID + , _msgSsrStecCorrection_n_sats :: !Word8 + -- ^ Number of satellites. , _msgSsrStecCorrection_stec_sat_list :: ![STECSatElement] -- ^ Array of STEC polynomial coefficients for each space vehicle. } deriving ( Show, Read, Eq ) @@ -528,11 +592,19 @@ data MsgSsrStecCorrection = MsgSsrStecCorrection instance Binary MsgSsrStecCorrection where get = do _msgSsrStecCorrection_header <- get + _msgSsrStecCorrection_ssr_iod_atmo <- getWord8 + _msgSsrStecCorrection_tile_set_id <- getWord16le + _msgSsrStecCorrection_tile_id <- getWord16le + _msgSsrStecCorrection_n_sats <- getWord8 _msgSsrStecCorrection_stec_sat_list <- whileM (not <$> isEmpty) get pure MsgSsrStecCorrection {..} put MsgSsrStecCorrection {..} = do put _msgSsrStecCorrection_header + putWord8 _msgSsrStecCorrection_ssr_iod_atmo + putWord16le _msgSsrStecCorrection_tile_set_id + putWord16le _msgSsrStecCorrection_tile_id + putWord8 _msgSsrStecCorrection_n_sats mapM_ put _msgSsrStecCorrection_stec_sat_list $(makeSBP 'msgSsrStecCorrection ''MsgSsrStecCorrection) @@ -576,10 +648,208 @@ $(makeSBP 'msgSsrGriddedCorrection ''MsgSsrGriddedCorrection) $(makeJSON "_msgSsrGriddedCorrection_" ''MsgSsrGriddedCorrection) $(makeLenses ''MsgSsrGriddedCorrection) +-- | STECSatElementIntegrity. +-- +-- STEC polynomial and bounds for the given satellite. +data STECSatElementIntegrity = STECSatElementIntegrity + { _sTECSatElementIntegrity_stec_residual :: !STECResidual + -- ^ STEC residuals (mean, stddev) + , _sTECSatElementIntegrity_stec_bound_mu :: !Word8 + -- ^ STEC Error Bound Mean (range 0-17.5) i<= 200, mean = 0.01i 200230, mean=5+0.5(i-230) + , _sTECSatElementIntegrity_stec_bound_sig :: !Word8 + -- ^ STEC Error Bound Standard Deviation (range 0-17.5) i<= 200, mean = + -- 0.01i 200230, mean=5+0.5(i-230) + , _sTECSatElementIntegrity_stec_bound_mu_dot :: !Word8 + -- ^ STEC Error Bound Mean First derivative degradation parameter(range + -- 0-0.01275) + , _sTECSatElementIntegrity_stec_bound_sig_dot :: !Word8 + -- ^ STEC Error Bound Standard Deviation First derivative degradation + -- parameter (range 0-0.01275) + } deriving ( Show, Read, Eq ) + +instance Binary STECSatElementIntegrity where + get = do + _sTECSatElementIntegrity_stec_residual <- get + _sTECSatElementIntegrity_stec_bound_mu <- getWord8 + _sTECSatElementIntegrity_stec_bound_sig <- getWord8 + _sTECSatElementIntegrity_stec_bound_mu_dot <- getWord8 + _sTECSatElementIntegrity_stec_bound_sig_dot <- getWord8 + pure STECSatElementIntegrity {..} + + put STECSatElementIntegrity {..} = do + put _sTECSatElementIntegrity_stec_residual + putWord8 _sTECSatElementIntegrity_stec_bound_mu + putWord8 _sTECSatElementIntegrity_stec_bound_sig + putWord8 _sTECSatElementIntegrity_stec_bound_mu_dot + putWord8 _sTECSatElementIntegrity_stec_bound_sig_dot + +$(makeJSON "_sTECSatElementIntegrity_" ''STECSatElementIntegrity) +$(makeLenses ''STECSatElementIntegrity) + +msgSsrGriddedCorrectionBounds :: Word16 +msgSsrGriddedCorrectionBounds = 0x05FE + +data MsgSsrGriddedCorrectionBounds = MsgSsrGriddedCorrectionBounds + { _msgSsrGriddedCorrectionBounds_header :: !BoundsHeader + -- ^ Header of a bounds message. + , _msgSsrGriddedCorrectionBounds_ssr_iod_atmo :: !Word8 + -- ^ IOD of the SSR atmospheric correction. + , _msgSsrGriddedCorrectionBounds_tile_set_id :: !Word16 + -- ^ Unique identifier of the set this tile belongs to. + , _msgSsrGriddedCorrectionBounds_tile_id :: !Word16 + -- ^ Unique identifier of this tile in the tile set. + , _msgSsrGriddedCorrectionBounds_tropo_qi :: !Word8 + -- ^ Tropo Quality Indicator. Similar to RTCM DF389. + , _msgSsrGriddedCorrectionBounds_grid_point_id :: !Word16 + -- ^ Index of the Grid Point. + , _msgSsrGriddedCorrectionBounds_tropo_delay_correction :: !TroposphericDelayCorrection + -- ^ Tropospheric delay at grid point. + , _msgSsrGriddedCorrectionBounds_tropo_bound_mu :: !Word8 + -- ^ Troposphere Error Bound Mean (range 0-1.275). + , _msgSsrGriddedCorrectionBounds_tropo_bound_sig :: !Word8 + -- ^ Troposphere Error Bound Standard Deviation (range 0-1.275) + , _msgSsrGriddedCorrectionBounds_n_sats :: !Word8 + -- ^ Number of satellites. + , _msgSsrGriddedCorrectionBounds_stec_sat_list :: ![STECSatElementIntegrity] + -- ^ Array of STEC polynomial coefficients and its bounds for each space + -- vehicle. + } deriving ( Show, Read, Eq ) + +instance Binary MsgSsrGriddedCorrectionBounds where + get = do + _msgSsrGriddedCorrectionBounds_header <- get + _msgSsrGriddedCorrectionBounds_ssr_iod_atmo <- getWord8 + _msgSsrGriddedCorrectionBounds_tile_set_id <- getWord16le + _msgSsrGriddedCorrectionBounds_tile_id <- getWord16le + _msgSsrGriddedCorrectionBounds_tropo_qi <- getWord8 + _msgSsrGriddedCorrectionBounds_grid_point_id <- getWord16le + _msgSsrGriddedCorrectionBounds_tropo_delay_correction <- get + _msgSsrGriddedCorrectionBounds_tropo_bound_mu <- getWord8 + _msgSsrGriddedCorrectionBounds_tropo_bound_sig <- getWord8 + _msgSsrGriddedCorrectionBounds_n_sats <- getWord8 + _msgSsrGriddedCorrectionBounds_stec_sat_list <- whileM (not <$> isEmpty) get + pure MsgSsrGriddedCorrectionBounds {..} + + put MsgSsrGriddedCorrectionBounds {..} = do + put _msgSsrGriddedCorrectionBounds_header + putWord8 _msgSsrGriddedCorrectionBounds_ssr_iod_atmo + putWord16le _msgSsrGriddedCorrectionBounds_tile_set_id + putWord16le _msgSsrGriddedCorrectionBounds_tile_id + putWord8 _msgSsrGriddedCorrectionBounds_tropo_qi + putWord16le _msgSsrGriddedCorrectionBounds_grid_point_id + put _msgSsrGriddedCorrectionBounds_tropo_delay_correction + putWord8 _msgSsrGriddedCorrectionBounds_tropo_bound_mu + putWord8 _msgSsrGriddedCorrectionBounds_tropo_bound_sig + putWord8 _msgSsrGriddedCorrectionBounds_n_sats + mapM_ put _msgSsrGriddedCorrectionBounds_stec_sat_list + +$(makeSBP 'msgSsrGriddedCorrectionBounds ''MsgSsrGriddedCorrectionBounds) +$(makeJSON "_msgSsrGriddedCorrectionBounds_" ''MsgSsrGriddedCorrectionBounds) +$(makeLenses ''MsgSsrGriddedCorrectionBounds) + +msgSsrTileDefinitionDep :: Word16 +msgSsrTileDefinitionDep = 0x05F6 + +-- | SBP class for message MSG_SSR_TILE_DEFINITION_DEP (0x05F6). +-- +-- Provides the correction point coordinates for the atmospheric correction +-- values in the MSG_SSR_STEC_CORRECTION_DEP and MSG_SSR_GRIDDED_CORRECTION +-- messages. +-- +-- Based on ETSI TS 137 355 V16.1.0 (LTE Positioning Protocol) information +-- element GNSS-SSR-CorrectionPoints. SBP only supports gridded arrays of +-- correction points, not lists of points. +data MsgSsrTileDefinitionDep = MsgSsrTileDefinitionDep + { _msgSsrTileDefinitionDep_tile_set_id :: !Word16 + -- ^ Unique identifier of the tile set this tile belongs to. + , _msgSsrTileDefinitionDep_tile_id :: !Word16 + -- ^ Unique identifier of this tile in the tile set. + -- See GNSS-SSR-ArrayOfCorrectionPoints field correctionPointSetID. + , _msgSsrTileDefinitionDep_corner_nw_lat :: !Int16 + -- ^ North-West corner correction point latitude. + -- + -- The relation between the latitude X in the range [-90, 90] and the + -- coded number N is: + -- + -- N = floor((X / 90) * 2^14) + -- + -- See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLatitude. + , _msgSsrTileDefinitionDep_corner_nw_lon :: !Int16 + -- ^ North-West corner correction point longitude. + -- + -- The relation between the longitude X in the range [-180, 180] and the + -- coded number N is: + -- + -- N = floor((X / 180) * 2^15) + -- + -- See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLongitude. + , _msgSsrTileDefinitionDep_spacing_lat :: !Word16 + -- ^ Spacing of the correction points in the latitude direction. + -- + -- See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLatitude. + , _msgSsrTileDefinitionDep_spacing_lon :: !Word16 + -- ^ Spacing of the correction points in the longitude direction. + -- + -- See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLongitude. + , _msgSsrTileDefinitionDep_rows :: !Word16 + -- ^ Number of steps in the latitude direction. + -- + -- See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLatitude. + , _msgSsrTileDefinitionDep_cols :: !Word16 + -- ^ Number of steps in the longitude direction. + -- + -- See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLongitude. + , _msgSsrTileDefinitionDep_bitmask :: !Word64 + -- ^ Specifies the availability of correction data at the correction points + -- in the array. + -- + -- If a specific bit is enabled (set to 1), the correction is not + -- available. Only the first rows * cols bits are used, the remainder are + -- set to 0. If there are more then 64 correction points the remaining + -- corrections are always available. + -- + -- Starting with the northwest corner of the array (top left on a north + -- oriented map) the correction points are enumerated with row precedence + -- - first row west to east, second row west to east, until last row west + -- to east - ending with the southeast corner of the array. + -- + -- See GNSS-SSR-ArrayOfCorrectionPoints field bitmaskOfGrids but note the + -- definition of the bits is inverted. + } deriving ( Show, Read, Eq ) + +instance Binary MsgSsrTileDefinitionDep where + get = do + _msgSsrTileDefinitionDep_tile_set_id <- getWord16le + _msgSsrTileDefinitionDep_tile_id <- getWord16le + _msgSsrTileDefinitionDep_corner_nw_lat <- (fromIntegral <$> getWord16le) + _msgSsrTileDefinitionDep_corner_nw_lon <- (fromIntegral <$> getWord16le) + _msgSsrTileDefinitionDep_spacing_lat <- getWord16le + _msgSsrTileDefinitionDep_spacing_lon <- getWord16le + _msgSsrTileDefinitionDep_rows <- getWord16le + _msgSsrTileDefinitionDep_cols <- getWord16le + _msgSsrTileDefinitionDep_bitmask <- getWord64le + pure MsgSsrTileDefinitionDep {..} + + put MsgSsrTileDefinitionDep {..} = do + putWord16le _msgSsrTileDefinitionDep_tile_set_id + putWord16le _msgSsrTileDefinitionDep_tile_id + (putWord16le . fromIntegral) _msgSsrTileDefinitionDep_corner_nw_lat + (putWord16le . fromIntegral) _msgSsrTileDefinitionDep_corner_nw_lon + putWord16le _msgSsrTileDefinitionDep_spacing_lat + putWord16le _msgSsrTileDefinitionDep_spacing_lon + putWord16le _msgSsrTileDefinitionDep_rows + putWord16le _msgSsrTileDefinitionDep_cols + putWord64le _msgSsrTileDefinitionDep_bitmask + +$(makeSBP 'msgSsrTileDefinitionDep ''MsgSsrTileDefinitionDep) +$(makeJSON "_msgSsrTileDefinitionDep_" ''MsgSsrTileDefinitionDep) +$(makeLenses ''MsgSsrTileDefinitionDep) + msgSsrTileDefinition :: Word16 -msgSsrTileDefinition = 0x05F6 +msgSsrTileDefinition = 0x05F7 --- | SBP class for message MSG_SSR_TILE_DEFINITION (0x05F6). +-- | SBP class for message MSG_SSR_TILE_DEFINITION (0x05F7). -- -- Provides the correction point coordinates for the atmospheric correction -- values in the MSG_SSR_STEC_CORRECTION and MSG_SSR_GRIDDED_CORRECTION @@ -589,7 +859,9 @@ msgSsrTileDefinition = 0x05F6 -- element GNSS-SSR-CorrectionPoints. SBP only supports gridded arrays of -- correction points, not lists of points. data MsgSsrTileDefinition = MsgSsrTileDefinition - { _msgSsrTileDefinition_tile_set_id :: !Word16 + { _msgSsrTileDefinition_ssr_sol_id :: !Word8 + -- ^ SSR Solution ID. + , _msgSsrTileDefinition_tile_set_id :: !Word16 -- ^ Unique identifier of the tile set this tile belongs to. , _msgSsrTileDefinition_tile_id :: !Word16 -- ^ Unique identifier of this tile in the tile set. @@ -648,6 +920,7 @@ data MsgSsrTileDefinition = MsgSsrTileDefinition instance Binary MsgSsrTileDefinition where get = do + _msgSsrTileDefinition_ssr_sol_id <- getWord8 _msgSsrTileDefinition_tile_set_id <- getWord16le _msgSsrTileDefinition_tile_id <- getWord16le _msgSsrTileDefinition_corner_nw_lat <- (fromIntegral <$> getWord16le) @@ -660,6 +933,7 @@ instance Binary MsgSsrTileDefinition where pure MsgSsrTileDefinition {..} put MsgSsrTileDefinition {..} = do + putWord8 _msgSsrTileDefinition_ssr_sol_id putWord16le _msgSsrTileDefinition_tile_set_id putWord16le _msgSsrTileDefinition_tile_id (putWord16le . fromIntegral) _msgSsrTileDefinition_corner_nw_lat @@ -1044,38 +1318,6 @@ $(makeSBP 'msgSsrGridDefinitionDepA ''MsgSsrGridDefinitionDepA) $(makeJSON "_msgSsrGridDefinitionDepA_" ''MsgSsrGridDefinitionDepA) $(makeLenses ''MsgSsrGridDefinitionDepA) -data BoundsHeader = BoundsHeader - { _boundsHeader_time :: !GpsTimeSec - -- ^ GNSS reference time of the bound - , _boundsHeader_num_msgs :: !Word8 - -- ^ Number of messages in the dataset - , _boundsHeader_seq_num :: !Word8 - -- ^ Position of this message in the dataset - , _boundsHeader_update_interval :: !Word8 - -- ^ Update interval between consecutive bounds. Similar to RTCM DF391. - , _boundsHeader_sol_id :: !Word8 - -- ^ SSR Solution ID. - } deriving ( Show, Read, Eq ) - -instance Binary BoundsHeader where - get = do - _boundsHeader_time <- get - _boundsHeader_num_msgs <- getWord8 - _boundsHeader_seq_num <- getWord8 - _boundsHeader_update_interval <- getWord8 - _boundsHeader_sol_id <- getWord8 - pure BoundsHeader {..} - - put BoundsHeader {..} = do - put _boundsHeader_time - putWord8 _boundsHeader_num_msgs - putWord8 _boundsHeader_seq_num - putWord8 _boundsHeader_update_interval - putWord8 _boundsHeader_sol_id - -$(makeJSON "_boundsHeader_" ''BoundsHeader) -$(makeLenses ''BoundsHeader) - -- | OrbitClockBound. -- -- Orbit and clock bound. diff --git a/java/src/com/swiftnav/sbp/client/MessageTable.java b/java/src/com/swiftnav/sbp/client/MessageTable.java index 674e8ef200..f24fa59730 100644 --- a/java/src/com/swiftnav/sbp/client/MessageTable.java +++ b/java/src/com/swiftnav/sbp/client/MessageTable.java @@ -185,6 +185,7 @@ import com.swiftnav.sbp.ssr.MsgSsrCodePhaseBiasesBounds; import com.swiftnav.sbp.ssr.MsgSsrGridDefinitionDepA; import com.swiftnav.sbp.ssr.MsgSsrGriddedCorrection; +import com.swiftnav.sbp.ssr.MsgSsrGriddedCorrectionBounds; import com.swiftnav.sbp.ssr.MsgSsrGriddedCorrectionDepA; import com.swiftnav.sbp.ssr.MsgSsrGriddedCorrectionNoStdDepA; import com.swiftnav.sbp.ssr.MsgSsrOrbitClock; @@ -193,8 +194,10 @@ import com.swiftnav.sbp.ssr.MsgSsrPhaseBiases; import com.swiftnav.sbp.ssr.MsgSsrSatelliteApc; import com.swiftnav.sbp.ssr.MsgSsrStecCorrection; +import com.swiftnav.sbp.ssr.MsgSsrStecCorrectionDep; import com.swiftnav.sbp.ssr.MsgSsrStecCorrectionDepA; import com.swiftnav.sbp.ssr.MsgSsrTileDefinition; +import com.swiftnav.sbp.ssr.MsgSsrTileDefinitionDep; import com.swiftnav.sbp.system.MsgCsacTelemetry; import com.swiftnav.sbp.system.MsgCsacTelemetryLabels; import com.swiftnav.sbp.system.MsgDgnssStatus; @@ -566,10 +569,16 @@ static SBPMessage dispatch(SBPMessage msg) throws SBPBinaryException { return new MsgSsrCodeBiases(msg); case MsgSsrPhaseBiases.TYPE: return new MsgSsrPhaseBiases(msg); + case MsgSsrStecCorrectionDep.TYPE: + return new MsgSsrStecCorrectionDep(msg); case MsgSsrStecCorrection.TYPE: return new MsgSsrStecCorrection(msg); case MsgSsrGriddedCorrection.TYPE: return new MsgSsrGriddedCorrection(msg); + case MsgSsrGriddedCorrectionBounds.TYPE: + return new MsgSsrGriddedCorrectionBounds(msg); + case MsgSsrTileDefinitionDep.TYPE: + return new MsgSsrTileDefinitionDep(msg); case MsgSsrTileDefinition.TYPE: return new MsgSsrTileDefinition(msg); case MsgSsrSatelliteApc.TYPE: diff --git a/java/src/com/swiftnav/sbp/ssr/MsgSsrGriddedCorrectionBounds.java b/java/src/com/swiftnav/sbp/ssr/MsgSsrGriddedCorrectionBounds.java new file mode 100644 index 0000000000..ddcecd3d6f --- /dev/null +++ b/java/src/com/swiftnav/sbp/ssr/MsgSsrGriddedCorrectionBounds.java @@ -0,0 +1,119 @@ +/* Copyright (C) 2015-2022 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ +package com.swiftnav.sbp.ssr; + +// This file was auto-generated from yaml/swiftnav/sbp/ssr.yaml by generate.py. +// Do not modify by hand! + + +import com.swiftnav.sbp.SBPBinaryException; +import com.swiftnav.sbp.SBPMessage; +import com.swiftnav.sbp.SBPStruct; +import com.swiftnav.sbp.gnss.*; +import org.json.JSONObject; + +public class MsgSsrGriddedCorrectionBounds extends SBPMessage { + public static final int TYPE = 0x05FE; + + /** Header of a bounds message. */ + public BoundsHeader header; + + /** IOD of the SSR atmospheric correction. */ + public int ssr_iod_atmo; + + /** Unique identifier of the set this tile belongs to. */ + public int tile_set_id; + + /** Unique identifier of this tile in the tile set. */ + public int tile_id; + + /** Tropo Quality Indicator. Similar to RTCM DF389. */ + public int tropo_qi; + + /** Index of the Grid Point. */ + public int grid_point_id; + + /** Tropospheric delay at grid point. */ + public TroposphericDelayCorrection tropo_delay_correction; + + /** Troposphere Error Bound Mean (range 0-1.275). */ + public int tropo_bound_mu; + + /** Troposphere Error Bound Standard Deviation (range 0-1.275) */ + public int tropo_bound_sig; + + /** Number of satellites. */ + public int n_sats; + + /** Array of STEC polynomial coefficients and its bounds for each space vehicle. */ + public STECSatElementIntegrity[] stec_sat_list; + + public MsgSsrGriddedCorrectionBounds(int sender) { + super(sender, TYPE); + } + + public MsgSsrGriddedCorrectionBounds() { + super(TYPE); + } + + public MsgSsrGriddedCorrectionBounds(SBPMessage msg) throws SBPBinaryException { + super(msg); + assert msg.type == TYPE; + } + + @Override + protected void parse(Parser parser) throws SBPBinaryException { + /* Parse fields from binary */ + header = new BoundsHeader().parse(parser); + ssr_iod_atmo = parser.getU8(); + tile_set_id = parser.getU16(); + tile_id = parser.getU16(); + tropo_qi = parser.getU8(); + grid_point_id = parser.getU16(); + tropo_delay_correction = new TroposphericDelayCorrection().parse(parser); + tropo_bound_mu = parser.getU8(); + tropo_bound_sig = parser.getU8(); + n_sats = parser.getU8(); + stec_sat_list = parser.getArray(STECSatElementIntegrity.class); + } + + @Override + protected void build(Builder builder) { + header.build(builder); + builder.putU8(ssr_iod_atmo); + builder.putU16(tile_set_id); + builder.putU16(tile_id); + builder.putU8(tropo_qi); + builder.putU16(grid_point_id); + tropo_delay_correction.build(builder); + builder.putU8(tropo_bound_mu); + builder.putU8(tropo_bound_sig); + builder.putU8(n_sats); + builder.putArray(stec_sat_list); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + obj.put("header", header.toJSON()); + obj.put("ssr_iod_atmo", ssr_iod_atmo); + obj.put("tile_set_id", tile_set_id); + obj.put("tile_id", tile_id); + obj.put("tropo_qi", tropo_qi); + obj.put("grid_point_id", grid_point_id); + obj.put("tropo_delay_correction", tropo_delay_correction.toJSON()); + obj.put("tropo_bound_mu", tropo_bound_mu); + obj.put("tropo_bound_sig", tropo_bound_sig); + obj.put("n_sats", n_sats); + obj.put("stec_sat_list", SBPStruct.toJSONArray(stec_sat_list)); + return obj; + } +} diff --git a/java/src/com/swiftnav/sbp/ssr/MsgSsrStecCorrection.java b/java/src/com/swiftnav/sbp/ssr/MsgSsrStecCorrection.java index 9ac3d52f62..9f4aed587e 100644 --- a/java/src/com/swiftnav/sbp/ssr/MsgSsrStecCorrection.java +++ b/java/src/com/swiftnav/sbp/ssr/MsgSsrStecCorrection.java @@ -20,23 +20,23 @@ import com.swiftnav.sbp.gnss.*; import org.json.JSONObject; -/** - * SBP class for message MSG_SSR_STEC_CORRECTION (0x05FB). - * - *

You can have MSG_SSR_STEC_CORRECTION inherent its fields directly from an inherited SBP - * object, or construct it inline using a dict of its fields. - * - *

The Slant Total Electron Content per space vehicle, given as polynomial approximation for a - * given tile. This should be combined with the MSG_SSR_GRIDDED_CORRECTION message to get the state - * space representation of the atmospheric delay. - * - *

It is typically equivalent to the QZSS CLAS Sub Type 8 messages. - */ public class MsgSsrStecCorrection extends SBPMessage { - public static final int TYPE = 0x05FB; + public static final int TYPE = 0x05FD; + + /** Header of a STEC correction with bounds message. */ + public BoundsHeader header; + + /** IOD of the SSR atmospheric correction */ + public int ssr_iod_atmo; + + /** Tile set ID */ + public int tile_set_id; + + /** Tile ID */ + public int tile_id; - /** Header of a STEC polynomial coefficient message. */ - public STECHeader header; + /** Number of satellites. */ + public int n_sats; /** Array of STEC polynomial coefficients for each space vehicle. */ public STECSatElement[] stec_sat_list; @@ -57,13 +57,21 @@ public MsgSsrStecCorrection(SBPMessage msg) throws SBPBinaryException { @Override protected void parse(Parser parser) throws SBPBinaryException { /* Parse fields from binary */ - header = new STECHeader().parse(parser); + header = new BoundsHeader().parse(parser); + ssr_iod_atmo = parser.getU8(); + tile_set_id = parser.getU16(); + tile_id = parser.getU16(); + n_sats = parser.getU8(); stec_sat_list = parser.getArray(STECSatElement.class); } @Override protected void build(Builder builder) { header.build(builder); + builder.putU8(ssr_iod_atmo); + builder.putU16(tile_set_id); + builder.putU16(tile_id); + builder.putU8(n_sats); builder.putArray(stec_sat_list); } @@ -71,6 +79,10 @@ protected void build(Builder builder) { public JSONObject toJSON() { JSONObject obj = super.toJSON(); obj.put("header", header.toJSON()); + obj.put("ssr_iod_atmo", ssr_iod_atmo); + obj.put("tile_set_id", tile_set_id); + obj.put("tile_id", tile_id); + obj.put("n_sats", n_sats); obj.put("stec_sat_list", SBPStruct.toJSONArray(stec_sat_list)); return obj; } diff --git a/java/src/com/swiftnav/sbp/ssr/MsgSsrStecCorrectionDep.java b/java/src/com/swiftnav/sbp/ssr/MsgSsrStecCorrectionDep.java new file mode 100644 index 0000000000..db9b661bd4 --- /dev/null +++ b/java/src/com/swiftnav/sbp/ssr/MsgSsrStecCorrectionDep.java @@ -0,0 +1,77 @@ +/* Copyright (C) 2015-2022 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ +package com.swiftnav.sbp.ssr; + +// This file was auto-generated from yaml/swiftnav/sbp/ssr.yaml by generate.py. +// Do not modify by hand! + + +import com.swiftnav.sbp.SBPBinaryException; +import com.swiftnav.sbp.SBPMessage; +import com.swiftnav.sbp.SBPStruct; +import com.swiftnav.sbp.gnss.*; +import org.json.JSONObject; + +/** + * SBP class for message MSG_SSR_STEC_CORRECTION_DEP (0x05FB). + * + *

You can have MSG_SSR_STEC_CORRECTION_DEP inherent its fields directly from an inherited SBP + * object, or construct it inline using a dict of its fields. + * + *

The Slant Total Electron Content per space vehicle, given as polynomial approximation for a + * given tile. This should be combined with the MSG_SSR_GRIDDED_CORRECTION message to get the state + * space representation of the atmospheric delay. + * + *

It is typically equivalent to the QZSS CLAS Sub Type 8 messages. + */ +public class MsgSsrStecCorrectionDep extends SBPMessage { + public static final int TYPE = 0x05FB; + + /** Header of a STEC polynomial coefficient message. */ + public STECHeader header; + + /** Array of STEC polynomial coefficients for each space vehicle. */ + public STECSatElement[] stec_sat_list; + + public MsgSsrStecCorrectionDep(int sender) { + super(sender, TYPE); + } + + public MsgSsrStecCorrectionDep() { + super(TYPE); + } + + public MsgSsrStecCorrectionDep(SBPMessage msg) throws SBPBinaryException { + super(msg); + assert msg.type == TYPE; + } + + @Override + protected void parse(Parser parser) throws SBPBinaryException { + /* Parse fields from binary */ + header = new STECHeader().parse(parser); + stec_sat_list = parser.getArray(STECSatElement.class); + } + + @Override + protected void build(Builder builder) { + header.build(builder); + builder.putArray(stec_sat_list); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + obj.put("header", header.toJSON()); + obj.put("stec_sat_list", SBPStruct.toJSONArray(stec_sat_list)); + return obj; + } +} diff --git a/java/src/com/swiftnav/sbp/ssr/MsgSsrTileDefinition.java b/java/src/com/swiftnav/sbp/ssr/MsgSsrTileDefinition.java index 839c2d40a8..cb2918f393 100644 --- a/java/src/com/swiftnav/sbp/ssr/MsgSsrTileDefinition.java +++ b/java/src/com/swiftnav/sbp/ssr/MsgSsrTileDefinition.java @@ -21,7 +21,7 @@ import org.json.JSONObject; /** - * SBP class for message MSG_SSR_TILE_DEFINITION (0x05F6). + * SBP class for message MSG_SSR_TILE_DEFINITION (0x05F7). * *

You can have MSG_SSR_TILE_DEFINITION inherent its fields directly from an inherited SBP * object, or construct it inline using a dict of its fields. @@ -34,7 +34,10 @@ * points. */ public class MsgSsrTileDefinition extends SBPMessage { - public static final int TYPE = 0x05F6; + public static final int TYPE = 0x05F7; + + /** SSR Solution ID. */ + public int ssr_sol_id; /** Unique identifier of the tile set this tile belongs to. */ public int tile_set_id; @@ -127,6 +130,7 @@ public MsgSsrTileDefinition(SBPMessage msg) throws SBPBinaryException { @Override protected void parse(Parser parser) throws SBPBinaryException { /* Parse fields from binary */ + ssr_sol_id = parser.getU8(); tile_set_id = parser.getU16(); tile_id = parser.getU16(); corner_nw_lat = parser.getS16(); @@ -140,6 +144,7 @@ protected void parse(Parser parser) throws SBPBinaryException { @Override protected void build(Builder builder) { + builder.putU8(ssr_sol_id); builder.putU16(tile_set_id); builder.putU16(tile_id); builder.putS16(corner_nw_lat); @@ -154,6 +159,7 @@ protected void build(Builder builder) { @Override public JSONObject toJSON() { JSONObject obj = super.toJSON(); + obj.put("ssr_sol_id", ssr_sol_id); obj.put("tile_set_id", tile_set_id); obj.put("tile_id", tile_id); obj.put("corner_nw_lat", corner_nw_lat); diff --git a/java/src/com/swiftnav/sbp/ssr/MsgSsrTileDefinitionDep.java b/java/src/com/swiftnav/sbp/ssr/MsgSsrTileDefinitionDep.java new file mode 100644 index 0000000000..0d2c14c5b8 --- /dev/null +++ b/java/src/com/swiftnav/sbp/ssr/MsgSsrTileDefinitionDep.java @@ -0,0 +1,168 @@ +/* Copyright (C) 2015-2022 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ +package com.swiftnav.sbp.ssr; + +// This file was auto-generated from yaml/swiftnav/sbp/ssr.yaml by generate.py. +// Do not modify by hand! + + +import com.swiftnav.sbp.SBPBinaryException; +import com.swiftnav.sbp.SBPMessage; +import com.swiftnav.sbp.gnss.*; +import java.math.BigInteger; +import org.json.JSONObject; + +/** + * SBP class for message MSG_SSR_TILE_DEFINITION_DEP (0x05F6). + * + *

You can have MSG_SSR_TILE_DEFINITION_DEP inherent its fields directly from an inherited SBP + * object, or construct it inline using a dict of its fields. + * + *

Provides the correction point coordinates for the atmospheric correction values in the + * MSG_SSR_STEC_CORRECTION_DEP and MSG_SSR_GRIDDED_CORRECTION messages. + * + *

Based on ETSI TS 137 355 V16.1.0 (LTE Positioning Protocol) information element + * GNSS-SSR-CorrectionPoints. SBP only supports gridded arrays of correction points, not lists of + * points. + */ +public class MsgSsrTileDefinitionDep extends SBPMessage { + public static final int TYPE = 0x05F6; + + /** Unique identifier of the tile set this tile belongs to. */ + public int tile_set_id; + + /** + * Unique identifier of this tile in the tile set. See GNSS-SSR-ArrayOfCorrectionPoints field + * correctionPointSetID. + */ + public int tile_id; + + /** + * North-West corner correction point latitude. + * + *

The relation between the latitude X in the range [-90, 90] and the coded number N is: + * + *

N = floor((X / 90) * 2^14) + * + *

See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLatitude. + */ + public int corner_nw_lat; + + /** + * North-West corner correction point longitude. + * + *

The relation between the longitude X in the range [-180, 180] and the coded number N is: + * + *

N = floor((X / 180) * 2^15) + * + *

See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLongitude. + */ + public int corner_nw_lon; + + /** + * Spacing of the correction points in the latitude direction. + * + *

See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLatitude. + */ + public int spacing_lat; + + /** + * Spacing of the correction points in the longitude direction. + * + *

See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLongitude. + */ + public int spacing_lon; + + /** + * Number of steps in the latitude direction. + * + *

See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLatitude. + */ + public int rows; + + /** + * Number of steps in the longitude direction. + * + *

See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLongitude. + */ + public int cols; + + /** + * Specifies the availability of correction data at the correction points in the array. + * + *

If a specific bit is enabled (set to 1), the correction is not available. Only the first + * rows * cols bits are used, the remainder are set to 0. If there are more then 64 correction + * points the remaining corrections are always available. + * + *

Starting with the northwest corner of the array (top left on a north oriented map) the + * correction points are enumerated with row precedence - first row west to east, second row + * west to east, until last row west to east - ending with the southeast corner of the array. + * + *

See GNSS-SSR-ArrayOfCorrectionPoints field bitmaskOfGrids but note the definition of the + * bits is inverted. + */ + public BigInteger bitmask; + + public MsgSsrTileDefinitionDep(int sender) { + super(sender, TYPE); + } + + public MsgSsrTileDefinitionDep() { + super(TYPE); + } + + public MsgSsrTileDefinitionDep(SBPMessage msg) throws SBPBinaryException { + super(msg); + assert msg.type == TYPE; + } + + @Override + protected void parse(Parser parser) throws SBPBinaryException { + /* Parse fields from binary */ + tile_set_id = parser.getU16(); + tile_id = parser.getU16(); + corner_nw_lat = parser.getS16(); + corner_nw_lon = parser.getS16(); + spacing_lat = parser.getU16(); + spacing_lon = parser.getU16(); + rows = parser.getU16(); + cols = parser.getU16(); + bitmask = parser.getU64(); + } + + @Override + protected void build(Builder builder) { + builder.putU16(tile_set_id); + builder.putU16(tile_id); + builder.putS16(corner_nw_lat); + builder.putS16(corner_nw_lon); + builder.putU16(spacing_lat); + builder.putU16(spacing_lon); + builder.putU16(rows); + builder.putU16(cols); + builder.putU64(bitmask); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + obj.put("tile_set_id", tile_set_id); + obj.put("tile_id", tile_id); + obj.put("corner_nw_lat", corner_nw_lat); + obj.put("corner_nw_lon", corner_nw_lon); + obj.put("spacing_lat", spacing_lat); + obj.put("spacing_lon", spacing_lon); + obj.put("rows", rows); + obj.put("cols", cols); + obj.put("bitmask", bitmask); + return obj; + } +} diff --git a/java/src/com/swiftnav/sbp/ssr/STECSatElementIntegrity.java b/java/src/com/swiftnav/sbp/ssr/STECSatElementIntegrity.java new file mode 100644 index 0000000000..5c2459dec4 --- /dev/null +++ b/java/src/com/swiftnav/sbp/ssr/STECSatElementIntegrity.java @@ -0,0 +1,81 @@ +/* Copyright (C) 2015-2022 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ +package com.swiftnav.sbp.ssr; + +// This file was auto-generated from yaml/swiftnav/sbp/ssr.yaml by generate.py. +// Do not modify by hand! + + +import com.swiftnav.sbp.SBPBinaryException; +import com.swiftnav.sbp.SBPMessage; +import com.swiftnav.sbp.SBPStruct; +import com.swiftnav.sbp.gnss.*; +import org.json.JSONObject; + +public class STECSatElementIntegrity extends SBPStruct { + + /** STEC residuals (mean, stddev) */ + public STECResidual stec_residual; + + /** + * STEC Error Bound Mean (range 0-17.5) i<= 200, mean = 0.01i 200230, mean=5+0.5(i-230) + */ + public int stec_bound_mu; + + /** + * STEC Error Bound Standard Deviation (range 0-17.5) i<= 200, mean = 0.01i 200230, mean=5+0.5(i-230) + */ + public int stec_bound_sig; + + /** STEC Error Bound Mean First derivative degradation parameter(range 0-0.01275) */ + public int stec_bound_mu_dot; + + /** + * STEC Error Bound Standard Deviation First derivative degradation parameter (range 0-0.01275) + */ + public int stec_bound_sig_dot; + + public STECSatElementIntegrity() {} + + @Override + public STECSatElementIntegrity parse(SBPMessage.Parser parser) throws SBPBinaryException { + /* Parse fields from binary */ + stec_residual = new STECResidual().parse(parser); + stec_bound_mu = parser.getU8(); + stec_bound_sig = parser.getU8(); + stec_bound_mu_dot = parser.getU8(); + stec_bound_sig_dot = parser.getU8(); + return this; + } + + @Override + public void build(SBPMessage.Builder builder) { + /* Build fields into binary */ + stec_residual.build(builder); + builder.putU8(stec_bound_mu); + builder.putU8(stec_bound_sig); + builder.putU8(stec_bound_mu_dot); + builder.putU8(stec_bound_sig_dot); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("stec_residual", stec_residual.toJSON()); + obj.put("stec_bound_mu", stec_bound_mu); + obj.put("stec_bound_sig", stec_bound_sig); + obj.put("stec_bound_mu_dot", stec_bound_mu_dot); + obj.put("stec_bound_sig_dot", stec_bound_sig_dot); + return obj; + } +} diff --git a/java/test/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBoundsTest.java b/java/test/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBoundsTest.java new file mode 100644 index 0000000000..e24006418d --- /dev/null +++ b/java/test/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBoundsTest.java @@ -0,0 +1,386 @@ +/* Copyright (C) 2015-2022 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ +package com.swiftnav.sbp.test; + +// This file was auto-generated from +// spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml by generate.py. Do not +// modify by hand! + + +import com.swiftnav.sbp.SBPMessage; +import com.swiftnav.sbp.ssr.MsgSsrGriddedCorrectionBounds; +import java.math.BigInteger; +import org.json.JSONObject; +import org.junit.Test; + +public class auto_check_sbp_ssr_MsgSsrGriddedCorrectionBoundsTest { + + public static boolean debug = false; + private static final double DELTA = 1e-15; + + @Test + public void test1() throws Throwable { + if (debug) + System.out.format( + "%n%s%n", "auto_check_sbp_ssr_MsgSsrGriddedCorrectionBoundsTest.test1"); + byte[] payload = + new byte[] { + (byte) 180, (byte) 0, (byte) 0, (byte) 0, (byte) 3, (byte) 0, (byte) 1, + (byte) 1, (byte) 10, (byte) 0, (byte) 15, (byte) 1, (byte) 0, (byte) 10, + (byte) 0, (byte) 39, (byte) 232, (byte) 3, (byte) 244, (byte) 1, (byte) 100, + (byte) 200, (byte) 150, (byte) 100, (byte) 2, (byte) 5, (byte) 10, (byte) 16, + (byte) 0, (byte) 17, (byte) 18, (byte) 19, (byte) 20, (byte) 21, (byte) 6, + (byte) 10, (byte) 22, (byte) 0, (byte) 23, (byte) 24, (byte) 25, (byte) 26, + (byte) 27, + }; + SBPMessage sbp = new SBPMessage(0x0042, 0x05FE, payload); + MsgSsrGriddedCorrectionBounds msg = new MsgSsrGriddedCorrectionBounds(sbp); + JSONObject json = msg.toJSON(); + Number value; + Number expected; + value = msg.grid_point_id; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.grid_point_id + "' != '" + 1000 + "'", + value.equals(BigInteger.valueOf(1000L))); + } else { + value = value.longValue(); + expected = 1000L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.header.num_msgs; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.header.num_msgs + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); + } else { + value = value.longValue(); + expected = 1L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.header.seq_num; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.header.seq_num + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); + } else { + value = value.longValue(); + expected = 1L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.header.sol_id; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.header.sol_id + "' != '" + 0 + "'", + value.equals(BigInteger.valueOf(0L))); + } else { + value = value.longValue(); + expected = 0L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.header.time.tow; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.header.time.tow + "' != '" + 180 + "'", + value.equals(BigInteger.valueOf(180L))); + } else { + value = value.longValue(); + expected = 180L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.header.time.wn; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.header.time.wn + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); + } else { + value = value.longValue(); + expected = 3L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.header.update_interval; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.header.update_interval + "' != '" + 10 + "'", + value.equals(BigInteger.valueOf(10L))); + } else { + value = value.longValue(); + expected = 10L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.n_sats; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.n_sats + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + } else { + value = value.longValue(); + expected = 2L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.ssr_iod_atmo; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.ssr_iod_atmo + "' != '" + 15 + "'", + value.equals(BigInteger.valueOf(15L))); + } else { + value = value.longValue(); + expected = 15L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[0].stec_bound_mu; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[0].stec_bound_mu + "' != '" + 18 + "'", + value.equals(BigInteger.valueOf(18L))); + } else { + value = value.longValue(); + expected = 18L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[0].stec_bound_mu_dot; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[0].stec_bound_mu_dot + "' != '" + 20 + "'", + value.equals(BigInteger.valueOf(20L))); + } else { + value = value.longValue(); + expected = 20L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[0].stec_bound_sig; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[0].stec_bound_sig + "' != '" + 19 + "'", + value.equals(BigInteger.valueOf(19L))); + } else { + value = value.longValue(); + expected = 19L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[0].stec_bound_sig_dot; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[0].stec_bound_sig_dot + "' != '" + 21 + "'", + value.equals(BigInteger.valueOf(21L))); + } else { + value = value.longValue(); + expected = 21L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[0].stec_residual.residual; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[0].stec_residual.residual + "' != '" + 16 + "'", + value.equals(BigInteger.valueOf(16L))); + } else { + value = value.longValue(); + expected = 16L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[0].stec_residual.stddev; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[0].stec_residual.stddev + "' != '" + 17 + "'", + value.equals(BigInteger.valueOf(17L))); + } else { + value = value.longValue(); + expected = 17L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[0].stec_residual.sv_id.constellation; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + + msg.stec_sat_list[0].stec_residual.sv_id.constellation + + "' != '" + + 10 + + "'", + value.equals(BigInteger.valueOf(10L))); + } else { + value = value.longValue(); + expected = 10L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[0].stec_residual.sv_id.satId; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[0].stec_residual.sv_id.satId + "' != '" + 5 + "'", + value.equals(BigInteger.valueOf(5L))); + } else { + value = value.longValue(); + expected = 5L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[1].stec_bound_mu; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[1].stec_bound_mu + "' != '" + 24 + "'", + value.equals(BigInteger.valueOf(24L))); + } else { + value = value.longValue(); + expected = 24L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[1].stec_bound_mu_dot; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[1].stec_bound_mu_dot + "' != '" + 26 + "'", + value.equals(BigInteger.valueOf(26L))); + } else { + value = value.longValue(); + expected = 26L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[1].stec_bound_sig; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[1].stec_bound_sig + "' != '" + 25 + "'", + value.equals(BigInteger.valueOf(25L))); + } else { + value = value.longValue(); + expected = 25L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[1].stec_bound_sig_dot; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[1].stec_bound_sig_dot + "' != '" + 27 + "'", + value.equals(BigInteger.valueOf(27L))); + } else { + value = value.longValue(); + expected = 27L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[1].stec_residual.residual; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[1].stec_residual.residual + "' != '" + 22 + "'", + value.equals(BigInteger.valueOf(22L))); + } else { + value = value.longValue(); + expected = 22L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[1].stec_residual.stddev; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[1].stec_residual.stddev + "' != '" + 23 + "'", + value.equals(BigInteger.valueOf(23L))); + } else { + value = value.longValue(); + expected = 23L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[1].stec_residual.sv_id.constellation; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + + msg.stec_sat_list[1].stec_residual.sv_id.constellation + + "' != '" + + 10 + + "'", + value.equals(BigInteger.valueOf(10L))); + } else { + value = value.longValue(); + expected = 10L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[1].stec_residual.sv_id.satId; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[1].stec_residual.sv_id.satId + "' != '" + 6 + "'", + value.equals(BigInteger.valueOf(6L))); + } else { + value = value.longValue(); + expected = 6L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.tile_id; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.tile_id + "' != '" + 10 + "'", value.equals(BigInteger.valueOf(10L))); + } else { + value = value.longValue(); + expected = 10L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.tile_set_id; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.tile_set_id + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); + } else { + value = value.longValue(); + expected = 1L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.tropo_bound_mu; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.tropo_bound_mu + "' != '" + 150 + "'", + value.equals(BigInteger.valueOf(150L))); + } else { + value = value.longValue(); + expected = 150L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.tropo_bound_sig; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.tropo_bound_sig + "' != '" + 100 + "'", + value.equals(BigInteger.valueOf(100L))); + } else { + value = value.longValue(); + expected = 100L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.tropo_delay_correction.hydro; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.tropo_delay_correction.hydro + "' != '" + 500 + "'", + value.equals(BigInteger.valueOf(500L))); + } else { + value = value.longValue(); + expected = 500L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.tropo_delay_correction.stddev; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.tropo_delay_correction.stddev + "' != '" + 200 + "'", + value.equals(BigInteger.valueOf(200L))); + } else { + value = value.longValue(); + expected = 200L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.tropo_delay_correction.wet; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.tropo_delay_correction.wet + "' != '" + 100 + "'", + value.equals(BigInteger.valueOf(100L))); + } else { + value = value.longValue(); + expected = 100L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.tropo_qi; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.tropo_qi + "' != '" + 39 + "'", + value.equals(BigInteger.valueOf(39L))); + } else { + value = value.longValue(); + expected = 39L; + org.junit.Assert.assertEquals(value, expected); + } + } +} diff --git a/java/test/auto_check_sbp_ssr_MsgSsrStecCorrectionTest.java b/java/test/auto_check_sbp_ssr_MsgSsrStecCorrectionTest.java new file mode 100644 index 0000000000..cfd173ce1a --- /dev/null +++ b/java/test/auto_check_sbp_ssr_MsgSsrStecCorrectionTest.java @@ -0,0 +1,284 @@ +/* Copyright (C) 2015-2022 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ +package com.swiftnav.sbp.test; + +// This file was auto-generated from spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrection.yaml +// by generate.py. Do not modify by hand! + + +import com.swiftnav.sbp.SBPMessage; +import com.swiftnav.sbp.ssr.MsgSsrStecCorrection; +import java.math.BigInteger; +import org.json.JSONObject; +import org.junit.Test; + +public class auto_check_sbp_ssr_MsgSsrStecCorrectionTest { + + public static boolean debug = false; + private static final double DELTA = 1e-15; + + @Test + public void test1() throws Throwable { + if (debug) System.out.format("%n%s%n", "auto_check_sbp_ssr_MsgSsrStecCorrectionTest.test1"); + byte[] payload = + new byte[] { + (byte) 180, (byte) 0, (byte) 0, (byte) 0, (byte) 3, (byte) 0, (byte) 1, + (byte) 1, (byte) 10, (byte) 0, (byte) 15, (byte) 1, (byte) 0, (byte) 10, + (byte) 0, (byte) 2, (byte) 1, (byte) 1, (byte) 1, (byte) 63, (byte) 0, + (byte) 62, (byte) 0, (byte) 61, (byte) 0, (byte) 60, (byte) 0, (byte) 31, + (byte) 15, (byte) 5, (byte) 63, (byte) 0, (byte) 64, (byte) 0, (byte) 65, + (byte) 0, (byte) 66, (byte) 0, + }; + SBPMessage sbp = new SBPMessage(0x0042, 0x05FD, payload); + MsgSsrStecCorrection msg = new MsgSsrStecCorrection(sbp); + JSONObject json = msg.toJSON(); + Number value; + Number expected; + value = msg.header.num_msgs; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.header.num_msgs + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); + } else { + value = value.longValue(); + expected = 1L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.header.seq_num; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.header.seq_num + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); + } else { + value = value.longValue(); + expected = 1L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.header.sol_id; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.header.sol_id + "' != '" + 0 + "'", + value.equals(BigInteger.valueOf(0L))); + } else { + value = value.longValue(); + expected = 0L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.header.time.tow; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.header.time.tow + "' != '" + 180 + "'", + value.equals(BigInteger.valueOf(180L))); + } else { + value = value.longValue(); + expected = 180L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.header.time.wn; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.header.time.wn + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); + } else { + value = value.longValue(); + expected = 3L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.header.update_interval; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.header.update_interval + "' != '" + 10 + "'", + value.equals(BigInteger.valueOf(10L))); + } else { + value = value.longValue(); + expected = 10L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.n_sats; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.n_sats + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + } else { + value = value.longValue(); + expected = 2L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.ssr_iod_atmo; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.ssr_iod_atmo + "' != '" + 15 + "'", + value.equals(BigInteger.valueOf(15L))); + } else { + value = value.longValue(); + expected = 15L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[0].stec_coeff[0]; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[0].stec_coeff[0] + "' != '" + 63 + "'", + value.equals(BigInteger.valueOf(63L))); + } else { + value = value.longValue(); + expected = 63L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[0].stec_coeff[1]; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[0].stec_coeff[1] + "' != '" + 62 + "'", + value.equals(BigInteger.valueOf(62L))); + } else { + value = value.longValue(); + expected = 62L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[0].stec_coeff[2]; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[0].stec_coeff[2] + "' != '" + 61 + "'", + value.equals(BigInteger.valueOf(61L))); + } else { + value = value.longValue(); + expected = 61L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[0].stec_coeff[3]; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[0].stec_coeff[3] + "' != '" + 60 + "'", + value.equals(BigInteger.valueOf(60L))); + } else { + value = value.longValue(); + expected = 60L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[0].stec_quality_indicator; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[0].stec_quality_indicator + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); + } else { + value = value.longValue(); + expected = 1L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[0].sv_id.constellation; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[0].sv_id.constellation + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); + } else { + value = value.longValue(); + expected = 1L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[0].sv_id.satId; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[0].sv_id.satId + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); + } else { + value = value.longValue(); + expected = 1L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[1].stec_coeff[0]; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[1].stec_coeff[0] + "' != '" + 63 + "'", + value.equals(BigInteger.valueOf(63L))); + } else { + value = value.longValue(); + expected = 63L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[1].stec_coeff[1]; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[1].stec_coeff[1] + "' != '" + 64 + "'", + value.equals(BigInteger.valueOf(64L))); + } else { + value = value.longValue(); + expected = 64L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[1].stec_coeff[2]; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[1].stec_coeff[2] + "' != '" + 65 + "'", + value.equals(BigInteger.valueOf(65L))); + } else { + value = value.longValue(); + expected = 65L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[1].stec_coeff[3]; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[1].stec_coeff[3] + "' != '" + 66 + "'", + value.equals(BigInteger.valueOf(66L))); + } else { + value = value.longValue(); + expected = 66L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[1].stec_quality_indicator; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[1].stec_quality_indicator + "' != '" + 5 + "'", + value.equals(BigInteger.valueOf(5L))); + } else { + value = value.longValue(); + expected = 5L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[1].sv_id.constellation; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[1].sv_id.constellation + "' != '" + 15 + "'", + value.equals(BigInteger.valueOf(15L))); + } else { + value = value.longValue(); + expected = 15L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.stec_sat_list[1].sv_id.satId; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.stec_sat_list[1].sv_id.satId + "' != '" + 31 + "'", + value.equals(BigInteger.valueOf(31L))); + } else { + value = value.longValue(); + expected = 31L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.tile_id; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.tile_id + "' != '" + 10 + "'", value.equals(BigInteger.valueOf(10L))); + } else { + value = value.longValue(); + expected = 10L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.tile_set_id; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.tile_set_id + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); + } else { + value = value.longValue(); + expected = 1L; + org.junit.Assert.assertEquals(value, expected); + } + } +} diff --git a/java/test/auto_check_sbp_ssr_MsgSsrTileDefinitionTest.java b/java/test/auto_check_sbp_ssr_MsgSsrTileDefinitionTest.java new file mode 100644 index 0000000000..3f5753b7a8 --- /dev/null +++ b/java/test/auto_check_sbp_ssr_MsgSsrTileDefinitionTest.java @@ -0,0 +1,165 @@ +/* Copyright (C) 2015-2022 Swift Navigation Inc. + * Contact: https://support.swiftnav.com + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ +package com.swiftnav.sbp.test; + +// This file was auto-generated from spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinition.yaml +// by generate.py. Do not modify by hand! + + +import com.swiftnav.sbp.SBPMessage; +import com.swiftnav.sbp.ssr.MsgSsrTileDefinition; +import java.math.BigInteger; +import org.json.JSONObject; +import org.junit.Test; + +public class auto_check_sbp_ssr_MsgSsrTileDefinitionTest { + + public static boolean debug = false; + private static final double DELTA = 1e-15; + + @Test + public void test1() throws Throwable { + if (debug) System.out.format("%n%s%n", "auto_check_sbp_ssr_MsgSsrTileDefinitionTest.test1"); + byte[] payload = + new byte[] { + (byte) 31, + (byte) 0, + (byte) 1, + (byte) 0, + (byte) 2, + (byte) 0, + (byte) 4, + (byte) 0, + (byte) 8, + (byte) 0, + (byte) 16, + (byte) 0, + (byte) 32, + (byte) 0, + (byte) 64, + (byte) 0, + (byte) 128, + (byte) 210, + (byte) 2, + (byte) 150, + (byte) 73, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + }; + SBPMessage sbp = new SBPMessage(0x0042, 0x05F7, payload); + MsgSsrTileDefinition msg = new MsgSsrTileDefinition(sbp); + JSONObject json = msg.toJSON(); + Number value; + Number expected; + value = msg.bitmask; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.bitmask + "' != '" + 1234567890 + "'", + value.equals(BigInteger.valueOf(1234567890L))); + } else { + value = value.longValue(); + expected = 1234567890L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.cols; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.cols + "' != '" + 32768 + "'", + value.equals(BigInteger.valueOf(32768L))); + } else { + value = value.longValue(); + expected = 32768L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.corner_nw_lat; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.corner_nw_lat + "' != '" + 1024 + "'", + value.equals(BigInteger.valueOf(1024L))); + } else { + value = value.longValue(); + expected = 1024L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.corner_nw_lon; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.corner_nw_lon + "' != '" + 2048 + "'", + value.equals(BigInteger.valueOf(2048L))); + } else { + value = value.longValue(); + expected = 2048L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.rows; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.rows + "' != '" + 16384 + "'", + value.equals(BigInteger.valueOf(16384L))); + } else { + value = value.longValue(); + expected = 16384L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.spacing_lat; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.spacing_lat + "' != '" + 4096 + "'", + value.equals(BigInteger.valueOf(4096L))); + } else { + value = value.longValue(); + expected = 4096L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.spacing_lon; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.spacing_lon + "' != '" + 8192 + "'", + value.equals(BigInteger.valueOf(8192L))); + } else { + value = value.longValue(); + expected = 8192L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.ssr_sol_id; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.ssr_sol_id + "' != '" + 31 + "'", + value.equals(BigInteger.valueOf(31L))); + } else { + value = value.longValue(); + expected = 31L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.tile_id; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.tile_id + "' != '" + 512 + "'", + value.equals(BigInteger.valueOf(512L))); + } else { + value = value.longValue(); + expected = 512L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.tile_set_id; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.tile_set_id + "' != '" + 256 + "'", + value.equals(BigInteger.valueOf(256L))); + } else { + value = value.longValue(); + expected = 256L; + org.junit.Assert.assertEquals(value, expected); + } + } +} diff --git a/javascript/sbp.bundle.js b/javascript/sbp.bundle.js index 10a20627bd..8ee34d98e1 100644 --- a/javascript/sbp.bundle.js +++ b/javascript/sbp.bundle.js @@ -12,4 +12,4 @@ var p=r(25),o=r(26),i=r(16);function s(){return a.TYPED_ARRAY_SUPPORT?2147483647 * @author Feross Aboukhadijeh * @license MIT */ -function p(e,t){if(e===t)return 0;for(var r=e.length,p=t.length,o=0,i=Math.min(r,p);o=0;l--)if(c[l]!==u[l])return!1;for(l=c.length-1;l>=0;l--)if(a=c[l],!g(e[a],t[a],r,p))return!1;return!0}(e,t,r,s))}return r?e===t:e==t}function w(e){return"[object Arguments]"==Object.prototype.toString.call(e)}function E(e,t){if(!e||!t)return!1;if("[object RegExp]"==Object.prototype.toString.call(t))return t.test(e);try{if(e instanceof t)return!0}catch(e){}return!Error.isPrototypeOf(t)&&!0===t.call({},e)}function m(e,t,r,p){var o;if("function"!=typeof t)throw new TypeError('"block" argument must be a function');"string"==typeof r&&(p=r,r=null),o=function(e){var t;try{e()}catch(e){t=e}return t}(t),p=(r&&r.name?" ("+r.name+").":".")+(p?" "+p:"."),e&&!o&&_(o,r,"Missing expected exception"+p);var s="string"==typeof p,n=!e&&o&&!r;if((!e&&i.isError(o)&&s&&E(o,r)||n)&&_(o,r,"Got unwanted exception"+p),e&&o&&r&&!E(o,r)||!e&&o)throw o}u.AssertionError=function(e){this.name="AssertionError",this.actual=e.actual,this.expected=e.expected,this.operator=e.operator,e.message?(this.message=e.message,this.generatedMessage=!1):(this.message=function(e){return f(d(e.actual),128)+" "+e.operator+" "+f(d(e.expected),128)}(this),this.generatedMessage=!0);var t=e.stackStartFunction||_;if(Error.captureStackTrace)Error.captureStackTrace(this,t);else{var r=new Error;if(r.stack){var p=r.stack,o=h(t),i=p.indexOf("\n"+o);if(i>=0){var s=p.indexOf("\n",i+1);p=p.substring(s+1)}this.stack=p}}},i.inherits(u.AssertionError,Error),u.fail=_,u.ok=S,u.equal=function(e,t,r){e!=t&&_(e,t,r,"==",u.equal)},u.notEqual=function(e,t,r){e==t&&_(e,t,r,"!=",u.notEqual)},u.deepEqual=function(e,t,r){g(e,t,!1)||_(e,t,r,"deepEqual",u.deepEqual)},u.deepStrictEqual=function(e,t,r){g(e,t,!0)||_(e,t,r,"deepStrictEqual",u.deepStrictEqual)},u.notDeepEqual=function(e,t,r){g(e,t,!1)&&_(e,t,r,"notDeepEqual",u.notDeepEqual)},u.notDeepStrictEqual=function e(t,r,p){g(t,r,!0)&&_(t,r,p,"notDeepStrictEqual",e)},u.strictEqual=function(e,t,r){e!==t&&_(e,t,r,"===",u.strictEqual)},u.notStrictEqual=function(e,t,r){e===t&&_(e,t,r,"!==",u.notStrictEqual)},u.throws=function(e,t,r){m(!0,e,t,r)},u.doesNotThrow=function(e,t,r){m(!1,e,t,r)},u.ifError=function(e){if(e)throw e};var b=Object.keys||function(e){var t=[];for(var r in e)s.call(e,r)&&t.push(r);return t}}).call(this,r(5))},function(e,t,r){var p;!function(r){o(Math.pow(36,5)),o(Math.pow(16,7)),o(Math.pow(10,9)),o(Math.pow(2,30)),o(36),o(16),o(10),o(2);function o(e,t){return this instanceof o?(this._low=0,this._high=0,this.remainder=null,void 0===t?s.call(this,e):"string"==typeof e?n.call(this,e,t):void i.call(this,e,t)):new o(e,t)}function i(e,t){return this._low=0|e,this._high=0|t,this}function s(e){return this._low=65535&e,this._high=e>>>16,this}function n(e,t){var r=parseInt(e,t||10);return this._low=65535&r,this._high=r>>>16,this}o.prototype.fromBits=i,o.prototype.fromNumber=s,o.prototype.fromString=n,o.prototype.toNumber=function(){return 65536*this._high+this._low},o.prototype.toString=function(e){return this.toNumber().toString(e||10)},o.prototype.add=function(e){var t=this._low+e._low,r=t>>>16;return r+=this._high+e._high,this._low=65535&t,this._high=65535&r,this},o.prototype.subtract=function(e){return this.add(e.clone().negate())},o.prototype.multiply=function(e){var t,r,p=this._high,o=this._low,i=e._high,s=e._low;return t=(r=o*s)>>>16,t+=p*s,t&=65535,t+=o*i,this._low=65535&r,this._high=65535&t,this},o.prototype.div=function(e){if(0==e._low&&0==e._high)throw Error("division by zero");if(0==e._high&&1==e._low)return this.remainder=new o(0),this;if(e.gt(this))return this.remainder=this.clone(),this._low=0,this._high=0,this;if(this.eq(e))return this.remainder=new o(0),this._low=1,this._high=0,this;for(var t=e.clone(),r=-1;!this.lt(t);)t.shiftLeft(1,!0),r++;for(this.remainder=this.clone(),this._low=0,this._high=0;r>=0;r--)t.shiftRight(1),this.remainder.lt(t)||(this.remainder.subtract(t),r>=16?this._high|=1<>>16)&65535,this},o.prototype.equals=o.prototype.eq=function(e){return this._low==e._low&&this._high==e._high},o.prototype.greaterThan=o.prototype.gt=function(e){return this._high>e._high||!(this._highe._low},o.prototype.lessThan=o.prototype.lt=function(e){return this._highe._high)&&this._low16?(this._low=this._high>>e-16,this._high=0):16==e?(this._low=this._high,this._high=0):(this._low=this._low>>e|this._high<<16-e&65535,this._high>>=e),this},o.prototype.shiftLeft=o.prototype.shiftl=function(e,t){return e>16?(this._high=this._low<>16-e,this._low=this._low<>>32-e,this._low=65535&t,this._high=t>>>16,this},o.prototype.rotateRight=o.prototype.rotr=function(e){var t=this._high<<16|this._low;return t=t>>>e|t<<32-e,this._low=65535&t,this._high=t>>>16,this},o.prototype.clone=function(){return new o(this._low,this._high)},void 0===(p=function(){return o}.apply(t,[]))||(e.exports=p)}()},function(e,t,r){var p;!function(r){var o={16:s(Math.pow(16,5)),10:s(Math.pow(10,5)),2:s(Math.pow(2,5))},i={16:s(16),10:s(10),2:s(2)};function s(e,t,r,p){return this instanceof s?(this.remainder=null,"string"==typeof e?l.call(this,e,t):void 0===t?a.call(this,e):void n.apply(this,arguments)):new s(e,t,r,p)}function n(e,t,r,p){return void 0===r?(this._a00=65535&e,this._a16=e>>>16,this._a32=65535&t,this._a48=t>>>16,this):(this._a00=0|e,this._a16=0|t,this._a32=0|r,this._a48=0|p,this)}function a(e){return this._a00=65535&e,this._a16=e>>>16,this._a32=0,this._a48=0,this}function l(e,t){t=t||10,this._a00=0,this._a16=0,this._a32=0,this._a48=0;for(var r=o[t]||new s(Math.pow(t,5)),p=0,i=e.length;p=0&&(r.div(t),p[o]=r.remainder.toNumber().toString(e),r.gt(t));o--);return p[o-1]=r.toNumber().toString(e),p.join("")},s.prototype.add=function(e){var t=this._a00+e._a00,r=t>>>16,p=(r+=this._a16+e._a16)>>>16,o=(p+=this._a32+e._a32)>>>16;return o+=this._a48+e._a48,this._a00=65535&t,this._a16=65535&r,this._a32=65535&p,this._a48=65535&o,this},s.prototype.subtract=function(e){return this.add(e.clone().negate())},s.prototype.multiply=function(e){var t=this._a00,r=this._a16,p=this._a32,o=this._a48,i=e._a00,s=e._a16,n=e._a32,a=t*i,l=a>>>16,c=(l+=t*s)>>>16;l&=65535,c+=(l+=r*i)>>>16;var u=(c+=t*n)>>>16;return c&=65535,u+=(c+=r*s)>>>16,c&=65535,u+=(c+=p*i)>>>16,u+=t*e._a48,u&=65535,u+=r*n,u&=65535,u+=p*s,u&=65535,u+=o*i,this._a00=65535&a,this._a16=65535&l,this._a32=65535&c,this._a48=65535&u,this},s.prototype.div=function(e){if(0==e._a16&&0==e._a32&&0==e._a48){if(0==e._a00)throw Error("division by zero");if(1==e._a00)return this.remainder=new s(0),this}if(e.gt(this))return this.remainder=this.clone(),this._a00=0,this._a16=0,this._a32=0,this._a48=0,this;if(this.eq(e))return this.remainder=new s(0),this._a00=1,this._a16=0,this._a32=0,this._a48=0,this;for(var t=e.clone(),r=-1;!this.lt(t);)t.shiftLeft(1,!0),r++;for(this.remainder=this.clone(),this._a00=0,this._a16=0,this._a32=0,this._a48=0;r>=0;r--)t.shiftRight(1),this.remainder.lt(t)||(this.remainder.subtract(t),r>=48?this._a48|=1<=32?this._a32|=1<=16?this._a16|=1<>>16),this._a16=65535&e,e=(65535&~this._a32)+(e>>>16),this._a32=65535&e,this._a48=~this._a48+(e>>>16)&65535,this},s.prototype.equals=s.prototype.eq=function(e){return this._a48==e._a48&&this._a00==e._a00&&this._a32==e._a32&&this._a16==e._a16},s.prototype.greaterThan=s.prototype.gt=function(e){return this._a48>e._a48||!(this._a48e._a32||!(this._a32e._a16||!(this._a16e._a00))},s.prototype.lessThan=s.prototype.lt=function(e){return this._a48e._a48)&&(this._a32e._a32)&&(this._a16e._a16)&&this._a00=48?(this._a00=this._a48>>e-48,this._a16=0,this._a32=0,this._a48=0):e>=32?(e-=32,this._a00=65535&(this._a32>>e|this._a48<<16-e),this._a16=this._a48>>e&65535,this._a32=0,this._a48=0):e>=16?(e-=16,this._a00=65535&(this._a16>>e|this._a32<<16-e),this._a16=65535&(this._a32>>e|this._a48<<16-e),this._a32=this._a48>>e&65535,this._a48=0):(this._a00=65535&(this._a00>>e|this._a16<<16-e),this._a16=65535&(this._a16>>e|this._a32<<16-e),this._a32=65535&(this._a32>>e|this._a48<<16-e),this._a48=this._a48>>e&65535),this},s.prototype.shiftLeft=s.prototype.shiftl=function(e,t){return(e%=64)>=48?(this._a48=this._a00<=32?(e-=32,this._a48=this._a16<>16-e,this._a32=this._a00<=16?(e-=16,this._a48=this._a32<>16-e,this._a32=65535&(this._a16<>16-e),this._a16=this._a00<>16-e,this._a32=65535&(this._a32<>16-e),this._a16=65535&(this._a16<>16-e),this._a00=this._a00<=32){var t=this._a00;if(this._a00=this._a32,this._a32=t,t=this._a48,this._a48=this._a16,this._a16=t,32==e)return this;e-=32}var r=this._a48<<16|this._a32,p=this._a16<<16|this._a00,o=r<>>32-e,i=p<>>32-e;return this._a00=65535&i,this._a16=i>>>16,this._a32=65535&o,this._a48=o>>>16,this},s.prototype.rotateRight=s.prototype.rotr=function(e){if(0==(e%=64))return this;if(e>=32){var t=this._a00;if(this._a00=this._a32,this._a32=t,t=this._a48,this._a48=this._a16,this._a16=t,32==e)return this;e-=32}var r=this._a48<<16|this._a32,p=this._a16<<16|this._a00,o=r>>>e|p<<32-e,i=p>>>e|r<<32-e;return this._a00=65535&i,this._a16=i>>>16,this._a32=65535&o,this._a48=o>>>16,this},s.prototype.clone=function(){return new s(this._a00,this._a16,this._a32,this._a48)},void 0===(p=function(){return s}.apply(t,[]))||(e.exports=p)}()},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,r(0).CarrierPhase,r(0).GnssSignal),s=r(0).GnssSignalDep,n=(r(0).GPSTime,r(0).GPSTimeDep,r(0).GPSTimeSec,r(0).SvId,function(e,t){return p.call(this,e),this.messageType="MSG_ACQ_RESULT",this.fields=t||this.parser.parse(e.payload),this});(n.prototype=Object.create(p.prototype)).messageType="MSG_ACQ_RESULT",n.prototype.msg_type=47,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").floatle("cn0").floatle("cp").floatle("cf").nest("sid",{type:i.prototype.parser}),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["cn0","writeFloatLE",4]),n.prototype.fieldSpec.push(["cp","writeFloatLE",4]),n.prototype.fieldSpec.push(["cf","writeFloatLE",4]),n.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]);var a=function(e,t){return p.call(this,e),this.messageType="MSG_ACQ_RESULT_DEP_C",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="MSG_ACQ_RESULT_DEP_C",a.prototype.msg_type=31,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").floatle("cn0").floatle("cp").floatle("cf").nest("sid",{type:s.prototype.parser}),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["cn0","writeFloatLE",4]),a.prototype.fieldSpec.push(["cp","writeFloatLE",4]),a.prototype.fieldSpec.push(["cf","writeFloatLE",4]),a.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]);var l=function(e,t){return p.call(this,e),this.messageType="MSG_ACQ_RESULT_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="MSG_ACQ_RESULT_DEP_B",l.prototype.msg_type=20,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").floatle("snr").floatle("cp").floatle("cf").nest("sid",{type:s.prototype.parser}),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["snr","writeFloatLE",4]),l.prototype.fieldSpec.push(["cp","writeFloatLE",4]),l.prototype.fieldSpec.push(["cf","writeFloatLE",4]),l.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]);var c=function(e,t){return p.call(this,e),this.messageType="MSG_ACQ_RESULT_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="MSG_ACQ_RESULT_DEP_A",c.prototype.msg_type=21,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").floatle("snr").floatle("cp").floatle("cf").uint8("prn"),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["snr","writeFloatLE",4]),c.prototype.fieldSpec.push(["cp","writeFloatLE",4]),c.prototype.fieldSpec.push(["cf","writeFloatLE",4]),c.prototype.fieldSpec.push(["prn","writeUInt8",1]);var u=function(e,t){return p.call(this,e),this.messageType="AcqSvProfile",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="AcqSvProfile",u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint8("job_type").uint8("status").uint16("cn0").uint8("int_time").nest("sid",{type:i.prototype.parser}).uint16("bin_width").uint32("timestamp").uint32("time_spent").int32("cf_min").int32("cf_max").int32("cf").uint32("cp"),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["job_type","writeUInt8",1]),u.prototype.fieldSpec.push(["status","writeUInt8",1]),u.prototype.fieldSpec.push(["cn0","writeUInt16LE",2]),u.prototype.fieldSpec.push(["int_time","writeUInt8",1]),u.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]),u.prototype.fieldSpec.push(["bin_width","writeUInt16LE",2]),u.prototype.fieldSpec.push(["timestamp","writeUInt32LE",4]),u.prototype.fieldSpec.push(["time_spent","writeUInt32LE",4]),u.prototype.fieldSpec.push(["cf_min","writeInt32LE",4]),u.prototype.fieldSpec.push(["cf_max","writeInt32LE",4]),u.prototype.fieldSpec.push(["cf","writeInt32LE",4]),u.prototype.fieldSpec.push(["cp","writeUInt32LE",4]);var y=function(e,t){return p.call(this,e),this.messageType="AcqSvProfileDep",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="AcqSvProfileDep",y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").uint8("job_type").uint8("status").uint16("cn0").uint8("int_time").nest("sid",{type:s.prototype.parser}).uint16("bin_width").uint32("timestamp").uint32("time_spent").int32("cf_min").int32("cf_max").int32("cf").uint32("cp"),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["job_type","writeUInt8",1]),y.prototype.fieldSpec.push(["status","writeUInt8",1]),y.prototype.fieldSpec.push(["cn0","writeUInt16LE",2]),y.prototype.fieldSpec.push(["int_time","writeUInt8",1]),y.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),y.prototype.fieldSpec.push(["bin_width","writeUInt16LE",2]),y.prototype.fieldSpec.push(["timestamp","writeUInt32LE",4]),y.prototype.fieldSpec.push(["time_spent","writeUInt32LE",4]),y.prototype.fieldSpec.push(["cf_min","writeInt32LE",4]),y.prototype.fieldSpec.push(["cf_max","writeInt32LE",4]),y.prototype.fieldSpec.push(["cf","writeInt32LE",4]),y.prototype.fieldSpec.push(["cp","writeUInt32LE",4]);var h=function(e,t){return p.call(this,e),this.messageType="MSG_ACQ_SV_PROFILE",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_ACQ_SV_PROFILE",h.prototype.msg_type=46,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").array("acq_sv_profile",{type:u.prototype.parser,readUntil:"eof"}),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["acq_sv_profile","array",u.prototype.fieldSpec,function(){return this.fields.array.length},null]);var f=function(e,t){return p.call(this,e),this.messageType="MSG_ACQ_SV_PROFILE_DEP",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="MSG_ACQ_SV_PROFILE_DEP",f.prototype.msg_type=30,f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").array("acq_sv_profile",{type:y.prototype.parser,readUntil:"eof"}),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["acq_sv_profile","array",y.prototype.fieldSpec,function(){return this.fields.array.length},null]),e.exports={47:n,MsgAcqResult:n,31:a,MsgAcqResultDepC:a,20:l,MsgAcqResultDepB:l,21:c,MsgAcqResultDepA:c,AcqSvProfile:u,AcqSvProfileDep:y,46:h,MsgAcqSvProfile:h,30:f,MsgAcqSvProfileDep:f}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_BOOTLOADER_HANDSHAKE_REQ",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_BOOTLOADER_HANDSHAKE_REQ",i.prototype.msg_type=179,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little"),i.prototype.fieldSpec=[];var s=function(e,t){return p.call(this,e),this.messageType="MSG_BOOTLOADER_HANDSHAKE_RESP",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_BOOTLOADER_HANDSHAKE_RESP",s.prototype.msg_type=180,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint32("flags").string("version",{greedy:!0}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["flags","writeUInt32LE",4]),s.prototype.fieldSpec.push(["version","string",null]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_BOOTLOADER_JUMP_TO_APP",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_BOOTLOADER_JUMP_TO_APP",n.prototype.msg_type=177,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint8("jump"),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["jump","writeUInt8",1]);var a=function(e,t){return p.call(this,e),this.messageType="MSG_NAP_DEVICE_DNA_REQ",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="MSG_NAP_DEVICE_DNA_REQ",a.prototype.msg_type=222,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little"),a.prototype.fieldSpec=[];var l=function(e,t){return p.call(this,e),this.messageType="MSG_NAP_DEVICE_DNA_RESP",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="MSG_NAP_DEVICE_DNA_RESP",l.prototype.msg_type=221,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").array("dna",{length:8,type:"uint8"}),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["dna","array","writeUInt8",function(){return 1},8]);var c=function(e,t){return p.call(this,e),this.messageType="MSG_BOOTLOADER_HANDSHAKE_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="MSG_BOOTLOADER_HANDSHAKE_DEP_A",c.prototype.msg_type=176,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").array("handshake",{type:"uint8",readUntil:"eof"}),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["handshake","array","writeUInt8",function(){return 1},null]),e.exports={179:i,MsgBootloaderHandshakeReq:i,180:s,MsgBootloaderHandshakeResp:s,177:n,MsgBootloaderJumpToApp:n,222:a,MsgNapDeviceDnaReq:a,221:l,MsgNapDeviceDnaResp:l,176:c,MsgBootloaderHandshakeDepA:c}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_EXT_EVENT",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_EXT_EVENT",i.prototype.msg_type=257,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint16("wn").uint32("tow").int32("ns_residual").uint8("flags").uint8("pin"),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["wn","writeUInt16LE",2]),i.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),i.prototype.fieldSpec.push(["ns_residual","writeInt32LE",4]),i.prototype.fieldSpec.push(["flags","writeUInt8",1]),i.prototype.fieldSpec.push(["pin","writeUInt8",1]),e.exports={257:i,MsgExtEvent:i}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_READ_REQ",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_READ_REQ",i.prototype.msg_type=168,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint32("sequence").uint32("offset").uint8("chunk_size").string("filename",{greedy:!0}),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),i.prototype.fieldSpec.push(["offset","writeUInt32LE",4]),i.prototype.fieldSpec.push(["chunk_size","writeUInt8",1]),i.prototype.fieldSpec.push(["filename","string",null]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_READ_RESP",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_READ_RESP",s.prototype.msg_type=163,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint32("sequence").array("contents",{type:"uint8",readUntil:"eof"}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),s.prototype.fieldSpec.push(["contents","array","writeUInt8",function(){return 1},null]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_READ_DIR_REQ",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_READ_DIR_REQ",n.prototype.msg_type=169,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint32("sequence").uint32("offset").string("dirname",{greedy:!0}),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),n.prototype.fieldSpec.push(["offset","writeUInt32LE",4]),n.prototype.fieldSpec.push(["dirname","string",null]);var a=function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_READ_DIR_RESP",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_READ_DIR_RESP",a.prototype.msg_type=170,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").uint32("sequence").array("contents",{type:"uint8",readUntil:"eof"}),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),a.prototype.fieldSpec.push(["contents","array","writeUInt8",function(){return 1},null]);var l=function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_REMOVE",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_REMOVE",l.prototype.msg_type=172,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").string("filename",{greedy:!0}),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["filename","string",null]);var c=function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_WRITE_REQ",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_WRITE_REQ",c.prototype.msg_type=173,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint32("sequence").uint32("offset").string("filename",{greedy:!0}).array("data",{type:"uint8",readUntil:"eof"}),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),c.prototype.fieldSpec.push(["offset","writeUInt32LE",4]),c.prototype.fieldSpec.push(["filename","string",null]),c.prototype.fieldSpec.push(["data","array","writeUInt8",function(){return 1},null]);var u=function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_WRITE_RESP",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_WRITE_RESP",u.prototype.msg_type=171,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint32("sequence"),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]);var y=function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_CONFIG_REQ",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_CONFIG_REQ",y.prototype.msg_type=4097,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").uint32("sequence"),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]);var h=function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_CONFIG_RESP",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_CONFIG_RESP",h.prototype.msg_type=4098,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").uint32("sequence").uint32("window_size").uint32("batch_size").uint32("fileio_version"),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),h.prototype.fieldSpec.push(["window_size","writeUInt32LE",4]),h.prototype.fieldSpec.push(["batch_size","writeUInt32LE",4]),h.prototype.fieldSpec.push(["fileio_version","writeUInt32LE",4]),e.exports={168:i,MsgFileioReadReq:i,163:s,MsgFileioReadResp:s,169:n,MsgFileioReadDirReq:n,170:a,MsgFileioReadDirResp:a,172:l,MsgFileioRemove:l,173:c,MsgFileioWriteReq:c,171:u,MsgFileioWriteResp:u,4097:y,MsgFileioConfigReq:y,4098:h,MsgFileioConfigResp:h}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_FLASH_PROGRAM",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_FLASH_PROGRAM",i.prototype.msg_type=230,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint8("target").array("addr_start",{length:3,type:"uint8"}).uint8("addr_len").array("data",{type:"uint8",length:"addr_len"}),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["target","writeUInt8",1]),i.prototype.fieldSpec.push(["addr_start","array","writeUInt8",function(){return 1},3]),i.prototype.fieldSpec.push(["addr_len","writeUInt8",1]),i.prototype.fieldSpec.push(["data","array","writeUInt8",function(){return 1},"addr_len"]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_FLASH_DONE",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_FLASH_DONE",s.prototype.msg_type=224,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint8("response"),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["response","writeUInt8",1]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_FLASH_READ_REQ",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_FLASH_READ_REQ",n.prototype.msg_type=231,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint8("target").array("addr_start",{length:3,type:"uint8"}).uint8("addr_len"),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["target","writeUInt8",1]),n.prototype.fieldSpec.push(["addr_start","array","writeUInt8",function(){return 1},3]),n.prototype.fieldSpec.push(["addr_len","writeUInt8",1]);var a=function(e,t){return p.call(this,e),this.messageType="MSG_FLASH_READ_RESP",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="MSG_FLASH_READ_RESP",a.prototype.msg_type=225,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").uint8("target").array("addr_start",{length:3,type:"uint8"}).uint8("addr_len"),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["target","writeUInt8",1]),a.prototype.fieldSpec.push(["addr_start","array","writeUInt8",function(){return 1},3]),a.prototype.fieldSpec.push(["addr_len","writeUInt8",1]);var l=function(e,t){return p.call(this,e),this.messageType="MSG_FLASH_ERASE",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="MSG_FLASH_ERASE",l.prototype.msg_type=226,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").uint8("target").uint32("sector_num"),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["target","writeUInt8",1]),l.prototype.fieldSpec.push(["sector_num","writeUInt32LE",4]);var c=function(e,t){return p.call(this,e),this.messageType="MSG_STM_FLASH_LOCK_SECTOR",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="MSG_STM_FLASH_LOCK_SECTOR",c.prototype.msg_type=227,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint32("sector"),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["sector","writeUInt32LE",4]);var u=function(e,t){return p.call(this,e),this.messageType="MSG_STM_FLASH_UNLOCK_SECTOR",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="MSG_STM_FLASH_UNLOCK_SECTOR",u.prototype.msg_type=228,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint32("sector"),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["sector","writeUInt32LE",4]);var y=function(e,t){return p.call(this,e),this.messageType="MSG_STM_UNIQUE_ID_REQ",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="MSG_STM_UNIQUE_ID_REQ",y.prototype.msg_type=232,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little"),y.prototype.fieldSpec=[];var h=function(e,t){return p.call(this,e),this.messageType="MSG_STM_UNIQUE_ID_RESP",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_STM_UNIQUE_ID_RESP",h.prototype.msg_type=229,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").array("stm_id",{length:12,type:"uint8"}),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["stm_id","array","writeUInt8",function(){return 1},12]);var f=function(e,t){return p.call(this,e),this.messageType="MSG_M25_FLASH_WRITE_STATUS",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="MSG_M25_FLASH_WRITE_STATUS",f.prototype.msg_type=243,f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").array("status",{length:1,type:"uint8"}),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["status","array","writeUInt8",function(){return 1},1]),e.exports={230:i,MsgFlashProgram:i,224:s,MsgFlashDone:s,231:n,MsgFlashReadReq:n,225:a,MsgFlashReadResp:a,226:l,MsgFlashErase:l,227:c,MsgStmFlashLockSector:c,228:u,MsgStmFlashUnlockSector:u,232:y,MsgStmUniqueIdReq:y,229:h,MsgStmUniqueIdResp:h,243:f,MsgM25FlashWriteStatus:f}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_IMU_RAW",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_IMU_RAW",i.prototype.msg_type=2304,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint32("tow").uint8("tow_f").int16("acc_x").int16("acc_y").int16("acc_z").int16("gyr_x").int16("gyr_y").int16("gyr_z"),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),i.prototype.fieldSpec.push(["tow_f","writeUInt8",1]),i.prototype.fieldSpec.push(["acc_x","writeInt16LE",2]),i.prototype.fieldSpec.push(["acc_y","writeInt16LE",2]),i.prototype.fieldSpec.push(["acc_z","writeInt16LE",2]),i.prototype.fieldSpec.push(["gyr_x","writeInt16LE",2]),i.prototype.fieldSpec.push(["gyr_y","writeInt16LE",2]),i.prototype.fieldSpec.push(["gyr_z","writeInt16LE",2]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_IMU_AUX",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_IMU_AUX",s.prototype.msg_type=2305,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint8("imu_type").int16("temp").uint8("imu_conf"),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["imu_type","writeUInt8",1]),s.prototype.fieldSpec.push(["temp","writeInt16LE",2]),s.prototype.fieldSpec.push(["imu_conf","writeUInt8",1]),e.exports={2304:i,MsgImuRaw:i,2305:s,MsgImuAux:s}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_CPU_STATE_DEP_A",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_CPU_STATE_DEP_A",i.prototype.msg_type=32512,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint8("index").uint16("pid").uint8("pcpu").string("tname",{length:15}).string("cmdline",{greedy:!0}),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["index","writeUInt8",1]),i.prototype.fieldSpec.push(["pid","writeUInt16LE",2]),i.prototype.fieldSpec.push(["pcpu","writeUInt8",1]),i.prototype.fieldSpec.push(["tname","string",15]),i.prototype.fieldSpec.push(["cmdline","string",null]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_MEM_STATE_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_MEM_STATE_DEP_A",s.prototype.msg_type=32513,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint8("index").uint16("pid").uint8("pmem").string("tname",{length:15}).string("cmdline",{greedy:!0}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["index","writeUInt8",1]),s.prototype.fieldSpec.push(["pid","writeUInt16LE",2]),s.prototype.fieldSpec.push(["pmem","writeUInt8",1]),s.prototype.fieldSpec.push(["tname","string",15]),s.prototype.fieldSpec.push(["cmdline","string",null]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_SYS_STATE_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_SYS_STATE_DEP_A",n.prototype.msg_type=32514,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint16("mem_total").uint8("pcpu").uint8("pmem").uint16("procs_starting").uint16("procs_stopping").uint16("pid_count"),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["mem_total","writeUInt16LE",2]),n.prototype.fieldSpec.push(["pcpu","writeUInt8",1]),n.prototype.fieldSpec.push(["pmem","writeUInt8",1]),n.prototype.fieldSpec.push(["procs_starting","writeUInt16LE",2]),n.prototype.fieldSpec.push(["procs_stopping","writeUInt16LE",2]),n.prototype.fieldSpec.push(["pid_count","writeUInt16LE",2]);var a=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_PROCESS_SOCKET_COUNTS",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_PROCESS_SOCKET_COUNTS",a.prototype.msg_type=32515,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").uint8("index").uint16("pid").uint16("socket_count").uint16("socket_types").uint16("socket_states").string("cmdline",{greedy:!0}),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["index","writeUInt8",1]),a.prototype.fieldSpec.push(["pid","writeUInt16LE",2]),a.prototype.fieldSpec.push(["socket_count","writeUInt16LE",2]),a.prototype.fieldSpec.push(["socket_types","writeUInt16LE",2]),a.prototype.fieldSpec.push(["socket_states","writeUInt16LE",2]),a.prototype.fieldSpec.push(["cmdline","string",null]);var l=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_PROCESS_SOCKET_QUEUES",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_PROCESS_SOCKET_QUEUES",l.prototype.msg_type=32516,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").uint8("index").uint16("pid").uint16("recv_queued").uint16("send_queued").uint16("socket_types").uint16("socket_states").string("address_of_largest",{length:64}).string("cmdline",{greedy:!0}),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["index","writeUInt8",1]),l.prototype.fieldSpec.push(["pid","writeUInt16LE",2]),l.prototype.fieldSpec.push(["recv_queued","writeUInt16LE",2]),l.prototype.fieldSpec.push(["send_queued","writeUInt16LE",2]),l.prototype.fieldSpec.push(["socket_types","writeUInt16LE",2]),l.prototype.fieldSpec.push(["socket_states","writeUInt16LE",2]),l.prototype.fieldSpec.push(["address_of_largest","string",64]),l.prototype.fieldSpec.push(["cmdline","string",null]);var c=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_SOCKET_USAGE",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_SOCKET_USAGE",c.prototype.msg_type=32517,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint32("avg_queue_depth").uint32("max_queue_depth").array("socket_state_counts",{length:16,type:"uint16le"}).array("socket_type_counts",{length:16,type:"uint16le"}),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["avg_queue_depth","writeUInt32LE",4]),c.prototype.fieldSpec.push(["max_queue_depth","writeUInt32LE",4]),c.prototype.fieldSpec.push(["socket_state_counts","array","writeUInt16LE",function(){return 2},16]),c.prototype.fieldSpec.push(["socket_type_counts","array","writeUInt16LE",function(){return 2},16]);var u=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_PROCESS_FD_COUNT",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_PROCESS_FD_COUNT",u.prototype.msg_type=32518,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint8("index").uint16("pid").uint16("fd_count").string("cmdline",{greedy:!0}),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["index","writeUInt8",1]),u.prototype.fieldSpec.push(["pid","writeUInt16LE",2]),u.prototype.fieldSpec.push(["fd_count","writeUInt16LE",2]),u.prototype.fieldSpec.push(["cmdline","string",null]);var y=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_PROCESS_FD_SUMMARY",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_PROCESS_FD_SUMMARY",y.prototype.msg_type=32519,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").uint32("sys_fd_count").string("most_opened",{greedy:!0}),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["sys_fd_count","writeUInt32LE",4]),y.prototype.fieldSpec.push(["most_opened","string",null]);var h=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_CPU_STATE",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_CPU_STATE",h.prototype.msg_type=32520,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").uint8("index").uint16("pid").uint8("pcpu").uint32("time").uint8("flags").string("tname",{length:15}).string("cmdline",{greedy:!0}),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["index","writeUInt8",1]),h.prototype.fieldSpec.push(["pid","writeUInt16LE",2]),h.prototype.fieldSpec.push(["pcpu","writeUInt8",1]),h.prototype.fieldSpec.push(["time","writeUInt32LE",4]),h.prototype.fieldSpec.push(["flags","writeUInt8",1]),h.prototype.fieldSpec.push(["tname","string",15]),h.prototype.fieldSpec.push(["cmdline","string",null]);var f=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_MEM_STATE",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_MEM_STATE",f.prototype.msg_type=32521,f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").uint8("index").uint16("pid").uint8("pmem").uint32("time").uint8("flags").string("tname",{length:15}).string("cmdline",{greedy:!0}),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["index","writeUInt8",1]),f.prototype.fieldSpec.push(["pid","writeUInt16LE",2]),f.prototype.fieldSpec.push(["pmem","writeUInt8",1]),f.prototype.fieldSpec.push(["time","writeUInt32LE",4]),f.prototype.fieldSpec.push(["flags","writeUInt8",1]),f.prototype.fieldSpec.push(["tname","string",15]),f.prototype.fieldSpec.push(["cmdline","string",null]);var d=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_SYS_STATE",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_SYS_STATE",d.prototype.msg_type=32522,d.prototype.constructor=d,d.prototype.parser=(new o).endianess("little").uint16("mem_total").uint8("pcpu").uint8("pmem").uint16("procs_starting").uint16("procs_stopping").uint16("pid_count").uint32("time").uint8("flags"),d.prototype.fieldSpec=[],d.prototype.fieldSpec.push(["mem_total","writeUInt16LE",2]),d.prototype.fieldSpec.push(["pcpu","writeUInt8",1]),d.prototype.fieldSpec.push(["pmem","writeUInt8",1]),d.prototype.fieldSpec.push(["procs_starting","writeUInt16LE",2]),d.prototype.fieldSpec.push(["procs_stopping","writeUInt16LE",2]),d.prototype.fieldSpec.push(["pid_count","writeUInt16LE",2]),d.prototype.fieldSpec.push(["time","writeUInt32LE",4]),d.prototype.fieldSpec.push(["flags","writeUInt8",1]),e.exports={32512:i,MsgLinuxCpuStateDepA:i,32513:s,MsgLinuxMemStateDepA:s,32514:n,MsgLinuxSysStateDepA:n,32515:a,MsgLinuxProcessSocketCounts:a,32516:l,MsgLinuxProcessSocketQueues:l,32517:c,MsgLinuxSocketUsage:c,32518:u,MsgLinuxProcessFdCount:u,32519:y,MsgLinuxProcessFdSummary:y,32520:h,MsgLinuxCpuState:h,32521:f,MsgLinuxMemState:f,32522:d,MsgLinuxSysState:d}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_LOG",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_LOG",i.prototype.msg_type=1025,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint8("level").string("text",{greedy:!0}),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["level","writeUInt8",1]),i.prototype.fieldSpec.push(["text","string",null]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_FWD",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_FWD",s.prototype.msg_type=1026,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint8("source").uint8("protocol").array("fwd_payload",{type:"uint8",readUntil:"eof"}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["source","writeUInt8",1]),s.prototype.fieldSpec.push(["protocol","writeUInt8",1]),s.prototype.fieldSpec.push(["fwd_payload","array","writeUInt8",function(){return 1},null]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_PRINT_DEP",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_PRINT_DEP",n.prototype.msg_type=16,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").string("text",{greedy:!0}),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["text","string",null]),e.exports={1025:i,MsgLog:i,1026:s,MsgFwd:s,16:n,MsgPrintDep:n}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_MAG_RAW",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_MAG_RAW",i.prototype.msg_type=2306,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint32("tow").uint8("tow_f").int16("mag_x").int16("mag_y").int16("mag_z"),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),i.prototype.fieldSpec.push(["tow_f","writeUInt8",1]),i.prototype.fieldSpec.push(["mag_x","writeInt16LE",2]),i.prototype.fieldSpec.push(["mag_y","writeInt16LE",2]),i.prototype.fieldSpec.push(["mag_z","writeInt16LE",2]),e.exports={2306:i,MsgMagRaw:i}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_GPS_TIME",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_GPS_TIME",i.prototype.msg_type=258,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint16("wn").uint32("tow").int32("ns_residual").uint8("flags"),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["wn","writeUInt16LE",2]),i.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),i.prototype.fieldSpec.push(["ns_residual","writeInt32LE",4]),i.prototype.fieldSpec.push(["flags","writeUInt8",1]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_GPS_TIME_GNSS",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_GPS_TIME_GNSS",s.prototype.msg_type=260,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint16("wn").uint32("tow").int32("ns_residual").uint8("flags"),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["wn","writeUInt16LE",2]),s.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),s.prototype.fieldSpec.push(["ns_residual","writeInt32LE",4]),s.prototype.fieldSpec.push(["flags","writeUInt8",1]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_UTC_TIME",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_UTC_TIME",n.prototype.msg_type=259,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint8("flags").uint32("tow").uint16("year").uint8("month").uint8("day").uint8("hours").uint8("minutes").uint8("seconds").uint32("ns"),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["flags","writeUInt8",1]),n.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),n.prototype.fieldSpec.push(["year","writeUInt16LE",2]),n.prototype.fieldSpec.push(["month","writeUInt8",1]),n.prototype.fieldSpec.push(["day","writeUInt8",1]),n.prototype.fieldSpec.push(["hours","writeUInt8",1]),n.prototype.fieldSpec.push(["minutes","writeUInt8",1]),n.prototype.fieldSpec.push(["seconds","writeUInt8",1]),n.prototype.fieldSpec.push(["ns","writeUInt32LE",4]);var a=function(e,t){return p.call(this,e),this.messageType="MSG_UTC_TIME_GNSS",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="MSG_UTC_TIME_GNSS",a.prototype.msg_type=261,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").uint8("flags").uint32("tow").uint16("year").uint8("month").uint8("day").uint8("hours").uint8("minutes").uint8("seconds").uint32("ns"),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["flags","writeUInt8",1]),a.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),a.prototype.fieldSpec.push(["year","writeUInt16LE",2]),a.prototype.fieldSpec.push(["month","writeUInt8",1]),a.prototype.fieldSpec.push(["day","writeUInt8",1]),a.prototype.fieldSpec.push(["hours","writeUInt8",1]),a.prototype.fieldSpec.push(["minutes","writeUInt8",1]),a.prototype.fieldSpec.push(["seconds","writeUInt8",1]),a.prototype.fieldSpec.push(["ns","writeUInt32LE",4]);var l=function(e,t){return p.call(this,e),this.messageType="MSG_DOPS",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="MSG_DOPS",l.prototype.msg_type=520,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").uint32("tow").uint16("gdop").uint16("pdop").uint16("tdop").uint16("hdop").uint16("vdop").uint8("flags"),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),l.prototype.fieldSpec.push(["gdop","writeUInt16LE",2]),l.prototype.fieldSpec.push(["pdop","writeUInt16LE",2]),l.prototype.fieldSpec.push(["tdop","writeUInt16LE",2]),l.prototype.fieldSpec.push(["hdop","writeUInt16LE",2]),l.prototype.fieldSpec.push(["vdop","writeUInt16LE",2]),l.prototype.fieldSpec.push(["flags","writeUInt8",1]);var c=function(e,t){return p.call(this,e),this.messageType="MSG_POS_ECEF",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="MSG_POS_ECEF",c.prototype.msg_type=521,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint32("tow").doublele("x").doublele("y").doublele("z").uint16("accuracy").uint8("n_sats").uint8("flags"),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),c.prototype.fieldSpec.push(["x","writeDoubleLE",8]),c.prototype.fieldSpec.push(["y","writeDoubleLE",8]),c.prototype.fieldSpec.push(["z","writeDoubleLE",8]),c.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),c.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),c.prototype.fieldSpec.push(["flags","writeUInt8",1]);var u=function(e,t){return p.call(this,e),this.messageType="MSG_POS_ECEF_COV",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="MSG_POS_ECEF_COV",u.prototype.msg_type=532,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint32("tow").doublele("x").doublele("y").doublele("z").floatle("cov_x_x").floatle("cov_x_y").floatle("cov_x_z").floatle("cov_y_y").floatle("cov_y_z").floatle("cov_z_z").uint8("n_sats").uint8("flags"),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),u.prototype.fieldSpec.push(["x","writeDoubleLE",8]),u.prototype.fieldSpec.push(["y","writeDoubleLE",8]),u.prototype.fieldSpec.push(["z","writeDoubleLE",8]),u.prototype.fieldSpec.push(["cov_x_x","writeFloatLE",4]),u.prototype.fieldSpec.push(["cov_x_y","writeFloatLE",4]),u.prototype.fieldSpec.push(["cov_x_z","writeFloatLE",4]),u.prototype.fieldSpec.push(["cov_y_y","writeFloatLE",4]),u.prototype.fieldSpec.push(["cov_y_z","writeFloatLE",4]),u.prototype.fieldSpec.push(["cov_z_z","writeFloatLE",4]),u.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),u.prototype.fieldSpec.push(["flags","writeUInt8",1]);var y=function(e,t){return p.call(this,e),this.messageType="MSG_POS_LLH",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="MSG_POS_LLH",y.prototype.msg_type=522,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").uint32("tow").doublele("lat").doublele("lon").doublele("height").uint16("h_accuracy").uint16("v_accuracy").uint8("n_sats").uint8("flags"),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),y.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),y.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),y.prototype.fieldSpec.push(["height","writeDoubleLE",8]),y.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),y.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),y.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),y.prototype.fieldSpec.push(["flags","writeUInt8",1]);var h=function(e,t){return p.call(this,e),this.messageType="MSG_POS_LLH_COV",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_POS_LLH_COV",h.prototype.msg_type=529,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").uint32("tow").doublele("lat").doublele("lon").doublele("height").floatle("cov_n_n").floatle("cov_n_e").floatle("cov_n_d").floatle("cov_e_e").floatle("cov_e_d").floatle("cov_d_d").uint8("n_sats").uint8("flags"),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),h.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),h.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),h.prototype.fieldSpec.push(["height","writeDoubleLE",8]),h.prototype.fieldSpec.push(["cov_n_n","writeFloatLE",4]),h.prototype.fieldSpec.push(["cov_n_e","writeFloatLE",4]),h.prototype.fieldSpec.push(["cov_n_d","writeFloatLE",4]),h.prototype.fieldSpec.push(["cov_e_e","writeFloatLE",4]),h.prototype.fieldSpec.push(["cov_e_d","writeFloatLE",4]),h.prototype.fieldSpec.push(["cov_d_d","writeFloatLE",4]),h.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),h.prototype.fieldSpec.push(["flags","writeUInt8",1]);var f=function(e,t){return p.call(this,e),this.messageType="EstimatedHorizontalErrorEllipse",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="EstimatedHorizontalErrorEllipse",f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").floatle("semi_major").floatle("semi_minor").floatle("orientation"),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["semi_major","writeFloatLE",4]),f.prototype.fieldSpec.push(["semi_minor","writeFloatLE",4]),f.prototype.fieldSpec.push(["orientation","writeFloatLE",4]);var d=function(e,t){return p.call(this,e),this.messageType="MSG_POS_LLH_ACC",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(p.prototype)).messageType="MSG_POS_LLH_ACC",d.prototype.msg_type=536,d.prototype.constructor=d,d.prototype.parser=(new o).endianess("little").uint32("tow").doublele("lat").doublele("lon").doublele("height").doublele("orthometric_height").floatle("h_accuracy").floatle("v_accuracy").floatle("ct_accuracy").floatle("at_accuracy").nest("h_ellipse",{type:f.prototype.parser}).uint8("confidence_and_geoid").uint8("n_sats").uint8("flags"),d.prototype.fieldSpec=[],d.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),d.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),d.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),d.prototype.fieldSpec.push(["height","writeDoubleLE",8]),d.prototype.fieldSpec.push(["orthometric_height","writeDoubleLE",8]),d.prototype.fieldSpec.push(["h_accuracy","writeFloatLE",4]),d.prototype.fieldSpec.push(["v_accuracy","writeFloatLE",4]),d.prototype.fieldSpec.push(["ct_accuracy","writeFloatLE",4]),d.prototype.fieldSpec.push(["at_accuracy","writeFloatLE",4]),d.prototype.fieldSpec.push(["h_ellipse",f.prototype.fieldSpec]),d.prototype.fieldSpec.push(["confidence_and_geoid","writeUInt8",1]),d.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),d.prototype.fieldSpec.push(["flags","writeUInt8",1]);var _=function(e,t){return p.call(this,e),this.messageType="MSG_BASELINE_ECEF",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(p.prototype)).messageType="MSG_BASELINE_ECEF",_.prototype.msg_type=523,_.prototype.constructor=_,_.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").uint16("accuracy").uint8("n_sats").uint8("flags"),_.prototype.fieldSpec=[],_.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),_.prototype.fieldSpec.push(["x","writeInt32LE",4]),_.prototype.fieldSpec.push(["y","writeInt32LE",4]),_.prototype.fieldSpec.push(["z","writeInt32LE",4]),_.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),_.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),_.prototype.fieldSpec.push(["flags","writeUInt8",1]);var S=function(e,t){return p.call(this,e),this.messageType="MSG_BASELINE_NED",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(p.prototype)).messageType="MSG_BASELINE_NED",S.prototype.msg_type=524,S.prototype.constructor=S,S.prototype.parser=(new o).endianess("little").uint32("tow").int32("n").int32("e").int32("d").uint16("h_accuracy").uint16("v_accuracy").uint8("n_sats").uint8("flags"),S.prototype.fieldSpec=[],S.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),S.prototype.fieldSpec.push(["n","writeInt32LE",4]),S.prototype.fieldSpec.push(["e","writeInt32LE",4]),S.prototype.fieldSpec.push(["d","writeInt32LE",4]),S.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),S.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),S.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),S.prototype.fieldSpec.push(["flags","writeUInt8",1]);var g=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_ECEF",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(p.prototype)).messageType="MSG_VEL_ECEF",g.prototype.msg_type=525,g.prototype.constructor=g,g.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").uint16("accuracy").uint8("n_sats").uint8("flags"),g.prototype.fieldSpec=[],g.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),g.prototype.fieldSpec.push(["x","writeInt32LE",4]),g.prototype.fieldSpec.push(["y","writeInt32LE",4]),g.prototype.fieldSpec.push(["z","writeInt32LE",4]),g.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),g.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),g.prototype.fieldSpec.push(["flags","writeUInt8",1]);var w=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_ECEF_COV",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(p.prototype)).messageType="MSG_VEL_ECEF_COV",w.prototype.msg_type=533,w.prototype.constructor=w,w.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").floatle("cov_x_x").floatle("cov_x_y").floatle("cov_x_z").floatle("cov_y_y").floatle("cov_y_z").floatle("cov_z_z").uint8("n_sats").uint8("flags"),w.prototype.fieldSpec=[],w.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),w.prototype.fieldSpec.push(["x","writeInt32LE",4]),w.prototype.fieldSpec.push(["y","writeInt32LE",4]),w.prototype.fieldSpec.push(["z","writeInt32LE",4]),w.prototype.fieldSpec.push(["cov_x_x","writeFloatLE",4]),w.prototype.fieldSpec.push(["cov_x_y","writeFloatLE",4]),w.prototype.fieldSpec.push(["cov_x_z","writeFloatLE",4]),w.prototype.fieldSpec.push(["cov_y_y","writeFloatLE",4]),w.prototype.fieldSpec.push(["cov_y_z","writeFloatLE",4]),w.prototype.fieldSpec.push(["cov_z_z","writeFloatLE",4]),w.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),w.prototype.fieldSpec.push(["flags","writeUInt8",1]);var E=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_NED",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(p.prototype)).messageType="MSG_VEL_NED",E.prototype.msg_type=526,E.prototype.constructor=E,E.prototype.parser=(new o).endianess("little").uint32("tow").int32("n").int32("e").int32("d").uint16("h_accuracy").uint16("v_accuracy").uint8("n_sats").uint8("flags"),E.prototype.fieldSpec=[],E.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),E.prototype.fieldSpec.push(["n","writeInt32LE",4]),E.prototype.fieldSpec.push(["e","writeInt32LE",4]),E.prototype.fieldSpec.push(["d","writeInt32LE",4]),E.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),E.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),E.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),E.prototype.fieldSpec.push(["flags","writeUInt8",1]);var m=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_NED_COV",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(p.prototype)).messageType="MSG_VEL_NED_COV",m.prototype.msg_type=530,m.prototype.constructor=m,m.prototype.parser=(new o).endianess("little").uint32("tow").int32("n").int32("e").int32("d").floatle("cov_n_n").floatle("cov_n_e").floatle("cov_n_d").floatle("cov_e_e").floatle("cov_e_d").floatle("cov_d_d").uint8("n_sats").uint8("flags"),m.prototype.fieldSpec=[],m.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),m.prototype.fieldSpec.push(["n","writeInt32LE",4]),m.prototype.fieldSpec.push(["e","writeInt32LE",4]),m.prototype.fieldSpec.push(["d","writeInt32LE",4]),m.prototype.fieldSpec.push(["cov_n_n","writeFloatLE",4]),m.prototype.fieldSpec.push(["cov_n_e","writeFloatLE",4]),m.prototype.fieldSpec.push(["cov_n_d","writeFloatLE",4]),m.prototype.fieldSpec.push(["cov_e_e","writeFloatLE",4]),m.prototype.fieldSpec.push(["cov_e_d","writeFloatLE",4]),m.prototype.fieldSpec.push(["cov_d_d","writeFloatLE",4]),m.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),m.prototype.fieldSpec.push(["flags","writeUInt8",1]);var b=function(e,t){return p.call(this,e),this.messageType="MSG_POS_ECEF_GNSS",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(p.prototype)).messageType="MSG_POS_ECEF_GNSS",b.prototype.msg_type=553,b.prototype.constructor=b,b.prototype.parser=(new o).endianess("little").uint32("tow").doublele("x").doublele("y").doublele("z").uint16("accuracy").uint8("n_sats").uint8("flags"),b.prototype.fieldSpec=[],b.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),b.prototype.fieldSpec.push(["x","writeDoubleLE",8]),b.prototype.fieldSpec.push(["y","writeDoubleLE",8]),b.prototype.fieldSpec.push(["z","writeDoubleLE",8]),b.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),b.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),b.prototype.fieldSpec.push(["flags","writeUInt8",1]);var v=function(e,t){return p.call(this,e),this.messageType="MSG_POS_ECEF_COV_GNSS",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(p.prototype)).messageType="MSG_POS_ECEF_COV_GNSS",v.prototype.msg_type=564,v.prototype.constructor=v,v.prototype.parser=(new o).endianess("little").uint32("tow").doublele("x").doublele("y").doublele("z").floatle("cov_x_x").floatle("cov_x_y").floatle("cov_x_z").floatle("cov_y_y").floatle("cov_y_z").floatle("cov_z_z").uint8("n_sats").uint8("flags"),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),v.prototype.fieldSpec.push(["x","writeDoubleLE",8]),v.prototype.fieldSpec.push(["y","writeDoubleLE",8]),v.prototype.fieldSpec.push(["z","writeDoubleLE",8]),v.prototype.fieldSpec.push(["cov_x_x","writeFloatLE",4]),v.prototype.fieldSpec.push(["cov_x_y","writeFloatLE",4]),v.prototype.fieldSpec.push(["cov_x_z","writeFloatLE",4]),v.prototype.fieldSpec.push(["cov_y_y","writeFloatLE",4]),v.prototype.fieldSpec.push(["cov_y_z","writeFloatLE",4]),v.prototype.fieldSpec.push(["cov_z_z","writeFloatLE",4]),v.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),v.prototype.fieldSpec.push(["flags","writeUInt8",1]);var I=function(e,t){return p.call(this,e),this.messageType="MSG_POS_LLH_GNSS",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(p.prototype)).messageType="MSG_POS_LLH_GNSS",I.prototype.msg_type=554,I.prototype.constructor=I,I.prototype.parser=(new o).endianess("little").uint32("tow").doublele("lat").doublele("lon").doublele("height").uint16("h_accuracy").uint16("v_accuracy").uint8("n_sats").uint8("flags"),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),I.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),I.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),I.prototype.fieldSpec.push(["height","writeDoubleLE",8]),I.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),I.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),I.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),I.prototype.fieldSpec.push(["flags","writeUInt8",1]);var L=function(e,t){return p.call(this,e),this.messageType="MSG_POS_LLH_COV_GNSS",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(p.prototype)).messageType="MSG_POS_LLH_COV_GNSS",L.prototype.msg_type=561,L.prototype.constructor=L,L.prototype.parser=(new o).endianess("little").uint32("tow").doublele("lat").doublele("lon").doublele("height").floatle("cov_n_n").floatle("cov_n_e").floatle("cov_n_d").floatle("cov_e_e").floatle("cov_e_d").floatle("cov_d_d").uint8("n_sats").uint8("flags"),L.prototype.fieldSpec=[],L.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),L.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),L.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),L.prototype.fieldSpec.push(["height","writeDoubleLE",8]),L.prototype.fieldSpec.push(["cov_n_n","writeFloatLE",4]),L.prototype.fieldSpec.push(["cov_n_e","writeFloatLE",4]),L.prototype.fieldSpec.push(["cov_n_d","writeFloatLE",4]),L.prototype.fieldSpec.push(["cov_e_e","writeFloatLE",4]),L.prototype.fieldSpec.push(["cov_e_d","writeFloatLE",4]),L.prototype.fieldSpec.push(["cov_d_d","writeFloatLE",4]),L.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),L.prototype.fieldSpec.push(["flags","writeUInt8",1]);var T=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_ECEF_GNSS",this.fields=t||this.parser.parse(e.payload),this};(T.prototype=Object.create(p.prototype)).messageType="MSG_VEL_ECEF_GNSS",T.prototype.msg_type=557,T.prototype.constructor=T,T.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").uint16("accuracy").uint8("n_sats").uint8("flags"),T.prototype.fieldSpec=[],T.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),T.prototype.fieldSpec.push(["x","writeInt32LE",4]),T.prototype.fieldSpec.push(["y","writeInt32LE",4]),T.prototype.fieldSpec.push(["z","writeInt32LE",4]),T.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),T.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),T.prototype.fieldSpec.push(["flags","writeUInt8",1]);var U=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_ECEF_COV_GNSS",this.fields=t||this.parser.parse(e.payload),this};(U.prototype=Object.create(p.prototype)).messageType="MSG_VEL_ECEF_COV_GNSS",U.prototype.msg_type=565,U.prototype.constructor=U,U.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").floatle("cov_x_x").floatle("cov_x_y").floatle("cov_x_z").floatle("cov_y_y").floatle("cov_y_z").floatle("cov_z_z").uint8("n_sats").uint8("flags"),U.prototype.fieldSpec=[],U.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),U.prototype.fieldSpec.push(["x","writeInt32LE",4]),U.prototype.fieldSpec.push(["y","writeInt32LE",4]),U.prototype.fieldSpec.push(["z","writeInt32LE",4]),U.prototype.fieldSpec.push(["cov_x_x","writeFloatLE",4]),U.prototype.fieldSpec.push(["cov_x_y","writeFloatLE",4]),U.prototype.fieldSpec.push(["cov_x_z","writeFloatLE",4]),U.prototype.fieldSpec.push(["cov_y_y","writeFloatLE",4]),U.prototype.fieldSpec.push(["cov_y_z","writeFloatLE",4]),U.prototype.fieldSpec.push(["cov_z_z","writeFloatLE",4]),U.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),U.prototype.fieldSpec.push(["flags","writeUInt8",1]);var M=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_NED_GNSS",this.fields=t||this.parser.parse(e.payload),this};(M.prototype=Object.create(p.prototype)).messageType="MSG_VEL_NED_GNSS",M.prototype.msg_type=558,M.prototype.constructor=M,M.prototype.parser=(new o).endianess("little").uint32("tow").int32("n").int32("e").int32("d").uint16("h_accuracy").uint16("v_accuracy").uint8("n_sats").uint8("flags"),M.prototype.fieldSpec=[],M.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),M.prototype.fieldSpec.push(["n","writeInt32LE",4]),M.prototype.fieldSpec.push(["e","writeInt32LE",4]),M.prototype.fieldSpec.push(["d","writeInt32LE",4]),M.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),M.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),M.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),M.prototype.fieldSpec.push(["flags","writeUInt8",1]);var D=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_NED_COV_GNSS",this.fields=t||this.parser.parse(e.payload),this};(D.prototype=Object.create(p.prototype)).messageType="MSG_VEL_NED_COV_GNSS",D.prototype.msg_type=562,D.prototype.constructor=D,D.prototype.parser=(new o).endianess("little").uint32("tow").int32("n").int32("e").int32("d").floatle("cov_n_n").floatle("cov_n_e").floatle("cov_n_d").floatle("cov_e_e").floatle("cov_e_d").floatle("cov_d_d").uint8("n_sats").uint8("flags"),D.prototype.fieldSpec=[],D.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),D.prototype.fieldSpec.push(["n","writeInt32LE",4]),D.prototype.fieldSpec.push(["e","writeInt32LE",4]),D.prototype.fieldSpec.push(["d","writeInt32LE",4]),D.prototype.fieldSpec.push(["cov_n_n","writeFloatLE",4]),D.prototype.fieldSpec.push(["cov_n_e","writeFloatLE",4]),D.prototype.fieldSpec.push(["cov_n_d","writeFloatLE",4]),D.prototype.fieldSpec.push(["cov_e_e","writeFloatLE",4]),D.prototype.fieldSpec.push(["cov_e_d","writeFloatLE",4]),D.prototype.fieldSpec.push(["cov_d_d","writeFloatLE",4]),D.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),D.prototype.fieldSpec.push(["flags","writeUInt8",1]);var O=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_BODY",this.fields=t||this.parser.parse(e.payload),this};(O.prototype=Object.create(p.prototype)).messageType="MSG_VEL_BODY",O.prototype.msg_type=531,O.prototype.constructor=O,O.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").floatle("cov_x_x").floatle("cov_x_y").floatle("cov_x_z").floatle("cov_y_y").floatle("cov_y_z").floatle("cov_z_z").uint8("n_sats").uint8("flags"),O.prototype.fieldSpec=[],O.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),O.prototype.fieldSpec.push(["x","writeInt32LE",4]),O.prototype.fieldSpec.push(["y","writeInt32LE",4]),O.prototype.fieldSpec.push(["z","writeInt32LE",4]),O.prototype.fieldSpec.push(["cov_x_x","writeFloatLE",4]),O.prototype.fieldSpec.push(["cov_x_y","writeFloatLE",4]),O.prototype.fieldSpec.push(["cov_x_z","writeFloatLE",4]),O.prototype.fieldSpec.push(["cov_y_y","writeFloatLE",4]),O.prototype.fieldSpec.push(["cov_y_z","writeFloatLE",4]),O.prototype.fieldSpec.push(["cov_z_z","writeFloatLE",4]),O.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),O.prototype.fieldSpec.push(["flags","writeUInt8",1]);var G=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_COG",this.fields=t||this.parser.parse(e.payload),this};(G.prototype=Object.create(p.prototype)).messageType="MSG_VEL_COG",G.prototype.msg_type=540,G.prototype.constructor=G,G.prototype.parser=(new o).endianess("little").uint32("tow").uint32("cog").uint32("sog").int32("v_up").uint32("cog_accuracy").uint32("sog_accuracy").uint32("v_up_accuracy").uint16("flags"),G.prototype.fieldSpec=[],G.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),G.prototype.fieldSpec.push(["cog","writeUInt32LE",4]),G.prototype.fieldSpec.push(["sog","writeUInt32LE",4]),G.prototype.fieldSpec.push(["v_up","writeInt32LE",4]),G.prototype.fieldSpec.push(["cog_accuracy","writeUInt32LE",4]),G.prototype.fieldSpec.push(["sog_accuracy","writeUInt32LE",4]),G.prototype.fieldSpec.push(["v_up_accuracy","writeUInt32LE",4]),G.prototype.fieldSpec.push(["flags","writeUInt16LE",2]);var A=function(e,t){return p.call(this,e),this.messageType="MSG_AGE_CORRECTIONS",this.fields=t||this.parser.parse(e.payload),this};(A.prototype=Object.create(p.prototype)).messageType="MSG_AGE_CORRECTIONS",A.prototype.msg_type=528,A.prototype.constructor=A,A.prototype.parser=(new o).endianess("little").uint32("tow").uint16("age"),A.prototype.fieldSpec=[],A.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),A.prototype.fieldSpec.push(["age","writeUInt16LE",2]);var C=function(e,t){return p.call(this,e),this.messageType="MSG_GPS_TIME_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(C.prototype=Object.create(p.prototype)).messageType="MSG_GPS_TIME_DEP_A",C.prototype.msg_type=256,C.prototype.constructor=C,C.prototype.parser=(new o).endianess("little").uint16("wn").uint32("tow").int32("ns_residual").uint8("flags"),C.prototype.fieldSpec=[],C.prototype.fieldSpec.push(["wn","writeUInt16LE",2]),C.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),C.prototype.fieldSpec.push(["ns_residual","writeInt32LE",4]),C.prototype.fieldSpec.push(["flags","writeUInt8",1]);var R=function(e,t){return p.call(this,e),this.messageType="MSG_DOPS_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(R.prototype=Object.create(p.prototype)).messageType="MSG_DOPS_DEP_A",R.prototype.msg_type=518,R.prototype.constructor=R,R.prototype.parser=(new o).endianess("little").uint32("tow").uint16("gdop").uint16("pdop").uint16("tdop").uint16("hdop").uint16("vdop"),R.prototype.fieldSpec=[],R.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),R.prototype.fieldSpec.push(["gdop","writeUInt16LE",2]),R.prototype.fieldSpec.push(["pdop","writeUInt16LE",2]),R.prototype.fieldSpec.push(["tdop","writeUInt16LE",2]),R.prototype.fieldSpec.push(["hdop","writeUInt16LE",2]),R.prototype.fieldSpec.push(["vdop","writeUInt16LE",2]);var P=function(e,t){return p.call(this,e),this.messageType="MSG_POS_ECEF_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(P.prototype=Object.create(p.prototype)).messageType="MSG_POS_ECEF_DEP_A",P.prototype.msg_type=512,P.prototype.constructor=P,P.prototype.parser=(new o).endianess("little").uint32("tow").doublele("x").doublele("y").doublele("z").uint16("accuracy").uint8("n_sats").uint8("flags"),P.prototype.fieldSpec=[],P.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),P.prototype.fieldSpec.push(["x","writeDoubleLE",8]),P.prototype.fieldSpec.push(["y","writeDoubleLE",8]),P.prototype.fieldSpec.push(["z","writeDoubleLE",8]),P.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),P.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),P.prototype.fieldSpec.push(["flags","writeUInt8",1]);var N=function(e,t){return p.call(this,e),this.messageType="MSG_POS_LLH_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(N.prototype=Object.create(p.prototype)).messageType="MSG_POS_LLH_DEP_A",N.prototype.msg_type=513,N.prototype.constructor=N,N.prototype.parser=(new o).endianess("little").uint32("tow").doublele("lat").doublele("lon").doublele("height").uint16("h_accuracy").uint16("v_accuracy").uint8("n_sats").uint8("flags"),N.prototype.fieldSpec=[],N.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),N.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),N.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),N.prototype.fieldSpec.push(["height","writeDoubleLE",8]),N.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),N.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),N.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),N.prototype.fieldSpec.push(["flags","writeUInt8",1]);var j=function(e,t){return p.call(this,e),this.messageType="MSG_BASELINE_ECEF_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(j.prototype=Object.create(p.prototype)).messageType="MSG_BASELINE_ECEF_DEP_A",j.prototype.msg_type=514,j.prototype.constructor=j,j.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").uint16("accuracy").uint8("n_sats").uint8("flags"),j.prototype.fieldSpec=[],j.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),j.prototype.fieldSpec.push(["x","writeInt32LE",4]),j.prototype.fieldSpec.push(["y","writeInt32LE",4]),j.prototype.fieldSpec.push(["z","writeInt32LE",4]),j.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),j.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),j.prototype.fieldSpec.push(["flags","writeUInt8",1]);var x=function(e,t){return p.call(this,e),this.messageType="MSG_BASELINE_NED_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(x.prototype=Object.create(p.prototype)).messageType="MSG_BASELINE_NED_DEP_A",x.prototype.msg_type=515,x.prototype.constructor=x,x.prototype.parser=(new o).endianess("little").uint32("tow").int32("n").int32("e").int32("d").uint16("h_accuracy").uint16("v_accuracy").uint8("n_sats").uint8("flags"),x.prototype.fieldSpec=[],x.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),x.prototype.fieldSpec.push(["n","writeInt32LE",4]),x.prototype.fieldSpec.push(["e","writeInt32LE",4]),x.prototype.fieldSpec.push(["d","writeInt32LE",4]),x.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),x.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),x.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),x.prototype.fieldSpec.push(["flags","writeUInt8",1]);var k=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_ECEF_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(k.prototype=Object.create(p.prototype)).messageType="MSG_VEL_ECEF_DEP_A",k.prototype.msg_type=516,k.prototype.constructor=k,k.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").uint16("accuracy").uint8("n_sats").uint8("flags"),k.prototype.fieldSpec=[],k.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),k.prototype.fieldSpec.push(["x","writeInt32LE",4]),k.prototype.fieldSpec.push(["y","writeInt32LE",4]),k.prototype.fieldSpec.push(["z","writeInt32LE",4]),k.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),k.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),k.prototype.fieldSpec.push(["flags","writeUInt8",1]);var F=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_NED_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(F.prototype=Object.create(p.prototype)).messageType="MSG_VEL_NED_DEP_A",F.prototype.msg_type=517,F.prototype.constructor=F,F.prototype.parser=(new o).endianess("little").uint32("tow").int32("n").int32("e").int32("d").uint16("h_accuracy").uint16("v_accuracy").uint8("n_sats").uint8("flags"),F.prototype.fieldSpec=[],F.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),F.prototype.fieldSpec.push(["n","writeInt32LE",4]),F.prototype.fieldSpec.push(["e","writeInt32LE",4]),F.prototype.fieldSpec.push(["d","writeInt32LE",4]),F.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),F.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),F.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),F.prototype.fieldSpec.push(["flags","writeUInt8",1]);var B=function(e,t){return p.call(this,e),this.messageType="MSG_BASELINE_HEADING_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(B.prototype=Object.create(p.prototype)).messageType="MSG_BASELINE_HEADING_DEP_A",B.prototype.msg_type=519,B.prototype.constructor=B,B.prototype.parser=(new o).endianess("little").uint32("tow").uint32("heading").uint8("n_sats").uint8("flags"),B.prototype.fieldSpec=[],B.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),B.prototype.fieldSpec.push(["heading","writeUInt32LE",4]),B.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),B.prototype.fieldSpec.push(["flags","writeUInt8",1]);var q=function(e,t){return p.call(this,e),this.messageType="MSG_PROTECTION_LEVEL_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(q.prototype=Object.create(p.prototype)).messageType="MSG_PROTECTION_LEVEL_DEP_A",q.prototype.msg_type=534,q.prototype.constructor=q,q.prototype.parser=(new o).endianess("little").uint32("tow").uint16("vpl").uint16("hpl").doublele("lat").doublele("lon").doublele("height").uint8("flags"),q.prototype.fieldSpec=[],q.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),q.prototype.fieldSpec.push(["vpl","writeUInt16LE",2]),q.prototype.fieldSpec.push(["hpl","writeUInt16LE",2]),q.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),q.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),q.prototype.fieldSpec.push(["height","writeDoubleLE",8]),q.prototype.fieldSpec.push(["flags","writeUInt8",1]);var z=function(e,t){return p.call(this,e),this.messageType="MSG_PROTECTION_LEVEL",this.fields=t||this.parser.parse(e.payload),this};(z.prototype=Object.create(p.prototype)).messageType="MSG_PROTECTION_LEVEL",z.prototype.msg_type=535,z.prototype.constructor=z,z.prototype.parser=(new o).endianess("little").uint32("tow").int16("wn").uint16("hpl").uint16("vpl").uint16("atpl").uint16("ctpl").uint16("hvpl").uint16("vvpl").uint16("hopl").uint16("popl").uint16("ropl").doublele("lat").doublele("lon").doublele("height").int32("v_x").int32("v_y").int32("v_z").int32("roll").int32("pitch").int32("heading").uint32("flags"),z.prototype.fieldSpec=[],z.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),z.prototype.fieldSpec.push(["wn","writeInt16LE",2]),z.prototype.fieldSpec.push(["hpl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["vpl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["atpl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["ctpl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["hvpl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["vvpl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["hopl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["popl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["ropl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),z.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),z.prototype.fieldSpec.push(["height","writeDoubleLE",8]),z.prototype.fieldSpec.push(["v_x","writeInt32LE",4]),z.prototype.fieldSpec.push(["v_y","writeInt32LE",4]),z.prototype.fieldSpec.push(["v_z","writeInt32LE",4]),z.prototype.fieldSpec.push(["roll","writeInt32LE",4]),z.prototype.fieldSpec.push(["pitch","writeInt32LE",4]),z.prototype.fieldSpec.push(["heading","writeInt32LE",4]),z.prototype.fieldSpec.push(["flags","writeUInt32LE",4]),e.exports={258:i,MsgGpsTime:i,260:s,MsgGpsTimeGnss:s,259:n,MsgUtcTime:n,261:a,MsgUtcTimeGnss:a,520:l,MsgDops:l,521:c,MsgPosEcef:c,532:u,MsgPosEcefCov:u,522:y,MsgPosLlh:y,529:h,MsgPosLlhCov:h,EstimatedHorizontalErrorEllipse:f,536:d,MsgPosLlhAcc:d,523:_,MsgBaselineEcef:_,524:S,MsgBaselineNed:S,525:g,MsgVelEcef:g,533:w,MsgVelEcefCov:w,526:E,MsgVelNed:E,530:m,MsgVelNedCov:m,553:b,MsgPosEcefGnss:b,564:v,MsgPosEcefCovGnss:v,554:I,MsgPosLlhGnss:I,561:L,MsgPosLlhCovGnss:L,557:T,MsgVelEcefGnss:T,565:U,MsgVelEcefCovGnss:U,558:M,MsgVelNedGnss:M,562:D,MsgVelNedCovGnss:D,531:O,MsgVelBody:O,540:G,MsgVelCog:G,528:A,MsgAgeCorrections:A,256:C,MsgGpsTimeDepA:C,518:R,MsgDopsDepA:R,512:P,MsgPosEcefDepA:P,513:N,MsgPosLlhDepA:N,514:j,MsgBaselineEcefDepA:j,515:x,MsgBaselineNedDepA:x,516:k,MsgVelEcefDepA:k,517:F,MsgVelNedDepA:F,519:B,MsgBaselineHeadingDepA:B,534:q,MsgProtectionLevelDepA:q,535:z,MsgProtectionLevel:z}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,r(0).CarrierPhase,r(0).GnssSignal),s=(r(0).GnssSignalDep,r(0).GPSTime,r(0).GPSTimeDep,r(0).GPSTimeSec,r(0).SvId,function(e,t){return p.call(this,e),this.messageType="MSG_NDB_EVENT",this.fields=t||this.parser.parse(e.payload),this});(s.prototype=Object.create(p.prototype)).messageType="MSG_NDB_EVENT",s.prototype.msg_type=1024,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint64("recv_time").uint8("event").uint8("object_type").uint8("result").uint8("data_source").nest("object_sid",{type:i.prototype.parser}).nest("src_sid",{type:i.prototype.parser}).uint16("original_sender"),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["recv_time","writeUInt64LE",8]),s.prototype.fieldSpec.push(["event","writeUInt8",1]),s.prototype.fieldSpec.push(["object_type","writeUInt8",1]),s.prototype.fieldSpec.push(["result","writeUInt8",1]),s.prototype.fieldSpec.push(["data_source","writeUInt8",1]),s.prototype.fieldSpec.push(["object_sid",i.prototype.fieldSpec]),s.prototype.fieldSpec.push(["src_sid",i.prototype.fieldSpec]),s.prototype.fieldSpec.push(["original_sender","writeUInt16LE",2]),e.exports={1024:s,MsgNdbEvent:s}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,r(0).CarrierPhase),s=r(0).GnssSignal,n=r(0).GnssSignalDep,a=r(0).GPSTime,l=r(0).GPSTimeDep,c=r(0).GPSTimeSec,u=(r(0).SvId,function(e,t){return p.call(this,e),this.messageType="ObservationHeader",this.fields=t||this.parser.parse(e.payload),this});(u.prototype=Object.create(p.prototype)).messageType="ObservationHeader",u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").nest("t",{type:a.prototype.parser}).uint8("n_obs"),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["t",a.prototype.fieldSpec]),u.prototype.fieldSpec.push(["n_obs","writeUInt8",1]);var y=function(e,t){return p.call(this,e),this.messageType="Doppler",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="Doppler",y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").int16("i").uint8("f"),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["i","writeInt16LE",2]),y.prototype.fieldSpec.push(["f","writeUInt8",1]);var h=function(e,t){return p.call(this,e),this.messageType="PackedObsContent",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="PackedObsContent",h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").uint32("P").nest("L",{type:i.prototype.parser}).nest("D",{type:y.prototype.parser}).uint8("cn0").uint8("lock").uint8("flags").nest("sid",{type:s.prototype.parser}),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["P","writeUInt32LE",4]),h.prototype.fieldSpec.push(["L",i.prototype.fieldSpec]),h.prototype.fieldSpec.push(["D",y.prototype.fieldSpec]),h.prototype.fieldSpec.push(["cn0","writeUInt8",1]),h.prototype.fieldSpec.push(["lock","writeUInt8",1]),h.prototype.fieldSpec.push(["flags","writeUInt8",1]),h.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]);var f=function(e,t){return p.call(this,e),this.messageType="PackedOsrContent",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="PackedOsrContent",f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").uint32("P").nest("L",{type:i.prototype.parser}).uint8("lock").uint8("flags").nest("sid",{type:s.prototype.parser}).uint16("iono_std").uint16("tropo_std").uint16("range_std"),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["P","writeUInt32LE",4]),f.prototype.fieldSpec.push(["L",i.prototype.fieldSpec]),f.prototype.fieldSpec.push(["lock","writeUInt8",1]),f.prototype.fieldSpec.push(["flags","writeUInt8",1]),f.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),f.prototype.fieldSpec.push(["iono_std","writeUInt16LE",2]),f.prototype.fieldSpec.push(["tropo_std","writeUInt16LE",2]),f.prototype.fieldSpec.push(["range_std","writeUInt16LE",2]);var d=function(e,t){return p.call(this,e),this.messageType="MSG_OBS",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(p.prototype)).messageType="MSG_OBS",d.prototype.msg_type=74,d.prototype.constructor=d,d.prototype.parser=(new o).endianess("little").nest("header",{type:u.prototype.parser}).array("obs",{type:h.prototype.parser,readUntil:"eof"}),d.prototype.fieldSpec=[],d.prototype.fieldSpec.push(["header",u.prototype.fieldSpec]),d.prototype.fieldSpec.push(["obs","array",h.prototype.fieldSpec,function(){return this.fields.array.length},null]);var _=function(e,t){return p.call(this,e),this.messageType="MSG_BASE_POS_LLH",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(p.prototype)).messageType="MSG_BASE_POS_LLH",_.prototype.msg_type=68,_.prototype.constructor=_,_.prototype.parser=(new o).endianess("little").doublele("lat").doublele("lon").doublele("height"),_.prototype.fieldSpec=[],_.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),_.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),_.prototype.fieldSpec.push(["height","writeDoubleLE",8]);var S=function(e,t){return p.call(this,e),this.messageType="MSG_BASE_POS_ECEF",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(p.prototype)).messageType="MSG_BASE_POS_ECEF",S.prototype.msg_type=72,S.prototype.constructor=S,S.prototype.parser=(new o).endianess("little").doublele("x").doublele("y").doublele("z"),S.prototype.fieldSpec=[],S.prototype.fieldSpec.push(["x","writeDoubleLE",8]),S.prototype.fieldSpec.push(["y","writeDoubleLE",8]),S.prototype.fieldSpec.push(["z","writeDoubleLE",8]);var g=function(e,t){return p.call(this,e),this.messageType="EphemerisCommonContent",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(p.prototype)).messageType="EphemerisCommonContent",g.prototype.constructor=g,g.prototype.parser=(new o).endianess("little").nest("sid",{type:s.prototype.parser}).nest("toe",{type:c.prototype.parser}).floatle("ura").uint32("fit_interval").uint8("valid").uint8("health_bits"),g.prototype.fieldSpec=[],g.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),g.prototype.fieldSpec.push(["toe",c.prototype.fieldSpec]),g.prototype.fieldSpec.push(["ura","writeFloatLE",4]),g.prototype.fieldSpec.push(["fit_interval","writeUInt32LE",4]),g.prototype.fieldSpec.push(["valid","writeUInt8",1]),g.prototype.fieldSpec.push(["health_bits","writeUInt8",1]);var w=function(e,t){return p.call(this,e),this.messageType="EphemerisCommonContentDepB",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(p.prototype)).messageType="EphemerisCommonContentDepB",w.prototype.constructor=w,w.prototype.parser=(new o).endianess("little").nest("sid",{type:s.prototype.parser}).nest("toe",{type:c.prototype.parser}).doublele("ura").uint32("fit_interval").uint8("valid").uint8("health_bits"),w.prototype.fieldSpec=[],w.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),w.prototype.fieldSpec.push(["toe",c.prototype.fieldSpec]),w.prototype.fieldSpec.push(["ura","writeDoubleLE",8]),w.prototype.fieldSpec.push(["fit_interval","writeUInt32LE",4]),w.prototype.fieldSpec.push(["valid","writeUInt8",1]),w.prototype.fieldSpec.push(["health_bits","writeUInt8",1]);var E=function(e,t){return p.call(this,e),this.messageType="EphemerisCommonContentDepA",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(p.prototype)).messageType="EphemerisCommonContentDepA",E.prototype.constructor=E,E.prototype.parser=(new o).endianess("little").nest("sid",{type:n.prototype.parser}).nest("toe",{type:l.prototype.parser}).doublele("ura").uint32("fit_interval").uint8("valid").uint8("health_bits"),E.prototype.fieldSpec=[],E.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),E.prototype.fieldSpec.push(["toe",l.prototype.fieldSpec]),E.prototype.fieldSpec.push(["ura","writeDoubleLE",8]),E.prototype.fieldSpec.push(["fit_interval","writeUInt32LE",4]),E.prototype.fieldSpec.push(["valid","writeUInt8",1]),E.prototype.fieldSpec.push(["health_bits","writeUInt8",1]);var m=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GPS_DEP_E",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GPS_DEP_E",m.prototype.msg_type=129,m.prototype.constructor=m,m.prototype.parser=(new o).endianess("little").nest("common",{type:E.prototype.parser}).doublele("tgd").doublele("c_rs").doublele("c_rc").doublele("c_uc").doublele("c_us").doublele("c_ic").doublele("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").doublele("af1").doublele("af2").nest("toc",{type:l.prototype.parser}).uint8("iode").uint16("iodc"),m.prototype.fieldSpec=[],m.prototype.fieldSpec.push(["common",E.prototype.fieldSpec]),m.prototype.fieldSpec.push(["tgd","writeDoubleLE",8]),m.prototype.fieldSpec.push(["c_rs","writeDoubleLE",8]),m.prototype.fieldSpec.push(["c_rc","writeDoubleLE",8]),m.prototype.fieldSpec.push(["c_uc","writeDoubleLE",8]),m.prototype.fieldSpec.push(["c_us","writeDoubleLE",8]),m.prototype.fieldSpec.push(["c_ic","writeDoubleLE",8]),m.prototype.fieldSpec.push(["c_is","writeDoubleLE",8]),m.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),m.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),m.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),m.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),m.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),m.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),m.prototype.fieldSpec.push(["w","writeDoubleLE",8]),m.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),m.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),m.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),m.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),m.prototype.fieldSpec.push(["af2","writeDoubleLE",8]),m.prototype.fieldSpec.push(["toc",l.prototype.fieldSpec]),m.prototype.fieldSpec.push(["iode","writeUInt8",1]),m.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]);var b=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GPS_DEP_F",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GPS_DEP_F",b.prototype.msg_type=134,b.prototype.constructor=b,b.prototype.parser=(new o).endianess("little").nest("common",{type:w.prototype.parser}).doublele("tgd").doublele("c_rs").doublele("c_rc").doublele("c_uc").doublele("c_us").doublele("c_ic").doublele("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").doublele("af1").doublele("af2").nest("toc",{type:c.prototype.parser}).uint8("iode").uint16("iodc"),b.prototype.fieldSpec=[],b.prototype.fieldSpec.push(["common",w.prototype.fieldSpec]),b.prototype.fieldSpec.push(["tgd","writeDoubleLE",8]),b.prototype.fieldSpec.push(["c_rs","writeDoubleLE",8]),b.prototype.fieldSpec.push(["c_rc","writeDoubleLE",8]),b.prototype.fieldSpec.push(["c_uc","writeDoubleLE",8]),b.prototype.fieldSpec.push(["c_us","writeDoubleLE",8]),b.prototype.fieldSpec.push(["c_ic","writeDoubleLE",8]),b.prototype.fieldSpec.push(["c_is","writeDoubleLE",8]),b.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),b.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),b.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),b.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),b.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),b.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),b.prototype.fieldSpec.push(["w","writeDoubleLE",8]),b.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),b.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),b.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),b.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),b.prototype.fieldSpec.push(["af2","writeDoubleLE",8]),b.prototype.fieldSpec.push(["toc",c.prototype.fieldSpec]),b.prototype.fieldSpec.push(["iode","writeUInt8",1]),b.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]);var v=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GPS",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GPS",v.prototype.msg_type=138,v.prototype.constructor=v,v.prototype.parser=(new o).endianess("little").nest("common",{type:g.prototype.parser}).floatle("tgd").floatle("c_rs").floatle("c_rc").floatle("c_uc").floatle("c_us").floatle("c_ic").floatle("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").floatle("af0").floatle("af1").floatle("af2").nest("toc",{type:c.prototype.parser}).uint8("iode").uint16("iodc"),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),v.prototype.fieldSpec.push(["tgd","writeFloatLE",4]),v.prototype.fieldSpec.push(["c_rs","writeFloatLE",4]),v.prototype.fieldSpec.push(["c_rc","writeFloatLE",4]),v.prototype.fieldSpec.push(["c_uc","writeFloatLE",4]),v.prototype.fieldSpec.push(["c_us","writeFloatLE",4]),v.prototype.fieldSpec.push(["c_ic","writeFloatLE",4]),v.prototype.fieldSpec.push(["c_is","writeFloatLE",4]),v.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),v.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),v.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),v.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),v.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),v.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),v.prototype.fieldSpec.push(["w","writeDoubleLE",8]),v.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),v.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),v.prototype.fieldSpec.push(["af0","writeFloatLE",4]),v.prototype.fieldSpec.push(["af1","writeFloatLE",4]),v.prototype.fieldSpec.push(["af2","writeFloatLE",4]),v.prototype.fieldSpec.push(["toc",c.prototype.fieldSpec]),v.prototype.fieldSpec.push(["iode","writeUInt8",1]),v.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]);var I=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_QZSS",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_QZSS",I.prototype.msg_type=142,I.prototype.constructor=I,I.prototype.parser=(new o).endianess("little").nest("common",{type:g.prototype.parser}).floatle("tgd").floatle("c_rs").floatle("c_rc").floatle("c_uc").floatle("c_us").floatle("c_ic").floatle("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").floatle("af0").floatle("af1").floatle("af2").nest("toc",{type:c.prototype.parser}).uint8("iode").uint16("iodc"),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),I.prototype.fieldSpec.push(["tgd","writeFloatLE",4]),I.prototype.fieldSpec.push(["c_rs","writeFloatLE",4]),I.prototype.fieldSpec.push(["c_rc","writeFloatLE",4]),I.prototype.fieldSpec.push(["c_uc","writeFloatLE",4]),I.prototype.fieldSpec.push(["c_us","writeFloatLE",4]),I.prototype.fieldSpec.push(["c_ic","writeFloatLE",4]),I.prototype.fieldSpec.push(["c_is","writeFloatLE",4]),I.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),I.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),I.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),I.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),I.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),I.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),I.prototype.fieldSpec.push(["w","writeDoubleLE",8]),I.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),I.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),I.prototype.fieldSpec.push(["af0","writeFloatLE",4]),I.prototype.fieldSpec.push(["af1","writeFloatLE",4]),I.prototype.fieldSpec.push(["af2","writeFloatLE",4]),I.prototype.fieldSpec.push(["toc",c.prototype.fieldSpec]),I.prototype.fieldSpec.push(["iode","writeUInt8",1]),I.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]);var L=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_BDS",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_BDS",L.prototype.msg_type=137,L.prototype.constructor=L,L.prototype.parser=(new o).endianess("little").nest("common",{type:g.prototype.parser}).floatle("tgd1").floatle("tgd2").floatle("c_rs").floatle("c_rc").floatle("c_uc").floatle("c_us").floatle("c_ic").floatle("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").floatle("af1").floatle("af2").nest("toc",{type:c.prototype.parser}).uint8("iode").uint16("iodc"),L.prototype.fieldSpec=[],L.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),L.prototype.fieldSpec.push(["tgd1","writeFloatLE",4]),L.prototype.fieldSpec.push(["tgd2","writeFloatLE",4]),L.prototype.fieldSpec.push(["c_rs","writeFloatLE",4]),L.prototype.fieldSpec.push(["c_rc","writeFloatLE",4]),L.prototype.fieldSpec.push(["c_uc","writeFloatLE",4]),L.prototype.fieldSpec.push(["c_us","writeFloatLE",4]),L.prototype.fieldSpec.push(["c_ic","writeFloatLE",4]),L.prototype.fieldSpec.push(["c_is","writeFloatLE",4]),L.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),L.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),L.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),L.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),L.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),L.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),L.prototype.fieldSpec.push(["w","writeDoubleLE",8]),L.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),L.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),L.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),L.prototype.fieldSpec.push(["af1","writeFloatLE",4]),L.prototype.fieldSpec.push(["af2","writeFloatLE",4]),L.prototype.fieldSpec.push(["toc",c.prototype.fieldSpec]),L.prototype.fieldSpec.push(["iode","writeUInt8",1]),L.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]);var T=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GAL_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(T.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GAL_DEP_A",T.prototype.msg_type=149,T.prototype.constructor=T,T.prototype.parser=(new o).endianess("little").nest("common",{type:g.prototype.parser}).floatle("bgd_e1e5a").floatle("bgd_e1e5b").floatle("c_rs").floatle("c_rc").floatle("c_uc").floatle("c_us").floatle("c_ic").floatle("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").doublele("af1").floatle("af2").nest("toc",{type:c.prototype.parser}).uint16("iode").uint16("iodc"),T.prototype.fieldSpec=[],T.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),T.prototype.fieldSpec.push(["bgd_e1e5a","writeFloatLE",4]),T.prototype.fieldSpec.push(["bgd_e1e5b","writeFloatLE",4]),T.prototype.fieldSpec.push(["c_rs","writeFloatLE",4]),T.prototype.fieldSpec.push(["c_rc","writeFloatLE",4]),T.prototype.fieldSpec.push(["c_uc","writeFloatLE",4]),T.prototype.fieldSpec.push(["c_us","writeFloatLE",4]),T.prototype.fieldSpec.push(["c_ic","writeFloatLE",4]),T.prototype.fieldSpec.push(["c_is","writeFloatLE",4]),T.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),T.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),T.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),T.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),T.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),T.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),T.prototype.fieldSpec.push(["w","writeDoubleLE",8]),T.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),T.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),T.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),T.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),T.prototype.fieldSpec.push(["af2","writeFloatLE",4]),T.prototype.fieldSpec.push(["toc",c.prototype.fieldSpec]),T.prototype.fieldSpec.push(["iode","writeUInt16LE",2]),T.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]);var U=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GAL",this.fields=t||this.parser.parse(e.payload),this};(U.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GAL",U.prototype.msg_type=141,U.prototype.constructor=U,U.prototype.parser=(new o).endianess("little").nest("common",{type:g.prototype.parser}).floatle("bgd_e1e5a").floatle("bgd_e1e5b").floatle("c_rs").floatle("c_rc").floatle("c_uc").floatle("c_us").floatle("c_ic").floatle("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").doublele("af1").floatle("af2").nest("toc",{type:c.prototype.parser}).uint16("iode").uint16("iodc").uint8("source"),U.prototype.fieldSpec=[],U.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),U.prototype.fieldSpec.push(["bgd_e1e5a","writeFloatLE",4]),U.prototype.fieldSpec.push(["bgd_e1e5b","writeFloatLE",4]),U.prototype.fieldSpec.push(["c_rs","writeFloatLE",4]),U.prototype.fieldSpec.push(["c_rc","writeFloatLE",4]),U.prototype.fieldSpec.push(["c_uc","writeFloatLE",4]),U.prototype.fieldSpec.push(["c_us","writeFloatLE",4]),U.prototype.fieldSpec.push(["c_ic","writeFloatLE",4]),U.prototype.fieldSpec.push(["c_is","writeFloatLE",4]),U.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),U.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),U.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),U.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),U.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),U.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),U.prototype.fieldSpec.push(["w","writeDoubleLE",8]),U.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),U.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),U.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),U.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),U.prototype.fieldSpec.push(["af2","writeFloatLE",4]),U.prototype.fieldSpec.push(["toc",c.prototype.fieldSpec]),U.prototype.fieldSpec.push(["iode","writeUInt16LE",2]),U.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]),U.prototype.fieldSpec.push(["source","writeUInt8",1]);var M=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_SBAS_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(M.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_SBAS_DEP_A",M.prototype.msg_type=130,M.prototype.constructor=M,M.prototype.parser=(new o).endianess("little").nest("common",{type:E.prototype.parser}).array("pos",{length:3,type:"doublele"}).array("vel",{length:3,type:"doublele"}).array("acc",{length:3,type:"doublele"}).doublele("a_gf0").doublele("a_gf1"),M.prototype.fieldSpec=[],M.prototype.fieldSpec.push(["common",E.prototype.fieldSpec]),M.prototype.fieldSpec.push(["pos","array","writeDoubleLE",function(){return 8},3]),M.prototype.fieldSpec.push(["vel","array","writeDoubleLE",function(){return 8},3]),M.prototype.fieldSpec.push(["acc","array","writeDoubleLE",function(){return 8},3]),M.prototype.fieldSpec.push(["a_gf0","writeDoubleLE",8]),M.prototype.fieldSpec.push(["a_gf1","writeDoubleLE",8]);var D=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GLO_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(D.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GLO_DEP_A",D.prototype.msg_type=131,D.prototype.constructor=D,D.prototype.parser=(new o).endianess("little").nest("common",{type:E.prototype.parser}).doublele("gamma").doublele("tau").array("pos",{length:3,type:"doublele"}).array("vel",{length:3,type:"doublele"}).array("acc",{length:3,type:"doublele"}),D.prototype.fieldSpec=[],D.prototype.fieldSpec.push(["common",E.prototype.fieldSpec]),D.prototype.fieldSpec.push(["gamma","writeDoubleLE",8]),D.prototype.fieldSpec.push(["tau","writeDoubleLE",8]),D.prototype.fieldSpec.push(["pos","array","writeDoubleLE",function(){return 8},3]),D.prototype.fieldSpec.push(["vel","array","writeDoubleLE",function(){return 8},3]),D.prototype.fieldSpec.push(["acc","array","writeDoubleLE",function(){return 8},3]);var O=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_SBAS_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(O.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_SBAS_DEP_B",O.prototype.msg_type=132,O.prototype.constructor=O,O.prototype.parser=(new o).endianess("little").nest("common",{type:w.prototype.parser}).array("pos",{length:3,type:"doublele"}).array("vel",{length:3,type:"doublele"}).array("acc",{length:3,type:"doublele"}).doublele("a_gf0").doublele("a_gf1"),O.prototype.fieldSpec=[],O.prototype.fieldSpec.push(["common",w.prototype.fieldSpec]),O.prototype.fieldSpec.push(["pos","array","writeDoubleLE",function(){return 8},3]),O.prototype.fieldSpec.push(["vel","array","writeDoubleLE",function(){return 8},3]),O.prototype.fieldSpec.push(["acc","array","writeDoubleLE",function(){return 8},3]),O.prototype.fieldSpec.push(["a_gf0","writeDoubleLE",8]),O.prototype.fieldSpec.push(["a_gf1","writeDoubleLE",8]);var G=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_SBAS",this.fields=t||this.parser.parse(e.payload),this};(G.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_SBAS",G.prototype.msg_type=140,G.prototype.constructor=G,G.prototype.parser=(new o).endianess("little").nest("common",{type:g.prototype.parser}).array("pos",{length:3,type:"doublele"}).array("vel",{length:3,type:"floatle"}).array("acc",{length:3,type:"floatle"}).floatle("a_gf0").floatle("a_gf1"),G.prototype.fieldSpec=[],G.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),G.prototype.fieldSpec.push(["pos","array","writeDoubleLE",function(){return 8},3]),G.prototype.fieldSpec.push(["vel","array","writeFloatLE",function(){return 4},3]),G.prototype.fieldSpec.push(["acc","array","writeFloatLE",function(){return 4},3]),G.prototype.fieldSpec.push(["a_gf0","writeFloatLE",4]),G.prototype.fieldSpec.push(["a_gf1","writeFloatLE",4]);var A=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GLO_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(A.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GLO_DEP_B",A.prototype.msg_type=133,A.prototype.constructor=A,A.prototype.parser=(new o).endianess("little").nest("common",{type:w.prototype.parser}).doublele("gamma").doublele("tau").array("pos",{length:3,type:"doublele"}).array("vel",{length:3,type:"doublele"}).array("acc",{length:3,type:"doublele"}),A.prototype.fieldSpec=[],A.prototype.fieldSpec.push(["common",w.prototype.fieldSpec]),A.prototype.fieldSpec.push(["gamma","writeDoubleLE",8]),A.prototype.fieldSpec.push(["tau","writeDoubleLE",8]),A.prototype.fieldSpec.push(["pos","array","writeDoubleLE",function(){return 8},3]),A.prototype.fieldSpec.push(["vel","array","writeDoubleLE",function(){return 8},3]),A.prototype.fieldSpec.push(["acc","array","writeDoubleLE",function(){return 8},3]);var C=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GLO_DEP_C",this.fields=t||this.parser.parse(e.payload),this};(C.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GLO_DEP_C",C.prototype.msg_type=135,C.prototype.constructor=C,C.prototype.parser=(new o).endianess("little").nest("common",{type:w.prototype.parser}).doublele("gamma").doublele("tau").doublele("d_tau").array("pos",{length:3,type:"doublele"}).array("vel",{length:3,type:"doublele"}).array("acc",{length:3,type:"doublele"}).uint8("fcn"),C.prototype.fieldSpec=[],C.prototype.fieldSpec.push(["common",w.prototype.fieldSpec]),C.prototype.fieldSpec.push(["gamma","writeDoubleLE",8]),C.prototype.fieldSpec.push(["tau","writeDoubleLE",8]),C.prototype.fieldSpec.push(["d_tau","writeDoubleLE",8]),C.prototype.fieldSpec.push(["pos","array","writeDoubleLE",function(){return 8},3]),C.prototype.fieldSpec.push(["vel","array","writeDoubleLE",function(){return 8},3]),C.prototype.fieldSpec.push(["acc","array","writeDoubleLE",function(){return 8},3]),C.prototype.fieldSpec.push(["fcn","writeUInt8",1]);var R=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GLO_DEP_D",this.fields=t||this.parser.parse(e.payload),this};(R.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GLO_DEP_D",R.prototype.msg_type=136,R.prototype.constructor=R,R.prototype.parser=(new o).endianess("little").nest("common",{type:w.prototype.parser}).doublele("gamma").doublele("tau").doublele("d_tau").array("pos",{length:3,type:"doublele"}).array("vel",{length:3,type:"doublele"}).array("acc",{length:3,type:"doublele"}).uint8("fcn").uint8("iod"),R.prototype.fieldSpec=[],R.prototype.fieldSpec.push(["common",w.prototype.fieldSpec]),R.prototype.fieldSpec.push(["gamma","writeDoubleLE",8]),R.prototype.fieldSpec.push(["tau","writeDoubleLE",8]),R.prototype.fieldSpec.push(["d_tau","writeDoubleLE",8]),R.prototype.fieldSpec.push(["pos","array","writeDoubleLE",function(){return 8},3]),R.prototype.fieldSpec.push(["vel","array","writeDoubleLE",function(){return 8},3]),R.prototype.fieldSpec.push(["acc","array","writeDoubleLE",function(){return 8},3]),R.prototype.fieldSpec.push(["fcn","writeUInt8",1]),R.prototype.fieldSpec.push(["iod","writeUInt8",1]);var P=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GLO",this.fields=t||this.parser.parse(e.payload),this};(P.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GLO",P.prototype.msg_type=139,P.prototype.constructor=P,P.prototype.parser=(new o).endianess("little").nest("common",{type:g.prototype.parser}).floatle("gamma").floatle("tau").floatle("d_tau").array("pos",{length:3,type:"doublele"}).array("vel",{length:3,type:"doublele"}).array("acc",{length:3,type:"floatle"}).uint8("fcn").uint8("iod"),P.prototype.fieldSpec=[],P.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),P.prototype.fieldSpec.push(["gamma","writeFloatLE",4]),P.prototype.fieldSpec.push(["tau","writeFloatLE",4]),P.prototype.fieldSpec.push(["d_tau","writeFloatLE",4]),P.prototype.fieldSpec.push(["pos","array","writeDoubleLE",function(){return 8},3]),P.prototype.fieldSpec.push(["vel","array","writeDoubleLE",function(){return 8},3]),P.prototype.fieldSpec.push(["acc","array","writeFloatLE",function(){return 4},3]),P.prototype.fieldSpec.push(["fcn","writeUInt8",1]),P.prototype.fieldSpec.push(["iod","writeUInt8",1]);var N=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_DEP_D",this.fields=t||this.parser.parse(e.payload),this};(N.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_DEP_D",N.prototype.msg_type=128,N.prototype.constructor=N,N.prototype.parser=(new o).endianess("little").doublele("tgd").doublele("c_rs").doublele("c_rc").doublele("c_uc").doublele("c_us").doublele("c_ic").doublele("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").doublele("af1").doublele("af2").doublele("toe_tow").uint16("toe_wn").doublele("toc_tow").uint16("toc_wn").uint8("valid").uint8("healthy").nest("sid",{type:n.prototype.parser}).uint8("iode").uint16("iodc").uint32("reserved"),N.prototype.fieldSpec=[],N.prototype.fieldSpec.push(["tgd","writeDoubleLE",8]),N.prototype.fieldSpec.push(["c_rs","writeDoubleLE",8]),N.prototype.fieldSpec.push(["c_rc","writeDoubleLE",8]),N.prototype.fieldSpec.push(["c_uc","writeDoubleLE",8]),N.prototype.fieldSpec.push(["c_us","writeDoubleLE",8]),N.prototype.fieldSpec.push(["c_ic","writeDoubleLE",8]),N.prototype.fieldSpec.push(["c_is","writeDoubleLE",8]),N.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),N.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),N.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),N.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),N.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),N.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),N.prototype.fieldSpec.push(["w","writeDoubleLE",8]),N.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),N.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),N.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),N.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),N.prototype.fieldSpec.push(["af2","writeDoubleLE",8]),N.prototype.fieldSpec.push(["toe_tow","writeDoubleLE",8]),N.prototype.fieldSpec.push(["toe_wn","writeUInt16LE",2]),N.prototype.fieldSpec.push(["toc_tow","writeDoubleLE",8]),N.prototype.fieldSpec.push(["toc_wn","writeUInt16LE",2]),N.prototype.fieldSpec.push(["valid","writeUInt8",1]),N.prototype.fieldSpec.push(["healthy","writeUInt8",1]),N.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),N.prototype.fieldSpec.push(["iode","writeUInt8",1]),N.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]),N.prototype.fieldSpec.push(["reserved","writeUInt32LE",4]);var j=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(j.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_DEP_A",j.prototype.msg_type=26,j.prototype.constructor=j,j.prototype.parser=(new o).endianess("little").doublele("tgd").doublele("c_rs").doublele("c_rc").doublele("c_uc").doublele("c_us").doublele("c_ic").doublele("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").doublele("af1").doublele("af2").doublele("toe_tow").uint16("toe_wn").doublele("toc_tow").uint16("toc_wn").uint8("valid").uint8("healthy").uint8("prn"),j.prototype.fieldSpec=[],j.prototype.fieldSpec.push(["tgd","writeDoubleLE",8]),j.prototype.fieldSpec.push(["c_rs","writeDoubleLE",8]),j.prototype.fieldSpec.push(["c_rc","writeDoubleLE",8]),j.prototype.fieldSpec.push(["c_uc","writeDoubleLE",8]),j.prototype.fieldSpec.push(["c_us","writeDoubleLE",8]),j.prototype.fieldSpec.push(["c_ic","writeDoubleLE",8]),j.prototype.fieldSpec.push(["c_is","writeDoubleLE",8]),j.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),j.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),j.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),j.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),j.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),j.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),j.prototype.fieldSpec.push(["w","writeDoubleLE",8]),j.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),j.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),j.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),j.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),j.prototype.fieldSpec.push(["af2","writeDoubleLE",8]),j.prototype.fieldSpec.push(["toe_tow","writeDoubleLE",8]),j.prototype.fieldSpec.push(["toe_wn","writeUInt16LE",2]),j.prototype.fieldSpec.push(["toc_tow","writeDoubleLE",8]),j.prototype.fieldSpec.push(["toc_wn","writeUInt16LE",2]),j.prototype.fieldSpec.push(["valid","writeUInt8",1]),j.prototype.fieldSpec.push(["healthy","writeUInt8",1]),j.prototype.fieldSpec.push(["prn","writeUInt8",1]);var x=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(x.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_DEP_B",x.prototype.msg_type=70,x.prototype.constructor=x,x.prototype.parser=(new o).endianess("little").doublele("tgd").doublele("c_rs").doublele("c_rc").doublele("c_uc").doublele("c_us").doublele("c_ic").doublele("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").doublele("af1").doublele("af2").doublele("toe_tow").uint16("toe_wn").doublele("toc_tow").uint16("toc_wn").uint8("valid").uint8("healthy").uint8("prn").uint8("iode"),x.prototype.fieldSpec=[],x.prototype.fieldSpec.push(["tgd","writeDoubleLE",8]),x.prototype.fieldSpec.push(["c_rs","writeDoubleLE",8]),x.prototype.fieldSpec.push(["c_rc","writeDoubleLE",8]),x.prototype.fieldSpec.push(["c_uc","writeDoubleLE",8]),x.prototype.fieldSpec.push(["c_us","writeDoubleLE",8]),x.prototype.fieldSpec.push(["c_ic","writeDoubleLE",8]),x.prototype.fieldSpec.push(["c_is","writeDoubleLE",8]),x.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),x.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),x.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),x.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),x.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),x.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),x.prototype.fieldSpec.push(["w","writeDoubleLE",8]),x.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),x.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),x.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),x.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),x.prototype.fieldSpec.push(["af2","writeDoubleLE",8]),x.prototype.fieldSpec.push(["toe_tow","writeDoubleLE",8]),x.prototype.fieldSpec.push(["toe_wn","writeUInt16LE",2]),x.prototype.fieldSpec.push(["toc_tow","writeDoubleLE",8]),x.prototype.fieldSpec.push(["toc_wn","writeUInt16LE",2]),x.prototype.fieldSpec.push(["valid","writeUInt8",1]),x.prototype.fieldSpec.push(["healthy","writeUInt8",1]),x.prototype.fieldSpec.push(["prn","writeUInt8",1]),x.prototype.fieldSpec.push(["iode","writeUInt8",1]);var k=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_DEP_C",this.fields=t||this.parser.parse(e.payload),this};(k.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_DEP_C",k.prototype.msg_type=71,k.prototype.constructor=k,k.prototype.parser=(new o).endianess("little").doublele("tgd").doublele("c_rs").doublele("c_rc").doublele("c_uc").doublele("c_us").doublele("c_ic").doublele("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").doublele("af1").doublele("af2").doublele("toe_tow").uint16("toe_wn").doublele("toc_tow").uint16("toc_wn").uint8("valid").uint8("healthy").nest("sid",{type:n.prototype.parser}).uint8("iode").uint16("iodc").uint32("reserved"),k.prototype.fieldSpec=[],k.prototype.fieldSpec.push(["tgd","writeDoubleLE",8]),k.prototype.fieldSpec.push(["c_rs","writeDoubleLE",8]),k.prototype.fieldSpec.push(["c_rc","writeDoubleLE",8]),k.prototype.fieldSpec.push(["c_uc","writeDoubleLE",8]),k.prototype.fieldSpec.push(["c_us","writeDoubleLE",8]),k.prototype.fieldSpec.push(["c_ic","writeDoubleLE",8]),k.prototype.fieldSpec.push(["c_is","writeDoubleLE",8]),k.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),k.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),k.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),k.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),k.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),k.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),k.prototype.fieldSpec.push(["w","writeDoubleLE",8]),k.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),k.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),k.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),k.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),k.prototype.fieldSpec.push(["af2","writeDoubleLE",8]),k.prototype.fieldSpec.push(["toe_tow","writeDoubleLE",8]),k.prototype.fieldSpec.push(["toe_wn","writeUInt16LE",2]),k.prototype.fieldSpec.push(["toc_tow","writeDoubleLE",8]),k.prototype.fieldSpec.push(["toc_wn","writeUInt16LE",2]),k.prototype.fieldSpec.push(["valid","writeUInt8",1]),k.prototype.fieldSpec.push(["healthy","writeUInt8",1]),k.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),k.prototype.fieldSpec.push(["iode","writeUInt8",1]),k.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]),k.prototype.fieldSpec.push(["reserved","writeUInt32LE",4]);var F=function(e,t){return p.call(this,e),this.messageType="ObservationHeaderDep",this.fields=t||this.parser.parse(e.payload),this};(F.prototype=Object.create(p.prototype)).messageType="ObservationHeaderDep",F.prototype.constructor=F,F.prototype.parser=(new o).endianess("little").nest("t",{type:l.prototype.parser}).uint8("n_obs"),F.prototype.fieldSpec=[],F.prototype.fieldSpec.push(["t",l.prototype.fieldSpec]),F.prototype.fieldSpec.push(["n_obs","writeUInt8",1]);var B=function(e,t){return p.call(this,e),this.messageType="CarrierPhaseDepA",this.fields=t||this.parser.parse(e.payload),this};(B.prototype=Object.create(p.prototype)).messageType="CarrierPhaseDepA",B.prototype.constructor=B,B.prototype.parser=(new o).endianess("little").int32("i").uint8("f"),B.prototype.fieldSpec=[],B.prototype.fieldSpec.push(["i","writeInt32LE",4]),B.prototype.fieldSpec.push(["f","writeUInt8",1]);var q=function(e,t){return p.call(this,e),this.messageType="PackedObsContentDepA",this.fields=t||this.parser.parse(e.payload),this};(q.prototype=Object.create(p.prototype)).messageType="PackedObsContentDepA",q.prototype.constructor=q,q.prototype.parser=(new o).endianess("little").uint32("P").nest("L",{type:B.prototype.parser}).uint8("cn0").uint16("lock").uint8("prn"),q.prototype.fieldSpec=[],q.prototype.fieldSpec.push(["P","writeUInt32LE",4]),q.prototype.fieldSpec.push(["L",B.prototype.fieldSpec]),q.prototype.fieldSpec.push(["cn0","writeUInt8",1]),q.prototype.fieldSpec.push(["lock","writeUInt16LE",2]),q.prototype.fieldSpec.push(["prn","writeUInt8",1]);var z=function(e,t){return p.call(this,e),this.messageType="PackedObsContentDepB",this.fields=t||this.parser.parse(e.payload),this};(z.prototype=Object.create(p.prototype)).messageType="PackedObsContentDepB",z.prototype.constructor=z,z.prototype.parser=(new o).endianess("little").uint32("P").nest("L",{type:B.prototype.parser}).uint8("cn0").uint16("lock").nest("sid",{type:n.prototype.parser}),z.prototype.fieldSpec=[],z.prototype.fieldSpec.push(["P","writeUInt32LE",4]),z.prototype.fieldSpec.push(["L",B.prototype.fieldSpec]),z.prototype.fieldSpec.push(["cn0","writeUInt8",1]),z.prototype.fieldSpec.push(["lock","writeUInt16LE",2]),z.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]);var H=function(e,t){return p.call(this,e),this.messageType="PackedObsContentDepC",this.fields=t||this.parser.parse(e.payload),this};(H.prototype=Object.create(p.prototype)).messageType="PackedObsContentDepC",H.prototype.constructor=H,H.prototype.parser=(new o).endianess("little").uint32("P").nest("L",{type:i.prototype.parser}).uint8("cn0").uint16("lock").nest("sid",{type:n.prototype.parser}),H.prototype.fieldSpec=[],H.prototype.fieldSpec.push(["P","writeUInt32LE",4]),H.prototype.fieldSpec.push(["L",i.prototype.fieldSpec]),H.prototype.fieldSpec.push(["cn0","writeUInt8",1]),H.prototype.fieldSpec.push(["lock","writeUInt16LE",2]),H.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]);var V=function(e,t){return p.call(this,e),this.messageType="MSG_OBS_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(V.prototype=Object.create(p.prototype)).messageType="MSG_OBS_DEP_A",V.prototype.msg_type=69,V.prototype.constructor=V,V.prototype.parser=(new o).endianess("little").nest("header",{type:F.prototype.parser}).array("obs",{type:q.prototype.parser,readUntil:"eof"}),V.prototype.fieldSpec=[],V.prototype.fieldSpec.push(["header",F.prototype.fieldSpec]),V.prototype.fieldSpec.push(["obs","array",q.prototype.fieldSpec,function(){return this.fields.array.length},null]);var Y=function(e,t){return p.call(this,e),this.messageType="MSG_OBS_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(Y.prototype=Object.create(p.prototype)).messageType="MSG_OBS_DEP_B",Y.prototype.msg_type=67,Y.prototype.constructor=Y,Y.prototype.parser=(new o).endianess("little").nest("header",{type:F.prototype.parser}).array("obs",{type:z.prototype.parser,readUntil:"eof"}),Y.prototype.fieldSpec=[],Y.prototype.fieldSpec.push(["header",F.prototype.fieldSpec]),Y.prototype.fieldSpec.push(["obs","array",z.prototype.fieldSpec,function(){return this.fields.array.length},null]);var W=function(e,t){return p.call(this,e),this.messageType="MSG_OBS_DEP_C",this.fields=t||this.parser.parse(e.payload),this};(W.prototype=Object.create(p.prototype)).messageType="MSG_OBS_DEP_C",W.prototype.msg_type=73,W.prototype.constructor=W,W.prototype.parser=(new o).endianess("little").nest("header",{type:F.prototype.parser}).array("obs",{type:H.prototype.parser,readUntil:"eof"}),W.prototype.fieldSpec=[],W.prototype.fieldSpec.push(["header",F.prototype.fieldSpec]),W.prototype.fieldSpec.push(["obs","array",H.prototype.fieldSpec,function(){return this.fields.array.length},null]);var Q=function(e,t){return p.call(this,e),this.messageType="MSG_IONO",this.fields=t||this.parser.parse(e.payload),this};(Q.prototype=Object.create(p.prototype)).messageType="MSG_IONO",Q.prototype.msg_type=144,Q.prototype.constructor=Q,Q.prototype.parser=(new o).endianess("little").nest("t_nmct",{type:c.prototype.parser}).doublele("a0").doublele("a1").doublele("a2").doublele("a3").doublele("b0").doublele("b1").doublele("b2").doublele("b3"),Q.prototype.fieldSpec=[],Q.prototype.fieldSpec.push(["t_nmct",c.prototype.fieldSpec]),Q.prototype.fieldSpec.push(["a0","writeDoubleLE",8]),Q.prototype.fieldSpec.push(["a1","writeDoubleLE",8]),Q.prototype.fieldSpec.push(["a2","writeDoubleLE",8]),Q.prototype.fieldSpec.push(["a3","writeDoubleLE",8]),Q.prototype.fieldSpec.push(["b0","writeDoubleLE",8]),Q.prototype.fieldSpec.push(["b1","writeDoubleLE",8]),Q.prototype.fieldSpec.push(["b2","writeDoubleLE",8]),Q.prototype.fieldSpec.push(["b3","writeDoubleLE",8]);var K=function(e,t){return p.call(this,e),this.messageType="MSG_SV_CONFIGURATION_GPS_DEP",this.fields=t||this.parser.parse(e.payload),this};(K.prototype=Object.create(p.prototype)).messageType="MSG_SV_CONFIGURATION_GPS_DEP",K.prototype.msg_type=145,K.prototype.constructor=K,K.prototype.parser=(new o).endianess("little").nest("t_nmct",{type:c.prototype.parser}).uint32("l2c_mask"),K.prototype.fieldSpec=[],K.prototype.fieldSpec.push(["t_nmct",c.prototype.fieldSpec]),K.prototype.fieldSpec.push(["l2c_mask","writeUInt32LE",4]);var X=function(e,t){return p.call(this,e),this.messageType="GnssCapb",this.fields=t||this.parser.parse(e.payload),this};(X.prototype=Object.create(p.prototype)).messageType="GnssCapb",X.prototype.constructor=X,X.prototype.parser=(new o).endianess("little").uint64("gps_active").uint64("gps_l2c").uint64("gps_l5").uint32("glo_active").uint32("glo_l2of").uint32("glo_l3").uint64("sbas_active").uint64("sbas_l5").uint64("bds_active").uint64("bds_d2nav").uint64("bds_b2").uint64("bds_b2a").uint32("qzss_active").uint64("gal_active").uint64("gal_e5"),X.prototype.fieldSpec=[],X.prototype.fieldSpec.push(["gps_active","writeUInt64LE",8]),X.prototype.fieldSpec.push(["gps_l2c","writeUInt64LE",8]),X.prototype.fieldSpec.push(["gps_l5","writeUInt64LE",8]),X.prototype.fieldSpec.push(["glo_active","writeUInt32LE",4]),X.prototype.fieldSpec.push(["glo_l2of","writeUInt32LE",4]),X.prototype.fieldSpec.push(["glo_l3","writeUInt32LE",4]),X.prototype.fieldSpec.push(["sbas_active","writeUInt64LE",8]),X.prototype.fieldSpec.push(["sbas_l5","writeUInt64LE",8]),X.prototype.fieldSpec.push(["bds_active","writeUInt64LE",8]),X.prototype.fieldSpec.push(["bds_d2nav","writeUInt64LE",8]),X.prototype.fieldSpec.push(["bds_b2","writeUInt64LE",8]),X.prototype.fieldSpec.push(["bds_b2a","writeUInt64LE",8]),X.prototype.fieldSpec.push(["qzss_active","writeUInt32LE",4]),X.prototype.fieldSpec.push(["gal_active","writeUInt64LE",8]),X.prototype.fieldSpec.push(["gal_e5","writeUInt64LE",8]);var J=function(e,t){return p.call(this,e),this.messageType="MSG_GNSS_CAPB",this.fields=t||this.parser.parse(e.payload),this};(J.prototype=Object.create(p.prototype)).messageType="MSG_GNSS_CAPB",J.prototype.msg_type=150,J.prototype.constructor=J,J.prototype.parser=(new o).endianess("little").nest("t_nmct",{type:c.prototype.parser}).nest("gc",{type:X.prototype.parser}),J.prototype.fieldSpec=[],J.prototype.fieldSpec.push(["t_nmct",c.prototype.fieldSpec]),J.prototype.fieldSpec.push(["gc",X.prototype.fieldSpec]);var $=function(e,t){return p.call(this,e),this.messageType="MSG_GROUP_DELAY_DEP_A",this.fields=t||this.parser.parse(e.payload),this};($.prototype=Object.create(p.prototype)).messageType="MSG_GROUP_DELAY_DEP_A",$.prototype.msg_type=146,$.prototype.constructor=$,$.prototype.parser=(new o).endianess("little").nest("t_op",{type:l.prototype.parser}).uint8("prn").uint8("valid").int16("tgd").int16("isc_l1ca").int16("isc_l2c"),$.prototype.fieldSpec=[],$.prototype.fieldSpec.push(["t_op",l.prototype.fieldSpec]),$.prototype.fieldSpec.push(["prn","writeUInt8",1]),$.prototype.fieldSpec.push(["valid","writeUInt8",1]),$.prototype.fieldSpec.push(["tgd","writeInt16LE",2]),$.prototype.fieldSpec.push(["isc_l1ca","writeInt16LE",2]),$.prototype.fieldSpec.push(["isc_l2c","writeInt16LE",2]);var Z=function(e,t){return p.call(this,e),this.messageType="MSG_GROUP_DELAY_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(Z.prototype=Object.create(p.prototype)).messageType="MSG_GROUP_DELAY_DEP_B",Z.prototype.msg_type=147,Z.prototype.constructor=Z,Z.prototype.parser=(new o).endianess("little").nest("t_op",{type:c.prototype.parser}).nest("sid",{type:n.prototype.parser}).uint8("valid").int16("tgd").int16("isc_l1ca").int16("isc_l2c"),Z.prototype.fieldSpec=[],Z.prototype.fieldSpec.push(["t_op",c.prototype.fieldSpec]),Z.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),Z.prototype.fieldSpec.push(["valid","writeUInt8",1]),Z.prototype.fieldSpec.push(["tgd","writeInt16LE",2]),Z.prototype.fieldSpec.push(["isc_l1ca","writeInt16LE",2]),Z.prototype.fieldSpec.push(["isc_l2c","writeInt16LE",2]);var ee=function(e,t){return p.call(this,e),this.messageType="MSG_GROUP_DELAY",this.fields=t||this.parser.parse(e.payload),this};(ee.prototype=Object.create(p.prototype)).messageType="MSG_GROUP_DELAY",ee.prototype.msg_type=148,ee.prototype.constructor=ee,ee.prototype.parser=(new o).endianess("little").nest("t_op",{type:c.prototype.parser}).nest("sid",{type:s.prototype.parser}).uint8("valid").int16("tgd").int16("isc_l1ca").int16("isc_l2c"),ee.prototype.fieldSpec=[],ee.prototype.fieldSpec.push(["t_op",c.prototype.fieldSpec]),ee.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),ee.prototype.fieldSpec.push(["valid","writeUInt8",1]),ee.prototype.fieldSpec.push(["tgd","writeInt16LE",2]),ee.prototype.fieldSpec.push(["isc_l1ca","writeInt16LE",2]),ee.prototype.fieldSpec.push(["isc_l2c","writeInt16LE",2]);var te=function(e,t){return p.call(this,e),this.messageType="AlmanacCommonContent",this.fields=t||this.parser.parse(e.payload),this};(te.prototype=Object.create(p.prototype)).messageType="AlmanacCommonContent",te.prototype.constructor=te,te.prototype.parser=(new o).endianess("little").nest("sid",{type:s.prototype.parser}).nest("toa",{type:c.prototype.parser}).doublele("ura").uint32("fit_interval").uint8("valid").uint8("health_bits"),te.prototype.fieldSpec=[],te.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),te.prototype.fieldSpec.push(["toa",c.prototype.fieldSpec]),te.prototype.fieldSpec.push(["ura","writeDoubleLE",8]),te.prototype.fieldSpec.push(["fit_interval","writeUInt32LE",4]),te.prototype.fieldSpec.push(["valid","writeUInt8",1]),te.prototype.fieldSpec.push(["health_bits","writeUInt8",1]);var re=function(e,t){return p.call(this,e),this.messageType="AlmanacCommonContentDep",this.fields=t||this.parser.parse(e.payload),this};(re.prototype=Object.create(p.prototype)).messageType="AlmanacCommonContentDep",re.prototype.constructor=re,re.prototype.parser=(new o).endianess("little").nest("sid",{type:n.prototype.parser}).nest("toa",{type:c.prototype.parser}).doublele("ura").uint32("fit_interval").uint8("valid").uint8("health_bits"),re.prototype.fieldSpec=[],re.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),re.prototype.fieldSpec.push(["toa",c.prototype.fieldSpec]),re.prototype.fieldSpec.push(["ura","writeDoubleLE",8]),re.prototype.fieldSpec.push(["fit_interval","writeUInt32LE",4]),re.prototype.fieldSpec.push(["valid","writeUInt8",1]),re.prototype.fieldSpec.push(["health_bits","writeUInt8",1]);var pe=function(e,t){return p.call(this,e),this.messageType="MSG_ALMANAC_GPS_DEP",this.fields=t||this.parser.parse(e.payload),this};(pe.prototype=Object.create(p.prototype)).messageType="MSG_ALMANAC_GPS_DEP",pe.prototype.msg_type=112,pe.prototype.constructor=pe,pe.prototype.parser=(new o).endianess("little").nest("common",{type:re.prototype.parser}).doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("af0").doublele("af1"),pe.prototype.fieldSpec=[],pe.prototype.fieldSpec.push(["common",re.prototype.fieldSpec]),pe.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["w","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["af1","writeDoubleLE",8]);var oe=function(e,t){return p.call(this,e),this.messageType="MSG_ALMANAC_GPS",this.fields=t||this.parser.parse(e.payload),this};(oe.prototype=Object.create(p.prototype)).messageType="MSG_ALMANAC_GPS",oe.prototype.msg_type=114,oe.prototype.constructor=oe,oe.prototype.parser=(new o).endianess("little").nest("common",{type:te.prototype.parser}).doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("af0").doublele("af1"),oe.prototype.fieldSpec=[],oe.prototype.fieldSpec.push(["common",te.prototype.fieldSpec]),oe.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),oe.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),oe.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),oe.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),oe.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),oe.prototype.fieldSpec.push(["w","writeDoubleLE",8]),oe.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),oe.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),oe.prototype.fieldSpec.push(["af1","writeDoubleLE",8]);var ie=function(e,t){return p.call(this,e),this.messageType="MSG_ALMANAC_GLO_DEP",this.fields=t||this.parser.parse(e.payload),this};(ie.prototype=Object.create(p.prototype)).messageType="MSG_ALMANAC_GLO_DEP",ie.prototype.msg_type=113,ie.prototype.constructor=ie,ie.prototype.parser=(new o).endianess("little").nest("common",{type:re.prototype.parser}).doublele("lambda_na").doublele("t_lambda_na").doublele("i").doublele("t").doublele("t_dot").doublele("epsilon").doublele("omega"),ie.prototype.fieldSpec=[],ie.prototype.fieldSpec.push(["common",re.prototype.fieldSpec]),ie.prototype.fieldSpec.push(["lambda_na","writeDoubleLE",8]),ie.prototype.fieldSpec.push(["t_lambda_na","writeDoubleLE",8]),ie.prototype.fieldSpec.push(["i","writeDoubleLE",8]),ie.prototype.fieldSpec.push(["t","writeDoubleLE",8]),ie.prototype.fieldSpec.push(["t_dot","writeDoubleLE",8]),ie.prototype.fieldSpec.push(["epsilon","writeDoubleLE",8]),ie.prototype.fieldSpec.push(["omega","writeDoubleLE",8]);var se=function(e,t){return p.call(this,e),this.messageType="MSG_ALMANAC_GLO",this.fields=t||this.parser.parse(e.payload),this};(se.prototype=Object.create(p.prototype)).messageType="MSG_ALMANAC_GLO",se.prototype.msg_type=115,se.prototype.constructor=se,se.prototype.parser=(new o).endianess("little").nest("common",{type:te.prototype.parser}).doublele("lambda_na").doublele("t_lambda_na").doublele("i").doublele("t").doublele("t_dot").doublele("epsilon").doublele("omega"),se.prototype.fieldSpec=[],se.prototype.fieldSpec.push(["common",te.prototype.fieldSpec]),se.prototype.fieldSpec.push(["lambda_na","writeDoubleLE",8]),se.prototype.fieldSpec.push(["t_lambda_na","writeDoubleLE",8]),se.prototype.fieldSpec.push(["i","writeDoubleLE",8]),se.prototype.fieldSpec.push(["t","writeDoubleLE",8]),se.prototype.fieldSpec.push(["t_dot","writeDoubleLE",8]),se.prototype.fieldSpec.push(["epsilon","writeDoubleLE",8]),se.prototype.fieldSpec.push(["omega","writeDoubleLE",8]);var ne=function(e,t){return p.call(this,e),this.messageType="MSG_GLO_BIASES",this.fields=t||this.parser.parse(e.payload),this};(ne.prototype=Object.create(p.prototype)).messageType="MSG_GLO_BIASES",ne.prototype.msg_type=117,ne.prototype.constructor=ne,ne.prototype.parser=(new o).endianess("little").uint8("mask").int16("l1ca_bias").int16("l1p_bias").int16("l2ca_bias").int16("l2p_bias"),ne.prototype.fieldSpec=[],ne.prototype.fieldSpec.push(["mask","writeUInt8",1]),ne.prototype.fieldSpec.push(["l1ca_bias","writeInt16LE",2]),ne.prototype.fieldSpec.push(["l1p_bias","writeInt16LE",2]),ne.prototype.fieldSpec.push(["l2ca_bias","writeInt16LE",2]),ne.prototype.fieldSpec.push(["l2p_bias","writeInt16LE",2]);var ae=function(e,t){return p.call(this,e),this.messageType="SvAzEl",this.fields=t||this.parser.parse(e.payload),this};(ae.prototype=Object.create(p.prototype)).messageType="SvAzEl",ae.prototype.constructor=ae,ae.prototype.parser=(new o).endianess("little").nest("sid",{type:s.prototype.parser}).uint8("az").int8("el"),ae.prototype.fieldSpec=[],ae.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),ae.prototype.fieldSpec.push(["az","writeUInt8",1]),ae.prototype.fieldSpec.push(["el","writeInt8",1]);var le=function(e,t){return p.call(this,e),this.messageType="MSG_SV_AZ_EL",this.fields=t||this.parser.parse(e.payload),this};(le.prototype=Object.create(p.prototype)).messageType="MSG_SV_AZ_EL",le.prototype.msg_type=151,le.prototype.constructor=le,le.prototype.parser=(new o).endianess("little").array("azel",{type:ae.prototype.parser,readUntil:"eof"}),le.prototype.fieldSpec=[],le.prototype.fieldSpec.push(["azel","array",ae.prototype.fieldSpec,function(){return this.fields.array.length},null]);var ce=function(e,t){return p.call(this,e),this.messageType="MSG_OSR",this.fields=t||this.parser.parse(e.payload),this};(ce.prototype=Object.create(p.prototype)).messageType="MSG_OSR",ce.prototype.msg_type=1600,ce.prototype.constructor=ce,ce.prototype.parser=(new o).endianess("little").nest("header",{type:u.prototype.parser}).array("obs",{type:f.prototype.parser,readUntil:"eof"}),ce.prototype.fieldSpec=[],ce.prototype.fieldSpec.push(["header",u.prototype.fieldSpec]),ce.prototype.fieldSpec.push(["obs","array",f.prototype.fieldSpec,function(){return this.fields.array.length},null]),e.exports={ObservationHeader:u,Doppler:y,PackedObsContent:h,PackedOsrContent:f,74:d,MsgObs:d,68:_,MsgBasePosLlh:_,72:S,MsgBasePosEcef:S,EphemerisCommonContent:g,EphemerisCommonContentDepB:w,EphemerisCommonContentDepA:E,129:m,MsgEphemerisGpsDepE:m,134:b,MsgEphemerisGpsDepF:b,138:v,MsgEphemerisGps:v,142:I,MsgEphemerisQzss:I,137:L,MsgEphemerisBds:L,149:T,MsgEphemerisGalDepA:T,141:U,MsgEphemerisGal:U,130:M,MsgEphemerisSbasDepA:M,131:D,MsgEphemerisGloDepA:D,132:O,MsgEphemerisSbasDepB:O,140:G,MsgEphemerisSbas:G,133:A,MsgEphemerisGloDepB:A,135:C,MsgEphemerisGloDepC:C,136:R,MsgEphemerisGloDepD:R,139:P,MsgEphemerisGlo:P,128:N,MsgEphemerisDepD:N,26:j,MsgEphemerisDepA:j,70:x,MsgEphemerisDepB:x,71:k,MsgEphemerisDepC:k,ObservationHeaderDep:F,CarrierPhaseDepA:B,PackedObsContentDepA:q,PackedObsContentDepB:z,PackedObsContentDepC:H,69:V,MsgObsDepA:V,67:Y,MsgObsDepB:Y,73:W,MsgObsDepC:W,144:Q,MsgIono:Q,145:K,MsgSvConfigurationGpsDep:K,GnssCapb:X,150:J,MsgGnssCapb:J,146:$,MsgGroupDelayDepA:$,147:Z,MsgGroupDelayDepB:Z,148:ee,MsgGroupDelay:ee,AlmanacCommonContent:te,AlmanacCommonContentDep:re,112:pe,MsgAlmanacGpsDep:pe,114:oe,MsgAlmanacGps:oe,113:ie,MsgAlmanacGloDep:ie,115:se,MsgAlmanacGlo:se,117:ne,MsgGloBiases:ne,SvAzEl:ae,151:le,MsgSvAzEl:le,1600:ce,MsgOsr:ce}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_BASELINE_HEADING",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_BASELINE_HEADING",i.prototype.msg_type=527,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint32("tow").uint32("heading").uint8("n_sats").uint8("flags"),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),i.prototype.fieldSpec.push(["heading","writeUInt32LE",4]),i.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),i.prototype.fieldSpec.push(["flags","writeUInt8",1]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_ORIENT_QUAT",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_ORIENT_QUAT",s.prototype.msg_type=544,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint32("tow").int32("w").int32("x").int32("y").int32("z").floatle("w_accuracy").floatle("x_accuracy").floatle("y_accuracy").floatle("z_accuracy").uint8("flags"),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),s.prototype.fieldSpec.push(["w","writeInt32LE",4]),s.prototype.fieldSpec.push(["x","writeInt32LE",4]),s.prototype.fieldSpec.push(["y","writeInt32LE",4]),s.prototype.fieldSpec.push(["z","writeInt32LE",4]),s.prototype.fieldSpec.push(["w_accuracy","writeFloatLE",4]),s.prototype.fieldSpec.push(["x_accuracy","writeFloatLE",4]),s.prototype.fieldSpec.push(["y_accuracy","writeFloatLE",4]),s.prototype.fieldSpec.push(["z_accuracy","writeFloatLE",4]),s.prototype.fieldSpec.push(["flags","writeUInt8",1]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_ORIENT_EULER",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_ORIENT_EULER",n.prototype.msg_type=545,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint32("tow").int32("roll").int32("pitch").int32("yaw").floatle("roll_accuracy").floatle("pitch_accuracy").floatle("yaw_accuracy").uint8("flags"),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),n.prototype.fieldSpec.push(["roll","writeInt32LE",4]),n.prototype.fieldSpec.push(["pitch","writeInt32LE",4]),n.prototype.fieldSpec.push(["yaw","writeInt32LE",4]),n.prototype.fieldSpec.push(["roll_accuracy","writeFloatLE",4]),n.prototype.fieldSpec.push(["pitch_accuracy","writeFloatLE",4]),n.prototype.fieldSpec.push(["yaw_accuracy","writeFloatLE",4]),n.prototype.fieldSpec.push(["flags","writeUInt8",1]);var a=function(e,t){return p.call(this,e),this.messageType="MSG_ANGULAR_RATE",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="MSG_ANGULAR_RATE",a.prototype.msg_type=546,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").uint8("flags"),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),a.prototype.fieldSpec.push(["x","writeInt32LE",4]),a.prototype.fieldSpec.push(["y","writeInt32LE",4]),a.prototype.fieldSpec.push(["z","writeInt32LE",4]),a.prototype.fieldSpec.push(["flags","writeUInt8",1]),e.exports={527:i,MsgBaselineHeading:i,544:s,MsgOrientQuat:s,545:n,MsgOrientEuler:n,546:a,MsgAngularRate:a}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,r(0).CarrierPhase,r(0).GnssSignal),s=r(0).GnssSignalDep,n=r(0).GPSTime,a=r(0).GPSTimeDep,l=(r(0).GPSTimeSec,r(0).SvId,function(e,t){return p.call(this,e),this.messageType="MSG_ALMANAC",this.fields=t||this.parser.parse(e.payload),this});(l.prototype=Object.create(p.prototype)).messageType="MSG_ALMANAC",l.prototype.msg_type=105,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little"),l.prototype.fieldSpec=[];var c=function(e,t){return p.call(this,e),this.messageType="MSG_SET_TIME",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="MSG_SET_TIME",c.prototype.msg_type=104,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little"),c.prototype.fieldSpec=[];var u=function(e,t){return p.call(this,e),this.messageType="MSG_RESET",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="MSG_RESET",u.prototype.msg_type=182,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint32("flags"),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["flags","writeUInt32LE",4]);var y=function(e,t){return p.call(this,e),this.messageType="MSG_RESET_DEP",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="MSG_RESET_DEP",y.prototype.msg_type=178,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little"),y.prototype.fieldSpec=[];var h=function(e,t){return p.call(this,e),this.messageType="MSG_CW_RESULTS",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_CW_RESULTS",h.prototype.msg_type=192,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little"),h.prototype.fieldSpec=[];var f=function(e,t){return p.call(this,e),this.messageType="MSG_CW_START",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="MSG_CW_START",f.prototype.msg_type=193,f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little"),f.prototype.fieldSpec=[];var d=function(e,t){return p.call(this,e),this.messageType="MSG_RESET_FILTERS",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(p.prototype)).messageType="MSG_RESET_FILTERS",d.prototype.msg_type=34,d.prototype.constructor=d,d.prototype.parser=(new o).endianess("little").uint8("filter"),d.prototype.fieldSpec=[],d.prototype.fieldSpec.push(["filter","writeUInt8",1]);var _=function(e,t){return p.call(this,e),this.messageType="MSG_INIT_BASE_DEP",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(p.prototype)).messageType="MSG_INIT_BASE_DEP",_.prototype.msg_type=35,_.prototype.constructor=_,_.prototype.parser=(new o).endianess("little"),_.prototype.fieldSpec=[];var S=function(e,t){return p.call(this,e),this.messageType="MSG_THREAD_STATE",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(p.prototype)).messageType="MSG_THREAD_STATE",S.prototype.msg_type=23,S.prototype.constructor=S,S.prototype.parser=(new o).endianess("little").string("name",{length:20}).uint16("cpu").uint32("stack_free"),S.prototype.fieldSpec=[],S.prototype.fieldSpec.push(["name","string",20]),S.prototype.fieldSpec.push(["cpu","writeUInt16LE",2]),S.prototype.fieldSpec.push(["stack_free","writeUInt32LE",4]);var g=function(e,t){return p.call(this,e),this.messageType="UARTChannel",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(p.prototype)).messageType="UARTChannel",g.prototype.constructor=g,g.prototype.parser=(new o).endianess("little").floatle("tx_throughput").floatle("rx_throughput").uint16("crc_error_count").uint16("io_error_count").uint8("tx_buffer_level").uint8("rx_buffer_level"),g.prototype.fieldSpec=[],g.prototype.fieldSpec.push(["tx_throughput","writeFloatLE",4]),g.prototype.fieldSpec.push(["rx_throughput","writeFloatLE",4]),g.prototype.fieldSpec.push(["crc_error_count","writeUInt16LE",2]),g.prototype.fieldSpec.push(["io_error_count","writeUInt16LE",2]),g.prototype.fieldSpec.push(["tx_buffer_level","writeUInt8",1]),g.prototype.fieldSpec.push(["rx_buffer_level","writeUInt8",1]);var w=function(e,t){return p.call(this,e),this.messageType="Period",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(p.prototype)).messageType="Period",w.prototype.constructor=w,w.prototype.parser=(new o).endianess("little").int32("avg").int32("pmin").int32("pmax").int32("current"),w.prototype.fieldSpec=[],w.prototype.fieldSpec.push(["avg","writeInt32LE",4]),w.prototype.fieldSpec.push(["pmin","writeInt32LE",4]),w.prototype.fieldSpec.push(["pmax","writeInt32LE",4]),w.prototype.fieldSpec.push(["current","writeInt32LE",4]);var E=function(e,t){return p.call(this,e),this.messageType="Latency",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(p.prototype)).messageType="Latency",E.prototype.constructor=E,E.prototype.parser=(new o).endianess("little").int32("avg").int32("lmin").int32("lmax").int32("current"),E.prototype.fieldSpec=[],E.prototype.fieldSpec.push(["avg","writeInt32LE",4]),E.prototype.fieldSpec.push(["lmin","writeInt32LE",4]),E.prototype.fieldSpec.push(["lmax","writeInt32LE",4]),E.prototype.fieldSpec.push(["current","writeInt32LE",4]);var m=function(e,t){return p.call(this,e),this.messageType="MSG_UART_STATE",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(p.prototype)).messageType="MSG_UART_STATE",m.prototype.msg_type=29,m.prototype.constructor=m,m.prototype.parser=(new o).endianess("little").nest("uart_a",{type:g.prototype.parser}).nest("uart_b",{type:g.prototype.parser}).nest("uart_ftdi",{type:g.prototype.parser}).nest("latency",{type:E.prototype.parser}).nest("obs_period",{type:w.prototype.parser}),m.prototype.fieldSpec=[],m.prototype.fieldSpec.push(["uart_a",g.prototype.fieldSpec]),m.prototype.fieldSpec.push(["uart_b",g.prototype.fieldSpec]),m.prototype.fieldSpec.push(["uart_ftdi",g.prototype.fieldSpec]),m.prototype.fieldSpec.push(["latency",E.prototype.fieldSpec]),m.prototype.fieldSpec.push(["obs_period",w.prototype.fieldSpec]);var b=function(e,t){return p.call(this,e),this.messageType="MSG_UART_STATE_DEPA",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(p.prototype)).messageType="MSG_UART_STATE_DEPA",b.prototype.msg_type=24,b.prototype.constructor=b,b.prototype.parser=(new o).endianess("little").nest("uart_a",{type:g.prototype.parser}).nest("uart_b",{type:g.prototype.parser}).nest("uart_ftdi",{type:g.prototype.parser}).nest("latency",{type:E.prototype.parser}),b.prototype.fieldSpec=[],b.prototype.fieldSpec.push(["uart_a",g.prototype.fieldSpec]),b.prototype.fieldSpec.push(["uart_b",g.prototype.fieldSpec]),b.prototype.fieldSpec.push(["uart_ftdi",g.prototype.fieldSpec]),b.prototype.fieldSpec.push(["latency",E.prototype.fieldSpec]);var v=function(e,t){return p.call(this,e),this.messageType="MSG_IAR_STATE",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(p.prototype)).messageType="MSG_IAR_STATE",v.prototype.msg_type=25,v.prototype.constructor=v,v.prototype.parser=(new o).endianess("little").uint32("num_hyps"),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["num_hyps","writeUInt32LE",4]);var I=function(e,t){return p.call(this,e),this.messageType="MSG_MASK_SATELLITE",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(p.prototype)).messageType="MSG_MASK_SATELLITE",I.prototype.msg_type=43,I.prototype.constructor=I,I.prototype.parser=(new o).endianess("little").uint8("mask").nest("sid",{type:i.prototype.parser}),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["mask","writeUInt8",1]),I.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]);var L=function(e,t){return p.call(this,e),this.messageType="MSG_MASK_SATELLITE_DEP",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(p.prototype)).messageType="MSG_MASK_SATELLITE_DEP",L.prototype.msg_type=27,L.prototype.constructor=L,L.prototype.parser=(new o).endianess("little").uint8("mask").nest("sid",{type:s.prototype.parser}),L.prototype.fieldSpec=[],L.prototype.fieldSpec.push(["mask","writeUInt8",1]),L.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]);var T=function(e,t){return p.call(this,e),this.messageType="MSG_DEVICE_MONITOR",this.fields=t||this.parser.parse(e.payload),this};(T.prototype=Object.create(p.prototype)).messageType="MSG_DEVICE_MONITOR",T.prototype.msg_type=181,T.prototype.constructor=T,T.prototype.parser=(new o).endianess("little").int16("dev_vin").int16("cpu_vint").int16("cpu_vaux").int16("cpu_temperature").int16("fe_temperature"),T.prototype.fieldSpec=[],T.prototype.fieldSpec.push(["dev_vin","writeInt16LE",2]),T.prototype.fieldSpec.push(["cpu_vint","writeInt16LE",2]),T.prototype.fieldSpec.push(["cpu_vaux","writeInt16LE",2]),T.prototype.fieldSpec.push(["cpu_temperature","writeInt16LE",2]),T.prototype.fieldSpec.push(["fe_temperature","writeInt16LE",2]);var U=function(e,t){return p.call(this,e),this.messageType="MSG_COMMAND_REQ",this.fields=t||this.parser.parse(e.payload),this};(U.prototype=Object.create(p.prototype)).messageType="MSG_COMMAND_REQ",U.prototype.msg_type=184,U.prototype.constructor=U,U.prototype.parser=(new o).endianess("little").uint32("sequence").string("command",{greedy:!0}),U.prototype.fieldSpec=[],U.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),U.prototype.fieldSpec.push(["command","string",null]);var M=function(e,t){return p.call(this,e),this.messageType="MSG_COMMAND_RESP",this.fields=t||this.parser.parse(e.payload),this};(M.prototype=Object.create(p.prototype)).messageType="MSG_COMMAND_RESP",M.prototype.msg_type=185,M.prototype.constructor=M,M.prototype.parser=(new o).endianess("little").uint32("sequence").int32("code"),M.prototype.fieldSpec=[],M.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),M.prototype.fieldSpec.push(["code","writeInt32LE",4]);var D=function(e,t){return p.call(this,e),this.messageType="MSG_COMMAND_OUTPUT",this.fields=t||this.parser.parse(e.payload),this};(D.prototype=Object.create(p.prototype)).messageType="MSG_COMMAND_OUTPUT",D.prototype.msg_type=188,D.prototype.constructor=D,D.prototype.parser=(new o).endianess("little").uint32("sequence").string("line",{greedy:!0}),D.prototype.fieldSpec=[],D.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),D.prototype.fieldSpec.push(["line","string",null]);var O=function(e,t){return p.call(this,e),this.messageType="MSG_NETWORK_STATE_REQ",this.fields=t||this.parser.parse(e.payload),this};(O.prototype=Object.create(p.prototype)).messageType="MSG_NETWORK_STATE_REQ",O.prototype.msg_type=186,O.prototype.constructor=O,O.prototype.parser=(new o).endianess("little"),O.prototype.fieldSpec=[];var G=function(e,t){return p.call(this,e),this.messageType="MSG_NETWORK_STATE_RESP",this.fields=t||this.parser.parse(e.payload),this};(G.prototype=Object.create(p.prototype)).messageType="MSG_NETWORK_STATE_RESP",G.prototype.msg_type=187,G.prototype.constructor=G,G.prototype.parser=(new o).endianess("little").array("ipv4_address",{length:4,type:"uint8"}).uint8("ipv4_mask_size").array("ipv6_address",{length:16,type:"uint8"}).uint8("ipv6_mask_size").uint32("rx_bytes").uint32("tx_bytes").string("interface_name",{length:16}).uint32("flags"),G.prototype.fieldSpec=[],G.prototype.fieldSpec.push(["ipv4_address","array","writeUInt8",function(){return 1},4]),G.prototype.fieldSpec.push(["ipv4_mask_size","writeUInt8",1]),G.prototype.fieldSpec.push(["ipv6_address","array","writeUInt8",function(){return 1},16]),G.prototype.fieldSpec.push(["ipv6_mask_size","writeUInt8",1]),G.prototype.fieldSpec.push(["rx_bytes","writeUInt32LE",4]),G.prototype.fieldSpec.push(["tx_bytes","writeUInt32LE",4]),G.prototype.fieldSpec.push(["interface_name","string",16]),G.prototype.fieldSpec.push(["flags","writeUInt32LE",4]);var A=function(e,t){return p.call(this,e),this.messageType="NetworkUsage",this.fields=t||this.parser.parse(e.payload),this};(A.prototype=Object.create(p.prototype)).messageType="NetworkUsage",A.prototype.constructor=A,A.prototype.parser=(new o).endianess("little").uint64("duration").uint64("total_bytes").uint32("rx_bytes").uint32("tx_bytes").string("interface_name",{length:16}),A.prototype.fieldSpec=[],A.prototype.fieldSpec.push(["duration","writeUInt64LE",8]),A.prototype.fieldSpec.push(["total_bytes","writeUInt64LE",8]),A.prototype.fieldSpec.push(["rx_bytes","writeUInt32LE",4]),A.prototype.fieldSpec.push(["tx_bytes","writeUInt32LE",4]),A.prototype.fieldSpec.push(["interface_name","string",16]);var C=function(e,t){return p.call(this,e),this.messageType="MSG_NETWORK_BANDWIDTH_USAGE",this.fields=t||this.parser.parse(e.payload),this};(C.prototype=Object.create(p.prototype)).messageType="MSG_NETWORK_BANDWIDTH_USAGE",C.prototype.msg_type=189,C.prototype.constructor=C,C.prototype.parser=(new o).endianess("little").array("interfaces",{type:A.prototype.parser,readUntil:"eof"}),C.prototype.fieldSpec=[],C.prototype.fieldSpec.push(["interfaces","array",A.prototype.fieldSpec,function(){return this.fields.array.length},null]);var R=function(e,t){return p.call(this,e),this.messageType="MSG_CELL_MODEM_STATUS",this.fields=t||this.parser.parse(e.payload),this};(R.prototype=Object.create(p.prototype)).messageType="MSG_CELL_MODEM_STATUS",R.prototype.msg_type=190,R.prototype.constructor=R,R.prototype.parser=(new o).endianess("little").int8("signal_strength").floatle("signal_error_rate").array("reserved",{type:"uint8",readUntil:"eof"}),R.prototype.fieldSpec=[],R.prototype.fieldSpec.push(["signal_strength","writeInt8",1]),R.prototype.fieldSpec.push(["signal_error_rate","writeFloatLE",4]),R.prototype.fieldSpec.push(["reserved","array","writeUInt8",function(){return 1},null]);var P=function(e,t){return p.call(this,e),this.messageType="MSG_SPECAN_DEP",this.fields=t||this.parser.parse(e.payload),this};(P.prototype=Object.create(p.prototype)).messageType="MSG_SPECAN_DEP",P.prototype.msg_type=80,P.prototype.constructor=P,P.prototype.parser=(new o).endianess("little").uint16("channel_tag").nest("t",{type:a.prototype.parser}).floatle("freq_ref").floatle("freq_step").floatle("amplitude_ref").floatle("amplitude_unit").array("amplitude_value",{type:"uint8",readUntil:"eof"}),P.prototype.fieldSpec=[],P.prototype.fieldSpec.push(["channel_tag","writeUInt16LE",2]),P.prototype.fieldSpec.push(["t",a.prototype.fieldSpec]),P.prototype.fieldSpec.push(["freq_ref","writeFloatLE",4]),P.prototype.fieldSpec.push(["freq_step","writeFloatLE",4]),P.prototype.fieldSpec.push(["amplitude_ref","writeFloatLE",4]),P.prototype.fieldSpec.push(["amplitude_unit","writeFloatLE",4]),P.prototype.fieldSpec.push(["amplitude_value","array","writeUInt8",function(){return 1},null]);var N=function(e,t){return p.call(this,e),this.messageType="MSG_SPECAN",this.fields=t||this.parser.parse(e.payload),this};(N.prototype=Object.create(p.prototype)).messageType="MSG_SPECAN",N.prototype.msg_type=81,N.prototype.constructor=N,N.prototype.parser=(new o).endianess("little").uint16("channel_tag").nest("t",{type:n.prototype.parser}).floatle("freq_ref").floatle("freq_step").floatle("amplitude_ref").floatle("amplitude_unit").array("amplitude_value",{type:"uint8",readUntil:"eof"}),N.prototype.fieldSpec=[],N.prototype.fieldSpec.push(["channel_tag","writeUInt16LE",2]),N.prototype.fieldSpec.push(["t",n.prototype.fieldSpec]),N.prototype.fieldSpec.push(["freq_ref","writeFloatLE",4]),N.prototype.fieldSpec.push(["freq_step","writeFloatLE",4]),N.prototype.fieldSpec.push(["amplitude_ref","writeFloatLE",4]),N.prototype.fieldSpec.push(["amplitude_unit","writeFloatLE",4]),N.prototype.fieldSpec.push(["amplitude_value","array","writeUInt8",function(){return 1},null]);var j=function(e,t){return p.call(this,e),this.messageType="MSG_FRONT_END_GAIN",this.fields=t||this.parser.parse(e.payload),this};(j.prototype=Object.create(p.prototype)).messageType="MSG_FRONT_END_GAIN",j.prototype.msg_type=191,j.prototype.constructor=j,j.prototype.parser=(new o).endianess("little").array("rf_gain",{length:8,type:"int8"}).array("if_gain",{length:8,type:"int8"}),j.prototype.fieldSpec=[],j.prototype.fieldSpec.push(["rf_gain","array","writeInt8",function(){return 1},8]),j.prototype.fieldSpec.push(["if_gain","array","writeInt8",function(){return 1},8]),e.exports={105:l,MsgAlmanac:l,104:c,MsgSetTime:c,182:u,MsgReset:u,178:y,MsgResetDep:y,192:h,MsgCwResults:h,193:f,MsgCwStart:f,34:d,MsgResetFilters:d,35:_,MsgInitBaseDep:_,23:S,MsgThreadState:S,UARTChannel:g,Period:w,Latency:E,29:m,MsgUartState:m,24:b,MsgUartStateDepa:b,25:v,MsgIarState:v,43:I,MsgMaskSatellite:I,27:L,MsgMaskSatelliteDep:L,181:T,MsgDeviceMonitor:T,184:U,MsgCommandReq:U,185:M,MsgCommandResp:M,188:D,MsgCommandOutput:D,186:O,MsgNetworkStateReq:O,187:G,MsgNetworkStateResp:G,NetworkUsage:A,189:C,MsgNetworkBandwidthUsage:C,190:R,MsgCellModemStatus:R,80:P,MsgSpecanDep:P,81:N,MsgSpecan:N,191:j,MsgFrontEndGain:j}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,r(0).CarrierPhase,r(0).GnssSignal),s=(r(0).GnssSignalDep,r(0).GPSTime,r(0).GPSTimeDep,r(0).GPSTimeSec,r(0).SvId,function(e,t){return p.call(this,e),this.messageType="MSG_SBAS_RAW",this.fields=t||this.parser.parse(e.payload),this});(s.prototype=Object.create(p.prototype)).messageType="MSG_SBAS_RAW",s.prototype.msg_type=30583,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").nest("sid",{type:i.prototype.parser}).uint32("tow").uint8("message_type").array("data",{length:27,type:"uint8"}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]),s.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),s.prototype.fieldSpec.push(["message_type","writeUInt8",1]),s.prototype.fieldSpec.push(["data","array","writeUInt8",function(){return 1},27]),e.exports={30583:s,MsgSbasRaw:s}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_SAVE",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_SAVE",i.prototype.msg_type=161,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little"),i.prototype.fieldSpec=[];var s=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_WRITE",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_WRITE",s.prototype.msg_type=160,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").string("setting",{greedy:!0}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["setting","string",null]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_WRITE_RESP",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_WRITE_RESP",n.prototype.msg_type=175,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint8("status").string("setting",{greedy:!0}),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["status","writeUInt8",1]),n.prototype.fieldSpec.push(["setting","string",null]);var a=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_READ_REQ",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_READ_REQ",a.prototype.msg_type=164,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").string("setting",{greedy:!0}),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["setting","string",null]);var l=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_READ_RESP",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_READ_RESP",l.prototype.msg_type=165,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").string("setting",{greedy:!0}),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["setting","string",null]);var c=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_READ_BY_INDEX_REQ",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_READ_BY_INDEX_REQ",c.prototype.msg_type=162,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint16("index"),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["index","writeUInt16LE",2]);var u=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_READ_BY_INDEX_RESP",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_READ_BY_INDEX_RESP",u.prototype.msg_type=167,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint16("index").string("setting",{greedy:!0}),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["index","writeUInt16LE",2]),u.prototype.fieldSpec.push(["setting","string",null]);var y=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_READ_BY_INDEX_DONE",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_READ_BY_INDEX_DONE",y.prototype.msg_type=166,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little"),y.prototype.fieldSpec=[];var h=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_REGISTER",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_REGISTER",h.prototype.msg_type=174,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").string("setting",{greedy:!0}),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["setting","string",null]);var f=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_REGISTER_RESP",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_REGISTER_RESP",f.prototype.msg_type=431,f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").uint8("status").string("setting",{greedy:!0}),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["status","writeUInt8",1]),f.prototype.fieldSpec.push(["setting","string",null]),e.exports={161:i,MsgSettingsSave:i,160:s,MsgSettingsWrite:s,175:n,MsgSettingsWriteResp:n,164:a,MsgSettingsReadReq:a,165:l,MsgSettingsReadResp:l,162:c,MsgSettingsReadByIndexReq:c,167:u,MsgSettingsReadByIndexResp:u,166:y,MsgSettingsReadByIndexDone:y,174:h,MsgSettingsRegister:h,431:f,MsgSettingsRegisterResp:f}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="SolutionInputType",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="SolutionInputType",i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint8("sensor_type").uint8("flags"),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["sensor_type","writeUInt8",1]),i.prototype.fieldSpec.push(["flags","writeUInt8",1]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_SOLN_META_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_SOLN_META_DEP_A",s.prototype.msg_type=65295,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint16("pdop").uint16("hdop").uint16("vdop").uint8("n_sats").uint16("age_corrections").uint8("alignment_status").uint32("last_used_gnss_pos_tow").uint32("last_used_gnss_vel_tow").array("sol_in",{type:i.prototype.parser,readUntil:"eof"}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["pdop","writeUInt16LE",2]),s.prototype.fieldSpec.push(["hdop","writeUInt16LE",2]),s.prototype.fieldSpec.push(["vdop","writeUInt16LE",2]),s.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),s.prototype.fieldSpec.push(["age_corrections","writeUInt16LE",2]),s.prototype.fieldSpec.push(["alignment_status","writeUInt8",1]),s.prototype.fieldSpec.push(["last_used_gnss_pos_tow","writeUInt32LE",4]),s.prototype.fieldSpec.push(["last_used_gnss_vel_tow","writeUInt32LE",4]),s.prototype.fieldSpec.push(["sol_in","array",i.prototype.fieldSpec,function(){return this.fields.array.length},null]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_SOLN_META",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_SOLN_META",n.prototype.msg_type=65294,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint32("tow").uint16("pdop").uint16("hdop").uint16("vdop").uint16("age_corrections").uint32("age_gnss").array("sol_in",{type:i.prototype.parser,readUntil:"eof"}),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),n.prototype.fieldSpec.push(["pdop","writeUInt16LE",2]),n.prototype.fieldSpec.push(["hdop","writeUInt16LE",2]),n.prototype.fieldSpec.push(["vdop","writeUInt16LE",2]),n.prototype.fieldSpec.push(["age_corrections","writeUInt16LE",2]),n.prototype.fieldSpec.push(["age_gnss","writeUInt32LE",4]),n.prototype.fieldSpec.push(["sol_in","array",i.prototype.fieldSpec,function(){return this.fields.array.length},null]);var a=function(e,t){return p.call(this,e),this.messageType="GNSSInputType",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="GNSSInputType",a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").uint8("flags"),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["flags","writeUInt8",1]);var l=function(e,t){return p.call(this,e),this.messageType="IMUInputType",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="IMUInputType",l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").uint8("flags"),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["flags","writeUInt8",1]);var c=function(e,t){return p.call(this,e),this.messageType="OdoInputType",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="OdoInputType",c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint8("flags"),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["flags","writeUInt8",1]),e.exports={SolutionInputType:i,65295:s,MsgSolnMetaDepA:s,65294:n,MsgSolnMeta:n,GNSSInputType:a,IMUInputType:l,OdoInputType:c}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,r(0).CarrierPhase,r(0).GnssSignal),s=(r(0).GnssSignalDep,r(0).GPSTime,r(0).GPSTimeDep,r(0).GPSTimeSec),n=r(0).SvId,a=function(e,t){return p.call(this,e),this.messageType="CodeBiasesContent",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="CodeBiasesContent",a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").uint8("code").int16("value"),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["code","writeUInt8",1]),a.prototype.fieldSpec.push(["value","writeInt16LE",2]);var l=function(e,t){return p.call(this,e),this.messageType="PhaseBiasesContent",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="PhaseBiasesContent",l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").uint8("code").uint8("integer_indicator").uint8("widelane_integer_indicator").uint8("discontinuity_counter").int32("bias"),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["code","writeUInt8",1]),l.prototype.fieldSpec.push(["integer_indicator","writeUInt8",1]),l.prototype.fieldSpec.push(["widelane_integer_indicator","writeUInt8",1]),l.prototype.fieldSpec.push(["discontinuity_counter","writeUInt8",1]),l.prototype.fieldSpec.push(["bias","writeInt32LE",4]);var c=function(e,t){return p.call(this,e),this.messageType="STECHeader",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="STECHeader",c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint16("tile_set_id").uint16("tile_id").nest("time",{type:s.prototype.parser}).uint8("num_msgs").uint8("seq_num").uint8("update_interval").uint8("iod_atmo"),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["tile_set_id","writeUInt16LE",2]),c.prototype.fieldSpec.push(["tile_id","writeUInt16LE",2]),c.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),c.prototype.fieldSpec.push(["num_msgs","writeUInt8",1]),c.prototype.fieldSpec.push(["seq_num","writeUInt8",1]),c.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),c.prototype.fieldSpec.push(["iod_atmo","writeUInt8",1]);var u=function(e,t){return p.call(this,e),this.messageType="GriddedCorrectionHeader",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="GriddedCorrectionHeader",u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint16("tile_set_id").uint16("tile_id").nest("time",{type:s.prototype.parser}).uint16("num_msgs").uint16("seq_num").uint8("update_interval").uint8("iod_atmo").uint8("tropo_quality_indicator"),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["tile_set_id","writeUInt16LE",2]),u.prototype.fieldSpec.push(["tile_id","writeUInt16LE",2]),u.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),u.prototype.fieldSpec.push(["num_msgs","writeUInt16LE",2]),u.prototype.fieldSpec.push(["seq_num","writeUInt16LE",2]),u.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),u.prototype.fieldSpec.push(["iod_atmo","writeUInt8",1]),u.prototype.fieldSpec.push(["tropo_quality_indicator","writeUInt8",1]);var y=function(e,t){return p.call(this,e),this.messageType="STECSatElement",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="STECSatElement",y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").nest("sv_id",{type:n.prototype.parser}).uint8("stec_quality_indicator").array("stec_coeff",{length:4,type:"int16le"}),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["sv_id",n.prototype.fieldSpec]),y.prototype.fieldSpec.push(["stec_quality_indicator","writeUInt8",1]),y.prototype.fieldSpec.push(["stec_coeff","array","writeInt16LE",function(){return 2},4]);var h=function(e,t){return p.call(this,e),this.messageType="TroposphericDelayCorrectionNoStd",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="TroposphericDelayCorrectionNoStd",h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").int16("hydro").int8("wet"),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["hydro","writeInt16LE",2]),h.prototype.fieldSpec.push(["wet","writeInt8",1]);var f=function(e,t){return p.call(this,e),this.messageType="TroposphericDelayCorrection",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="TroposphericDelayCorrection",f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").int16("hydro").int8("wet").uint8("stddev"),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["hydro","writeInt16LE",2]),f.prototype.fieldSpec.push(["wet","writeInt8",1]),f.prototype.fieldSpec.push(["stddev","writeUInt8",1]);var d=function(e,t){return p.call(this,e),this.messageType="STECResidualNoStd",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(p.prototype)).messageType="STECResidualNoStd",d.prototype.constructor=d,d.prototype.parser=(new o).endianess("little").nest("sv_id",{type:n.prototype.parser}).int16("residual"),d.prototype.fieldSpec=[],d.prototype.fieldSpec.push(["sv_id",n.prototype.fieldSpec]),d.prototype.fieldSpec.push(["residual","writeInt16LE",2]);var _=function(e,t){return p.call(this,e),this.messageType="STECResidual",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(p.prototype)).messageType="STECResidual",_.prototype.constructor=_,_.prototype.parser=(new o).endianess("little").nest("sv_id",{type:n.prototype.parser}).int16("residual").uint8("stddev"),_.prototype.fieldSpec=[],_.prototype.fieldSpec.push(["sv_id",n.prototype.fieldSpec]),_.prototype.fieldSpec.push(["residual","writeInt16LE",2]),_.prototype.fieldSpec.push(["stddev","writeUInt8",1]);var S=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_ORBIT_CLOCK",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(p.prototype)).messageType="MSG_SSR_ORBIT_CLOCK",S.prototype.msg_type=1501,S.prototype.constructor=S,S.prototype.parser=(new o).endianess("little").nest("time",{type:s.prototype.parser}).nest("sid",{type:i.prototype.parser}).uint8("update_interval").uint8("iod_ssr").uint32("iod").int32("radial").int32("along").int32("cross").int32("dot_radial").int32("dot_along").int32("dot_cross").int32("c0").int32("c1").int32("c2"),S.prototype.fieldSpec=[],S.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),S.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]),S.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),S.prototype.fieldSpec.push(["iod_ssr","writeUInt8",1]),S.prototype.fieldSpec.push(["iod","writeUInt32LE",4]),S.prototype.fieldSpec.push(["radial","writeInt32LE",4]),S.prototype.fieldSpec.push(["along","writeInt32LE",4]),S.prototype.fieldSpec.push(["cross","writeInt32LE",4]),S.prototype.fieldSpec.push(["dot_radial","writeInt32LE",4]),S.prototype.fieldSpec.push(["dot_along","writeInt32LE",4]),S.prototype.fieldSpec.push(["dot_cross","writeInt32LE",4]),S.prototype.fieldSpec.push(["c0","writeInt32LE",4]),S.prototype.fieldSpec.push(["c1","writeInt32LE",4]),S.prototype.fieldSpec.push(["c2","writeInt32LE",4]);var g=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_CODE_BIASES",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(p.prototype)).messageType="MSG_SSR_CODE_BIASES",g.prototype.msg_type=1505,g.prototype.constructor=g,g.prototype.parser=(new o).endianess("little").nest("time",{type:s.prototype.parser}).nest("sid",{type:i.prototype.parser}).uint8("update_interval").uint8("iod_ssr").array("biases",{type:a.prototype.parser,readUntil:"eof"}),g.prototype.fieldSpec=[],g.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),g.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]),g.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),g.prototype.fieldSpec.push(["iod_ssr","writeUInt8",1]),g.prototype.fieldSpec.push(["biases","array",a.prototype.fieldSpec,function(){return this.fields.array.length},null]);var w=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_PHASE_BIASES",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(p.prototype)).messageType="MSG_SSR_PHASE_BIASES",w.prototype.msg_type=1510,w.prototype.constructor=w,w.prototype.parser=(new o).endianess("little").nest("time",{type:s.prototype.parser}).nest("sid",{type:i.prototype.parser}).uint8("update_interval").uint8("iod_ssr").uint8("dispersive_bias").uint8("mw_consistency").uint16("yaw").int8("yaw_rate").array("biases",{type:l.prototype.parser,readUntil:"eof"}),w.prototype.fieldSpec=[],w.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),w.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]),w.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),w.prototype.fieldSpec.push(["iod_ssr","writeUInt8",1]),w.prototype.fieldSpec.push(["dispersive_bias","writeUInt8",1]),w.prototype.fieldSpec.push(["mw_consistency","writeUInt8",1]),w.prototype.fieldSpec.push(["yaw","writeUInt16LE",2]),w.prototype.fieldSpec.push(["yaw_rate","writeInt8",1]),w.prototype.fieldSpec.push(["biases","array",l.prototype.fieldSpec,function(){return this.fields.array.length},null]);var E=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_STEC_CORRECTION",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(p.prototype)).messageType="MSG_SSR_STEC_CORRECTION",E.prototype.msg_type=1531,E.prototype.constructor=E,E.prototype.parser=(new o).endianess("little").nest("header",{type:c.prototype.parser}).array("stec_sat_list",{type:y.prototype.parser,readUntil:"eof"}),E.prototype.fieldSpec=[],E.prototype.fieldSpec.push(["header",c.prototype.fieldSpec]),E.prototype.fieldSpec.push(["stec_sat_list","array",y.prototype.fieldSpec,function(){return this.fields.array.length},null]);var m=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_GRIDDED_CORRECTION",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(p.prototype)).messageType="MSG_SSR_GRIDDED_CORRECTION",m.prototype.msg_type=1532,m.prototype.constructor=m,m.prototype.parser=(new o).endianess("little").nest("header",{type:u.prototype.parser}).uint16("index").nest("tropo_delay_correction",{type:f.prototype.parser}).array("stec_residuals",{type:_.prototype.parser,readUntil:"eof"}),m.prototype.fieldSpec=[],m.prototype.fieldSpec.push(["header",u.prototype.fieldSpec]),m.prototype.fieldSpec.push(["index","writeUInt16LE",2]),m.prototype.fieldSpec.push(["tropo_delay_correction",f.prototype.fieldSpec]),m.prototype.fieldSpec.push(["stec_residuals","array",_.prototype.fieldSpec,function(){return this.fields.array.length},null]);var b=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_TILE_DEFINITION",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(p.prototype)).messageType="MSG_SSR_TILE_DEFINITION",b.prototype.msg_type=1526,b.prototype.constructor=b,b.prototype.parser=(new o).endianess("little").uint16("tile_set_id").uint16("tile_id").int16("corner_nw_lat").int16("corner_nw_lon").uint16("spacing_lat").uint16("spacing_lon").uint16("rows").uint16("cols").uint64("bitmask"),b.prototype.fieldSpec=[],b.prototype.fieldSpec.push(["tile_set_id","writeUInt16LE",2]),b.prototype.fieldSpec.push(["tile_id","writeUInt16LE",2]),b.prototype.fieldSpec.push(["corner_nw_lat","writeInt16LE",2]),b.prototype.fieldSpec.push(["corner_nw_lon","writeInt16LE",2]),b.prototype.fieldSpec.push(["spacing_lat","writeUInt16LE",2]),b.prototype.fieldSpec.push(["spacing_lon","writeUInt16LE",2]),b.prototype.fieldSpec.push(["rows","writeUInt16LE",2]),b.prototype.fieldSpec.push(["cols","writeUInt16LE",2]),b.prototype.fieldSpec.push(["bitmask","writeUInt64LE",8]);var v=function(e,t){return p.call(this,e),this.messageType="SatelliteAPC",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(p.prototype)).messageType="SatelliteAPC",v.prototype.constructor=v,v.prototype.parser=(new o).endianess("little").nest("sid",{type:i.prototype.parser}).uint8("sat_info").uint16("svn").array("pco",{length:3,type:"int16le"}).array("pcv",{length:21,type:"int8"}),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]),v.prototype.fieldSpec.push(["sat_info","writeUInt8",1]),v.prototype.fieldSpec.push(["svn","writeUInt16LE",2]),v.prototype.fieldSpec.push(["pco","array","writeInt16LE",function(){return 2},3]),v.prototype.fieldSpec.push(["pcv","array","writeInt8",function(){return 1},21]);var I=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_SATELLITE_APC",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(p.prototype)).messageType="MSG_SSR_SATELLITE_APC",I.prototype.msg_type=1540,I.prototype.constructor=I,I.prototype.parser=(new o).endianess("little").array("apc",{type:v.prototype.parser,readUntil:"eof"}),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["apc","array",v.prototype.fieldSpec,function(){return this.fields.array.length},null]);var L=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_ORBIT_CLOCK_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(p.prototype)).messageType="MSG_SSR_ORBIT_CLOCK_DEP_A",L.prototype.msg_type=1500,L.prototype.constructor=L,L.prototype.parser=(new o).endianess("little").nest("time",{type:s.prototype.parser}).nest("sid",{type:i.prototype.parser}).uint8("update_interval").uint8("iod_ssr").uint8("iod").int32("radial").int32("along").int32("cross").int32("dot_radial").int32("dot_along").int32("dot_cross").int32("c0").int32("c1").int32("c2"),L.prototype.fieldSpec=[],L.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),L.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]),L.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),L.prototype.fieldSpec.push(["iod_ssr","writeUInt8",1]),L.prototype.fieldSpec.push(["iod","writeUInt8",1]),L.prototype.fieldSpec.push(["radial","writeInt32LE",4]),L.prototype.fieldSpec.push(["along","writeInt32LE",4]),L.prototype.fieldSpec.push(["cross","writeInt32LE",4]),L.prototype.fieldSpec.push(["dot_radial","writeInt32LE",4]),L.prototype.fieldSpec.push(["dot_along","writeInt32LE",4]),L.prototype.fieldSpec.push(["dot_cross","writeInt32LE",4]),L.prototype.fieldSpec.push(["c0","writeInt32LE",4]),L.prototype.fieldSpec.push(["c1","writeInt32LE",4]),L.prototype.fieldSpec.push(["c2","writeInt32LE",4]);var T=function(e,t){return p.call(this,e),this.messageType="STECHeaderDepA",this.fields=t||this.parser.parse(e.payload),this};(T.prototype=Object.create(p.prototype)).messageType="STECHeaderDepA",T.prototype.constructor=T,T.prototype.parser=(new o).endianess("little").nest("time",{type:s.prototype.parser}).uint8("num_msgs").uint8("seq_num").uint8("update_interval").uint8("iod_atmo"),T.prototype.fieldSpec=[],T.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),T.prototype.fieldSpec.push(["num_msgs","writeUInt8",1]),T.prototype.fieldSpec.push(["seq_num","writeUInt8",1]),T.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),T.prototype.fieldSpec.push(["iod_atmo","writeUInt8",1]);var U=function(e,t){return p.call(this,e),this.messageType="GriddedCorrectionHeaderDepA",this.fields=t||this.parser.parse(e.payload),this};(U.prototype=Object.create(p.prototype)).messageType="GriddedCorrectionHeaderDepA",U.prototype.constructor=U,U.prototype.parser=(new o).endianess("little").nest("time",{type:s.prototype.parser}).uint16("num_msgs").uint16("seq_num").uint8("update_interval").uint8("iod_atmo").uint8("tropo_quality_indicator"),U.prototype.fieldSpec=[],U.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),U.prototype.fieldSpec.push(["num_msgs","writeUInt16LE",2]),U.prototype.fieldSpec.push(["seq_num","writeUInt16LE",2]),U.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),U.prototype.fieldSpec.push(["iod_atmo","writeUInt8",1]),U.prototype.fieldSpec.push(["tropo_quality_indicator","writeUInt8",1]);var M=function(e,t){return p.call(this,e),this.messageType="GridDefinitionHeaderDepA",this.fields=t||this.parser.parse(e.payload),this};(M.prototype=Object.create(p.prototype)).messageType="GridDefinitionHeaderDepA",M.prototype.constructor=M,M.prototype.parser=(new o).endianess("little").uint8("region_size_inverse").uint16("area_width").uint16("lat_nw_corner_enc").uint16("lon_nw_corner_enc").uint8("num_msgs").uint8("seq_num"),M.prototype.fieldSpec=[],M.prototype.fieldSpec.push(["region_size_inverse","writeUInt8",1]),M.prototype.fieldSpec.push(["area_width","writeUInt16LE",2]),M.prototype.fieldSpec.push(["lat_nw_corner_enc","writeUInt16LE",2]),M.prototype.fieldSpec.push(["lon_nw_corner_enc","writeUInt16LE",2]),M.prototype.fieldSpec.push(["num_msgs","writeUInt8",1]),M.prototype.fieldSpec.push(["seq_num","writeUInt8",1]);var D=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_STEC_CORRECTION_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(D.prototype=Object.create(p.prototype)).messageType="MSG_SSR_STEC_CORRECTION_DEP_A",D.prototype.msg_type=1515,D.prototype.constructor=D,D.prototype.parser=(new o).endianess("little").nest("header",{type:T.prototype.parser}).array("stec_sat_list",{type:y.prototype.parser,readUntil:"eof"}),D.prototype.fieldSpec=[],D.prototype.fieldSpec.push(["header",T.prototype.fieldSpec]),D.prototype.fieldSpec.push(["stec_sat_list","array",y.prototype.fieldSpec,function(){return this.fields.array.length},null]);var O=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_GRIDDED_CORRECTION_NO_STD_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(O.prototype=Object.create(p.prototype)).messageType="MSG_SSR_GRIDDED_CORRECTION_NO_STD_DEP_A",O.prototype.msg_type=1520,O.prototype.constructor=O,O.prototype.parser=(new o).endianess("little").nest("header",{type:U.prototype.parser}).uint16("index").nest("tropo_delay_correction",{type:h.prototype.parser}).array("stec_residuals",{type:d.prototype.parser,readUntil:"eof"}),O.prototype.fieldSpec=[],O.prototype.fieldSpec.push(["header",U.prototype.fieldSpec]),O.prototype.fieldSpec.push(["index","writeUInt16LE",2]),O.prototype.fieldSpec.push(["tropo_delay_correction",h.prototype.fieldSpec]),O.prototype.fieldSpec.push(["stec_residuals","array",d.prototype.fieldSpec,function(){return this.fields.array.length},null]);var G=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_GRIDDED_CORRECTION_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(G.prototype=Object.create(p.prototype)).messageType="MSG_SSR_GRIDDED_CORRECTION_DEP_A",G.prototype.msg_type=1530,G.prototype.constructor=G,G.prototype.parser=(new o).endianess("little").nest("header",{type:U.prototype.parser}).uint16("index").nest("tropo_delay_correction",{type:f.prototype.parser}).array("stec_residuals",{type:_.prototype.parser,readUntil:"eof"}),G.prototype.fieldSpec=[],G.prototype.fieldSpec.push(["header",U.prototype.fieldSpec]),G.prototype.fieldSpec.push(["index","writeUInt16LE",2]),G.prototype.fieldSpec.push(["tropo_delay_correction",f.prototype.fieldSpec]),G.prototype.fieldSpec.push(["stec_residuals","array",_.prototype.fieldSpec,function(){return this.fields.array.length},null]);var A=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_GRID_DEFINITION_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(A.prototype=Object.create(p.prototype)).messageType="MSG_SSR_GRID_DEFINITION_DEP_A",A.prototype.msg_type=1525,A.prototype.constructor=A,A.prototype.parser=(new o).endianess("little").nest("header",{type:M.prototype.parser}).array("rle_list",{type:"uint8",readUntil:"eof"}),A.prototype.fieldSpec=[],A.prototype.fieldSpec.push(["header",M.prototype.fieldSpec]),A.prototype.fieldSpec.push(["rle_list","array","writeUInt8",function(){return 1},null]);var C=function(e,t){return p.call(this,e),this.messageType="BoundsHeader",this.fields=t||this.parser.parse(e.payload),this};(C.prototype=Object.create(p.prototype)).messageType="BoundsHeader",C.prototype.constructor=C,C.prototype.parser=(new o).endianess("little").nest("time",{type:s.prototype.parser}).uint8("num_msgs").uint8("seq_num").uint8("update_interval").uint8("sol_id"),C.prototype.fieldSpec=[],C.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),C.prototype.fieldSpec.push(["num_msgs","writeUInt8",1]),C.prototype.fieldSpec.push(["seq_num","writeUInt8",1]),C.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),C.prototype.fieldSpec.push(["sol_id","writeUInt8",1]);var R=function(e,t){return p.call(this,e),this.messageType="OrbitClockBound",this.fields=t||this.parser.parse(e.payload),this};(R.prototype=Object.create(p.prototype)).messageType="OrbitClockBound",R.prototype.constructor=R,R.prototype.parser=(new o).endianess("little").uint8("sat_id").uint8("orb_radial_bound_mu").uint8("orb_along_bound_mu").uint8("orb_cross_bound_mu").uint8("orb_radial_bound_sig").uint8("orb_along_bound_sig").uint8("orb_cross_bound_sig").uint8("clock_bound_mu").uint8("clock_bound_sig"),R.prototype.fieldSpec=[],R.prototype.fieldSpec.push(["sat_id","writeUInt8",1]),R.prototype.fieldSpec.push(["orb_radial_bound_mu","writeUInt8",1]),R.prototype.fieldSpec.push(["orb_along_bound_mu","writeUInt8",1]),R.prototype.fieldSpec.push(["orb_cross_bound_mu","writeUInt8",1]),R.prototype.fieldSpec.push(["orb_radial_bound_sig","writeUInt8",1]),R.prototype.fieldSpec.push(["orb_along_bound_sig","writeUInt8",1]),R.prototype.fieldSpec.push(["orb_cross_bound_sig","writeUInt8",1]),R.prototype.fieldSpec.push(["clock_bound_mu","writeUInt8",1]),R.prototype.fieldSpec.push(["clock_bound_sig","writeUInt8",1]);var P=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_ORBIT_CLOCK_BOUNDS",this.fields=t||this.parser.parse(e.payload),this};(P.prototype=Object.create(p.prototype)).messageType="MSG_SSR_ORBIT_CLOCK_BOUNDS",P.prototype.msg_type=1502,P.prototype.constructor=P,P.prototype.parser=(new o).endianess("little").nest("header",{type:C.prototype.parser}).uint8("ssr_iod").uint8("const_id").uint8("n_sats").array("orbit_clock_bounds",{type:R.prototype.parser,length:"n_sats"}),P.prototype.fieldSpec=[],P.prototype.fieldSpec.push(["header",C.prototype.fieldSpec]),P.prototype.fieldSpec.push(["ssr_iod","writeUInt8",1]),P.prototype.fieldSpec.push(["const_id","writeUInt8",1]),P.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),P.prototype.fieldSpec.push(["orbit_clock_bounds","array",R.prototype.fieldSpec,function(){return this.fields.array.length},"n_sats"]);var N=function(e,t){return p.call(this,e),this.messageType="CodePhaseBiasesSatSig",this.fields=t||this.parser.parse(e.payload),this};(N.prototype=Object.create(p.prototype)).messageType="CodePhaseBiasesSatSig",N.prototype.constructor=N,N.prototype.parser=(new o).endianess("little").uint8("sat_id").uint8("signal_id").uint8("code_bias_bound_mu").uint8("code_bias_bound_sig").uint8("phase_bias_bound_mu").uint8("phase_bias_bound_sig"),N.prototype.fieldSpec=[],N.prototype.fieldSpec.push(["sat_id","writeUInt8",1]),N.prototype.fieldSpec.push(["signal_id","writeUInt8",1]),N.prototype.fieldSpec.push(["code_bias_bound_mu","writeUInt8",1]),N.prototype.fieldSpec.push(["code_bias_bound_sig","writeUInt8",1]),N.prototype.fieldSpec.push(["phase_bias_bound_mu","writeUInt8",1]),N.prototype.fieldSpec.push(["phase_bias_bound_sig","writeUInt8",1]);var j=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_CODE_PHASE_BIASES_BOUNDS",this.fields=t||this.parser.parse(e.payload),this};(j.prototype=Object.create(p.prototype)).messageType="MSG_SSR_CODE_PHASE_BIASES_BOUNDS",j.prototype.msg_type=1516,j.prototype.constructor=j,j.prototype.parser=(new o).endianess("little").nest("header",{type:C.prototype.parser}).uint8("ssr_iod").uint8("const_id").uint8("n_sats_signals").array("satellites_signals",{type:N.prototype.parser,length:"n_sats_signals"}),j.prototype.fieldSpec=[],j.prototype.fieldSpec.push(["header",C.prototype.fieldSpec]),j.prototype.fieldSpec.push(["ssr_iod","writeUInt8",1]),j.prototype.fieldSpec.push(["const_id","writeUInt8",1]),j.prototype.fieldSpec.push(["n_sats_signals","writeUInt8",1]),j.prototype.fieldSpec.push(["satellites_signals","array",N.prototype.fieldSpec,function(){return this.fields.array.length},"n_sats_signals"]),e.exports={CodeBiasesContent:a,PhaseBiasesContent:l,STECHeader:c,GriddedCorrectionHeader:u,STECSatElement:y,TroposphericDelayCorrectionNoStd:h,TroposphericDelayCorrection:f,STECResidualNoStd:d,STECResidual:_,1501:S,MsgSsrOrbitClock:S,1505:g,MsgSsrCodeBiases:g,1510:w,MsgSsrPhaseBiases:w,1531:E,MsgSsrStecCorrection:E,1532:m,MsgSsrGriddedCorrection:m,1526:b,MsgSsrTileDefinition:b,SatelliteAPC:v,1540:I,MsgSsrSatelliteApc:I,1500:L,MsgSsrOrbitClockDepA:L,STECHeaderDepA:T,GriddedCorrectionHeaderDepA:U,GridDefinitionHeaderDepA:M,1515:D,MsgSsrStecCorrectionDepA:D,1520:O,MsgSsrGriddedCorrectionNoStdDepA:O,1530:G,MsgSsrGriddedCorrectionDepA:G,1525:A,MsgSsrGridDefinitionDepA:A,BoundsHeader:C,OrbitClockBound:R,1502:P,MsgSsrOrbitClockBounds:P,CodePhaseBiasesSatSig:N,1516:j,MsgSsrCodePhaseBiasesBounds:j}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_STARTUP",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_STARTUP",i.prototype.msg_type=65280,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint8("cause").uint8("startup_type").uint16("reserved"),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["cause","writeUInt8",1]),i.prototype.fieldSpec.push(["startup_type","writeUInt8",1]),i.prototype.fieldSpec.push(["reserved","writeUInt16LE",2]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_DGNSS_STATUS",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_DGNSS_STATUS",s.prototype.msg_type=65282,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint8("flags").uint16("latency").uint8("num_signals").string("source",{greedy:!0}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["flags","writeUInt8",1]),s.prototype.fieldSpec.push(["latency","writeUInt16LE",2]),s.prototype.fieldSpec.push(["num_signals","writeUInt8",1]),s.prototype.fieldSpec.push(["source","string",null]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_HEARTBEAT",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_HEARTBEAT",n.prototype.msg_type=65535,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint32("flags"),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["flags","writeUInt32LE",4]);var a=function(e,t){return p.call(this,e),this.messageType="SubSystemReport",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="SubSystemReport",a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").uint16("component").uint8("generic").uint8("specific"),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["component","writeUInt16LE",2]),a.prototype.fieldSpec.push(["generic","writeUInt8",1]),a.prototype.fieldSpec.push(["specific","writeUInt8",1]);var l=function(e,t){return p.call(this,e),this.messageType="MSG_STATUS_REPORT",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="MSG_STATUS_REPORT",l.prototype.msg_type=65534,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").uint16("reporting_system").uint16("sbp_version").uint32("sequence").uint32("uptime").array("status",{type:a.prototype.parser,readUntil:"eof"}),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["reporting_system","writeUInt16LE",2]),l.prototype.fieldSpec.push(["sbp_version","writeUInt16LE",2]),l.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),l.prototype.fieldSpec.push(["uptime","writeUInt32LE",4]),l.prototype.fieldSpec.push(["status","array",a.prototype.fieldSpec,function(){return this.fields.array.length},null]);var c=function(e,t){return p.call(this,e),this.messageType="StatusJournalItem",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="StatusJournalItem",c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint32("uptime").nest("report",{type:a.prototype.parser}),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["uptime","writeUInt32LE",4]),c.prototype.fieldSpec.push(["report",a.prototype.fieldSpec]);var u=function(e,t){return p.call(this,e),this.messageType="MSG_STATUS_JOURNAL",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="MSG_STATUS_JOURNAL",u.prototype.msg_type=65533,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint16("reporting_system").uint16("sbp_version").uint32("total_status_reports").uint8("sequence_descriptor").array("journal",{type:c.prototype.parser,readUntil:"eof"}),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["reporting_system","writeUInt16LE",2]),u.prototype.fieldSpec.push(["sbp_version","writeUInt16LE",2]),u.prototype.fieldSpec.push(["total_status_reports","writeUInt32LE",4]),u.prototype.fieldSpec.push(["sequence_descriptor","writeUInt8",1]),u.prototype.fieldSpec.push(["journal","array",c.prototype.fieldSpec,function(){return this.fields.array.length},null]);var y=function(e,t){return p.call(this,e),this.messageType="MSG_INS_STATUS",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="MSG_INS_STATUS",y.prototype.msg_type=65283,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").uint32("flags"),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["flags","writeUInt32LE",4]);var h=function(e,t){return p.call(this,e),this.messageType="MSG_CSAC_TELEMETRY",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_CSAC_TELEMETRY",h.prototype.msg_type=65284,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").uint8("id").string("telemetry",{greedy:!0}),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["id","writeUInt8",1]),h.prototype.fieldSpec.push(["telemetry","string",null]);var f=function(e,t){return p.call(this,e),this.messageType="MSG_CSAC_TELEMETRY_LABELS",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="MSG_CSAC_TELEMETRY_LABELS",f.prototype.msg_type=65285,f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").uint8("id").string("telemetry_labels",{greedy:!0}),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["id","writeUInt8",1]),f.prototype.fieldSpec.push(["telemetry_labels","string",null]);var d=function(e,t){return p.call(this,e),this.messageType="MSG_INS_UPDATES",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(p.prototype)).messageType="MSG_INS_UPDATES",d.prototype.msg_type=65286,d.prototype.constructor=d,d.prototype.parser=(new o).endianess("little").uint32("tow").uint8("gnsspos").uint8("gnssvel").uint8("wheelticks").uint8("speed").uint8("nhc").uint8("zerovel"),d.prototype.fieldSpec=[],d.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),d.prototype.fieldSpec.push(["gnsspos","writeUInt8",1]),d.prototype.fieldSpec.push(["gnssvel","writeUInt8",1]),d.prototype.fieldSpec.push(["wheelticks","writeUInt8",1]),d.prototype.fieldSpec.push(["speed","writeUInt8",1]),d.prototype.fieldSpec.push(["nhc","writeUInt8",1]),d.prototype.fieldSpec.push(["zerovel","writeUInt8",1]);var _=function(e,t){return p.call(this,e),this.messageType="MSG_GNSS_TIME_OFFSET",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(p.prototype)).messageType="MSG_GNSS_TIME_OFFSET",_.prototype.msg_type=65287,_.prototype.constructor=_,_.prototype.parser=(new o).endianess("little").int16("weeks").int32("milliseconds").int16("microseconds").uint8("flags"),_.prototype.fieldSpec=[],_.prototype.fieldSpec.push(["weeks","writeInt16LE",2]),_.prototype.fieldSpec.push(["milliseconds","writeInt32LE",4]),_.prototype.fieldSpec.push(["microseconds","writeInt16LE",2]),_.prototype.fieldSpec.push(["flags","writeUInt8",1]);var S=function(e,t){return p.call(this,e),this.messageType="MSG_PPS_TIME",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(p.prototype)).messageType="MSG_PPS_TIME",S.prototype.msg_type=65288,S.prototype.constructor=S,S.prototype.parser=(new o).endianess("little").uint64("time").uint8("flags"),S.prototype.fieldSpec=[],S.prototype.fieldSpec.push(["time","writeUInt64LE",8]),S.prototype.fieldSpec.push(["flags","writeUInt8",1]);var g=function(e,t){return p.call(this,e),this.messageType="MSG_SENSOR_AID_EVENT",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(p.prototype)).messageType="MSG_SENSOR_AID_EVENT",g.prototype.msg_type=65289,g.prototype.constructor=g,g.prototype.parser=(new o).endianess("little").uint32("time").uint8("sensor_type").uint16("sensor_id").uint8("sensor_state").uint8("n_available_meas").uint8("n_attempted_meas").uint8("n_accepted_meas").uint32("flags"),g.prototype.fieldSpec=[],g.prototype.fieldSpec.push(["time","writeUInt32LE",4]),g.prototype.fieldSpec.push(["sensor_type","writeUInt8",1]),g.prototype.fieldSpec.push(["sensor_id","writeUInt16LE",2]),g.prototype.fieldSpec.push(["sensor_state","writeUInt8",1]),g.prototype.fieldSpec.push(["n_available_meas","writeUInt8",1]),g.prototype.fieldSpec.push(["n_attempted_meas","writeUInt8",1]),g.prototype.fieldSpec.push(["n_accepted_meas","writeUInt8",1]),g.prototype.fieldSpec.push(["flags","writeUInt32LE",4]);var w=function(e,t){return p.call(this,e),this.messageType="MSG_GROUP_META",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(p.prototype)).messageType="MSG_GROUP_META",w.prototype.msg_type=65290,w.prototype.constructor=w,w.prototype.parser=(new o).endianess("little").uint8("group_id").uint8("flags").uint8("n_group_msgs").array("group_msgs",{type:"uint16le",length:"n_group_msgs"}),w.prototype.fieldSpec=[],w.prototype.fieldSpec.push(["group_id","writeUInt8",1]),w.prototype.fieldSpec.push(["flags","writeUInt8",1]),w.prototype.fieldSpec.push(["n_group_msgs","writeUInt8",1]),w.prototype.fieldSpec.push(["group_msgs","array","writeUInt16LE",function(){return 2},"n_group_msgs"]),e.exports={65280:i,MsgStartup:i,65282:s,MsgDgnssStatus:s,65535:n,MsgHeartbeat:n,SubSystemReport:a,65534:l,MsgStatusReport:l,StatusJournalItem:c,65533:u,MsgStatusJournal:u,65283:y,MsgInsStatus:y,65284:h,MsgCsacTelemetry:h,65285:f,MsgCsacTelemetryLabels:f,65286:d,MsgInsUpdates:d,65287:_,MsgGnssTimeOffset:_,65288:S,MsgPpsTime:S,65289:g,MsgSensorAidEvent:g,65290:w,MsgGroupMeta:w}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,r(0).CarrierPhase),s=r(0).GnssSignal,n=r(0).GnssSignalDep,a=r(0).GPSTime,l=r(0).GPSTimeDep,c=(r(0).GPSTimeSec,r(0).SvId,function(e,t){return p.call(this,e),this.messageType="MSG_TRACKING_STATE_DETAILED_DEP_A",this.fields=t||this.parser.parse(e.payload),this});(c.prototype=Object.create(p.prototype)).messageType="MSG_TRACKING_STATE_DETAILED_DEP_A",c.prototype.msg_type=33,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint64("recv_time").nest("tot",{type:a.prototype.parser}).uint32("P").uint16("P_std").nest("L",{type:i.prototype.parser}).uint8("cn0").uint16("lock").nest("sid",{type:s.prototype.parser}).int32("doppler").uint16("doppler_std").uint32("uptime").int16("clock_offset").int16("clock_drift").uint16("corr_spacing").int8("acceleration").uint8("sync_flags").uint8("tow_flags").uint8("track_flags").uint8("nav_flags").uint8("pset_flags").uint8("misc_flags"),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["recv_time","writeUInt64LE",8]),c.prototype.fieldSpec.push(["tot",a.prototype.fieldSpec]),c.prototype.fieldSpec.push(["P","writeUInt32LE",4]),c.prototype.fieldSpec.push(["P_std","writeUInt16LE",2]),c.prototype.fieldSpec.push(["L",i.prototype.fieldSpec]),c.prototype.fieldSpec.push(["cn0","writeUInt8",1]),c.prototype.fieldSpec.push(["lock","writeUInt16LE",2]),c.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),c.prototype.fieldSpec.push(["doppler","writeInt32LE",4]),c.prototype.fieldSpec.push(["doppler_std","writeUInt16LE",2]),c.prototype.fieldSpec.push(["uptime","writeUInt32LE",4]),c.prototype.fieldSpec.push(["clock_offset","writeInt16LE",2]),c.prototype.fieldSpec.push(["clock_drift","writeInt16LE",2]),c.prototype.fieldSpec.push(["corr_spacing","writeUInt16LE",2]),c.prototype.fieldSpec.push(["acceleration","writeInt8",1]),c.prototype.fieldSpec.push(["sync_flags","writeUInt8",1]),c.prototype.fieldSpec.push(["tow_flags","writeUInt8",1]),c.prototype.fieldSpec.push(["track_flags","writeUInt8",1]),c.prototype.fieldSpec.push(["nav_flags","writeUInt8",1]),c.prototype.fieldSpec.push(["pset_flags","writeUInt8",1]),c.prototype.fieldSpec.push(["misc_flags","writeUInt8",1]);var u=function(e,t){return p.call(this,e),this.messageType="MSG_TRACKING_STATE_DETAILED_DEP",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="MSG_TRACKING_STATE_DETAILED_DEP",u.prototype.msg_type=17,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint64("recv_time").nest("tot",{type:l.prototype.parser}).uint32("P").uint16("P_std").nest("L",{type:i.prototype.parser}).uint8("cn0").uint16("lock").nest("sid",{type:n.prototype.parser}).int32("doppler").uint16("doppler_std").uint32("uptime").int16("clock_offset").int16("clock_drift").uint16("corr_spacing").int8("acceleration").uint8("sync_flags").uint8("tow_flags").uint8("track_flags").uint8("nav_flags").uint8("pset_flags").uint8("misc_flags"),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["recv_time","writeUInt64LE",8]),u.prototype.fieldSpec.push(["tot",l.prototype.fieldSpec]),u.prototype.fieldSpec.push(["P","writeUInt32LE",4]),u.prototype.fieldSpec.push(["P_std","writeUInt16LE",2]),u.prototype.fieldSpec.push(["L",i.prototype.fieldSpec]),u.prototype.fieldSpec.push(["cn0","writeUInt8",1]),u.prototype.fieldSpec.push(["lock","writeUInt16LE",2]),u.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),u.prototype.fieldSpec.push(["doppler","writeInt32LE",4]),u.prototype.fieldSpec.push(["doppler_std","writeUInt16LE",2]),u.prototype.fieldSpec.push(["uptime","writeUInt32LE",4]),u.prototype.fieldSpec.push(["clock_offset","writeInt16LE",2]),u.prototype.fieldSpec.push(["clock_drift","writeInt16LE",2]),u.prototype.fieldSpec.push(["corr_spacing","writeUInt16LE",2]),u.prototype.fieldSpec.push(["acceleration","writeInt8",1]),u.prototype.fieldSpec.push(["sync_flags","writeUInt8",1]),u.prototype.fieldSpec.push(["tow_flags","writeUInt8",1]),u.prototype.fieldSpec.push(["track_flags","writeUInt8",1]),u.prototype.fieldSpec.push(["nav_flags","writeUInt8",1]),u.prototype.fieldSpec.push(["pset_flags","writeUInt8",1]),u.prototype.fieldSpec.push(["misc_flags","writeUInt8",1]);var y=function(e,t){return p.call(this,e),this.messageType="TrackingChannelState",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="TrackingChannelState",y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").nest("sid",{type:s.prototype.parser}).uint8("fcn").uint8("cn0"),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),y.prototype.fieldSpec.push(["fcn","writeUInt8",1]),y.prototype.fieldSpec.push(["cn0","writeUInt8",1]);var h=function(e,t){return p.call(this,e),this.messageType="MSG_TRACKING_STATE",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_TRACKING_STATE",h.prototype.msg_type=65,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").array("states",{type:y.prototype.parser,readUntil:"eof"}),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["states","array",y.prototype.fieldSpec,function(){return this.fields.array.length},null]);var f=function(e,t){return p.call(this,e),this.messageType="MeasurementState",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="MeasurementState",f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").nest("mesid",{type:s.prototype.parser}).uint8("cn0"),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["mesid",s.prototype.fieldSpec]),f.prototype.fieldSpec.push(["cn0","writeUInt8",1]);var d=function(e,t){return p.call(this,e),this.messageType="MSG_MEASUREMENT_STATE",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(p.prototype)).messageType="MSG_MEASUREMENT_STATE",d.prototype.msg_type=97,d.prototype.constructor=d,d.prototype.parser=(new o).endianess("little").array("states",{type:f.prototype.parser,readUntil:"eof"}),d.prototype.fieldSpec=[],d.prototype.fieldSpec.push(["states","array",f.prototype.fieldSpec,function(){return this.fields.array.length},null]);var _=function(e,t){return p.call(this,e),this.messageType="TrackingChannelCorrelation",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(p.prototype)).messageType="TrackingChannelCorrelation",_.prototype.constructor=_,_.prototype.parser=(new o).endianess("little").int16("I").int16("Q"),_.prototype.fieldSpec=[],_.prototype.fieldSpec.push(["I","writeInt16LE",2]),_.prototype.fieldSpec.push(["Q","writeInt16LE",2]);var S=function(e,t){return p.call(this,e),this.messageType="MSG_TRACKING_IQ",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(p.prototype)).messageType="MSG_TRACKING_IQ",S.prototype.msg_type=45,S.prototype.constructor=S,S.prototype.parser=(new o).endianess("little").uint8("channel").nest("sid",{type:s.prototype.parser}).array("corrs",{length:3,type:_.prototype.parser}),S.prototype.fieldSpec=[],S.prototype.fieldSpec.push(["channel","writeUInt8",1]),S.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),S.prototype.fieldSpec.push(["corrs","array",_.prototype.fieldSpec,function(){return this.fields.array.length},3]);var g=function(e,t){return p.call(this,e),this.messageType="TrackingChannelCorrelationDep",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(p.prototype)).messageType="TrackingChannelCorrelationDep",g.prototype.constructor=g,g.prototype.parser=(new o).endianess("little").int32("I").int32("Q"),g.prototype.fieldSpec=[],g.prototype.fieldSpec.push(["I","writeInt32LE",4]),g.prototype.fieldSpec.push(["Q","writeInt32LE",4]);var w=function(e,t){return p.call(this,e),this.messageType="MSG_TRACKING_IQ_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(p.prototype)).messageType="MSG_TRACKING_IQ_DEP_B",w.prototype.msg_type=44,w.prototype.constructor=w,w.prototype.parser=(new o).endianess("little").uint8("channel").nest("sid",{type:s.prototype.parser}).array("corrs",{length:3,type:g.prototype.parser}),w.prototype.fieldSpec=[],w.prototype.fieldSpec.push(["channel","writeUInt8",1]),w.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),w.prototype.fieldSpec.push(["corrs","array",g.prototype.fieldSpec,function(){return this.fields.array.length},3]);var E=function(e,t){return p.call(this,e),this.messageType="MSG_TRACKING_IQ_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(p.prototype)).messageType="MSG_TRACKING_IQ_DEP_A",E.prototype.msg_type=28,E.prototype.constructor=E,E.prototype.parser=(new o).endianess("little").uint8("channel").nest("sid",{type:n.prototype.parser}).array("corrs",{length:3,type:g.prototype.parser}),E.prototype.fieldSpec=[],E.prototype.fieldSpec.push(["channel","writeUInt8",1]),E.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),E.prototype.fieldSpec.push(["corrs","array",g.prototype.fieldSpec,function(){return this.fields.array.length},3]);var m=function(e,t){return p.call(this,e),this.messageType="TrackingChannelStateDepA",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(p.prototype)).messageType="TrackingChannelStateDepA",m.prototype.constructor=m,m.prototype.parser=(new o).endianess("little").uint8("state").uint8("prn").floatle("cn0"),m.prototype.fieldSpec=[],m.prototype.fieldSpec.push(["state","writeUInt8",1]),m.prototype.fieldSpec.push(["prn","writeUInt8",1]),m.prototype.fieldSpec.push(["cn0","writeFloatLE",4]);var b=function(e,t){return p.call(this,e),this.messageType="MSG_TRACKING_STATE_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(p.prototype)).messageType="MSG_TRACKING_STATE_DEP_A",b.prototype.msg_type=22,b.prototype.constructor=b,b.prototype.parser=(new o).endianess("little").array("states",{type:m.prototype.parser,readUntil:"eof"}),b.prototype.fieldSpec=[],b.prototype.fieldSpec.push(["states","array",m.prototype.fieldSpec,function(){return this.fields.array.length},null]);var v=function(e,t){return p.call(this,e),this.messageType="TrackingChannelStateDepB",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(p.prototype)).messageType="TrackingChannelStateDepB",v.prototype.constructor=v,v.prototype.parser=(new o).endianess("little").uint8("state").nest("sid",{type:n.prototype.parser}).floatle("cn0"),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["state","writeUInt8",1]),v.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),v.prototype.fieldSpec.push(["cn0","writeFloatLE",4]);var I=function(e,t){return p.call(this,e),this.messageType="MSG_TRACKING_STATE_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(p.prototype)).messageType="MSG_TRACKING_STATE_DEP_B",I.prototype.msg_type=19,I.prototype.constructor=I,I.prototype.parser=(new o).endianess("little").array("states",{type:v.prototype.parser,readUntil:"eof"}),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["states","array",v.prototype.fieldSpec,function(){return this.fields.array.length},null]),e.exports={33:c,MsgTrackingStateDetailedDepA:c,17:u,MsgTrackingStateDetailedDep:u,TrackingChannelState:y,65:h,MsgTrackingState:h,MeasurementState:f,97:d,MsgMeasurementState:d,TrackingChannelCorrelation:_,45:S,MsgTrackingIq:S,TrackingChannelCorrelationDep:g,44:w,MsgTrackingIqDepB:w,28:E,MsgTrackingIqDepA:E,TrackingChannelStateDepA:m,22:b,MsgTrackingStateDepA:b,TrackingChannelStateDepB:v,19:I,MsgTrackingStateDepB:I}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_USER_DATA",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_USER_DATA",i.prototype.msg_type=2048,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").array("contents",{type:"uint8",readUntil:"eof"}),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["contents","array","writeUInt8",function(){return 1},null]),e.exports={2048:i,MsgUserData:i}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_ODOMETRY",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_ODOMETRY",i.prototype.msg_type=2307,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint32("tow").int32("velocity").uint8("flags"),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),i.prototype.fieldSpec.push(["velocity","writeInt32LE",4]),i.prototype.fieldSpec.push(["flags","writeUInt8",1]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_WHEELTICK",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_WHEELTICK",s.prototype.msg_type=2308,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint64("time").uint8("flags").uint8("source").int32("ticks"),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["time","writeUInt64LE",8]),s.prototype.fieldSpec.push(["flags","writeUInt8",1]),s.prototype.fieldSpec.push(["source","writeUInt8",1]),s.prototype.fieldSpec.push(["ticks","writeInt32LE",4]),e.exports={2307:i,MsgOdometry:i,2308:s,MsgWheeltick:s}}]); \ No newline at end of file +function p(e,t){if(e===t)return 0;for(var r=e.length,p=t.length,o=0,i=Math.min(r,p);o=0;l--)if(c[l]!==u[l])return!1;for(l=c.length-1;l>=0;l--)if(a=c[l],!g(e[a],t[a],r,p))return!1;return!0}(e,t,r,s))}return r?e===t:e==t}function w(e){return"[object Arguments]"==Object.prototype.toString.call(e)}function E(e,t){if(!e||!t)return!1;if("[object RegExp]"==Object.prototype.toString.call(t))return t.test(e);try{if(e instanceof t)return!0}catch(e){}return!Error.isPrototypeOf(t)&&!0===t.call({},e)}function m(e,t,r,p){var o;if("function"!=typeof t)throw new TypeError('"block" argument must be a function');"string"==typeof r&&(p=r,r=null),o=function(e){var t;try{e()}catch(e){t=e}return t}(t),p=(r&&r.name?" ("+r.name+").":".")+(p?" "+p:"."),e&&!o&&_(o,r,"Missing expected exception"+p);var s="string"==typeof p,n=!e&&o&&!r;if((!e&&i.isError(o)&&s&&E(o,r)||n)&&_(o,r,"Got unwanted exception"+p),e&&o&&r&&!E(o,r)||!e&&o)throw o}u.AssertionError=function(e){this.name="AssertionError",this.actual=e.actual,this.expected=e.expected,this.operator=e.operator,e.message?(this.message=e.message,this.generatedMessage=!1):(this.message=function(e){return f(d(e.actual),128)+" "+e.operator+" "+f(d(e.expected),128)}(this),this.generatedMessage=!0);var t=e.stackStartFunction||_;if(Error.captureStackTrace)Error.captureStackTrace(this,t);else{var r=new Error;if(r.stack){var p=r.stack,o=h(t),i=p.indexOf("\n"+o);if(i>=0){var s=p.indexOf("\n",i+1);p=p.substring(s+1)}this.stack=p}}},i.inherits(u.AssertionError,Error),u.fail=_,u.ok=S,u.equal=function(e,t,r){e!=t&&_(e,t,r,"==",u.equal)},u.notEqual=function(e,t,r){e==t&&_(e,t,r,"!=",u.notEqual)},u.deepEqual=function(e,t,r){g(e,t,!1)||_(e,t,r,"deepEqual",u.deepEqual)},u.deepStrictEqual=function(e,t,r){g(e,t,!0)||_(e,t,r,"deepStrictEqual",u.deepStrictEqual)},u.notDeepEqual=function(e,t,r){g(e,t,!1)&&_(e,t,r,"notDeepEqual",u.notDeepEqual)},u.notDeepStrictEqual=function e(t,r,p){g(t,r,!0)&&_(t,r,p,"notDeepStrictEqual",e)},u.strictEqual=function(e,t,r){e!==t&&_(e,t,r,"===",u.strictEqual)},u.notStrictEqual=function(e,t,r){e===t&&_(e,t,r,"!==",u.notStrictEqual)},u.throws=function(e,t,r){m(!0,e,t,r)},u.doesNotThrow=function(e,t,r){m(!1,e,t,r)},u.ifError=function(e){if(e)throw e};var b=Object.keys||function(e){var t=[];for(var r in e)s.call(e,r)&&t.push(r);return t}}).call(this,r(5))},function(e,t,r){var p;!function(r){o(Math.pow(36,5)),o(Math.pow(16,7)),o(Math.pow(10,9)),o(Math.pow(2,30)),o(36),o(16),o(10),o(2);function o(e,t){return this instanceof o?(this._low=0,this._high=0,this.remainder=null,void 0===t?s.call(this,e):"string"==typeof e?n.call(this,e,t):void i.call(this,e,t)):new o(e,t)}function i(e,t){return this._low=0|e,this._high=0|t,this}function s(e){return this._low=65535&e,this._high=e>>>16,this}function n(e,t){var r=parseInt(e,t||10);return this._low=65535&r,this._high=r>>>16,this}o.prototype.fromBits=i,o.prototype.fromNumber=s,o.prototype.fromString=n,o.prototype.toNumber=function(){return 65536*this._high+this._low},o.prototype.toString=function(e){return this.toNumber().toString(e||10)},o.prototype.add=function(e){var t=this._low+e._low,r=t>>>16;return r+=this._high+e._high,this._low=65535&t,this._high=65535&r,this},o.prototype.subtract=function(e){return this.add(e.clone().negate())},o.prototype.multiply=function(e){var t,r,p=this._high,o=this._low,i=e._high,s=e._low;return t=(r=o*s)>>>16,t+=p*s,t&=65535,t+=o*i,this._low=65535&r,this._high=65535&t,this},o.prototype.div=function(e){if(0==e._low&&0==e._high)throw Error("division by zero");if(0==e._high&&1==e._low)return this.remainder=new o(0),this;if(e.gt(this))return this.remainder=this.clone(),this._low=0,this._high=0,this;if(this.eq(e))return this.remainder=new o(0),this._low=1,this._high=0,this;for(var t=e.clone(),r=-1;!this.lt(t);)t.shiftLeft(1,!0),r++;for(this.remainder=this.clone(),this._low=0,this._high=0;r>=0;r--)t.shiftRight(1),this.remainder.lt(t)||(this.remainder.subtract(t),r>=16?this._high|=1<>>16)&65535,this},o.prototype.equals=o.prototype.eq=function(e){return this._low==e._low&&this._high==e._high},o.prototype.greaterThan=o.prototype.gt=function(e){return this._high>e._high||!(this._highe._low},o.prototype.lessThan=o.prototype.lt=function(e){return this._highe._high)&&this._low16?(this._low=this._high>>e-16,this._high=0):16==e?(this._low=this._high,this._high=0):(this._low=this._low>>e|this._high<<16-e&65535,this._high>>=e),this},o.prototype.shiftLeft=o.prototype.shiftl=function(e,t){return e>16?(this._high=this._low<>16-e,this._low=this._low<>>32-e,this._low=65535&t,this._high=t>>>16,this},o.prototype.rotateRight=o.prototype.rotr=function(e){var t=this._high<<16|this._low;return t=t>>>e|t<<32-e,this._low=65535&t,this._high=t>>>16,this},o.prototype.clone=function(){return new o(this._low,this._high)},void 0===(p=function(){return o}.apply(t,[]))||(e.exports=p)}()},function(e,t,r){var p;!function(r){var o={16:s(Math.pow(16,5)),10:s(Math.pow(10,5)),2:s(Math.pow(2,5))},i={16:s(16),10:s(10),2:s(2)};function s(e,t,r,p){return this instanceof s?(this.remainder=null,"string"==typeof e?l.call(this,e,t):void 0===t?a.call(this,e):void n.apply(this,arguments)):new s(e,t,r,p)}function n(e,t,r,p){return void 0===r?(this._a00=65535&e,this._a16=e>>>16,this._a32=65535&t,this._a48=t>>>16,this):(this._a00=0|e,this._a16=0|t,this._a32=0|r,this._a48=0|p,this)}function a(e){return this._a00=65535&e,this._a16=e>>>16,this._a32=0,this._a48=0,this}function l(e,t){t=t||10,this._a00=0,this._a16=0,this._a32=0,this._a48=0;for(var r=o[t]||new s(Math.pow(t,5)),p=0,i=e.length;p=0&&(r.div(t),p[o]=r.remainder.toNumber().toString(e),r.gt(t));o--);return p[o-1]=r.toNumber().toString(e),p.join("")},s.prototype.add=function(e){var t=this._a00+e._a00,r=t>>>16,p=(r+=this._a16+e._a16)>>>16,o=(p+=this._a32+e._a32)>>>16;return o+=this._a48+e._a48,this._a00=65535&t,this._a16=65535&r,this._a32=65535&p,this._a48=65535&o,this},s.prototype.subtract=function(e){return this.add(e.clone().negate())},s.prototype.multiply=function(e){var t=this._a00,r=this._a16,p=this._a32,o=this._a48,i=e._a00,s=e._a16,n=e._a32,a=t*i,l=a>>>16,c=(l+=t*s)>>>16;l&=65535,c+=(l+=r*i)>>>16;var u=(c+=t*n)>>>16;return c&=65535,u+=(c+=r*s)>>>16,c&=65535,u+=(c+=p*i)>>>16,u+=t*e._a48,u&=65535,u+=r*n,u&=65535,u+=p*s,u&=65535,u+=o*i,this._a00=65535&a,this._a16=65535&l,this._a32=65535&c,this._a48=65535&u,this},s.prototype.div=function(e){if(0==e._a16&&0==e._a32&&0==e._a48){if(0==e._a00)throw Error("division by zero");if(1==e._a00)return this.remainder=new s(0),this}if(e.gt(this))return this.remainder=this.clone(),this._a00=0,this._a16=0,this._a32=0,this._a48=0,this;if(this.eq(e))return this.remainder=new s(0),this._a00=1,this._a16=0,this._a32=0,this._a48=0,this;for(var t=e.clone(),r=-1;!this.lt(t);)t.shiftLeft(1,!0),r++;for(this.remainder=this.clone(),this._a00=0,this._a16=0,this._a32=0,this._a48=0;r>=0;r--)t.shiftRight(1),this.remainder.lt(t)||(this.remainder.subtract(t),r>=48?this._a48|=1<=32?this._a32|=1<=16?this._a16|=1<>>16),this._a16=65535&e,e=(65535&~this._a32)+(e>>>16),this._a32=65535&e,this._a48=~this._a48+(e>>>16)&65535,this},s.prototype.equals=s.prototype.eq=function(e){return this._a48==e._a48&&this._a00==e._a00&&this._a32==e._a32&&this._a16==e._a16},s.prototype.greaterThan=s.prototype.gt=function(e){return this._a48>e._a48||!(this._a48e._a32||!(this._a32e._a16||!(this._a16e._a00))},s.prototype.lessThan=s.prototype.lt=function(e){return this._a48e._a48)&&(this._a32e._a32)&&(this._a16e._a16)&&this._a00=48?(this._a00=this._a48>>e-48,this._a16=0,this._a32=0,this._a48=0):e>=32?(e-=32,this._a00=65535&(this._a32>>e|this._a48<<16-e),this._a16=this._a48>>e&65535,this._a32=0,this._a48=0):e>=16?(e-=16,this._a00=65535&(this._a16>>e|this._a32<<16-e),this._a16=65535&(this._a32>>e|this._a48<<16-e),this._a32=this._a48>>e&65535,this._a48=0):(this._a00=65535&(this._a00>>e|this._a16<<16-e),this._a16=65535&(this._a16>>e|this._a32<<16-e),this._a32=65535&(this._a32>>e|this._a48<<16-e),this._a48=this._a48>>e&65535),this},s.prototype.shiftLeft=s.prototype.shiftl=function(e,t){return(e%=64)>=48?(this._a48=this._a00<=32?(e-=32,this._a48=this._a16<>16-e,this._a32=this._a00<=16?(e-=16,this._a48=this._a32<>16-e,this._a32=65535&(this._a16<>16-e),this._a16=this._a00<>16-e,this._a32=65535&(this._a32<>16-e),this._a16=65535&(this._a16<>16-e),this._a00=this._a00<=32){var t=this._a00;if(this._a00=this._a32,this._a32=t,t=this._a48,this._a48=this._a16,this._a16=t,32==e)return this;e-=32}var r=this._a48<<16|this._a32,p=this._a16<<16|this._a00,o=r<>>32-e,i=p<>>32-e;return this._a00=65535&i,this._a16=i>>>16,this._a32=65535&o,this._a48=o>>>16,this},s.prototype.rotateRight=s.prototype.rotr=function(e){if(0==(e%=64))return this;if(e>=32){var t=this._a00;if(this._a00=this._a32,this._a32=t,t=this._a48,this._a48=this._a16,this._a16=t,32==e)return this;e-=32}var r=this._a48<<16|this._a32,p=this._a16<<16|this._a00,o=r>>>e|p<<32-e,i=p>>>e|r<<32-e;return this._a00=65535&i,this._a16=i>>>16,this._a32=65535&o,this._a48=o>>>16,this},s.prototype.clone=function(){return new s(this._a00,this._a16,this._a32,this._a48)},void 0===(p=function(){return s}.apply(t,[]))||(e.exports=p)}()},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,r(0).CarrierPhase,r(0).GnssSignal),s=r(0).GnssSignalDep,n=(r(0).GPSTime,r(0).GPSTimeDep,r(0).GPSTimeSec,r(0).SvId,function(e,t){return p.call(this,e),this.messageType="MSG_ACQ_RESULT",this.fields=t||this.parser.parse(e.payload),this});(n.prototype=Object.create(p.prototype)).messageType="MSG_ACQ_RESULT",n.prototype.msg_type=47,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").floatle("cn0").floatle("cp").floatle("cf").nest("sid",{type:i.prototype.parser}),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["cn0","writeFloatLE",4]),n.prototype.fieldSpec.push(["cp","writeFloatLE",4]),n.prototype.fieldSpec.push(["cf","writeFloatLE",4]),n.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]);var a=function(e,t){return p.call(this,e),this.messageType="MSG_ACQ_RESULT_DEP_C",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="MSG_ACQ_RESULT_DEP_C",a.prototype.msg_type=31,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").floatle("cn0").floatle("cp").floatle("cf").nest("sid",{type:s.prototype.parser}),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["cn0","writeFloatLE",4]),a.prototype.fieldSpec.push(["cp","writeFloatLE",4]),a.prototype.fieldSpec.push(["cf","writeFloatLE",4]),a.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]);var l=function(e,t){return p.call(this,e),this.messageType="MSG_ACQ_RESULT_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="MSG_ACQ_RESULT_DEP_B",l.prototype.msg_type=20,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").floatle("snr").floatle("cp").floatle("cf").nest("sid",{type:s.prototype.parser}),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["snr","writeFloatLE",4]),l.prototype.fieldSpec.push(["cp","writeFloatLE",4]),l.prototype.fieldSpec.push(["cf","writeFloatLE",4]),l.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]);var c=function(e,t){return p.call(this,e),this.messageType="MSG_ACQ_RESULT_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="MSG_ACQ_RESULT_DEP_A",c.prototype.msg_type=21,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").floatle("snr").floatle("cp").floatle("cf").uint8("prn"),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["snr","writeFloatLE",4]),c.prototype.fieldSpec.push(["cp","writeFloatLE",4]),c.prototype.fieldSpec.push(["cf","writeFloatLE",4]),c.prototype.fieldSpec.push(["prn","writeUInt8",1]);var u=function(e,t){return p.call(this,e),this.messageType="AcqSvProfile",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="AcqSvProfile",u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint8("job_type").uint8("status").uint16("cn0").uint8("int_time").nest("sid",{type:i.prototype.parser}).uint16("bin_width").uint32("timestamp").uint32("time_spent").int32("cf_min").int32("cf_max").int32("cf").uint32("cp"),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["job_type","writeUInt8",1]),u.prototype.fieldSpec.push(["status","writeUInt8",1]),u.prototype.fieldSpec.push(["cn0","writeUInt16LE",2]),u.prototype.fieldSpec.push(["int_time","writeUInt8",1]),u.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]),u.prototype.fieldSpec.push(["bin_width","writeUInt16LE",2]),u.prototype.fieldSpec.push(["timestamp","writeUInt32LE",4]),u.prototype.fieldSpec.push(["time_spent","writeUInt32LE",4]),u.prototype.fieldSpec.push(["cf_min","writeInt32LE",4]),u.prototype.fieldSpec.push(["cf_max","writeInt32LE",4]),u.prototype.fieldSpec.push(["cf","writeInt32LE",4]),u.prototype.fieldSpec.push(["cp","writeUInt32LE",4]);var y=function(e,t){return p.call(this,e),this.messageType="AcqSvProfileDep",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="AcqSvProfileDep",y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").uint8("job_type").uint8("status").uint16("cn0").uint8("int_time").nest("sid",{type:s.prototype.parser}).uint16("bin_width").uint32("timestamp").uint32("time_spent").int32("cf_min").int32("cf_max").int32("cf").uint32("cp"),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["job_type","writeUInt8",1]),y.prototype.fieldSpec.push(["status","writeUInt8",1]),y.prototype.fieldSpec.push(["cn0","writeUInt16LE",2]),y.prototype.fieldSpec.push(["int_time","writeUInt8",1]),y.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),y.prototype.fieldSpec.push(["bin_width","writeUInt16LE",2]),y.prototype.fieldSpec.push(["timestamp","writeUInt32LE",4]),y.prototype.fieldSpec.push(["time_spent","writeUInt32LE",4]),y.prototype.fieldSpec.push(["cf_min","writeInt32LE",4]),y.prototype.fieldSpec.push(["cf_max","writeInt32LE",4]),y.prototype.fieldSpec.push(["cf","writeInt32LE",4]),y.prototype.fieldSpec.push(["cp","writeUInt32LE",4]);var h=function(e,t){return p.call(this,e),this.messageType="MSG_ACQ_SV_PROFILE",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_ACQ_SV_PROFILE",h.prototype.msg_type=46,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").array("acq_sv_profile",{type:u.prototype.parser,readUntil:"eof"}),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["acq_sv_profile","array",u.prototype.fieldSpec,function(){return this.fields.array.length},null]);var f=function(e,t){return p.call(this,e),this.messageType="MSG_ACQ_SV_PROFILE_DEP",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="MSG_ACQ_SV_PROFILE_DEP",f.prototype.msg_type=30,f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").array("acq_sv_profile",{type:y.prototype.parser,readUntil:"eof"}),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["acq_sv_profile","array",y.prototype.fieldSpec,function(){return this.fields.array.length},null]),e.exports={47:n,MsgAcqResult:n,31:a,MsgAcqResultDepC:a,20:l,MsgAcqResultDepB:l,21:c,MsgAcqResultDepA:c,AcqSvProfile:u,AcqSvProfileDep:y,46:h,MsgAcqSvProfile:h,30:f,MsgAcqSvProfileDep:f}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_BOOTLOADER_HANDSHAKE_REQ",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_BOOTLOADER_HANDSHAKE_REQ",i.prototype.msg_type=179,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little"),i.prototype.fieldSpec=[];var s=function(e,t){return p.call(this,e),this.messageType="MSG_BOOTLOADER_HANDSHAKE_RESP",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_BOOTLOADER_HANDSHAKE_RESP",s.prototype.msg_type=180,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint32("flags").string("version",{greedy:!0}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["flags","writeUInt32LE",4]),s.prototype.fieldSpec.push(["version","string",null]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_BOOTLOADER_JUMP_TO_APP",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_BOOTLOADER_JUMP_TO_APP",n.prototype.msg_type=177,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint8("jump"),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["jump","writeUInt8",1]);var a=function(e,t){return p.call(this,e),this.messageType="MSG_NAP_DEVICE_DNA_REQ",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="MSG_NAP_DEVICE_DNA_REQ",a.prototype.msg_type=222,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little"),a.prototype.fieldSpec=[];var l=function(e,t){return p.call(this,e),this.messageType="MSG_NAP_DEVICE_DNA_RESP",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="MSG_NAP_DEVICE_DNA_RESP",l.prototype.msg_type=221,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").array("dna",{length:8,type:"uint8"}),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["dna","array","writeUInt8",function(){return 1},8]);var c=function(e,t){return p.call(this,e),this.messageType="MSG_BOOTLOADER_HANDSHAKE_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="MSG_BOOTLOADER_HANDSHAKE_DEP_A",c.prototype.msg_type=176,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").array("handshake",{type:"uint8",readUntil:"eof"}),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["handshake","array","writeUInt8",function(){return 1},null]),e.exports={179:i,MsgBootloaderHandshakeReq:i,180:s,MsgBootloaderHandshakeResp:s,177:n,MsgBootloaderJumpToApp:n,222:a,MsgNapDeviceDnaReq:a,221:l,MsgNapDeviceDnaResp:l,176:c,MsgBootloaderHandshakeDepA:c}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_EXT_EVENT",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_EXT_EVENT",i.prototype.msg_type=257,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint16("wn").uint32("tow").int32("ns_residual").uint8("flags").uint8("pin"),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["wn","writeUInt16LE",2]),i.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),i.prototype.fieldSpec.push(["ns_residual","writeInt32LE",4]),i.prototype.fieldSpec.push(["flags","writeUInt8",1]),i.prototype.fieldSpec.push(["pin","writeUInt8",1]),e.exports={257:i,MsgExtEvent:i}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_READ_REQ",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_READ_REQ",i.prototype.msg_type=168,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint32("sequence").uint32("offset").uint8("chunk_size").string("filename",{greedy:!0}),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),i.prototype.fieldSpec.push(["offset","writeUInt32LE",4]),i.prototype.fieldSpec.push(["chunk_size","writeUInt8",1]),i.prototype.fieldSpec.push(["filename","string",null]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_READ_RESP",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_READ_RESP",s.prototype.msg_type=163,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint32("sequence").array("contents",{type:"uint8",readUntil:"eof"}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),s.prototype.fieldSpec.push(["contents","array","writeUInt8",function(){return 1},null]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_READ_DIR_REQ",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_READ_DIR_REQ",n.prototype.msg_type=169,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint32("sequence").uint32("offset").string("dirname",{greedy:!0}),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),n.prototype.fieldSpec.push(["offset","writeUInt32LE",4]),n.prototype.fieldSpec.push(["dirname","string",null]);var a=function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_READ_DIR_RESP",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_READ_DIR_RESP",a.prototype.msg_type=170,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").uint32("sequence").array("contents",{type:"uint8",readUntil:"eof"}),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),a.prototype.fieldSpec.push(["contents","array","writeUInt8",function(){return 1},null]);var l=function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_REMOVE",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_REMOVE",l.prototype.msg_type=172,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").string("filename",{greedy:!0}),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["filename","string",null]);var c=function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_WRITE_REQ",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_WRITE_REQ",c.prototype.msg_type=173,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint32("sequence").uint32("offset").string("filename",{greedy:!0}).array("data",{type:"uint8",readUntil:"eof"}),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),c.prototype.fieldSpec.push(["offset","writeUInt32LE",4]),c.prototype.fieldSpec.push(["filename","string",null]),c.prototype.fieldSpec.push(["data","array","writeUInt8",function(){return 1},null]);var u=function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_WRITE_RESP",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_WRITE_RESP",u.prototype.msg_type=171,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint32("sequence"),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]);var y=function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_CONFIG_REQ",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_CONFIG_REQ",y.prototype.msg_type=4097,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").uint32("sequence"),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]);var h=function(e,t){return p.call(this,e),this.messageType="MSG_FILEIO_CONFIG_RESP",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_FILEIO_CONFIG_RESP",h.prototype.msg_type=4098,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").uint32("sequence").uint32("window_size").uint32("batch_size").uint32("fileio_version"),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),h.prototype.fieldSpec.push(["window_size","writeUInt32LE",4]),h.prototype.fieldSpec.push(["batch_size","writeUInt32LE",4]),h.prototype.fieldSpec.push(["fileio_version","writeUInt32LE",4]),e.exports={168:i,MsgFileioReadReq:i,163:s,MsgFileioReadResp:s,169:n,MsgFileioReadDirReq:n,170:a,MsgFileioReadDirResp:a,172:l,MsgFileioRemove:l,173:c,MsgFileioWriteReq:c,171:u,MsgFileioWriteResp:u,4097:y,MsgFileioConfigReq:y,4098:h,MsgFileioConfigResp:h}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_FLASH_PROGRAM",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_FLASH_PROGRAM",i.prototype.msg_type=230,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint8("target").array("addr_start",{length:3,type:"uint8"}).uint8("addr_len").array("data",{type:"uint8",length:"addr_len"}),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["target","writeUInt8",1]),i.prototype.fieldSpec.push(["addr_start","array","writeUInt8",function(){return 1},3]),i.prototype.fieldSpec.push(["addr_len","writeUInt8",1]),i.prototype.fieldSpec.push(["data","array","writeUInt8",function(){return 1},"addr_len"]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_FLASH_DONE",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_FLASH_DONE",s.prototype.msg_type=224,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint8("response"),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["response","writeUInt8",1]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_FLASH_READ_REQ",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_FLASH_READ_REQ",n.prototype.msg_type=231,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint8("target").array("addr_start",{length:3,type:"uint8"}).uint8("addr_len"),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["target","writeUInt8",1]),n.prototype.fieldSpec.push(["addr_start","array","writeUInt8",function(){return 1},3]),n.prototype.fieldSpec.push(["addr_len","writeUInt8",1]);var a=function(e,t){return p.call(this,e),this.messageType="MSG_FLASH_READ_RESP",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="MSG_FLASH_READ_RESP",a.prototype.msg_type=225,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").uint8("target").array("addr_start",{length:3,type:"uint8"}).uint8("addr_len"),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["target","writeUInt8",1]),a.prototype.fieldSpec.push(["addr_start","array","writeUInt8",function(){return 1},3]),a.prototype.fieldSpec.push(["addr_len","writeUInt8",1]);var l=function(e,t){return p.call(this,e),this.messageType="MSG_FLASH_ERASE",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="MSG_FLASH_ERASE",l.prototype.msg_type=226,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").uint8("target").uint32("sector_num"),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["target","writeUInt8",1]),l.prototype.fieldSpec.push(["sector_num","writeUInt32LE",4]);var c=function(e,t){return p.call(this,e),this.messageType="MSG_STM_FLASH_LOCK_SECTOR",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="MSG_STM_FLASH_LOCK_SECTOR",c.prototype.msg_type=227,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint32("sector"),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["sector","writeUInt32LE",4]);var u=function(e,t){return p.call(this,e),this.messageType="MSG_STM_FLASH_UNLOCK_SECTOR",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="MSG_STM_FLASH_UNLOCK_SECTOR",u.prototype.msg_type=228,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint32("sector"),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["sector","writeUInt32LE",4]);var y=function(e,t){return p.call(this,e),this.messageType="MSG_STM_UNIQUE_ID_REQ",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="MSG_STM_UNIQUE_ID_REQ",y.prototype.msg_type=232,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little"),y.prototype.fieldSpec=[];var h=function(e,t){return p.call(this,e),this.messageType="MSG_STM_UNIQUE_ID_RESP",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_STM_UNIQUE_ID_RESP",h.prototype.msg_type=229,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").array("stm_id",{length:12,type:"uint8"}),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["stm_id","array","writeUInt8",function(){return 1},12]);var f=function(e,t){return p.call(this,e),this.messageType="MSG_M25_FLASH_WRITE_STATUS",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="MSG_M25_FLASH_WRITE_STATUS",f.prototype.msg_type=243,f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").array("status",{length:1,type:"uint8"}),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["status","array","writeUInt8",function(){return 1},1]),e.exports={230:i,MsgFlashProgram:i,224:s,MsgFlashDone:s,231:n,MsgFlashReadReq:n,225:a,MsgFlashReadResp:a,226:l,MsgFlashErase:l,227:c,MsgStmFlashLockSector:c,228:u,MsgStmFlashUnlockSector:u,232:y,MsgStmUniqueIdReq:y,229:h,MsgStmUniqueIdResp:h,243:f,MsgM25FlashWriteStatus:f}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_IMU_RAW",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_IMU_RAW",i.prototype.msg_type=2304,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint32("tow").uint8("tow_f").int16("acc_x").int16("acc_y").int16("acc_z").int16("gyr_x").int16("gyr_y").int16("gyr_z"),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),i.prototype.fieldSpec.push(["tow_f","writeUInt8",1]),i.prototype.fieldSpec.push(["acc_x","writeInt16LE",2]),i.prototype.fieldSpec.push(["acc_y","writeInt16LE",2]),i.prototype.fieldSpec.push(["acc_z","writeInt16LE",2]),i.prototype.fieldSpec.push(["gyr_x","writeInt16LE",2]),i.prototype.fieldSpec.push(["gyr_y","writeInt16LE",2]),i.prototype.fieldSpec.push(["gyr_z","writeInt16LE",2]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_IMU_AUX",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_IMU_AUX",s.prototype.msg_type=2305,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint8("imu_type").int16("temp").uint8("imu_conf"),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["imu_type","writeUInt8",1]),s.prototype.fieldSpec.push(["temp","writeInt16LE",2]),s.prototype.fieldSpec.push(["imu_conf","writeUInt8",1]),e.exports={2304:i,MsgImuRaw:i,2305:s,MsgImuAux:s}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_CPU_STATE_DEP_A",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_CPU_STATE_DEP_A",i.prototype.msg_type=32512,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint8("index").uint16("pid").uint8("pcpu").string("tname",{length:15}).string("cmdline",{greedy:!0}),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["index","writeUInt8",1]),i.prototype.fieldSpec.push(["pid","writeUInt16LE",2]),i.prototype.fieldSpec.push(["pcpu","writeUInt8",1]),i.prototype.fieldSpec.push(["tname","string",15]),i.prototype.fieldSpec.push(["cmdline","string",null]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_MEM_STATE_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_MEM_STATE_DEP_A",s.prototype.msg_type=32513,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint8("index").uint16("pid").uint8("pmem").string("tname",{length:15}).string("cmdline",{greedy:!0}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["index","writeUInt8",1]),s.prototype.fieldSpec.push(["pid","writeUInt16LE",2]),s.prototype.fieldSpec.push(["pmem","writeUInt8",1]),s.prototype.fieldSpec.push(["tname","string",15]),s.prototype.fieldSpec.push(["cmdline","string",null]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_SYS_STATE_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_SYS_STATE_DEP_A",n.prototype.msg_type=32514,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint16("mem_total").uint8("pcpu").uint8("pmem").uint16("procs_starting").uint16("procs_stopping").uint16("pid_count"),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["mem_total","writeUInt16LE",2]),n.prototype.fieldSpec.push(["pcpu","writeUInt8",1]),n.prototype.fieldSpec.push(["pmem","writeUInt8",1]),n.prototype.fieldSpec.push(["procs_starting","writeUInt16LE",2]),n.prototype.fieldSpec.push(["procs_stopping","writeUInt16LE",2]),n.prototype.fieldSpec.push(["pid_count","writeUInt16LE",2]);var a=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_PROCESS_SOCKET_COUNTS",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_PROCESS_SOCKET_COUNTS",a.prototype.msg_type=32515,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").uint8("index").uint16("pid").uint16("socket_count").uint16("socket_types").uint16("socket_states").string("cmdline",{greedy:!0}),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["index","writeUInt8",1]),a.prototype.fieldSpec.push(["pid","writeUInt16LE",2]),a.prototype.fieldSpec.push(["socket_count","writeUInt16LE",2]),a.prototype.fieldSpec.push(["socket_types","writeUInt16LE",2]),a.prototype.fieldSpec.push(["socket_states","writeUInt16LE",2]),a.prototype.fieldSpec.push(["cmdline","string",null]);var l=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_PROCESS_SOCKET_QUEUES",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_PROCESS_SOCKET_QUEUES",l.prototype.msg_type=32516,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").uint8("index").uint16("pid").uint16("recv_queued").uint16("send_queued").uint16("socket_types").uint16("socket_states").string("address_of_largest",{length:64}).string("cmdline",{greedy:!0}),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["index","writeUInt8",1]),l.prototype.fieldSpec.push(["pid","writeUInt16LE",2]),l.prototype.fieldSpec.push(["recv_queued","writeUInt16LE",2]),l.prototype.fieldSpec.push(["send_queued","writeUInt16LE",2]),l.prototype.fieldSpec.push(["socket_types","writeUInt16LE",2]),l.prototype.fieldSpec.push(["socket_states","writeUInt16LE",2]),l.prototype.fieldSpec.push(["address_of_largest","string",64]),l.prototype.fieldSpec.push(["cmdline","string",null]);var c=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_SOCKET_USAGE",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_SOCKET_USAGE",c.prototype.msg_type=32517,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint32("avg_queue_depth").uint32("max_queue_depth").array("socket_state_counts",{length:16,type:"uint16le"}).array("socket_type_counts",{length:16,type:"uint16le"}),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["avg_queue_depth","writeUInt32LE",4]),c.prototype.fieldSpec.push(["max_queue_depth","writeUInt32LE",4]),c.prototype.fieldSpec.push(["socket_state_counts","array","writeUInt16LE",function(){return 2},16]),c.prototype.fieldSpec.push(["socket_type_counts","array","writeUInt16LE",function(){return 2},16]);var u=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_PROCESS_FD_COUNT",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_PROCESS_FD_COUNT",u.prototype.msg_type=32518,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint8("index").uint16("pid").uint16("fd_count").string("cmdline",{greedy:!0}),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["index","writeUInt8",1]),u.prototype.fieldSpec.push(["pid","writeUInt16LE",2]),u.prototype.fieldSpec.push(["fd_count","writeUInt16LE",2]),u.prototype.fieldSpec.push(["cmdline","string",null]);var y=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_PROCESS_FD_SUMMARY",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_PROCESS_FD_SUMMARY",y.prototype.msg_type=32519,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").uint32("sys_fd_count").string("most_opened",{greedy:!0}),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["sys_fd_count","writeUInt32LE",4]),y.prototype.fieldSpec.push(["most_opened","string",null]);var h=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_CPU_STATE",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_CPU_STATE",h.prototype.msg_type=32520,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").uint8("index").uint16("pid").uint8("pcpu").uint32("time").uint8("flags").string("tname",{length:15}).string("cmdline",{greedy:!0}),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["index","writeUInt8",1]),h.prototype.fieldSpec.push(["pid","writeUInt16LE",2]),h.prototype.fieldSpec.push(["pcpu","writeUInt8",1]),h.prototype.fieldSpec.push(["time","writeUInt32LE",4]),h.prototype.fieldSpec.push(["flags","writeUInt8",1]),h.prototype.fieldSpec.push(["tname","string",15]),h.prototype.fieldSpec.push(["cmdline","string",null]);var f=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_MEM_STATE",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_MEM_STATE",f.prototype.msg_type=32521,f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").uint8("index").uint16("pid").uint8("pmem").uint32("time").uint8("flags").string("tname",{length:15}).string("cmdline",{greedy:!0}),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["index","writeUInt8",1]),f.prototype.fieldSpec.push(["pid","writeUInt16LE",2]),f.prototype.fieldSpec.push(["pmem","writeUInt8",1]),f.prototype.fieldSpec.push(["time","writeUInt32LE",4]),f.prototype.fieldSpec.push(["flags","writeUInt8",1]),f.prototype.fieldSpec.push(["tname","string",15]),f.prototype.fieldSpec.push(["cmdline","string",null]);var d=function(e,t){return p.call(this,e),this.messageType="MSG_LINUX_SYS_STATE",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(p.prototype)).messageType="MSG_LINUX_SYS_STATE",d.prototype.msg_type=32522,d.prototype.constructor=d,d.prototype.parser=(new o).endianess("little").uint16("mem_total").uint8("pcpu").uint8("pmem").uint16("procs_starting").uint16("procs_stopping").uint16("pid_count").uint32("time").uint8("flags"),d.prototype.fieldSpec=[],d.prototype.fieldSpec.push(["mem_total","writeUInt16LE",2]),d.prototype.fieldSpec.push(["pcpu","writeUInt8",1]),d.prototype.fieldSpec.push(["pmem","writeUInt8",1]),d.prototype.fieldSpec.push(["procs_starting","writeUInt16LE",2]),d.prototype.fieldSpec.push(["procs_stopping","writeUInt16LE",2]),d.prototype.fieldSpec.push(["pid_count","writeUInt16LE",2]),d.prototype.fieldSpec.push(["time","writeUInt32LE",4]),d.prototype.fieldSpec.push(["flags","writeUInt8",1]),e.exports={32512:i,MsgLinuxCpuStateDepA:i,32513:s,MsgLinuxMemStateDepA:s,32514:n,MsgLinuxSysStateDepA:n,32515:a,MsgLinuxProcessSocketCounts:a,32516:l,MsgLinuxProcessSocketQueues:l,32517:c,MsgLinuxSocketUsage:c,32518:u,MsgLinuxProcessFdCount:u,32519:y,MsgLinuxProcessFdSummary:y,32520:h,MsgLinuxCpuState:h,32521:f,MsgLinuxMemState:f,32522:d,MsgLinuxSysState:d}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_LOG",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_LOG",i.prototype.msg_type=1025,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint8("level").string("text",{greedy:!0}),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["level","writeUInt8",1]),i.prototype.fieldSpec.push(["text","string",null]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_FWD",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_FWD",s.prototype.msg_type=1026,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint8("source").uint8("protocol").array("fwd_payload",{type:"uint8",readUntil:"eof"}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["source","writeUInt8",1]),s.prototype.fieldSpec.push(["protocol","writeUInt8",1]),s.prototype.fieldSpec.push(["fwd_payload","array","writeUInt8",function(){return 1},null]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_PRINT_DEP",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_PRINT_DEP",n.prototype.msg_type=16,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").string("text",{greedy:!0}),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["text","string",null]),e.exports={1025:i,MsgLog:i,1026:s,MsgFwd:s,16:n,MsgPrintDep:n}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_MAG_RAW",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_MAG_RAW",i.prototype.msg_type=2306,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint32("tow").uint8("tow_f").int16("mag_x").int16("mag_y").int16("mag_z"),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),i.prototype.fieldSpec.push(["tow_f","writeUInt8",1]),i.prototype.fieldSpec.push(["mag_x","writeInt16LE",2]),i.prototype.fieldSpec.push(["mag_y","writeInt16LE",2]),i.prototype.fieldSpec.push(["mag_z","writeInt16LE",2]),e.exports={2306:i,MsgMagRaw:i}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_GPS_TIME",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_GPS_TIME",i.prototype.msg_type=258,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint16("wn").uint32("tow").int32("ns_residual").uint8("flags"),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["wn","writeUInt16LE",2]),i.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),i.prototype.fieldSpec.push(["ns_residual","writeInt32LE",4]),i.prototype.fieldSpec.push(["flags","writeUInt8",1]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_GPS_TIME_GNSS",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_GPS_TIME_GNSS",s.prototype.msg_type=260,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint16("wn").uint32("tow").int32("ns_residual").uint8("flags"),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["wn","writeUInt16LE",2]),s.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),s.prototype.fieldSpec.push(["ns_residual","writeInt32LE",4]),s.prototype.fieldSpec.push(["flags","writeUInt8",1]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_UTC_TIME",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_UTC_TIME",n.prototype.msg_type=259,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint8("flags").uint32("tow").uint16("year").uint8("month").uint8("day").uint8("hours").uint8("minutes").uint8("seconds").uint32("ns"),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["flags","writeUInt8",1]),n.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),n.prototype.fieldSpec.push(["year","writeUInt16LE",2]),n.prototype.fieldSpec.push(["month","writeUInt8",1]),n.prototype.fieldSpec.push(["day","writeUInt8",1]),n.prototype.fieldSpec.push(["hours","writeUInt8",1]),n.prototype.fieldSpec.push(["minutes","writeUInt8",1]),n.prototype.fieldSpec.push(["seconds","writeUInt8",1]),n.prototype.fieldSpec.push(["ns","writeUInt32LE",4]);var a=function(e,t){return p.call(this,e),this.messageType="MSG_UTC_TIME_GNSS",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="MSG_UTC_TIME_GNSS",a.prototype.msg_type=261,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").uint8("flags").uint32("tow").uint16("year").uint8("month").uint8("day").uint8("hours").uint8("minutes").uint8("seconds").uint32("ns"),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["flags","writeUInt8",1]),a.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),a.prototype.fieldSpec.push(["year","writeUInt16LE",2]),a.prototype.fieldSpec.push(["month","writeUInt8",1]),a.prototype.fieldSpec.push(["day","writeUInt8",1]),a.prototype.fieldSpec.push(["hours","writeUInt8",1]),a.prototype.fieldSpec.push(["minutes","writeUInt8",1]),a.prototype.fieldSpec.push(["seconds","writeUInt8",1]),a.prototype.fieldSpec.push(["ns","writeUInt32LE",4]);var l=function(e,t){return p.call(this,e),this.messageType="MSG_DOPS",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="MSG_DOPS",l.prototype.msg_type=520,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").uint32("tow").uint16("gdop").uint16("pdop").uint16("tdop").uint16("hdop").uint16("vdop").uint8("flags"),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),l.prototype.fieldSpec.push(["gdop","writeUInt16LE",2]),l.prototype.fieldSpec.push(["pdop","writeUInt16LE",2]),l.prototype.fieldSpec.push(["tdop","writeUInt16LE",2]),l.prototype.fieldSpec.push(["hdop","writeUInt16LE",2]),l.prototype.fieldSpec.push(["vdop","writeUInt16LE",2]),l.prototype.fieldSpec.push(["flags","writeUInt8",1]);var c=function(e,t){return p.call(this,e),this.messageType="MSG_POS_ECEF",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="MSG_POS_ECEF",c.prototype.msg_type=521,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint32("tow").doublele("x").doublele("y").doublele("z").uint16("accuracy").uint8("n_sats").uint8("flags"),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),c.prototype.fieldSpec.push(["x","writeDoubleLE",8]),c.prototype.fieldSpec.push(["y","writeDoubleLE",8]),c.prototype.fieldSpec.push(["z","writeDoubleLE",8]),c.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),c.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),c.prototype.fieldSpec.push(["flags","writeUInt8",1]);var u=function(e,t){return p.call(this,e),this.messageType="MSG_POS_ECEF_COV",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="MSG_POS_ECEF_COV",u.prototype.msg_type=532,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint32("tow").doublele("x").doublele("y").doublele("z").floatle("cov_x_x").floatle("cov_x_y").floatle("cov_x_z").floatle("cov_y_y").floatle("cov_y_z").floatle("cov_z_z").uint8("n_sats").uint8("flags"),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),u.prototype.fieldSpec.push(["x","writeDoubleLE",8]),u.prototype.fieldSpec.push(["y","writeDoubleLE",8]),u.prototype.fieldSpec.push(["z","writeDoubleLE",8]),u.prototype.fieldSpec.push(["cov_x_x","writeFloatLE",4]),u.prototype.fieldSpec.push(["cov_x_y","writeFloatLE",4]),u.prototype.fieldSpec.push(["cov_x_z","writeFloatLE",4]),u.prototype.fieldSpec.push(["cov_y_y","writeFloatLE",4]),u.prototype.fieldSpec.push(["cov_y_z","writeFloatLE",4]),u.prototype.fieldSpec.push(["cov_z_z","writeFloatLE",4]),u.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),u.prototype.fieldSpec.push(["flags","writeUInt8",1]);var y=function(e,t){return p.call(this,e),this.messageType="MSG_POS_LLH",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="MSG_POS_LLH",y.prototype.msg_type=522,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").uint32("tow").doublele("lat").doublele("lon").doublele("height").uint16("h_accuracy").uint16("v_accuracy").uint8("n_sats").uint8("flags"),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),y.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),y.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),y.prototype.fieldSpec.push(["height","writeDoubleLE",8]),y.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),y.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),y.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),y.prototype.fieldSpec.push(["flags","writeUInt8",1]);var h=function(e,t){return p.call(this,e),this.messageType="MSG_POS_LLH_COV",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_POS_LLH_COV",h.prototype.msg_type=529,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").uint32("tow").doublele("lat").doublele("lon").doublele("height").floatle("cov_n_n").floatle("cov_n_e").floatle("cov_n_d").floatle("cov_e_e").floatle("cov_e_d").floatle("cov_d_d").uint8("n_sats").uint8("flags"),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),h.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),h.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),h.prototype.fieldSpec.push(["height","writeDoubleLE",8]),h.prototype.fieldSpec.push(["cov_n_n","writeFloatLE",4]),h.prototype.fieldSpec.push(["cov_n_e","writeFloatLE",4]),h.prototype.fieldSpec.push(["cov_n_d","writeFloatLE",4]),h.prototype.fieldSpec.push(["cov_e_e","writeFloatLE",4]),h.prototype.fieldSpec.push(["cov_e_d","writeFloatLE",4]),h.prototype.fieldSpec.push(["cov_d_d","writeFloatLE",4]),h.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),h.prototype.fieldSpec.push(["flags","writeUInt8",1]);var f=function(e,t){return p.call(this,e),this.messageType="EstimatedHorizontalErrorEllipse",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="EstimatedHorizontalErrorEllipse",f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").floatle("semi_major").floatle("semi_minor").floatle("orientation"),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["semi_major","writeFloatLE",4]),f.prototype.fieldSpec.push(["semi_minor","writeFloatLE",4]),f.prototype.fieldSpec.push(["orientation","writeFloatLE",4]);var d=function(e,t){return p.call(this,e),this.messageType="MSG_POS_LLH_ACC",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(p.prototype)).messageType="MSG_POS_LLH_ACC",d.prototype.msg_type=536,d.prototype.constructor=d,d.prototype.parser=(new o).endianess("little").uint32("tow").doublele("lat").doublele("lon").doublele("height").doublele("orthometric_height").floatle("h_accuracy").floatle("v_accuracy").floatle("ct_accuracy").floatle("at_accuracy").nest("h_ellipse",{type:f.prototype.parser}).uint8("confidence_and_geoid").uint8("n_sats").uint8("flags"),d.prototype.fieldSpec=[],d.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),d.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),d.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),d.prototype.fieldSpec.push(["height","writeDoubleLE",8]),d.prototype.fieldSpec.push(["orthometric_height","writeDoubleLE",8]),d.prototype.fieldSpec.push(["h_accuracy","writeFloatLE",4]),d.prototype.fieldSpec.push(["v_accuracy","writeFloatLE",4]),d.prototype.fieldSpec.push(["ct_accuracy","writeFloatLE",4]),d.prototype.fieldSpec.push(["at_accuracy","writeFloatLE",4]),d.prototype.fieldSpec.push(["h_ellipse",f.prototype.fieldSpec]),d.prototype.fieldSpec.push(["confidence_and_geoid","writeUInt8",1]),d.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),d.prototype.fieldSpec.push(["flags","writeUInt8",1]);var _=function(e,t){return p.call(this,e),this.messageType="MSG_BASELINE_ECEF",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(p.prototype)).messageType="MSG_BASELINE_ECEF",_.prototype.msg_type=523,_.prototype.constructor=_,_.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").uint16("accuracy").uint8("n_sats").uint8("flags"),_.prototype.fieldSpec=[],_.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),_.prototype.fieldSpec.push(["x","writeInt32LE",4]),_.prototype.fieldSpec.push(["y","writeInt32LE",4]),_.prototype.fieldSpec.push(["z","writeInt32LE",4]),_.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),_.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),_.prototype.fieldSpec.push(["flags","writeUInt8",1]);var S=function(e,t){return p.call(this,e),this.messageType="MSG_BASELINE_NED",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(p.prototype)).messageType="MSG_BASELINE_NED",S.prototype.msg_type=524,S.prototype.constructor=S,S.prototype.parser=(new o).endianess("little").uint32("tow").int32("n").int32("e").int32("d").uint16("h_accuracy").uint16("v_accuracy").uint8("n_sats").uint8("flags"),S.prototype.fieldSpec=[],S.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),S.prototype.fieldSpec.push(["n","writeInt32LE",4]),S.prototype.fieldSpec.push(["e","writeInt32LE",4]),S.prototype.fieldSpec.push(["d","writeInt32LE",4]),S.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),S.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),S.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),S.prototype.fieldSpec.push(["flags","writeUInt8",1]);var g=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_ECEF",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(p.prototype)).messageType="MSG_VEL_ECEF",g.prototype.msg_type=525,g.prototype.constructor=g,g.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").uint16("accuracy").uint8("n_sats").uint8("flags"),g.prototype.fieldSpec=[],g.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),g.prototype.fieldSpec.push(["x","writeInt32LE",4]),g.prototype.fieldSpec.push(["y","writeInt32LE",4]),g.prototype.fieldSpec.push(["z","writeInt32LE",4]),g.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),g.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),g.prototype.fieldSpec.push(["flags","writeUInt8",1]);var w=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_ECEF_COV",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(p.prototype)).messageType="MSG_VEL_ECEF_COV",w.prototype.msg_type=533,w.prototype.constructor=w,w.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").floatle("cov_x_x").floatle("cov_x_y").floatle("cov_x_z").floatle("cov_y_y").floatle("cov_y_z").floatle("cov_z_z").uint8("n_sats").uint8("flags"),w.prototype.fieldSpec=[],w.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),w.prototype.fieldSpec.push(["x","writeInt32LE",4]),w.prototype.fieldSpec.push(["y","writeInt32LE",4]),w.prototype.fieldSpec.push(["z","writeInt32LE",4]),w.prototype.fieldSpec.push(["cov_x_x","writeFloatLE",4]),w.prototype.fieldSpec.push(["cov_x_y","writeFloatLE",4]),w.prototype.fieldSpec.push(["cov_x_z","writeFloatLE",4]),w.prototype.fieldSpec.push(["cov_y_y","writeFloatLE",4]),w.prototype.fieldSpec.push(["cov_y_z","writeFloatLE",4]),w.prototype.fieldSpec.push(["cov_z_z","writeFloatLE",4]),w.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),w.prototype.fieldSpec.push(["flags","writeUInt8",1]);var E=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_NED",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(p.prototype)).messageType="MSG_VEL_NED",E.prototype.msg_type=526,E.prototype.constructor=E,E.prototype.parser=(new o).endianess("little").uint32("tow").int32("n").int32("e").int32("d").uint16("h_accuracy").uint16("v_accuracy").uint8("n_sats").uint8("flags"),E.prototype.fieldSpec=[],E.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),E.prototype.fieldSpec.push(["n","writeInt32LE",4]),E.prototype.fieldSpec.push(["e","writeInt32LE",4]),E.prototype.fieldSpec.push(["d","writeInt32LE",4]),E.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),E.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),E.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),E.prototype.fieldSpec.push(["flags","writeUInt8",1]);var m=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_NED_COV",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(p.prototype)).messageType="MSG_VEL_NED_COV",m.prototype.msg_type=530,m.prototype.constructor=m,m.prototype.parser=(new o).endianess("little").uint32("tow").int32("n").int32("e").int32("d").floatle("cov_n_n").floatle("cov_n_e").floatle("cov_n_d").floatle("cov_e_e").floatle("cov_e_d").floatle("cov_d_d").uint8("n_sats").uint8("flags"),m.prototype.fieldSpec=[],m.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),m.prototype.fieldSpec.push(["n","writeInt32LE",4]),m.prototype.fieldSpec.push(["e","writeInt32LE",4]),m.prototype.fieldSpec.push(["d","writeInt32LE",4]),m.prototype.fieldSpec.push(["cov_n_n","writeFloatLE",4]),m.prototype.fieldSpec.push(["cov_n_e","writeFloatLE",4]),m.prototype.fieldSpec.push(["cov_n_d","writeFloatLE",4]),m.prototype.fieldSpec.push(["cov_e_e","writeFloatLE",4]),m.prototype.fieldSpec.push(["cov_e_d","writeFloatLE",4]),m.prototype.fieldSpec.push(["cov_d_d","writeFloatLE",4]),m.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),m.prototype.fieldSpec.push(["flags","writeUInt8",1]);var b=function(e,t){return p.call(this,e),this.messageType="MSG_POS_ECEF_GNSS",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(p.prototype)).messageType="MSG_POS_ECEF_GNSS",b.prototype.msg_type=553,b.prototype.constructor=b,b.prototype.parser=(new o).endianess("little").uint32("tow").doublele("x").doublele("y").doublele("z").uint16("accuracy").uint8("n_sats").uint8("flags"),b.prototype.fieldSpec=[],b.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),b.prototype.fieldSpec.push(["x","writeDoubleLE",8]),b.prototype.fieldSpec.push(["y","writeDoubleLE",8]),b.prototype.fieldSpec.push(["z","writeDoubleLE",8]),b.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),b.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),b.prototype.fieldSpec.push(["flags","writeUInt8",1]);var v=function(e,t){return p.call(this,e),this.messageType="MSG_POS_ECEF_COV_GNSS",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(p.prototype)).messageType="MSG_POS_ECEF_COV_GNSS",v.prototype.msg_type=564,v.prototype.constructor=v,v.prototype.parser=(new o).endianess("little").uint32("tow").doublele("x").doublele("y").doublele("z").floatle("cov_x_x").floatle("cov_x_y").floatle("cov_x_z").floatle("cov_y_y").floatle("cov_y_z").floatle("cov_z_z").uint8("n_sats").uint8("flags"),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),v.prototype.fieldSpec.push(["x","writeDoubleLE",8]),v.prototype.fieldSpec.push(["y","writeDoubleLE",8]),v.prototype.fieldSpec.push(["z","writeDoubleLE",8]),v.prototype.fieldSpec.push(["cov_x_x","writeFloatLE",4]),v.prototype.fieldSpec.push(["cov_x_y","writeFloatLE",4]),v.prototype.fieldSpec.push(["cov_x_z","writeFloatLE",4]),v.prototype.fieldSpec.push(["cov_y_y","writeFloatLE",4]),v.prototype.fieldSpec.push(["cov_y_z","writeFloatLE",4]),v.prototype.fieldSpec.push(["cov_z_z","writeFloatLE",4]),v.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),v.prototype.fieldSpec.push(["flags","writeUInt8",1]);var I=function(e,t){return p.call(this,e),this.messageType="MSG_POS_LLH_GNSS",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(p.prototype)).messageType="MSG_POS_LLH_GNSS",I.prototype.msg_type=554,I.prototype.constructor=I,I.prototype.parser=(new o).endianess("little").uint32("tow").doublele("lat").doublele("lon").doublele("height").uint16("h_accuracy").uint16("v_accuracy").uint8("n_sats").uint8("flags"),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),I.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),I.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),I.prototype.fieldSpec.push(["height","writeDoubleLE",8]),I.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),I.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),I.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),I.prototype.fieldSpec.push(["flags","writeUInt8",1]);var L=function(e,t){return p.call(this,e),this.messageType="MSG_POS_LLH_COV_GNSS",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(p.prototype)).messageType="MSG_POS_LLH_COV_GNSS",L.prototype.msg_type=561,L.prototype.constructor=L,L.prototype.parser=(new o).endianess("little").uint32("tow").doublele("lat").doublele("lon").doublele("height").floatle("cov_n_n").floatle("cov_n_e").floatle("cov_n_d").floatle("cov_e_e").floatle("cov_e_d").floatle("cov_d_d").uint8("n_sats").uint8("flags"),L.prototype.fieldSpec=[],L.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),L.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),L.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),L.prototype.fieldSpec.push(["height","writeDoubleLE",8]),L.prototype.fieldSpec.push(["cov_n_n","writeFloatLE",4]),L.prototype.fieldSpec.push(["cov_n_e","writeFloatLE",4]),L.prototype.fieldSpec.push(["cov_n_d","writeFloatLE",4]),L.prototype.fieldSpec.push(["cov_e_e","writeFloatLE",4]),L.prototype.fieldSpec.push(["cov_e_d","writeFloatLE",4]),L.prototype.fieldSpec.push(["cov_d_d","writeFloatLE",4]),L.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),L.prototype.fieldSpec.push(["flags","writeUInt8",1]);var T=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_ECEF_GNSS",this.fields=t||this.parser.parse(e.payload),this};(T.prototype=Object.create(p.prototype)).messageType="MSG_VEL_ECEF_GNSS",T.prototype.msg_type=557,T.prototype.constructor=T,T.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").uint16("accuracy").uint8("n_sats").uint8("flags"),T.prototype.fieldSpec=[],T.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),T.prototype.fieldSpec.push(["x","writeInt32LE",4]),T.prototype.fieldSpec.push(["y","writeInt32LE",4]),T.prototype.fieldSpec.push(["z","writeInt32LE",4]),T.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),T.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),T.prototype.fieldSpec.push(["flags","writeUInt8",1]);var U=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_ECEF_COV_GNSS",this.fields=t||this.parser.parse(e.payload),this};(U.prototype=Object.create(p.prototype)).messageType="MSG_VEL_ECEF_COV_GNSS",U.prototype.msg_type=565,U.prototype.constructor=U,U.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").floatle("cov_x_x").floatle("cov_x_y").floatle("cov_x_z").floatle("cov_y_y").floatle("cov_y_z").floatle("cov_z_z").uint8("n_sats").uint8("flags"),U.prototype.fieldSpec=[],U.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),U.prototype.fieldSpec.push(["x","writeInt32LE",4]),U.prototype.fieldSpec.push(["y","writeInt32LE",4]),U.prototype.fieldSpec.push(["z","writeInt32LE",4]),U.prototype.fieldSpec.push(["cov_x_x","writeFloatLE",4]),U.prototype.fieldSpec.push(["cov_x_y","writeFloatLE",4]),U.prototype.fieldSpec.push(["cov_x_z","writeFloatLE",4]),U.prototype.fieldSpec.push(["cov_y_y","writeFloatLE",4]),U.prototype.fieldSpec.push(["cov_y_z","writeFloatLE",4]),U.prototype.fieldSpec.push(["cov_z_z","writeFloatLE",4]),U.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),U.prototype.fieldSpec.push(["flags","writeUInt8",1]);var M=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_NED_GNSS",this.fields=t||this.parser.parse(e.payload),this};(M.prototype=Object.create(p.prototype)).messageType="MSG_VEL_NED_GNSS",M.prototype.msg_type=558,M.prototype.constructor=M,M.prototype.parser=(new o).endianess("little").uint32("tow").int32("n").int32("e").int32("d").uint16("h_accuracy").uint16("v_accuracy").uint8("n_sats").uint8("flags"),M.prototype.fieldSpec=[],M.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),M.prototype.fieldSpec.push(["n","writeInt32LE",4]),M.prototype.fieldSpec.push(["e","writeInt32LE",4]),M.prototype.fieldSpec.push(["d","writeInt32LE",4]),M.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),M.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),M.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),M.prototype.fieldSpec.push(["flags","writeUInt8",1]);var D=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_NED_COV_GNSS",this.fields=t||this.parser.parse(e.payload),this};(D.prototype=Object.create(p.prototype)).messageType="MSG_VEL_NED_COV_GNSS",D.prototype.msg_type=562,D.prototype.constructor=D,D.prototype.parser=(new o).endianess("little").uint32("tow").int32("n").int32("e").int32("d").floatle("cov_n_n").floatle("cov_n_e").floatle("cov_n_d").floatle("cov_e_e").floatle("cov_e_d").floatle("cov_d_d").uint8("n_sats").uint8("flags"),D.prototype.fieldSpec=[],D.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),D.prototype.fieldSpec.push(["n","writeInt32LE",4]),D.prototype.fieldSpec.push(["e","writeInt32LE",4]),D.prototype.fieldSpec.push(["d","writeInt32LE",4]),D.prototype.fieldSpec.push(["cov_n_n","writeFloatLE",4]),D.prototype.fieldSpec.push(["cov_n_e","writeFloatLE",4]),D.prototype.fieldSpec.push(["cov_n_d","writeFloatLE",4]),D.prototype.fieldSpec.push(["cov_e_e","writeFloatLE",4]),D.prototype.fieldSpec.push(["cov_e_d","writeFloatLE",4]),D.prototype.fieldSpec.push(["cov_d_d","writeFloatLE",4]),D.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),D.prototype.fieldSpec.push(["flags","writeUInt8",1]);var O=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_BODY",this.fields=t||this.parser.parse(e.payload),this};(O.prototype=Object.create(p.prototype)).messageType="MSG_VEL_BODY",O.prototype.msg_type=531,O.prototype.constructor=O,O.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").floatle("cov_x_x").floatle("cov_x_y").floatle("cov_x_z").floatle("cov_y_y").floatle("cov_y_z").floatle("cov_z_z").uint8("n_sats").uint8("flags"),O.prototype.fieldSpec=[],O.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),O.prototype.fieldSpec.push(["x","writeInt32LE",4]),O.prototype.fieldSpec.push(["y","writeInt32LE",4]),O.prototype.fieldSpec.push(["z","writeInt32LE",4]),O.prototype.fieldSpec.push(["cov_x_x","writeFloatLE",4]),O.prototype.fieldSpec.push(["cov_x_y","writeFloatLE",4]),O.prototype.fieldSpec.push(["cov_x_z","writeFloatLE",4]),O.prototype.fieldSpec.push(["cov_y_y","writeFloatLE",4]),O.prototype.fieldSpec.push(["cov_y_z","writeFloatLE",4]),O.prototype.fieldSpec.push(["cov_z_z","writeFloatLE",4]),O.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),O.prototype.fieldSpec.push(["flags","writeUInt8",1]);var G=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_COG",this.fields=t||this.parser.parse(e.payload),this};(G.prototype=Object.create(p.prototype)).messageType="MSG_VEL_COG",G.prototype.msg_type=540,G.prototype.constructor=G,G.prototype.parser=(new o).endianess("little").uint32("tow").uint32("cog").uint32("sog").int32("v_up").uint32("cog_accuracy").uint32("sog_accuracy").uint32("v_up_accuracy").uint16("flags"),G.prototype.fieldSpec=[],G.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),G.prototype.fieldSpec.push(["cog","writeUInt32LE",4]),G.prototype.fieldSpec.push(["sog","writeUInt32LE",4]),G.prototype.fieldSpec.push(["v_up","writeInt32LE",4]),G.prototype.fieldSpec.push(["cog_accuracy","writeUInt32LE",4]),G.prototype.fieldSpec.push(["sog_accuracy","writeUInt32LE",4]),G.prototype.fieldSpec.push(["v_up_accuracy","writeUInt32LE",4]),G.prototype.fieldSpec.push(["flags","writeUInt16LE",2]);var A=function(e,t){return p.call(this,e),this.messageType="MSG_AGE_CORRECTIONS",this.fields=t||this.parser.parse(e.payload),this};(A.prototype=Object.create(p.prototype)).messageType="MSG_AGE_CORRECTIONS",A.prototype.msg_type=528,A.prototype.constructor=A,A.prototype.parser=(new o).endianess("little").uint32("tow").uint16("age"),A.prototype.fieldSpec=[],A.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),A.prototype.fieldSpec.push(["age","writeUInt16LE",2]);var C=function(e,t){return p.call(this,e),this.messageType="MSG_GPS_TIME_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(C.prototype=Object.create(p.prototype)).messageType="MSG_GPS_TIME_DEP_A",C.prototype.msg_type=256,C.prototype.constructor=C,C.prototype.parser=(new o).endianess("little").uint16("wn").uint32("tow").int32("ns_residual").uint8("flags"),C.prototype.fieldSpec=[],C.prototype.fieldSpec.push(["wn","writeUInt16LE",2]),C.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),C.prototype.fieldSpec.push(["ns_residual","writeInt32LE",4]),C.prototype.fieldSpec.push(["flags","writeUInt8",1]);var R=function(e,t){return p.call(this,e),this.messageType="MSG_DOPS_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(R.prototype=Object.create(p.prototype)).messageType="MSG_DOPS_DEP_A",R.prototype.msg_type=518,R.prototype.constructor=R,R.prototype.parser=(new o).endianess("little").uint32("tow").uint16("gdop").uint16("pdop").uint16("tdop").uint16("hdop").uint16("vdop"),R.prototype.fieldSpec=[],R.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),R.prototype.fieldSpec.push(["gdop","writeUInt16LE",2]),R.prototype.fieldSpec.push(["pdop","writeUInt16LE",2]),R.prototype.fieldSpec.push(["tdop","writeUInt16LE",2]),R.prototype.fieldSpec.push(["hdop","writeUInt16LE",2]),R.prototype.fieldSpec.push(["vdop","writeUInt16LE",2]);var P=function(e,t){return p.call(this,e),this.messageType="MSG_POS_ECEF_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(P.prototype=Object.create(p.prototype)).messageType="MSG_POS_ECEF_DEP_A",P.prototype.msg_type=512,P.prototype.constructor=P,P.prototype.parser=(new o).endianess("little").uint32("tow").doublele("x").doublele("y").doublele("z").uint16("accuracy").uint8("n_sats").uint8("flags"),P.prototype.fieldSpec=[],P.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),P.prototype.fieldSpec.push(["x","writeDoubleLE",8]),P.prototype.fieldSpec.push(["y","writeDoubleLE",8]),P.prototype.fieldSpec.push(["z","writeDoubleLE",8]),P.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),P.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),P.prototype.fieldSpec.push(["flags","writeUInt8",1]);var N=function(e,t){return p.call(this,e),this.messageType="MSG_POS_LLH_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(N.prototype=Object.create(p.prototype)).messageType="MSG_POS_LLH_DEP_A",N.prototype.msg_type=513,N.prototype.constructor=N,N.prototype.parser=(new o).endianess("little").uint32("tow").doublele("lat").doublele("lon").doublele("height").uint16("h_accuracy").uint16("v_accuracy").uint8("n_sats").uint8("flags"),N.prototype.fieldSpec=[],N.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),N.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),N.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),N.prototype.fieldSpec.push(["height","writeDoubleLE",8]),N.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),N.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),N.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),N.prototype.fieldSpec.push(["flags","writeUInt8",1]);var j=function(e,t){return p.call(this,e),this.messageType="MSG_BASELINE_ECEF_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(j.prototype=Object.create(p.prototype)).messageType="MSG_BASELINE_ECEF_DEP_A",j.prototype.msg_type=514,j.prototype.constructor=j,j.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").uint16("accuracy").uint8("n_sats").uint8("flags"),j.prototype.fieldSpec=[],j.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),j.prototype.fieldSpec.push(["x","writeInt32LE",4]),j.prototype.fieldSpec.push(["y","writeInt32LE",4]),j.prototype.fieldSpec.push(["z","writeInt32LE",4]),j.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),j.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),j.prototype.fieldSpec.push(["flags","writeUInt8",1]);var x=function(e,t){return p.call(this,e),this.messageType="MSG_BASELINE_NED_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(x.prototype=Object.create(p.prototype)).messageType="MSG_BASELINE_NED_DEP_A",x.prototype.msg_type=515,x.prototype.constructor=x,x.prototype.parser=(new o).endianess("little").uint32("tow").int32("n").int32("e").int32("d").uint16("h_accuracy").uint16("v_accuracy").uint8("n_sats").uint8("flags"),x.prototype.fieldSpec=[],x.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),x.prototype.fieldSpec.push(["n","writeInt32LE",4]),x.prototype.fieldSpec.push(["e","writeInt32LE",4]),x.prototype.fieldSpec.push(["d","writeInt32LE",4]),x.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),x.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),x.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),x.prototype.fieldSpec.push(["flags","writeUInt8",1]);var k=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_ECEF_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(k.prototype=Object.create(p.prototype)).messageType="MSG_VEL_ECEF_DEP_A",k.prototype.msg_type=516,k.prototype.constructor=k,k.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").uint16("accuracy").uint8("n_sats").uint8("flags"),k.prototype.fieldSpec=[],k.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),k.prototype.fieldSpec.push(["x","writeInt32LE",4]),k.prototype.fieldSpec.push(["y","writeInt32LE",4]),k.prototype.fieldSpec.push(["z","writeInt32LE",4]),k.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),k.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),k.prototype.fieldSpec.push(["flags","writeUInt8",1]);var F=function(e,t){return p.call(this,e),this.messageType="MSG_VEL_NED_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(F.prototype=Object.create(p.prototype)).messageType="MSG_VEL_NED_DEP_A",F.prototype.msg_type=517,F.prototype.constructor=F,F.prototype.parser=(new o).endianess("little").uint32("tow").int32("n").int32("e").int32("d").uint16("h_accuracy").uint16("v_accuracy").uint8("n_sats").uint8("flags"),F.prototype.fieldSpec=[],F.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),F.prototype.fieldSpec.push(["n","writeInt32LE",4]),F.prototype.fieldSpec.push(["e","writeInt32LE",4]),F.prototype.fieldSpec.push(["d","writeInt32LE",4]),F.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),F.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),F.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),F.prototype.fieldSpec.push(["flags","writeUInt8",1]);var B=function(e,t){return p.call(this,e),this.messageType="MSG_BASELINE_HEADING_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(B.prototype=Object.create(p.prototype)).messageType="MSG_BASELINE_HEADING_DEP_A",B.prototype.msg_type=519,B.prototype.constructor=B,B.prototype.parser=(new o).endianess("little").uint32("tow").uint32("heading").uint8("n_sats").uint8("flags"),B.prototype.fieldSpec=[],B.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),B.prototype.fieldSpec.push(["heading","writeUInt32LE",4]),B.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),B.prototype.fieldSpec.push(["flags","writeUInt8",1]);var q=function(e,t){return p.call(this,e),this.messageType="MSG_PROTECTION_LEVEL_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(q.prototype=Object.create(p.prototype)).messageType="MSG_PROTECTION_LEVEL_DEP_A",q.prototype.msg_type=534,q.prototype.constructor=q,q.prototype.parser=(new o).endianess("little").uint32("tow").uint16("vpl").uint16("hpl").doublele("lat").doublele("lon").doublele("height").uint8("flags"),q.prototype.fieldSpec=[],q.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),q.prototype.fieldSpec.push(["vpl","writeUInt16LE",2]),q.prototype.fieldSpec.push(["hpl","writeUInt16LE",2]),q.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),q.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),q.prototype.fieldSpec.push(["height","writeDoubleLE",8]),q.prototype.fieldSpec.push(["flags","writeUInt8",1]);var z=function(e,t){return p.call(this,e),this.messageType="MSG_PROTECTION_LEVEL",this.fields=t||this.parser.parse(e.payload),this};(z.prototype=Object.create(p.prototype)).messageType="MSG_PROTECTION_LEVEL",z.prototype.msg_type=535,z.prototype.constructor=z,z.prototype.parser=(new o).endianess("little").uint32("tow").int16("wn").uint16("hpl").uint16("vpl").uint16("atpl").uint16("ctpl").uint16("hvpl").uint16("vvpl").uint16("hopl").uint16("popl").uint16("ropl").doublele("lat").doublele("lon").doublele("height").int32("v_x").int32("v_y").int32("v_z").int32("roll").int32("pitch").int32("heading").uint32("flags"),z.prototype.fieldSpec=[],z.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),z.prototype.fieldSpec.push(["wn","writeInt16LE",2]),z.prototype.fieldSpec.push(["hpl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["vpl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["atpl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["ctpl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["hvpl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["vvpl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["hopl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["popl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["ropl","writeUInt16LE",2]),z.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),z.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),z.prototype.fieldSpec.push(["height","writeDoubleLE",8]),z.prototype.fieldSpec.push(["v_x","writeInt32LE",4]),z.prototype.fieldSpec.push(["v_y","writeInt32LE",4]),z.prototype.fieldSpec.push(["v_z","writeInt32LE",4]),z.prototype.fieldSpec.push(["roll","writeInt32LE",4]),z.prototype.fieldSpec.push(["pitch","writeInt32LE",4]),z.prototype.fieldSpec.push(["heading","writeInt32LE",4]),z.prototype.fieldSpec.push(["flags","writeUInt32LE",4]),e.exports={258:i,MsgGpsTime:i,260:s,MsgGpsTimeGnss:s,259:n,MsgUtcTime:n,261:a,MsgUtcTimeGnss:a,520:l,MsgDops:l,521:c,MsgPosEcef:c,532:u,MsgPosEcefCov:u,522:y,MsgPosLlh:y,529:h,MsgPosLlhCov:h,EstimatedHorizontalErrorEllipse:f,536:d,MsgPosLlhAcc:d,523:_,MsgBaselineEcef:_,524:S,MsgBaselineNed:S,525:g,MsgVelEcef:g,533:w,MsgVelEcefCov:w,526:E,MsgVelNed:E,530:m,MsgVelNedCov:m,553:b,MsgPosEcefGnss:b,564:v,MsgPosEcefCovGnss:v,554:I,MsgPosLlhGnss:I,561:L,MsgPosLlhCovGnss:L,557:T,MsgVelEcefGnss:T,565:U,MsgVelEcefCovGnss:U,558:M,MsgVelNedGnss:M,562:D,MsgVelNedCovGnss:D,531:O,MsgVelBody:O,540:G,MsgVelCog:G,528:A,MsgAgeCorrections:A,256:C,MsgGpsTimeDepA:C,518:R,MsgDopsDepA:R,512:P,MsgPosEcefDepA:P,513:N,MsgPosLlhDepA:N,514:j,MsgBaselineEcefDepA:j,515:x,MsgBaselineNedDepA:x,516:k,MsgVelEcefDepA:k,517:F,MsgVelNedDepA:F,519:B,MsgBaselineHeadingDepA:B,534:q,MsgProtectionLevelDepA:q,535:z,MsgProtectionLevel:z}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,r(0).CarrierPhase,r(0).GnssSignal),s=(r(0).GnssSignalDep,r(0).GPSTime,r(0).GPSTimeDep,r(0).GPSTimeSec,r(0).SvId,function(e,t){return p.call(this,e),this.messageType="MSG_NDB_EVENT",this.fields=t||this.parser.parse(e.payload),this});(s.prototype=Object.create(p.prototype)).messageType="MSG_NDB_EVENT",s.prototype.msg_type=1024,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint64("recv_time").uint8("event").uint8("object_type").uint8("result").uint8("data_source").nest("object_sid",{type:i.prototype.parser}).nest("src_sid",{type:i.prototype.parser}).uint16("original_sender"),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["recv_time","writeUInt64LE",8]),s.prototype.fieldSpec.push(["event","writeUInt8",1]),s.prototype.fieldSpec.push(["object_type","writeUInt8",1]),s.prototype.fieldSpec.push(["result","writeUInt8",1]),s.prototype.fieldSpec.push(["data_source","writeUInt8",1]),s.prototype.fieldSpec.push(["object_sid",i.prototype.fieldSpec]),s.prototype.fieldSpec.push(["src_sid",i.prototype.fieldSpec]),s.prototype.fieldSpec.push(["original_sender","writeUInt16LE",2]),e.exports={1024:s,MsgNdbEvent:s}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,r(0).CarrierPhase),s=r(0).GnssSignal,n=r(0).GnssSignalDep,a=r(0).GPSTime,l=r(0).GPSTimeDep,c=r(0).GPSTimeSec,u=(r(0).SvId,function(e,t){return p.call(this,e),this.messageType="ObservationHeader",this.fields=t||this.parser.parse(e.payload),this});(u.prototype=Object.create(p.prototype)).messageType="ObservationHeader",u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").nest("t",{type:a.prototype.parser}).uint8("n_obs"),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["t",a.prototype.fieldSpec]),u.prototype.fieldSpec.push(["n_obs","writeUInt8",1]);var y=function(e,t){return p.call(this,e),this.messageType="Doppler",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="Doppler",y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").int16("i").uint8("f"),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["i","writeInt16LE",2]),y.prototype.fieldSpec.push(["f","writeUInt8",1]);var h=function(e,t){return p.call(this,e),this.messageType="PackedObsContent",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="PackedObsContent",h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").uint32("P").nest("L",{type:i.prototype.parser}).nest("D",{type:y.prototype.parser}).uint8("cn0").uint8("lock").uint8("flags").nest("sid",{type:s.prototype.parser}),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["P","writeUInt32LE",4]),h.prototype.fieldSpec.push(["L",i.prototype.fieldSpec]),h.prototype.fieldSpec.push(["D",y.prototype.fieldSpec]),h.prototype.fieldSpec.push(["cn0","writeUInt8",1]),h.prototype.fieldSpec.push(["lock","writeUInt8",1]),h.prototype.fieldSpec.push(["flags","writeUInt8",1]),h.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]);var f=function(e,t){return p.call(this,e),this.messageType="PackedOsrContent",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="PackedOsrContent",f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").uint32("P").nest("L",{type:i.prototype.parser}).uint8("lock").uint8("flags").nest("sid",{type:s.prototype.parser}).uint16("iono_std").uint16("tropo_std").uint16("range_std"),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["P","writeUInt32LE",4]),f.prototype.fieldSpec.push(["L",i.prototype.fieldSpec]),f.prototype.fieldSpec.push(["lock","writeUInt8",1]),f.prototype.fieldSpec.push(["flags","writeUInt8",1]),f.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),f.prototype.fieldSpec.push(["iono_std","writeUInt16LE",2]),f.prototype.fieldSpec.push(["tropo_std","writeUInt16LE",2]),f.prototype.fieldSpec.push(["range_std","writeUInt16LE",2]);var d=function(e,t){return p.call(this,e),this.messageType="MSG_OBS",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(p.prototype)).messageType="MSG_OBS",d.prototype.msg_type=74,d.prototype.constructor=d,d.prototype.parser=(new o).endianess("little").nest("header",{type:u.prototype.parser}).array("obs",{type:h.prototype.parser,readUntil:"eof"}),d.prototype.fieldSpec=[],d.prototype.fieldSpec.push(["header",u.prototype.fieldSpec]),d.prototype.fieldSpec.push(["obs","array",h.prototype.fieldSpec,function(){return this.fields.array.length},null]);var _=function(e,t){return p.call(this,e),this.messageType="MSG_BASE_POS_LLH",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(p.prototype)).messageType="MSG_BASE_POS_LLH",_.prototype.msg_type=68,_.prototype.constructor=_,_.prototype.parser=(new o).endianess("little").doublele("lat").doublele("lon").doublele("height"),_.prototype.fieldSpec=[],_.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),_.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),_.prototype.fieldSpec.push(["height","writeDoubleLE",8]);var S=function(e,t){return p.call(this,e),this.messageType="MSG_BASE_POS_ECEF",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(p.prototype)).messageType="MSG_BASE_POS_ECEF",S.prototype.msg_type=72,S.prototype.constructor=S,S.prototype.parser=(new o).endianess("little").doublele("x").doublele("y").doublele("z"),S.prototype.fieldSpec=[],S.prototype.fieldSpec.push(["x","writeDoubleLE",8]),S.prototype.fieldSpec.push(["y","writeDoubleLE",8]),S.prototype.fieldSpec.push(["z","writeDoubleLE",8]);var g=function(e,t){return p.call(this,e),this.messageType="EphemerisCommonContent",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(p.prototype)).messageType="EphemerisCommonContent",g.prototype.constructor=g,g.prototype.parser=(new o).endianess("little").nest("sid",{type:s.prototype.parser}).nest("toe",{type:c.prototype.parser}).floatle("ura").uint32("fit_interval").uint8("valid").uint8("health_bits"),g.prototype.fieldSpec=[],g.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),g.prototype.fieldSpec.push(["toe",c.prototype.fieldSpec]),g.prototype.fieldSpec.push(["ura","writeFloatLE",4]),g.prototype.fieldSpec.push(["fit_interval","writeUInt32LE",4]),g.prototype.fieldSpec.push(["valid","writeUInt8",1]),g.prototype.fieldSpec.push(["health_bits","writeUInt8",1]);var w=function(e,t){return p.call(this,e),this.messageType="EphemerisCommonContentDepB",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(p.prototype)).messageType="EphemerisCommonContentDepB",w.prototype.constructor=w,w.prototype.parser=(new o).endianess("little").nest("sid",{type:s.prototype.parser}).nest("toe",{type:c.prototype.parser}).doublele("ura").uint32("fit_interval").uint8("valid").uint8("health_bits"),w.prototype.fieldSpec=[],w.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),w.prototype.fieldSpec.push(["toe",c.prototype.fieldSpec]),w.prototype.fieldSpec.push(["ura","writeDoubleLE",8]),w.prototype.fieldSpec.push(["fit_interval","writeUInt32LE",4]),w.prototype.fieldSpec.push(["valid","writeUInt8",1]),w.prototype.fieldSpec.push(["health_bits","writeUInt8",1]);var E=function(e,t){return p.call(this,e),this.messageType="EphemerisCommonContentDepA",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(p.prototype)).messageType="EphemerisCommonContentDepA",E.prototype.constructor=E,E.prototype.parser=(new o).endianess("little").nest("sid",{type:n.prototype.parser}).nest("toe",{type:l.prototype.parser}).doublele("ura").uint32("fit_interval").uint8("valid").uint8("health_bits"),E.prototype.fieldSpec=[],E.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),E.prototype.fieldSpec.push(["toe",l.prototype.fieldSpec]),E.prototype.fieldSpec.push(["ura","writeDoubleLE",8]),E.prototype.fieldSpec.push(["fit_interval","writeUInt32LE",4]),E.prototype.fieldSpec.push(["valid","writeUInt8",1]),E.prototype.fieldSpec.push(["health_bits","writeUInt8",1]);var m=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GPS_DEP_E",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GPS_DEP_E",m.prototype.msg_type=129,m.prototype.constructor=m,m.prototype.parser=(new o).endianess("little").nest("common",{type:E.prototype.parser}).doublele("tgd").doublele("c_rs").doublele("c_rc").doublele("c_uc").doublele("c_us").doublele("c_ic").doublele("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").doublele("af1").doublele("af2").nest("toc",{type:l.prototype.parser}).uint8("iode").uint16("iodc"),m.prototype.fieldSpec=[],m.prototype.fieldSpec.push(["common",E.prototype.fieldSpec]),m.prototype.fieldSpec.push(["tgd","writeDoubleLE",8]),m.prototype.fieldSpec.push(["c_rs","writeDoubleLE",8]),m.prototype.fieldSpec.push(["c_rc","writeDoubleLE",8]),m.prototype.fieldSpec.push(["c_uc","writeDoubleLE",8]),m.prototype.fieldSpec.push(["c_us","writeDoubleLE",8]),m.prototype.fieldSpec.push(["c_ic","writeDoubleLE",8]),m.prototype.fieldSpec.push(["c_is","writeDoubleLE",8]),m.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),m.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),m.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),m.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),m.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),m.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),m.prototype.fieldSpec.push(["w","writeDoubleLE",8]),m.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),m.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),m.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),m.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),m.prototype.fieldSpec.push(["af2","writeDoubleLE",8]),m.prototype.fieldSpec.push(["toc",l.prototype.fieldSpec]),m.prototype.fieldSpec.push(["iode","writeUInt8",1]),m.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]);var b=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GPS_DEP_F",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GPS_DEP_F",b.prototype.msg_type=134,b.prototype.constructor=b,b.prototype.parser=(new o).endianess("little").nest("common",{type:w.prototype.parser}).doublele("tgd").doublele("c_rs").doublele("c_rc").doublele("c_uc").doublele("c_us").doublele("c_ic").doublele("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").doublele("af1").doublele("af2").nest("toc",{type:c.prototype.parser}).uint8("iode").uint16("iodc"),b.prototype.fieldSpec=[],b.prototype.fieldSpec.push(["common",w.prototype.fieldSpec]),b.prototype.fieldSpec.push(["tgd","writeDoubleLE",8]),b.prototype.fieldSpec.push(["c_rs","writeDoubleLE",8]),b.prototype.fieldSpec.push(["c_rc","writeDoubleLE",8]),b.prototype.fieldSpec.push(["c_uc","writeDoubleLE",8]),b.prototype.fieldSpec.push(["c_us","writeDoubleLE",8]),b.prototype.fieldSpec.push(["c_ic","writeDoubleLE",8]),b.prototype.fieldSpec.push(["c_is","writeDoubleLE",8]),b.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),b.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),b.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),b.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),b.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),b.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),b.prototype.fieldSpec.push(["w","writeDoubleLE",8]),b.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),b.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),b.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),b.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),b.prototype.fieldSpec.push(["af2","writeDoubleLE",8]),b.prototype.fieldSpec.push(["toc",c.prototype.fieldSpec]),b.prototype.fieldSpec.push(["iode","writeUInt8",1]),b.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]);var v=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GPS",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GPS",v.prototype.msg_type=138,v.prototype.constructor=v,v.prototype.parser=(new o).endianess("little").nest("common",{type:g.prototype.parser}).floatle("tgd").floatle("c_rs").floatle("c_rc").floatle("c_uc").floatle("c_us").floatle("c_ic").floatle("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").floatle("af0").floatle("af1").floatle("af2").nest("toc",{type:c.prototype.parser}).uint8("iode").uint16("iodc"),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),v.prototype.fieldSpec.push(["tgd","writeFloatLE",4]),v.prototype.fieldSpec.push(["c_rs","writeFloatLE",4]),v.prototype.fieldSpec.push(["c_rc","writeFloatLE",4]),v.prototype.fieldSpec.push(["c_uc","writeFloatLE",4]),v.prototype.fieldSpec.push(["c_us","writeFloatLE",4]),v.prototype.fieldSpec.push(["c_ic","writeFloatLE",4]),v.prototype.fieldSpec.push(["c_is","writeFloatLE",4]),v.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),v.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),v.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),v.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),v.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),v.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),v.prototype.fieldSpec.push(["w","writeDoubleLE",8]),v.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),v.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),v.prototype.fieldSpec.push(["af0","writeFloatLE",4]),v.prototype.fieldSpec.push(["af1","writeFloatLE",4]),v.prototype.fieldSpec.push(["af2","writeFloatLE",4]),v.prototype.fieldSpec.push(["toc",c.prototype.fieldSpec]),v.prototype.fieldSpec.push(["iode","writeUInt8",1]),v.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]);var I=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_QZSS",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_QZSS",I.prototype.msg_type=142,I.prototype.constructor=I,I.prototype.parser=(new o).endianess("little").nest("common",{type:g.prototype.parser}).floatle("tgd").floatle("c_rs").floatle("c_rc").floatle("c_uc").floatle("c_us").floatle("c_ic").floatle("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").floatle("af0").floatle("af1").floatle("af2").nest("toc",{type:c.prototype.parser}).uint8("iode").uint16("iodc"),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),I.prototype.fieldSpec.push(["tgd","writeFloatLE",4]),I.prototype.fieldSpec.push(["c_rs","writeFloatLE",4]),I.prototype.fieldSpec.push(["c_rc","writeFloatLE",4]),I.prototype.fieldSpec.push(["c_uc","writeFloatLE",4]),I.prototype.fieldSpec.push(["c_us","writeFloatLE",4]),I.prototype.fieldSpec.push(["c_ic","writeFloatLE",4]),I.prototype.fieldSpec.push(["c_is","writeFloatLE",4]),I.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),I.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),I.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),I.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),I.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),I.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),I.prototype.fieldSpec.push(["w","writeDoubleLE",8]),I.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),I.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),I.prototype.fieldSpec.push(["af0","writeFloatLE",4]),I.prototype.fieldSpec.push(["af1","writeFloatLE",4]),I.prototype.fieldSpec.push(["af2","writeFloatLE",4]),I.prototype.fieldSpec.push(["toc",c.prototype.fieldSpec]),I.prototype.fieldSpec.push(["iode","writeUInt8",1]),I.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]);var L=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_BDS",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_BDS",L.prototype.msg_type=137,L.prototype.constructor=L,L.prototype.parser=(new o).endianess("little").nest("common",{type:g.prototype.parser}).floatle("tgd1").floatle("tgd2").floatle("c_rs").floatle("c_rc").floatle("c_uc").floatle("c_us").floatle("c_ic").floatle("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").floatle("af1").floatle("af2").nest("toc",{type:c.prototype.parser}).uint8("iode").uint16("iodc"),L.prototype.fieldSpec=[],L.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),L.prototype.fieldSpec.push(["tgd1","writeFloatLE",4]),L.prototype.fieldSpec.push(["tgd2","writeFloatLE",4]),L.prototype.fieldSpec.push(["c_rs","writeFloatLE",4]),L.prototype.fieldSpec.push(["c_rc","writeFloatLE",4]),L.prototype.fieldSpec.push(["c_uc","writeFloatLE",4]),L.prototype.fieldSpec.push(["c_us","writeFloatLE",4]),L.prototype.fieldSpec.push(["c_ic","writeFloatLE",4]),L.prototype.fieldSpec.push(["c_is","writeFloatLE",4]),L.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),L.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),L.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),L.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),L.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),L.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),L.prototype.fieldSpec.push(["w","writeDoubleLE",8]),L.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),L.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),L.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),L.prototype.fieldSpec.push(["af1","writeFloatLE",4]),L.prototype.fieldSpec.push(["af2","writeFloatLE",4]),L.prototype.fieldSpec.push(["toc",c.prototype.fieldSpec]),L.prototype.fieldSpec.push(["iode","writeUInt8",1]),L.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]);var T=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GAL_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(T.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GAL_DEP_A",T.prototype.msg_type=149,T.prototype.constructor=T,T.prototype.parser=(new o).endianess("little").nest("common",{type:g.prototype.parser}).floatle("bgd_e1e5a").floatle("bgd_e1e5b").floatle("c_rs").floatle("c_rc").floatle("c_uc").floatle("c_us").floatle("c_ic").floatle("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").doublele("af1").floatle("af2").nest("toc",{type:c.prototype.parser}).uint16("iode").uint16("iodc"),T.prototype.fieldSpec=[],T.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),T.prototype.fieldSpec.push(["bgd_e1e5a","writeFloatLE",4]),T.prototype.fieldSpec.push(["bgd_e1e5b","writeFloatLE",4]),T.prototype.fieldSpec.push(["c_rs","writeFloatLE",4]),T.prototype.fieldSpec.push(["c_rc","writeFloatLE",4]),T.prototype.fieldSpec.push(["c_uc","writeFloatLE",4]),T.prototype.fieldSpec.push(["c_us","writeFloatLE",4]),T.prototype.fieldSpec.push(["c_ic","writeFloatLE",4]),T.prototype.fieldSpec.push(["c_is","writeFloatLE",4]),T.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),T.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),T.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),T.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),T.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),T.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),T.prototype.fieldSpec.push(["w","writeDoubleLE",8]),T.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),T.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),T.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),T.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),T.prototype.fieldSpec.push(["af2","writeFloatLE",4]),T.prototype.fieldSpec.push(["toc",c.prototype.fieldSpec]),T.prototype.fieldSpec.push(["iode","writeUInt16LE",2]),T.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]);var U=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GAL",this.fields=t||this.parser.parse(e.payload),this};(U.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GAL",U.prototype.msg_type=141,U.prototype.constructor=U,U.prototype.parser=(new o).endianess("little").nest("common",{type:g.prototype.parser}).floatle("bgd_e1e5a").floatle("bgd_e1e5b").floatle("c_rs").floatle("c_rc").floatle("c_uc").floatle("c_us").floatle("c_ic").floatle("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").doublele("af1").floatle("af2").nest("toc",{type:c.prototype.parser}).uint16("iode").uint16("iodc").uint8("source"),U.prototype.fieldSpec=[],U.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),U.prototype.fieldSpec.push(["bgd_e1e5a","writeFloatLE",4]),U.prototype.fieldSpec.push(["bgd_e1e5b","writeFloatLE",4]),U.prototype.fieldSpec.push(["c_rs","writeFloatLE",4]),U.prototype.fieldSpec.push(["c_rc","writeFloatLE",4]),U.prototype.fieldSpec.push(["c_uc","writeFloatLE",4]),U.prototype.fieldSpec.push(["c_us","writeFloatLE",4]),U.prototype.fieldSpec.push(["c_ic","writeFloatLE",4]),U.prototype.fieldSpec.push(["c_is","writeFloatLE",4]),U.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),U.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),U.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),U.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),U.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),U.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),U.prototype.fieldSpec.push(["w","writeDoubleLE",8]),U.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),U.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),U.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),U.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),U.prototype.fieldSpec.push(["af2","writeFloatLE",4]),U.prototype.fieldSpec.push(["toc",c.prototype.fieldSpec]),U.prototype.fieldSpec.push(["iode","writeUInt16LE",2]),U.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]),U.prototype.fieldSpec.push(["source","writeUInt8",1]);var M=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_SBAS_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(M.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_SBAS_DEP_A",M.prototype.msg_type=130,M.prototype.constructor=M,M.prototype.parser=(new o).endianess("little").nest("common",{type:E.prototype.parser}).array("pos",{length:3,type:"doublele"}).array("vel",{length:3,type:"doublele"}).array("acc",{length:3,type:"doublele"}).doublele("a_gf0").doublele("a_gf1"),M.prototype.fieldSpec=[],M.prototype.fieldSpec.push(["common",E.prototype.fieldSpec]),M.prototype.fieldSpec.push(["pos","array","writeDoubleLE",function(){return 8},3]),M.prototype.fieldSpec.push(["vel","array","writeDoubleLE",function(){return 8},3]),M.prototype.fieldSpec.push(["acc","array","writeDoubleLE",function(){return 8},3]),M.prototype.fieldSpec.push(["a_gf0","writeDoubleLE",8]),M.prototype.fieldSpec.push(["a_gf1","writeDoubleLE",8]);var D=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GLO_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(D.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GLO_DEP_A",D.prototype.msg_type=131,D.prototype.constructor=D,D.prototype.parser=(new o).endianess("little").nest("common",{type:E.prototype.parser}).doublele("gamma").doublele("tau").array("pos",{length:3,type:"doublele"}).array("vel",{length:3,type:"doublele"}).array("acc",{length:3,type:"doublele"}),D.prototype.fieldSpec=[],D.prototype.fieldSpec.push(["common",E.prototype.fieldSpec]),D.prototype.fieldSpec.push(["gamma","writeDoubleLE",8]),D.prototype.fieldSpec.push(["tau","writeDoubleLE",8]),D.prototype.fieldSpec.push(["pos","array","writeDoubleLE",function(){return 8},3]),D.prototype.fieldSpec.push(["vel","array","writeDoubleLE",function(){return 8},3]),D.prototype.fieldSpec.push(["acc","array","writeDoubleLE",function(){return 8},3]);var O=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_SBAS_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(O.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_SBAS_DEP_B",O.prototype.msg_type=132,O.prototype.constructor=O,O.prototype.parser=(new o).endianess("little").nest("common",{type:w.prototype.parser}).array("pos",{length:3,type:"doublele"}).array("vel",{length:3,type:"doublele"}).array("acc",{length:3,type:"doublele"}).doublele("a_gf0").doublele("a_gf1"),O.prototype.fieldSpec=[],O.prototype.fieldSpec.push(["common",w.prototype.fieldSpec]),O.prototype.fieldSpec.push(["pos","array","writeDoubleLE",function(){return 8},3]),O.prototype.fieldSpec.push(["vel","array","writeDoubleLE",function(){return 8},3]),O.prototype.fieldSpec.push(["acc","array","writeDoubleLE",function(){return 8},3]),O.prototype.fieldSpec.push(["a_gf0","writeDoubleLE",8]),O.prototype.fieldSpec.push(["a_gf1","writeDoubleLE",8]);var G=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_SBAS",this.fields=t||this.parser.parse(e.payload),this};(G.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_SBAS",G.prototype.msg_type=140,G.prototype.constructor=G,G.prototype.parser=(new o).endianess("little").nest("common",{type:g.prototype.parser}).array("pos",{length:3,type:"doublele"}).array("vel",{length:3,type:"floatle"}).array("acc",{length:3,type:"floatle"}).floatle("a_gf0").floatle("a_gf1"),G.prototype.fieldSpec=[],G.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),G.prototype.fieldSpec.push(["pos","array","writeDoubleLE",function(){return 8},3]),G.prototype.fieldSpec.push(["vel","array","writeFloatLE",function(){return 4},3]),G.prototype.fieldSpec.push(["acc","array","writeFloatLE",function(){return 4},3]),G.prototype.fieldSpec.push(["a_gf0","writeFloatLE",4]),G.prototype.fieldSpec.push(["a_gf1","writeFloatLE",4]);var A=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GLO_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(A.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GLO_DEP_B",A.prototype.msg_type=133,A.prototype.constructor=A,A.prototype.parser=(new o).endianess("little").nest("common",{type:w.prototype.parser}).doublele("gamma").doublele("tau").array("pos",{length:3,type:"doublele"}).array("vel",{length:3,type:"doublele"}).array("acc",{length:3,type:"doublele"}),A.prototype.fieldSpec=[],A.prototype.fieldSpec.push(["common",w.prototype.fieldSpec]),A.prototype.fieldSpec.push(["gamma","writeDoubleLE",8]),A.prototype.fieldSpec.push(["tau","writeDoubleLE",8]),A.prototype.fieldSpec.push(["pos","array","writeDoubleLE",function(){return 8},3]),A.prototype.fieldSpec.push(["vel","array","writeDoubleLE",function(){return 8},3]),A.prototype.fieldSpec.push(["acc","array","writeDoubleLE",function(){return 8},3]);var C=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GLO_DEP_C",this.fields=t||this.parser.parse(e.payload),this};(C.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GLO_DEP_C",C.prototype.msg_type=135,C.prototype.constructor=C,C.prototype.parser=(new o).endianess("little").nest("common",{type:w.prototype.parser}).doublele("gamma").doublele("tau").doublele("d_tau").array("pos",{length:3,type:"doublele"}).array("vel",{length:3,type:"doublele"}).array("acc",{length:3,type:"doublele"}).uint8("fcn"),C.prototype.fieldSpec=[],C.prototype.fieldSpec.push(["common",w.prototype.fieldSpec]),C.prototype.fieldSpec.push(["gamma","writeDoubleLE",8]),C.prototype.fieldSpec.push(["tau","writeDoubleLE",8]),C.prototype.fieldSpec.push(["d_tau","writeDoubleLE",8]),C.prototype.fieldSpec.push(["pos","array","writeDoubleLE",function(){return 8},3]),C.prototype.fieldSpec.push(["vel","array","writeDoubleLE",function(){return 8},3]),C.prototype.fieldSpec.push(["acc","array","writeDoubleLE",function(){return 8},3]),C.prototype.fieldSpec.push(["fcn","writeUInt8",1]);var R=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GLO_DEP_D",this.fields=t||this.parser.parse(e.payload),this};(R.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GLO_DEP_D",R.prototype.msg_type=136,R.prototype.constructor=R,R.prototype.parser=(new o).endianess("little").nest("common",{type:w.prototype.parser}).doublele("gamma").doublele("tau").doublele("d_tau").array("pos",{length:3,type:"doublele"}).array("vel",{length:3,type:"doublele"}).array("acc",{length:3,type:"doublele"}).uint8("fcn").uint8("iod"),R.prototype.fieldSpec=[],R.prototype.fieldSpec.push(["common",w.prototype.fieldSpec]),R.prototype.fieldSpec.push(["gamma","writeDoubleLE",8]),R.prototype.fieldSpec.push(["tau","writeDoubleLE",8]),R.prototype.fieldSpec.push(["d_tau","writeDoubleLE",8]),R.prototype.fieldSpec.push(["pos","array","writeDoubleLE",function(){return 8},3]),R.prototype.fieldSpec.push(["vel","array","writeDoubleLE",function(){return 8},3]),R.prototype.fieldSpec.push(["acc","array","writeDoubleLE",function(){return 8},3]),R.prototype.fieldSpec.push(["fcn","writeUInt8",1]),R.prototype.fieldSpec.push(["iod","writeUInt8",1]);var P=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_GLO",this.fields=t||this.parser.parse(e.payload),this};(P.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_GLO",P.prototype.msg_type=139,P.prototype.constructor=P,P.prototype.parser=(new o).endianess("little").nest("common",{type:g.prototype.parser}).floatle("gamma").floatle("tau").floatle("d_tau").array("pos",{length:3,type:"doublele"}).array("vel",{length:3,type:"doublele"}).array("acc",{length:3,type:"floatle"}).uint8("fcn").uint8("iod"),P.prototype.fieldSpec=[],P.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),P.prototype.fieldSpec.push(["gamma","writeFloatLE",4]),P.prototype.fieldSpec.push(["tau","writeFloatLE",4]),P.prototype.fieldSpec.push(["d_tau","writeFloatLE",4]),P.prototype.fieldSpec.push(["pos","array","writeDoubleLE",function(){return 8},3]),P.prototype.fieldSpec.push(["vel","array","writeDoubleLE",function(){return 8},3]),P.prototype.fieldSpec.push(["acc","array","writeFloatLE",function(){return 4},3]),P.prototype.fieldSpec.push(["fcn","writeUInt8",1]),P.prototype.fieldSpec.push(["iod","writeUInt8",1]);var N=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_DEP_D",this.fields=t||this.parser.parse(e.payload),this};(N.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_DEP_D",N.prototype.msg_type=128,N.prototype.constructor=N,N.prototype.parser=(new o).endianess("little").doublele("tgd").doublele("c_rs").doublele("c_rc").doublele("c_uc").doublele("c_us").doublele("c_ic").doublele("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").doublele("af1").doublele("af2").doublele("toe_tow").uint16("toe_wn").doublele("toc_tow").uint16("toc_wn").uint8("valid").uint8("healthy").nest("sid",{type:n.prototype.parser}).uint8("iode").uint16("iodc").uint32("reserved"),N.prototype.fieldSpec=[],N.prototype.fieldSpec.push(["tgd","writeDoubleLE",8]),N.prototype.fieldSpec.push(["c_rs","writeDoubleLE",8]),N.prototype.fieldSpec.push(["c_rc","writeDoubleLE",8]),N.prototype.fieldSpec.push(["c_uc","writeDoubleLE",8]),N.prototype.fieldSpec.push(["c_us","writeDoubleLE",8]),N.prototype.fieldSpec.push(["c_ic","writeDoubleLE",8]),N.prototype.fieldSpec.push(["c_is","writeDoubleLE",8]),N.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),N.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),N.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),N.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),N.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),N.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),N.prototype.fieldSpec.push(["w","writeDoubleLE",8]),N.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),N.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),N.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),N.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),N.prototype.fieldSpec.push(["af2","writeDoubleLE",8]),N.prototype.fieldSpec.push(["toe_tow","writeDoubleLE",8]),N.prototype.fieldSpec.push(["toe_wn","writeUInt16LE",2]),N.prototype.fieldSpec.push(["toc_tow","writeDoubleLE",8]),N.prototype.fieldSpec.push(["toc_wn","writeUInt16LE",2]),N.prototype.fieldSpec.push(["valid","writeUInt8",1]),N.prototype.fieldSpec.push(["healthy","writeUInt8",1]),N.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),N.prototype.fieldSpec.push(["iode","writeUInt8",1]),N.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]),N.prototype.fieldSpec.push(["reserved","writeUInt32LE",4]);var j=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(j.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_DEP_A",j.prototype.msg_type=26,j.prototype.constructor=j,j.prototype.parser=(new o).endianess("little").doublele("tgd").doublele("c_rs").doublele("c_rc").doublele("c_uc").doublele("c_us").doublele("c_ic").doublele("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").doublele("af1").doublele("af2").doublele("toe_tow").uint16("toe_wn").doublele("toc_tow").uint16("toc_wn").uint8("valid").uint8("healthy").uint8("prn"),j.prototype.fieldSpec=[],j.prototype.fieldSpec.push(["tgd","writeDoubleLE",8]),j.prototype.fieldSpec.push(["c_rs","writeDoubleLE",8]),j.prototype.fieldSpec.push(["c_rc","writeDoubleLE",8]),j.prototype.fieldSpec.push(["c_uc","writeDoubleLE",8]),j.prototype.fieldSpec.push(["c_us","writeDoubleLE",8]),j.prototype.fieldSpec.push(["c_ic","writeDoubleLE",8]),j.prototype.fieldSpec.push(["c_is","writeDoubleLE",8]),j.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),j.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),j.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),j.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),j.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),j.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),j.prototype.fieldSpec.push(["w","writeDoubleLE",8]),j.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),j.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),j.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),j.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),j.prototype.fieldSpec.push(["af2","writeDoubleLE",8]),j.prototype.fieldSpec.push(["toe_tow","writeDoubleLE",8]),j.prototype.fieldSpec.push(["toe_wn","writeUInt16LE",2]),j.prototype.fieldSpec.push(["toc_tow","writeDoubleLE",8]),j.prototype.fieldSpec.push(["toc_wn","writeUInt16LE",2]),j.prototype.fieldSpec.push(["valid","writeUInt8",1]),j.prototype.fieldSpec.push(["healthy","writeUInt8",1]),j.prototype.fieldSpec.push(["prn","writeUInt8",1]);var x=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(x.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_DEP_B",x.prototype.msg_type=70,x.prototype.constructor=x,x.prototype.parser=(new o).endianess("little").doublele("tgd").doublele("c_rs").doublele("c_rc").doublele("c_uc").doublele("c_us").doublele("c_ic").doublele("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").doublele("af1").doublele("af2").doublele("toe_tow").uint16("toe_wn").doublele("toc_tow").uint16("toc_wn").uint8("valid").uint8("healthy").uint8("prn").uint8("iode"),x.prototype.fieldSpec=[],x.prototype.fieldSpec.push(["tgd","writeDoubleLE",8]),x.prototype.fieldSpec.push(["c_rs","writeDoubleLE",8]),x.prototype.fieldSpec.push(["c_rc","writeDoubleLE",8]),x.prototype.fieldSpec.push(["c_uc","writeDoubleLE",8]),x.prototype.fieldSpec.push(["c_us","writeDoubleLE",8]),x.prototype.fieldSpec.push(["c_ic","writeDoubleLE",8]),x.prototype.fieldSpec.push(["c_is","writeDoubleLE",8]),x.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),x.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),x.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),x.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),x.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),x.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),x.prototype.fieldSpec.push(["w","writeDoubleLE",8]),x.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),x.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),x.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),x.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),x.prototype.fieldSpec.push(["af2","writeDoubleLE",8]),x.prototype.fieldSpec.push(["toe_tow","writeDoubleLE",8]),x.prototype.fieldSpec.push(["toe_wn","writeUInt16LE",2]),x.prototype.fieldSpec.push(["toc_tow","writeDoubleLE",8]),x.prototype.fieldSpec.push(["toc_wn","writeUInt16LE",2]),x.prototype.fieldSpec.push(["valid","writeUInt8",1]),x.prototype.fieldSpec.push(["healthy","writeUInt8",1]),x.prototype.fieldSpec.push(["prn","writeUInt8",1]),x.prototype.fieldSpec.push(["iode","writeUInt8",1]);var k=function(e,t){return p.call(this,e),this.messageType="MSG_EPHEMERIS_DEP_C",this.fields=t||this.parser.parse(e.payload),this};(k.prototype=Object.create(p.prototype)).messageType="MSG_EPHEMERIS_DEP_C",k.prototype.msg_type=71,k.prototype.constructor=k,k.prototype.parser=(new o).endianess("little").doublele("tgd").doublele("c_rs").doublele("c_rc").doublele("c_uc").doublele("c_us").doublele("c_ic").doublele("c_is").doublele("dn").doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("inc_dot").doublele("af0").doublele("af1").doublele("af2").doublele("toe_tow").uint16("toe_wn").doublele("toc_tow").uint16("toc_wn").uint8("valid").uint8("healthy").nest("sid",{type:n.prototype.parser}).uint8("iode").uint16("iodc").uint32("reserved"),k.prototype.fieldSpec=[],k.prototype.fieldSpec.push(["tgd","writeDoubleLE",8]),k.prototype.fieldSpec.push(["c_rs","writeDoubleLE",8]),k.prototype.fieldSpec.push(["c_rc","writeDoubleLE",8]),k.prototype.fieldSpec.push(["c_uc","writeDoubleLE",8]),k.prototype.fieldSpec.push(["c_us","writeDoubleLE",8]),k.prototype.fieldSpec.push(["c_ic","writeDoubleLE",8]),k.prototype.fieldSpec.push(["c_is","writeDoubleLE",8]),k.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),k.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),k.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),k.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),k.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),k.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),k.prototype.fieldSpec.push(["w","writeDoubleLE",8]),k.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),k.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),k.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),k.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),k.prototype.fieldSpec.push(["af2","writeDoubleLE",8]),k.prototype.fieldSpec.push(["toe_tow","writeDoubleLE",8]),k.prototype.fieldSpec.push(["toe_wn","writeUInt16LE",2]),k.prototype.fieldSpec.push(["toc_tow","writeDoubleLE",8]),k.prototype.fieldSpec.push(["toc_wn","writeUInt16LE",2]),k.prototype.fieldSpec.push(["valid","writeUInt8",1]),k.prototype.fieldSpec.push(["healthy","writeUInt8",1]),k.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),k.prototype.fieldSpec.push(["iode","writeUInt8",1]),k.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]),k.prototype.fieldSpec.push(["reserved","writeUInt32LE",4]);var F=function(e,t){return p.call(this,e),this.messageType="ObservationHeaderDep",this.fields=t||this.parser.parse(e.payload),this};(F.prototype=Object.create(p.prototype)).messageType="ObservationHeaderDep",F.prototype.constructor=F,F.prototype.parser=(new o).endianess("little").nest("t",{type:l.prototype.parser}).uint8("n_obs"),F.prototype.fieldSpec=[],F.prototype.fieldSpec.push(["t",l.prototype.fieldSpec]),F.prototype.fieldSpec.push(["n_obs","writeUInt8",1]);var B=function(e,t){return p.call(this,e),this.messageType="CarrierPhaseDepA",this.fields=t||this.parser.parse(e.payload),this};(B.prototype=Object.create(p.prototype)).messageType="CarrierPhaseDepA",B.prototype.constructor=B,B.prototype.parser=(new o).endianess("little").int32("i").uint8("f"),B.prototype.fieldSpec=[],B.prototype.fieldSpec.push(["i","writeInt32LE",4]),B.prototype.fieldSpec.push(["f","writeUInt8",1]);var q=function(e,t){return p.call(this,e),this.messageType="PackedObsContentDepA",this.fields=t||this.parser.parse(e.payload),this};(q.prototype=Object.create(p.prototype)).messageType="PackedObsContentDepA",q.prototype.constructor=q,q.prototype.parser=(new o).endianess("little").uint32("P").nest("L",{type:B.prototype.parser}).uint8("cn0").uint16("lock").uint8("prn"),q.prototype.fieldSpec=[],q.prototype.fieldSpec.push(["P","writeUInt32LE",4]),q.prototype.fieldSpec.push(["L",B.prototype.fieldSpec]),q.prototype.fieldSpec.push(["cn0","writeUInt8",1]),q.prototype.fieldSpec.push(["lock","writeUInt16LE",2]),q.prototype.fieldSpec.push(["prn","writeUInt8",1]);var z=function(e,t){return p.call(this,e),this.messageType="PackedObsContentDepB",this.fields=t||this.parser.parse(e.payload),this};(z.prototype=Object.create(p.prototype)).messageType="PackedObsContentDepB",z.prototype.constructor=z,z.prototype.parser=(new o).endianess("little").uint32("P").nest("L",{type:B.prototype.parser}).uint8("cn0").uint16("lock").nest("sid",{type:n.prototype.parser}),z.prototype.fieldSpec=[],z.prototype.fieldSpec.push(["P","writeUInt32LE",4]),z.prototype.fieldSpec.push(["L",B.prototype.fieldSpec]),z.prototype.fieldSpec.push(["cn0","writeUInt8",1]),z.prototype.fieldSpec.push(["lock","writeUInt16LE",2]),z.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]);var H=function(e,t){return p.call(this,e),this.messageType="PackedObsContentDepC",this.fields=t||this.parser.parse(e.payload),this};(H.prototype=Object.create(p.prototype)).messageType="PackedObsContentDepC",H.prototype.constructor=H,H.prototype.parser=(new o).endianess("little").uint32("P").nest("L",{type:i.prototype.parser}).uint8("cn0").uint16("lock").nest("sid",{type:n.prototype.parser}),H.prototype.fieldSpec=[],H.prototype.fieldSpec.push(["P","writeUInt32LE",4]),H.prototype.fieldSpec.push(["L",i.prototype.fieldSpec]),H.prototype.fieldSpec.push(["cn0","writeUInt8",1]),H.prototype.fieldSpec.push(["lock","writeUInt16LE",2]),H.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]);var V=function(e,t){return p.call(this,e),this.messageType="MSG_OBS_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(V.prototype=Object.create(p.prototype)).messageType="MSG_OBS_DEP_A",V.prototype.msg_type=69,V.prototype.constructor=V,V.prototype.parser=(new o).endianess("little").nest("header",{type:F.prototype.parser}).array("obs",{type:q.prototype.parser,readUntil:"eof"}),V.prototype.fieldSpec=[],V.prototype.fieldSpec.push(["header",F.prototype.fieldSpec]),V.prototype.fieldSpec.push(["obs","array",q.prototype.fieldSpec,function(){return this.fields.array.length},null]);var Y=function(e,t){return p.call(this,e),this.messageType="MSG_OBS_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(Y.prototype=Object.create(p.prototype)).messageType="MSG_OBS_DEP_B",Y.prototype.msg_type=67,Y.prototype.constructor=Y,Y.prototype.parser=(new o).endianess("little").nest("header",{type:F.prototype.parser}).array("obs",{type:z.prototype.parser,readUntil:"eof"}),Y.prototype.fieldSpec=[],Y.prototype.fieldSpec.push(["header",F.prototype.fieldSpec]),Y.prototype.fieldSpec.push(["obs","array",z.prototype.fieldSpec,function(){return this.fields.array.length},null]);var W=function(e,t){return p.call(this,e),this.messageType="MSG_OBS_DEP_C",this.fields=t||this.parser.parse(e.payload),this};(W.prototype=Object.create(p.prototype)).messageType="MSG_OBS_DEP_C",W.prototype.msg_type=73,W.prototype.constructor=W,W.prototype.parser=(new o).endianess("little").nest("header",{type:F.prototype.parser}).array("obs",{type:H.prototype.parser,readUntil:"eof"}),W.prototype.fieldSpec=[],W.prototype.fieldSpec.push(["header",F.prototype.fieldSpec]),W.prototype.fieldSpec.push(["obs","array",H.prototype.fieldSpec,function(){return this.fields.array.length},null]);var Q=function(e,t){return p.call(this,e),this.messageType="MSG_IONO",this.fields=t||this.parser.parse(e.payload),this};(Q.prototype=Object.create(p.prototype)).messageType="MSG_IONO",Q.prototype.msg_type=144,Q.prototype.constructor=Q,Q.prototype.parser=(new o).endianess("little").nest("t_nmct",{type:c.prototype.parser}).doublele("a0").doublele("a1").doublele("a2").doublele("a3").doublele("b0").doublele("b1").doublele("b2").doublele("b3"),Q.prototype.fieldSpec=[],Q.prototype.fieldSpec.push(["t_nmct",c.prototype.fieldSpec]),Q.prototype.fieldSpec.push(["a0","writeDoubleLE",8]),Q.prototype.fieldSpec.push(["a1","writeDoubleLE",8]),Q.prototype.fieldSpec.push(["a2","writeDoubleLE",8]),Q.prototype.fieldSpec.push(["a3","writeDoubleLE",8]),Q.prototype.fieldSpec.push(["b0","writeDoubleLE",8]),Q.prototype.fieldSpec.push(["b1","writeDoubleLE",8]),Q.prototype.fieldSpec.push(["b2","writeDoubleLE",8]),Q.prototype.fieldSpec.push(["b3","writeDoubleLE",8]);var K=function(e,t){return p.call(this,e),this.messageType="MSG_SV_CONFIGURATION_GPS_DEP",this.fields=t||this.parser.parse(e.payload),this};(K.prototype=Object.create(p.prototype)).messageType="MSG_SV_CONFIGURATION_GPS_DEP",K.prototype.msg_type=145,K.prototype.constructor=K,K.prototype.parser=(new o).endianess("little").nest("t_nmct",{type:c.prototype.parser}).uint32("l2c_mask"),K.prototype.fieldSpec=[],K.prototype.fieldSpec.push(["t_nmct",c.prototype.fieldSpec]),K.prototype.fieldSpec.push(["l2c_mask","writeUInt32LE",4]);var X=function(e,t){return p.call(this,e),this.messageType="GnssCapb",this.fields=t||this.parser.parse(e.payload),this};(X.prototype=Object.create(p.prototype)).messageType="GnssCapb",X.prototype.constructor=X,X.prototype.parser=(new o).endianess("little").uint64("gps_active").uint64("gps_l2c").uint64("gps_l5").uint32("glo_active").uint32("glo_l2of").uint32("glo_l3").uint64("sbas_active").uint64("sbas_l5").uint64("bds_active").uint64("bds_d2nav").uint64("bds_b2").uint64("bds_b2a").uint32("qzss_active").uint64("gal_active").uint64("gal_e5"),X.prototype.fieldSpec=[],X.prototype.fieldSpec.push(["gps_active","writeUInt64LE",8]),X.prototype.fieldSpec.push(["gps_l2c","writeUInt64LE",8]),X.prototype.fieldSpec.push(["gps_l5","writeUInt64LE",8]),X.prototype.fieldSpec.push(["glo_active","writeUInt32LE",4]),X.prototype.fieldSpec.push(["glo_l2of","writeUInt32LE",4]),X.prototype.fieldSpec.push(["glo_l3","writeUInt32LE",4]),X.prototype.fieldSpec.push(["sbas_active","writeUInt64LE",8]),X.prototype.fieldSpec.push(["sbas_l5","writeUInt64LE",8]),X.prototype.fieldSpec.push(["bds_active","writeUInt64LE",8]),X.prototype.fieldSpec.push(["bds_d2nav","writeUInt64LE",8]),X.prototype.fieldSpec.push(["bds_b2","writeUInt64LE",8]),X.prototype.fieldSpec.push(["bds_b2a","writeUInt64LE",8]),X.prototype.fieldSpec.push(["qzss_active","writeUInt32LE",4]),X.prototype.fieldSpec.push(["gal_active","writeUInt64LE",8]),X.prototype.fieldSpec.push(["gal_e5","writeUInt64LE",8]);var J=function(e,t){return p.call(this,e),this.messageType="MSG_GNSS_CAPB",this.fields=t||this.parser.parse(e.payload),this};(J.prototype=Object.create(p.prototype)).messageType="MSG_GNSS_CAPB",J.prototype.msg_type=150,J.prototype.constructor=J,J.prototype.parser=(new o).endianess("little").nest("t_nmct",{type:c.prototype.parser}).nest("gc",{type:X.prototype.parser}),J.prototype.fieldSpec=[],J.prototype.fieldSpec.push(["t_nmct",c.prototype.fieldSpec]),J.prototype.fieldSpec.push(["gc",X.prototype.fieldSpec]);var $=function(e,t){return p.call(this,e),this.messageType="MSG_GROUP_DELAY_DEP_A",this.fields=t||this.parser.parse(e.payload),this};($.prototype=Object.create(p.prototype)).messageType="MSG_GROUP_DELAY_DEP_A",$.prototype.msg_type=146,$.prototype.constructor=$,$.prototype.parser=(new o).endianess("little").nest("t_op",{type:l.prototype.parser}).uint8("prn").uint8("valid").int16("tgd").int16("isc_l1ca").int16("isc_l2c"),$.prototype.fieldSpec=[],$.prototype.fieldSpec.push(["t_op",l.prototype.fieldSpec]),$.prototype.fieldSpec.push(["prn","writeUInt8",1]),$.prototype.fieldSpec.push(["valid","writeUInt8",1]),$.prototype.fieldSpec.push(["tgd","writeInt16LE",2]),$.prototype.fieldSpec.push(["isc_l1ca","writeInt16LE",2]),$.prototype.fieldSpec.push(["isc_l2c","writeInt16LE",2]);var Z=function(e,t){return p.call(this,e),this.messageType="MSG_GROUP_DELAY_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(Z.prototype=Object.create(p.prototype)).messageType="MSG_GROUP_DELAY_DEP_B",Z.prototype.msg_type=147,Z.prototype.constructor=Z,Z.prototype.parser=(new o).endianess("little").nest("t_op",{type:c.prototype.parser}).nest("sid",{type:n.prototype.parser}).uint8("valid").int16("tgd").int16("isc_l1ca").int16("isc_l2c"),Z.prototype.fieldSpec=[],Z.prototype.fieldSpec.push(["t_op",c.prototype.fieldSpec]),Z.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),Z.prototype.fieldSpec.push(["valid","writeUInt8",1]),Z.prototype.fieldSpec.push(["tgd","writeInt16LE",2]),Z.prototype.fieldSpec.push(["isc_l1ca","writeInt16LE",2]),Z.prototype.fieldSpec.push(["isc_l2c","writeInt16LE",2]);var ee=function(e,t){return p.call(this,e),this.messageType="MSG_GROUP_DELAY",this.fields=t||this.parser.parse(e.payload),this};(ee.prototype=Object.create(p.prototype)).messageType="MSG_GROUP_DELAY",ee.prototype.msg_type=148,ee.prototype.constructor=ee,ee.prototype.parser=(new o).endianess("little").nest("t_op",{type:c.prototype.parser}).nest("sid",{type:s.prototype.parser}).uint8("valid").int16("tgd").int16("isc_l1ca").int16("isc_l2c"),ee.prototype.fieldSpec=[],ee.prototype.fieldSpec.push(["t_op",c.prototype.fieldSpec]),ee.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),ee.prototype.fieldSpec.push(["valid","writeUInt8",1]),ee.prototype.fieldSpec.push(["tgd","writeInt16LE",2]),ee.prototype.fieldSpec.push(["isc_l1ca","writeInt16LE",2]),ee.prototype.fieldSpec.push(["isc_l2c","writeInt16LE",2]);var te=function(e,t){return p.call(this,e),this.messageType="AlmanacCommonContent",this.fields=t||this.parser.parse(e.payload),this};(te.prototype=Object.create(p.prototype)).messageType="AlmanacCommonContent",te.prototype.constructor=te,te.prototype.parser=(new o).endianess("little").nest("sid",{type:s.prototype.parser}).nest("toa",{type:c.prototype.parser}).doublele("ura").uint32("fit_interval").uint8("valid").uint8("health_bits"),te.prototype.fieldSpec=[],te.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),te.prototype.fieldSpec.push(["toa",c.prototype.fieldSpec]),te.prototype.fieldSpec.push(["ura","writeDoubleLE",8]),te.prototype.fieldSpec.push(["fit_interval","writeUInt32LE",4]),te.prototype.fieldSpec.push(["valid","writeUInt8",1]),te.prototype.fieldSpec.push(["health_bits","writeUInt8",1]);var re=function(e,t){return p.call(this,e),this.messageType="AlmanacCommonContentDep",this.fields=t||this.parser.parse(e.payload),this};(re.prototype=Object.create(p.prototype)).messageType="AlmanacCommonContentDep",re.prototype.constructor=re,re.prototype.parser=(new o).endianess("little").nest("sid",{type:n.prototype.parser}).nest("toa",{type:c.prototype.parser}).doublele("ura").uint32("fit_interval").uint8("valid").uint8("health_bits"),re.prototype.fieldSpec=[],re.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),re.prototype.fieldSpec.push(["toa",c.prototype.fieldSpec]),re.prototype.fieldSpec.push(["ura","writeDoubleLE",8]),re.prototype.fieldSpec.push(["fit_interval","writeUInt32LE",4]),re.prototype.fieldSpec.push(["valid","writeUInt8",1]),re.prototype.fieldSpec.push(["health_bits","writeUInt8",1]);var pe=function(e,t){return p.call(this,e),this.messageType="MSG_ALMANAC_GPS_DEP",this.fields=t||this.parser.parse(e.payload),this};(pe.prototype=Object.create(p.prototype)).messageType="MSG_ALMANAC_GPS_DEP",pe.prototype.msg_type=112,pe.prototype.constructor=pe,pe.prototype.parser=(new o).endianess("little").nest("common",{type:re.prototype.parser}).doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("af0").doublele("af1"),pe.prototype.fieldSpec=[],pe.prototype.fieldSpec.push(["common",re.prototype.fieldSpec]),pe.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["w","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["af1","writeDoubleLE",8]);var oe=function(e,t){return p.call(this,e),this.messageType="MSG_ALMANAC_GPS",this.fields=t||this.parser.parse(e.payload),this};(oe.prototype=Object.create(p.prototype)).messageType="MSG_ALMANAC_GPS",oe.prototype.msg_type=114,oe.prototype.constructor=oe,oe.prototype.parser=(new o).endianess("little").nest("common",{type:te.prototype.parser}).doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("af0").doublele("af1"),oe.prototype.fieldSpec=[],oe.prototype.fieldSpec.push(["common",te.prototype.fieldSpec]),oe.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),oe.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),oe.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),oe.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),oe.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),oe.prototype.fieldSpec.push(["w","writeDoubleLE",8]),oe.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),oe.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),oe.prototype.fieldSpec.push(["af1","writeDoubleLE",8]);var ie=function(e,t){return p.call(this,e),this.messageType="MSG_ALMANAC_GLO_DEP",this.fields=t||this.parser.parse(e.payload),this};(ie.prototype=Object.create(p.prototype)).messageType="MSG_ALMANAC_GLO_DEP",ie.prototype.msg_type=113,ie.prototype.constructor=ie,ie.prototype.parser=(new o).endianess("little").nest("common",{type:re.prototype.parser}).doublele("lambda_na").doublele("t_lambda_na").doublele("i").doublele("t").doublele("t_dot").doublele("epsilon").doublele("omega"),ie.prototype.fieldSpec=[],ie.prototype.fieldSpec.push(["common",re.prototype.fieldSpec]),ie.prototype.fieldSpec.push(["lambda_na","writeDoubleLE",8]),ie.prototype.fieldSpec.push(["t_lambda_na","writeDoubleLE",8]),ie.prototype.fieldSpec.push(["i","writeDoubleLE",8]),ie.prototype.fieldSpec.push(["t","writeDoubleLE",8]),ie.prototype.fieldSpec.push(["t_dot","writeDoubleLE",8]),ie.prototype.fieldSpec.push(["epsilon","writeDoubleLE",8]),ie.prototype.fieldSpec.push(["omega","writeDoubleLE",8]);var se=function(e,t){return p.call(this,e),this.messageType="MSG_ALMANAC_GLO",this.fields=t||this.parser.parse(e.payload),this};(se.prototype=Object.create(p.prototype)).messageType="MSG_ALMANAC_GLO",se.prototype.msg_type=115,se.prototype.constructor=se,se.prototype.parser=(new o).endianess("little").nest("common",{type:te.prototype.parser}).doublele("lambda_na").doublele("t_lambda_na").doublele("i").doublele("t").doublele("t_dot").doublele("epsilon").doublele("omega"),se.prototype.fieldSpec=[],se.prototype.fieldSpec.push(["common",te.prototype.fieldSpec]),se.prototype.fieldSpec.push(["lambda_na","writeDoubleLE",8]),se.prototype.fieldSpec.push(["t_lambda_na","writeDoubleLE",8]),se.prototype.fieldSpec.push(["i","writeDoubleLE",8]),se.prototype.fieldSpec.push(["t","writeDoubleLE",8]),se.prototype.fieldSpec.push(["t_dot","writeDoubleLE",8]),se.prototype.fieldSpec.push(["epsilon","writeDoubleLE",8]),se.prototype.fieldSpec.push(["omega","writeDoubleLE",8]);var ne=function(e,t){return p.call(this,e),this.messageType="MSG_GLO_BIASES",this.fields=t||this.parser.parse(e.payload),this};(ne.prototype=Object.create(p.prototype)).messageType="MSG_GLO_BIASES",ne.prototype.msg_type=117,ne.prototype.constructor=ne,ne.prototype.parser=(new o).endianess("little").uint8("mask").int16("l1ca_bias").int16("l1p_bias").int16("l2ca_bias").int16("l2p_bias"),ne.prototype.fieldSpec=[],ne.prototype.fieldSpec.push(["mask","writeUInt8",1]),ne.prototype.fieldSpec.push(["l1ca_bias","writeInt16LE",2]),ne.prototype.fieldSpec.push(["l1p_bias","writeInt16LE",2]),ne.prototype.fieldSpec.push(["l2ca_bias","writeInt16LE",2]),ne.prototype.fieldSpec.push(["l2p_bias","writeInt16LE",2]);var ae=function(e,t){return p.call(this,e),this.messageType="SvAzEl",this.fields=t||this.parser.parse(e.payload),this};(ae.prototype=Object.create(p.prototype)).messageType="SvAzEl",ae.prototype.constructor=ae,ae.prototype.parser=(new o).endianess("little").nest("sid",{type:s.prototype.parser}).uint8("az").int8("el"),ae.prototype.fieldSpec=[],ae.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),ae.prototype.fieldSpec.push(["az","writeUInt8",1]),ae.prototype.fieldSpec.push(["el","writeInt8",1]);var le=function(e,t){return p.call(this,e),this.messageType="MSG_SV_AZ_EL",this.fields=t||this.parser.parse(e.payload),this};(le.prototype=Object.create(p.prototype)).messageType="MSG_SV_AZ_EL",le.prototype.msg_type=151,le.prototype.constructor=le,le.prototype.parser=(new o).endianess("little").array("azel",{type:ae.prototype.parser,readUntil:"eof"}),le.prototype.fieldSpec=[],le.prototype.fieldSpec.push(["azel","array",ae.prototype.fieldSpec,function(){return this.fields.array.length},null]);var ce=function(e,t){return p.call(this,e),this.messageType="MSG_OSR",this.fields=t||this.parser.parse(e.payload),this};(ce.prototype=Object.create(p.prototype)).messageType="MSG_OSR",ce.prototype.msg_type=1600,ce.prototype.constructor=ce,ce.prototype.parser=(new o).endianess("little").nest("header",{type:u.prototype.parser}).array("obs",{type:f.prototype.parser,readUntil:"eof"}),ce.prototype.fieldSpec=[],ce.prototype.fieldSpec.push(["header",u.prototype.fieldSpec]),ce.prototype.fieldSpec.push(["obs","array",f.prototype.fieldSpec,function(){return this.fields.array.length},null]),e.exports={ObservationHeader:u,Doppler:y,PackedObsContent:h,PackedOsrContent:f,74:d,MsgObs:d,68:_,MsgBasePosLlh:_,72:S,MsgBasePosEcef:S,EphemerisCommonContent:g,EphemerisCommonContentDepB:w,EphemerisCommonContentDepA:E,129:m,MsgEphemerisGpsDepE:m,134:b,MsgEphemerisGpsDepF:b,138:v,MsgEphemerisGps:v,142:I,MsgEphemerisQzss:I,137:L,MsgEphemerisBds:L,149:T,MsgEphemerisGalDepA:T,141:U,MsgEphemerisGal:U,130:M,MsgEphemerisSbasDepA:M,131:D,MsgEphemerisGloDepA:D,132:O,MsgEphemerisSbasDepB:O,140:G,MsgEphemerisSbas:G,133:A,MsgEphemerisGloDepB:A,135:C,MsgEphemerisGloDepC:C,136:R,MsgEphemerisGloDepD:R,139:P,MsgEphemerisGlo:P,128:N,MsgEphemerisDepD:N,26:j,MsgEphemerisDepA:j,70:x,MsgEphemerisDepB:x,71:k,MsgEphemerisDepC:k,ObservationHeaderDep:F,CarrierPhaseDepA:B,PackedObsContentDepA:q,PackedObsContentDepB:z,PackedObsContentDepC:H,69:V,MsgObsDepA:V,67:Y,MsgObsDepB:Y,73:W,MsgObsDepC:W,144:Q,MsgIono:Q,145:K,MsgSvConfigurationGpsDep:K,GnssCapb:X,150:J,MsgGnssCapb:J,146:$,MsgGroupDelayDepA:$,147:Z,MsgGroupDelayDepB:Z,148:ee,MsgGroupDelay:ee,AlmanacCommonContent:te,AlmanacCommonContentDep:re,112:pe,MsgAlmanacGpsDep:pe,114:oe,MsgAlmanacGps:oe,113:ie,MsgAlmanacGloDep:ie,115:se,MsgAlmanacGlo:se,117:ne,MsgGloBiases:ne,SvAzEl:ae,151:le,MsgSvAzEl:le,1600:ce,MsgOsr:ce}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_BASELINE_HEADING",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_BASELINE_HEADING",i.prototype.msg_type=527,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint32("tow").uint32("heading").uint8("n_sats").uint8("flags"),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),i.prototype.fieldSpec.push(["heading","writeUInt32LE",4]),i.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),i.prototype.fieldSpec.push(["flags","writeUInt8",1]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_ORIENT_QUAT",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_ORIENT_QUAT",s.prototype.msg_type=544,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint32("tow").int32("w").int32("x").int32("y").int32("z").floatle("w_accuracy").floatle("x_accuracy").floatle("y_accuracy").floatle("z_accuracy").uint8("flags"),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),s.prototype.fieldSpec.push(["w","writeInt32LE",4]),s.prototype.fieldSpec.push(["x","writeInt32LE",4]),s.prototype.fieldSpec.push(["y","writeInt32LE",4]),s.prototype.fieldSpec.push(["z","writeInt32LE",4]),s.prototype.fieldSpec.push(["w_accuracy","writeFloatLE",4]),s.prototype.fieldSpec.push(["x_accuracy","writeFloatLE",4]),s.prototype.fieldSpec.push(["y_accuracy","writeFloatLE",4]),s.prototype.fieldSpec.push(["z_accuracy","writeFloatLE",4]),s.prototype.fieldSpec.push(["flags","writeUInt8",1]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_ORIENT_EULER",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_ORIENT_EULER",n.prototype.msg_type=545,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint32("tow").int32("roll").int32("pitch").int32("yaw").floatle("roll_accuracy").floatle("pitch_accuracy").floatle("yaw_accuracy").uint8("flags"),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),n.prototype.fieldSpec.push(["roll","writeInt32LE",4]),n.prototype.fieldSpec.push(["pitch","writeInt32LE",4]),n.prototype.fieldSpec.push(["yaw","writeInt32LE",4]),n.prototype.fieldSpec.push(["roll_accuracy","writeFloatLE",4]),n.prototype.fieldSpec.push(["pitch_accuracy","writeFloatLE",4]),n.prototype.fieldSpec.push(["yaw_accuracy","writeFloatLE",4]),n.prototype.fieldSpec.push(["flags","writeUInt8",1]);var a=function(e,t){return p.call(this,e),this.messageType="MSG_ANGULAR_RATE",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="MSG_ANGULAR_RATE",a.prototype.msg_type=546,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").uint8("flags"),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),a.prototype.fieldSpec.push(["x","writeInt32LE",4]),a.prototype.fieldSpec.push(["y","writeInt32LE",4]),a.prototype.fieldSpec.push(["z","writeInt32LE",4]),a.prototype.fieldSpec.push(["flags","writeUInt8",1]),e.exports={527:i,MsgBaselineHeading:i,544:s,MsgOrientQuat:s,545:n,MsgOrientEuler:n,546:a,MsgAngularRate:a}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,r(0).CarrierPhase,r(0).GnssSignal),s=r(0).GnssSignalDep,n=r(0).GPSTime,a=r(0).GPSTimeDep,l=(r(0).GPSTimeSec,r(0).SvId,function(e,t){return p.call(this,e),this.messageType="MSG_ALMANAC",this.fields=t||this.parser.parse(e.payload),this});(l.prototype=Object.create(p.prototype)).messageType="MSG_ALMANAC",l.prototype.msg_type=105,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little"),l.prototype.fieldSpec=[];var c=function(e,t){return p.call(this,e),this.messageType="MSG_SET_TIME",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="MSG_SET_TIME",c.prototype.msg_type=104,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little"),c.prototype.fieldSpec=[];var u=function(e,t){return p.call(this,e),this.messageType="MSG_RESET",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="MSG_RESET",u.prototype.msg_type=182,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint32("flags"),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["flags","writeUInt32LE",4]);var y=function(e,t){return p.call(this,e),this.messageType="MSG_RESET_DEP",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="MSG_RESET_DEP",y.prototype.msg_type=178,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little"),y.prototype.fieldSpec=[];var h=function(e,t){return p.call(this,e),this.messageType="MSG_CW_RESULTS",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_CW_RESULTS",h.prototype.msg_type=192,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little"),h.prototype.fieldSpec=[];var f=function(e,t){return p.call(this,e),this.messageType="MSG_CW_START",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="MSG_CW_START",f.prototype.msg_type=193,f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little"),f.prototype.fieldSpec=[];var d=function(e,t){return p.call(this,e),this.messageType="MSG_RESET_FILTERS",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(p.prototype)).messageType="MSG_RESET_FILTERS",d.prototype.msg_type=34,d.prototype.constructor=d,d.prototype.parser=(new o).endianess("little").uint8("filter"),d.prototype.fieldSpec=[],d.prototype.fieldSpec.push(["filter","writeUInt8",1]);var _=function(e,t){return p.call(this,e),this.messageType="MSG_INIT_BASE_DEP",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(p.prototype)).messageType="MSG_INIT_BASE_DEP",_.prototype.msg_type=35,_.prototype.constructor=_,_.prototype.parser=(new o).endianess("little"),_.prototype.fieldSpec=[];var S=function(e,t){return p.call(this,e),this.messageType="MSG_THREAD_STATE",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(p.prototype)).messageType="MSG_THREAD_STATE",S.prototype.msg_type=23,S.prototype.constructor=S,S.prototype.parser=(new o).endianess("little").string("name",{length:20}).uint16("cpu").uint32("stack_free"),S.prototype.fieldSpec=[],S.prototype.fieldSpec.push(["name","string",20]),S.prototype.fieldSpec.push(["cpu","writeUInt16LE",2]),S.prototype.fieldSpec.push(["stack_free","writeUInt32LE",4]);var g=function(e,t){return p.call(this,e),this.messageType="UARTChannel",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(p.prototype)).messageType="UARTChannel",g.prototype.constructor=g,g.prototype.parser=(new o).endianess("little").floatle("tx_throughput").floatle("rx_throughput").uint16("crc_error_count").uint16("io_error_count").uint8("tx_buffer_level").uint8("rx_buffer_level"),g.prototype.fieldSpec=[],g.prototype.fieldSpec.push(["tx_throughput","writeFloatLE",4]),g.prototype.fieldSpec.push(["rx_throughput","writeFloatLE",4]),g.prototype.fieldSpec.push(["crc_error_count","writeUInt16LE",2]),g.prototype.fieldSpec.push(["io_error_count","writeUInt16LE",2]),g.prototype.fieldSpec.push(["tx_buffer_level","writeUInt8",1]),g.prototype.fieldSpec.push(["rx_buffer_level","writeUInt8",1]);var w=function(e,t){return p.call(this,e),this.messageType="Period",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(p.prototype)).messageType="Period",w.prototype.constructor=w,w.prototype.parser=(new o).endianess("little").int32("avg").int32("pmin").int32("pmax").int32("current"),w.prototype.fieldSpec=[],w.prototype.fieldSpec.push(["avg","writeInt32LE",4]),w.prototype.fieldSpec.push(["pmin","writeInt32LE",4]),w.prototype.fieldSpec.push(["pmax","writeInt32LE",4]),w.prototype.fieldSpec.push(["current","writeInt32LE",4]);var E=function(e,t){return p.call(this,e),this.messageType="Latency",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(p.prototype)).messageType="Latency",E.prototype.constructor=E,E.prototype.parser=(new o).endianess("little").int32("avg").int32("lmin").int32("lmax").int32("current"),E.prototype.fieldSpec=[],E.prototype.fieldSpec.push(["avg","writeInt32LE",4]),E.prototype.fieldSpec.push(["lmin","writeInt32LE",4]),E.prototype.fieldSpec.push(["lmax","writeInt32LE",4]),E.prototype.fieldSpec.push(["current","writeInt32LE",4]);var m=function(e,t){return p.call(this,e),this.messageType="MSG_UART_STATE",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(p.prototype)).messageType="MSG_UART_STATE",m.prototype.msg_type=29,m.prototype.constructor=m,m.prototype.parser=(new o).endianess("little").nest("uart_a",{type:g.prototype.parser}).nest("uart_b",{type:g.prototype.parser}).nest("uart_ftdi",{type:g.prototype.parser}).nest("latency",{type:E.prototype.parser}).nest("obs_period",{type:w.prototype.parser}),m.prototype.fieldSpec=[],m.prototype.fieldSpec.push(["uart_a",g.prototype.fieldSpec]),m.prototype.fieldSpec.push(["uart_b",g.prototype.fieldSpec]),m.prototype.fieldSpec.push(["uart_ftdi",g.prototype.fieldSpec]),m.prototype.fieldSpec.push(["latency",E.prototype.fieldSpec]),m.prototype.fieldSpec.push(["obs_period",w.prototype.fieldSpec]);var b=function(e,t){return p.call(this,e),this.messageType="MSG_UART_STATE_DEPA",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(p.prototype)).messageType="MSG_UART_STATE_DEPA",b.prototype.msg_type=24,b.prototype.constructor=b,b.prototype.parser=(new o).endianess("little").nest("uart_a",{type:g.prototype.parser}).nest("uart_b",{type:g.prototype.parser}).nest("uart_ftdi",{type:g.prototype.parser}).nest("latency",{type:E.prototype.parser}),b.prototype.fieldSpec=[],b.prototype.fieldSpec.push(["uart_a",g.prototype.fieldSpec]),b.prototype.fieldSpec.push(["uart_b",g.prototype.fieldSpec]),b.prototype.fieldSpec.push(["uart_ftdi",g.prototype.fieldSpec]),b.prototype.fieldSpec.push(["latency",E.prototype.fieldSpec]);var v=function(e,t){return p.call(this,e),this.messageType="MSG_IAR_STATE",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(p.prototype)).messageType="MSG_IAR_STATE",v.prototype.msg_type=25,v.prototype.constructor=v,v.prototype.parser=(new o).endianess("little").uint32("num_hyps"),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["num_hyps","writeUInt32LE",4]);var I=function(e,t){return p.call(this,e),this.messageType="MSG_MASK_SATELLITE",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(p.prototype)).messageType="MSG_MASK_SATELLITE",I.prototype.msg_type=43,I.prototype.constructor=I,I.prototype.parser=(new o).endianess("little").uint8("mask").nest("sid",{type:i.prototype.parser}),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["mask","writeUInt8",1]),I.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]);var L=function(e,t){return p.call(this,e),this.messageType="MSG_MASK_SATELLITE_DEP",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(p.prototype)).messageType="MSG_MASK_SATELLITE_DEP",L.prototype.msg_type=27,L.prototype.constructor=L,L.prototype.parser=(new o).endianess("little").uint8("mask").nest("sid",{type:s.prototype.parser}),L.prototype.fieldSpec=[],L.prototype.fieldSpec.push(["mask","writeUInt8",1]),L.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]);var T=function(e,t){return p.call(this,e),this.messageType="MSG_DEVICE_MONITOR",this.fields=t||this.parser.parse(e.payload),this};(T.prototype=Object.create(p.prototype)).messageType="MSG_DEVICE_MONITOR",T.prototype.msg_type=181,T.prototype.constructor=T,T.prototype.parser=(new o).endianess("little").int16("dev_vin").int16("cpu_vint").int16("cpu_vaux").int16("cpu_temperature").int16("fe_temperature"),T.prototype.fieldSpec=[],T.prototype.fieldSpec.push(["dev_vin","writeInt16LE",2]),T.prototype.fieldSpec.push(["cpu_vint","writeInt16LE",2]),T.prototype.fieldSpec.push(["cpu_vaux","writeInt16LE",2]),T.prototype.fieldSpec.push(["cpu_temperature","writeInt16LE",2]),T.prototype.fieldSpec.push(["fe_temperature","writeInt16LE",2]);var U=function(e,t){return p.call(this,e),this.messageType="MSG_COMMAND_REQ",this.fields=t||this.parser.parse(e.payload),this};(U.prototype=Object.create(p.prototype)).messageType="MSG_COMMAND_REQ",U.prototype.msg_type=184,U.prototype.constructor=U,U.prototype.parser=(new o).endianess("little").uint32("sequence").string("command",{greedy:!0}),U.prototype.fieldSpec=[],U.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),U.prototype.fieldSpec.push(["command","string",null]);var M=function(e,t){return p.call(this,e),this.messageType="MSG_COMMAND_RESP",this.fields=t||this.parser.parse(e.payload),this};(M.prototype=Object.create(p.prototype)).messageType="MSG_COMMAND_RESP",M.prototype.msg_type=185,M.prototype.constructor=M,M.prototype.parser=(new o).endianess("little").uint32("sequence").int32("code"),M.prototype.fieldSpec=[],M.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),M.prototype.fieldSpec.push(["code","writeInt32LE",4]);var D=function(e,t){return p.call(this,e),this.messageType="MSG_COMMAND_OUTPUT",this.fields=t||this.parser.parse(e.payload),this};(D.prototype=Object.create(p.prototype)).messageType="MSG_COMMAND_OUTPUT",D.prototype.msg_type=188,D.prototype.constructor=D,D.prototype.parser=(new o).endianess("little").uint32("sequence").string("line",{greedy:!0}),D.prototype.fieldSpec=[],D.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),D.prototype.fieldSpec.push(["line","string",null]);var O=function(e,t){return p.call(this,e),this.messageType="MSG_NETWORK_STATE_REQ",this.fields=t||this.parser.parse(e.payload),this};(O.prototype=Object.create(p.prototype)).messageType="MSG_NETWORK_STATE_REQ",O.prototype.msg_type=186,O.prototype.constructor=O,O.prototype.parser=(new o).endianess("little"),O.prototype.fieldSpec=[];var G=function(e,t){return p.call(this,e),this.messageType="MSG_NETWORK_STATE_RESP",this.fields=t||this.parser.parse(e.payload),this};(G.prototype=Object.create(p.prototype)).messageType="MSG_NETWORK_STATE_RESP",G.prototype.msg_type=187,G.prototype.constructor=G,G.prototype.parser=(new o).endianess("little").array("ipv4_address",{length:4,type:"uint8"}).uint8("ipv4_mask_size").array("ipv6_address",{length:16,type:"uint8"}).uint8("ipv6_mask_size").uint32("rx_bytes").uint32("tx_bytes").string("interface_name",{length:16}).uint32("flags"),G.prototype.fieldSpec=[],G.prototype.fieldSpec.push(["ipv4_address","array","writeUInt8",function(){return 1},4]),G.prototype.fieldSpec.push(["ipv4_mask_size","writeUInt8",1]),G.prototype.fieldSpec.push(["ipv6_address","array","writeUInt8",function(){return 1},16]),G.prototype.fieldSpec.push(["ipv6_mask_size","writeUInt8",1]),G.prototype.fieldSpec.push(["rx_bytes","writeUInt32LE",4]),G.prototype.fieldSpec.push(["tx_bytes","writeUInt32LE",4]),G.prototype.fieldSpec.push(["interface_name","string",16]),G.prototype.fieldSpec.push(["flags","writeUInt32LE",4]);var A=function(e,t){return p.call(this,e),this.messageType="NetworkUsage",this.fields=t||this.parser.parse(e.payload),this};(A.prototype=Object.create(p.prototype)).messageType="NetworkUsage",A.prototype.constructor=A,A.prototype.parser=(new o).endianess("little").uint64("duration").uint64("total_bytes").uint32("rx_bytes").uint32("tx_bytes").string("interface_name",{length:16}),A.prototype.fieldSpec=[],A.prototype.fieldSpec.push(["duration","writeUInt64LE",8]),A.prototype.fieldSpec.push(["total_bytes","writeUInt64LE",8]),A.prototype.fieldSpec.push(["rx_bytes","writeUInt32LE",4]),A.prototype.fieldSpec.push(["tx_bytes","writeUInt32LE",4]),A.prototype.fieldSpec.push(["interface_name","string",16]);var C=function(e,t){return p.call(this,e),this.messageType="MSG_NETWORK_BANDWIDTH_USAGE",this.fields=t||this.parser.parse(e.payload),this};(C.prototype=Object.create(p.prototype)).messageType="MSG_NETWORK_BANDWIDTH_USAGE",C.prototype.msg_type=189,C.prototype.constructor=C,C.prototype.parser=(new o).endianess("little").array("interfaces",{type:A.prototype.parser,readUntil:"eof"}),C.prototype.fieldSpec=[],C.prototype.fieldSpec.push(["interfaces","array",A.prototype.fieldSpec,function(){return this.fields.array.length},null]);var R=function(e,t){return p.call(this,e),this.messageType="MSG_CELL_MODEM_STATUS",this.fields=t||this.parser.parse(e.payload),this};(R.prototype=Object.create(p.prototype)).messageType="MSG_CELL_MODEM_STATUS",R.prototype.msg_type=190,R.prototype.constructor=R,R.prototype.parser=(new o).endianess("little").int8("signal_strength").floatle("signal_error_rate").array("reserved",{type:"uint8",readUntil:"eof"}),R.prototype.fieldSpec=[],R.prototype.fieldSpec.push(["signal_strength","writeInt8",1]),R.prototype.fieldSpec.push(["signal_error_rate","writeFloatLE",4]),R.prototype.fieldSpec.push(["reserved","array","writeUInt8",function(){return 1},null]);var P=function(e,t){return p.call(this,e),this.messageType="MSG_SPECAN_DEP",this.fields=t||this.parser.parse(e.payload),this};(P.prototype=Object.create(p.prototype)).messageType="MSG_SPECAN_DEP",P.prototype.msg_type=80,P.prototype.constructor=P,P.prototype.parser=(new o).endianess("little").uint16("channel_tag").nest("t",{type:a.prototype.parser}).floatle("freq_ref").floatle("freq_step").floatle("amplitude_ref").floatle("amplitude_unit").array("amplitude_value",{type:"uint8",readUntil:"eof"}),P.prototype.fieldSpec=[],P.prototype.fieldSpec.push(["channel_tag","writeUInt16LE",2]),P.prototype.fieldSpec.push(["t",a.prototype.fieldSpec]),P.prototype.fieldSpec.push(["freq_ref","writeFloatLE",4]),P.prototype.fieldSpec.push(["freq_step","writeFloatLE",4]),P.prototype.fieldSpec.push(["amplitude_ref","writeFloatLE",4]),P.prototype.fieldSpec.push(["amplitude_unit","writeFloatLE",4]),P.prototype.fieldSpec.push(["amplitude_value","array","writeUInt8",function(){return 1},null]);var N=function(e,t){return p.call(this,e),this.messageType="MSG_SPECAN",this.fields=t||this.parser.parse(e.payload),this};(N.prototype=Object.create(p.prototype)).messageType="MSG_SPECAN",N.prototype.msg_type=81,N.prototype.constructor=N,N.prototype.parser=(new o).endianess("little").uint16("channel_tag").nest("t",{type:n.prototype.parser}).floatle("freq_ref").floatle("freq_step").floatle("amplitude_ref").floatle("amplitude_unit").array("amplitude_value",{type:"uint8",readUntil:"eof"}),N.prototype.fieldSpec=[],N.prototype.fieldSpec.push(["channel_tag","writeUInt16LE",2]),N.prototype.fieldSpec.push(["t",n.prototype.fieldSpec]),N.prototype.fieldSpec.push(["freq_ref","writeFloatLE",4]),N.prototype.fieldSpec.push(["freq_step","writeFloatLE",4]),N.prototype.fieldSpec.push(["amplitude_ref","writeFloatLE",4]),N.prototype.fieldSpec.push(["amplitude_unit","writeFloatLE",4]),N.prototype.fieldSpec.push(["amplitude_value","array","writeUInt8",function(){return 1},null]);var j=function(e,t){return p.call(this,e),this.messageType="MSG_FRONT_END_GAIN",this.fields=t||this.parser.parse(e.payload),this};(j.prototype=Object.create(p.prototype)).messageType="MSG_FRONT_END_GAIN",j.prototype.msg_type=191,j.prototype.constructor=j,j.prototype.parser=(new o).endianess("little").array("rf_gain",{length:8,type:"int8"}).array("if_gain",{length:8,type:"int8"}),j.prototype.fieldSpec=[],j.prototype.fieldSpec.push(["rf_gain","array","writeInt8",function(){return 1},8]),j.prototype.fieldSpec.push(["if_gain","array","writeInt8",function(){return 1},8]),e.exports={105:l,MsgAlmanac:l,104:c,MsgSetTime:c,182:u,MsgReset:u,178:y,MsgResetDep:y,192:h,MsgCwResults:h,193:f,MsgCwStart:f,34:d,MsgResetFilters:d,35:_,MsgInitBaseDep:_,23:S,MsgThreadState:S,UARTChannel:g,Period:w,Latency:E,29:m,MsgUartState:m,24:b,MsgUartStateDepa:b,25:v,MsgIarState:v,43:I,MsgMaskSatellite:I,27:L,MsgMaskSatelliteDep:L,181:T,MsgDeviceMonitor:T,184:U,MsgCommandReq:U,185:M,MsgCommandResp:M,188:D,MsgCommandOutput:D,186:O,MsgNetworkStateReq:O,187:G,MsgNetworkStateResp:G,NetworkUsage:A,189:C,MsgNetworkBandwidthUsage:C,190:R,MsgCellModemStatus:R,80:P,MsgSpecanDep:P,81:N,MsgSpecan:N,191:j,MsgFrontEndGain:j}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,r(0).CarrierPhase,r(0).GnssSignal),s=(r(0).GnssSignalDep,r(0).GPSTime,r(0).GPSTimeDep,r(0).GPSTimeSec,r(0).SvId,function(e,t){return p.call(this,e),this.messageType="MSG_SBAS_RAW",this.fields=t||this.parser.parse(e.payload),this});(s.prototype=Object.create(p.prototype)).messageType="MSG_SBAS_RAW",s.prototype.msg_type=30583,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").nest("sid",{type:i.prototype.parser}).uint32("tow").uint8("message_type").array("data",{length:27,type:"uint8"}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]),s.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),s.prototype.fieldSpec.push(["message_type","writeUInt8",1]),s.prototype.fieldSpec.push(["data","array","writeUInt8",function(){return 1},27]),e.exports={30583:s,MsgSbasRaw:s}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_SAVE",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_SAVE",i.prototype.msg_type=161,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little"),i.prototype.fieldSpec=[];var s=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_WRITE",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_WRITE",s.prototype.msg_type=160,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").string("setting",{greedy:!0}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["setting","string",null]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_WRITE_RESP",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_WRITE_RESP",n.prototype.msg_type=175,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint8("status").string("setting",{greedy:!0}),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["status","writeUInt8",1]),n.prototype.fieldSpec.push(["setting","string",null]);var a=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_READ_REQ",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_READ_REQ",a.prototype.msg_type=164,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").string("setting",{greedy:!0}),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["setting","string",null]);var l=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_READ_RESP",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_READ_RESP",l.prototype.msg_type=165,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").string("setting",{greedy:!0}),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["setting","string",null]);var c=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_READ_BY_INDEX_REQ",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_READ_BY_INDEX_REQ",c.prototype.msg_type=162,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint16("index"),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["index","writeUInt16LE",2]);var u=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_READ_BY_INDEX_RESP",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_READ_BY_INDEX_RESP",u.prototype.msg_type=167,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint16("index").string("setting",{greedy:!0}),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["index","writeUInt16LE",2]),u.prototype.fieldSpec.push(["setting","string",null]);var y=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_READ_BY_INDEX_DONE",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_READ_BY_INDEX_DONE",y.prototype.msg_type=166,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little"),y.prototype.fieldSpec=[];var h=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_REGISTER",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_REGISTER",h.prototype.msg_type=174,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").string("setting",{greedy:!0}),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["setting","string",null]);var f=function(e,t){return p.call(this,e),this.messageType="MSG_SETTINGS_REGISTER_RESP",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="MSG_SETTINGS_REGISTER_RESP",f.prototype.msg_type=431,f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").uint8("status").string("setting",{greedy:!0}),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["status","writeUInt8",1]),f.prototype.fieldSpec.push(["setting","string",null]),e.exports={161:i,MsgSettingsSave:i,160:s,MsgSettingsWrite:s,175:n,MsgSettingsWriteResp:n,164:a,MsgSettingsReadReq:a,165:l,MsgSettingsReadResp:l,162:c,MsgSettingsReadByIndexReq:c,167:u,MsgSettingsReadByIndexResp:u,166:y,MsgSettingsReadByIndexDone:y,174:h,MsgSettingsRegister:h,431:f,MsgSettingsRegisterResp:f}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="SolutionInputType",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="SolutionInputType",i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint8("sensor_type").uint8("flags"),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["sensor_type","writeUInt8",1]),i.prototype.fieldSpec.push(["flags","writeUInt8",1]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_SOLN_META_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_SOLN_META_DEP_A",s.prototype.msg_type=65295,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint16("pdop").uint16("hdop").uint16("vdop").uint8("n_sats").uint16("age_corrections").uint8("alignment_status").uint32("last_used_gnss_pos_tow").uint32("last_used_gnss_vel_tow").array("sol_in",{type:i.prototype.parser,readUntil:"eof"}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["pdop","writeUInt16LE",2]),s.prototype.fieldSpec.push(["hdop","writeUInt16LE",2]),s.prototype.fieldSpec.push(["vdop","writeUInt16LE",2]),s.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),s.prototype.fieldSpec.push(["age_corrections","writeUInt16LE",2]),s.prototype.fieldSpec.push(["alignment_status","writeUInt8",1]),s.prototype.fieldSpec.push(["last_used_gnss_pos_tow","writeUInt32LE",4]),s.prototype.fieldSpec.push(["last_used_gnss_vel_tow","writeUInt32LE",4]),s.prototype.fieldSpec.push(["sol_in","array",i.prototype.fieldSpec,function(){return this.fields.array.length},null]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_SOLN_META",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_SOLN_META",n.prototype.msg_type=65294,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint32("tow").uint16("pdop").uint16("hdop").uint16("vdop").uint16("age_corrections").uint32("age_gnss").array("sol_in",{type:i.prototype.parser,readUntil:"eof"}),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),n.prototype.fieldSpec.push(["pdop","writeUInt16LE",2]),n.prototype.fieldSpec.push(["hdop","writeUInt16LE",2]),n.prototype.fieldSpec.push(["vdop","writeUInt16LE",2]),n.prototype.fieldSpec.push(["age_corrections","writeUInt16LE",2]),n.prototype.fieldSpec.push(["age_gnss","writeUInt32LE",4]),n.prototype.fieldSpec.push(["sol_in","array",i.prototype.fieldSpec,function(){return this.fields.array.length},null]);var a=function(e,t){return p.call(this,e),this.messageType="GNSSInputType",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="GNSSInputType",a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").uint8("flags"),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["flags","writeUInt8",1]);var l=function(e,t){return p.call(this,e),this.messageType="IMUInputType",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="IMUInputType",l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").uint8("flags"),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["flags","writeUInt8",1]);var c=function(e,t){return p.call(this,e),this.messageType="OdoInputType",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="OdoInputType",c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint8("flags"),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["flags","writeUInt8",1]),e.exports={SolutionInputType:i,65295:s,MsgSolnMetaDepA:s,65294:n,MsgSolnMeta:n,GNSSInputType:a,IMUInputType:l,OdoInputType:c}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,r(0).CarrierPhase,r(0).GnssSignal),s=(r(0).GnssSignalDep,r(0).GPSTime,r(0).GPSTimeDep,r(0).GPSTimeSec),n=r(0).SvId,a=function(e,t){return p.call(this,e),this.messageType="CodeBiasesContent",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="CodeBiasesContent",a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").uint8("code").int16("value"),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["code","writeUInt8",1]),a.prototype.fieldSpec.push(["value","writeInt16LE",2]);var l=function(e,t){return p.call(this,e),this.messageType="PhaseBiasesContent",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="PhaseBiasesContent",l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").uint8("code").uint8("integer_indicator").uint8("widelane_integer_indicator").uint8("discontinuity_counter").int32("bias"),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["code","writeUInt8",1]),l.prototype.fieldSpec.push(["integer_indicator","writeUInt8",1]),l.prototype.fieldSpec.push(["widelane_integer_indicator","writeUInt8",1]),l.prototype.fieldSpec.push(["discontinuity_counter","writeUInt8",1]),l.prototype.fieldSpec.push(["bias","writeInt32LE",4]);var c=function(e,t){return p.call(this,e),this.messageType="STECHeader",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="STECHeader",c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint16("tile_set_id").uint16("tile_id").nest("time",{type:s.prototype.parser}).uint8("num_msgs").uint8("seq_num").uint8("update_interval").uint8("iod_atmo"),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["tile_set_id","writeUInt16LE",2]),c.prototype.fieldSpec.push(["tile_id","writeUInt16LE",2]),c.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),c.prototype.fieldSpec.push(["num_msgs","writeUInt8",1]),c.prototype.fieldSpec.push(["seq_num","writeUInt8",1]),c.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),c.prototype.fieldSpec.push(["iod_atmo","writeUInt8",1]);var u=function(e,t){return p.call(this,e),this.messageType="GriddedCorrectionHeader",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="GriddedCorrectionHeader",u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint16("tile_set_id").uint16("tile_id").nest("time",{type:s.prototype.parser}).uint16("num_msgs").uint16("seq_num").uint8("update_interval").uint8("iod_atmo").uint8("tropo_quality_indicator"),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["tile_set_id","writeUInt16LE",2]),u.prototype.fieldSpec.push(["tile_id","writeUInt16LE",2]),u.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),u.prototype.fieldSpec.push(["num_msgs","writeUInt16LE",2]),u.prototype.fieldSpec.push(["seq_num","writeUInt16LE",2]),u.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),u.prototype.fieldSpec.push(["iod_atmo","writeUInt8",1]),u.prototype.fieldSpec.push(["tropo_quality_indicator","writeUInt8",1]);var y=function(e,t){return p.call(this,e),this.messageType="STECSatElement",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="STECSatElement",y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").nest("sv_id",{type:n.prototype.parser}).uint8("stec_quality_indicator").array("stec_coeff",{length:4,type:"int16le"}),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["sv_id",n.prototype.fieldSpec]),y.prototype.fieldSpec.push(["stec_quality_indicator","writeUInt8",1]),y.prototype.fieldSpec.push(["stec_coeff","array","writeInt16LE",function(){return 2},4]);var h=function(e,t){return p.call(this,e),this.messageType="TroposphericDelayCorrectionNoStd",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="TroposphericDelayCorrectionNoStd",h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").int16("hydro").int8("wet"),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["hydro","writeInt16LE",2]),h.prototype.fieldSpec.push(["wet","writeInt8",1]);var f=function(e,t){return p.call(this,e),this.messageType="TroposphericDelayCorrection",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="TroposphericDelayCorrection",f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").int16("hydro").int8("wet").uint8("stddev"),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["hydro","writeInt16LE",2]),f.prototype.fieldSpec.push(["wet","writeInt8",1]),f.prototype.fieldSpec.push(["stddev","writeUInt8",1]);var d=function(e,t){return p.call(this,e),this.messageType="STECResidualNoStd",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(p.prototype)).messageType="STECResidualNoStd",d.prototype.constructor=d,d.prototype.parser=(new o).endianess("little").nest("sv_id",{type:n.prototype.parser}).int16("residual"),d.prototype.fieldSpec=[],d.prototype.fieldSpec.push(["sv_id",n.prototype.fieldSpec]),d.prototype.fieldSpec.push(["residual","writeInt16LE",2]);var _=function(e,t){return p.call(this,e),this.messageType="STECResidual",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(p.prototype)).messageType="STECResidual",_.prototype.constructor=_,_.prototype.parser=(new o).endianess("little").nest("sv_id",{type:n.prototype.parser}).int16("residual").uint8("stddev"),_.prototype.fieldSpec=[],_.prototype.fieldSpec.push(["sv_id",n.prototype.fieldSpec]),_.prototype.fieldSpec.push(["residual","writeInt16LE",2]),_.prototype.fieldSpec.push(["stddev","writeUInt8",1]);var S=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_ORBIT_CLOCK",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(p.prototype)).messageType="MSG_SSR_ORBIT_CLOCK",S.prototype.msg_type=1501,S.prototype.constructor=S,S.prototype.parser=(new o).endianess("little").nest("time",{type:s.prototype.parser}).nest("sid",{type:i.prototype.parser}).uint8("update_interval").uint8("iod_ssr").uint32("iod").int32("radial").int32("along").int32("cross").int32("dot_radial").int32("dot_along").int32("dot_cross").int32("c0").int32("c1").int32("c2"),S.prototype.fieldSpec=[],S.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),S.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]),S.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),S.prototype.fieldSpec.push(["iod_ssr","writeUInt8",1]),S.prototype.fieldSpec.push(["iod","writeUInt32LE",4]),S.prototype.fieldSpec.push(["radial","writeInt32LE",4]),S.prototype.fieldSpec.push(["along","writeInt32LE",4]),S.prototype.fieldSpec.push(["cross","writeInt32LE",4]),S.prototype.fieldSpec.push(["dot_radial","writeInt32LE",4]),S.prototype.fieldSpec.push(["dot_along","writeInt32LE",4]),S.prototype.fieldSpec.push(["dot_cross","writeInt32LE",4]),S.prototype.fieldSpec.push(["c0","writeInt32LE",4]),S.prototype.fieldSpec.push(["c1","writeInt32LE",4]),S.prototype.fieldSpec.push(["c2","writeInt32LE",4]);var g=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_CODE_BIASES",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(p.prototype)).messageType="MSG_SSR_CODE_BIASES",g.prototype.msg_type=1505,g.prototype.constructor=g,g.prototype.parser=(new o).endianess("little").nest("time",{type:s.prototype.parser}).nest("sid",{type:i.prototype.parser}).uint8("update_interval").uint8("iod_ssr").array("biases",{type:a.prototype.parser,readUntil:"eof"}),g.prototype.fieldSpec=[],g.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),g.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]),g.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),g.prototype.fieldSpec.push(["iod_ssr","writeUInt8",1]),g.prototype.fieldSpec.push(["biases","array",a.prototype.fieldSpec,function(){return this.fields.array.length},null]);var w=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_PHASE_BIASES",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(p.prototype)).messageType="MSG_SSR_PHASE_BIASES",w.prototype.msg_type=1510,w.prototype.constructor=w,w.prototype.parser=(new o).endianess("little").nest("time",{type:s.prototype.parser}).nest("sid",{type:i.prototype.parser}).uint8("update_interval").uint8("iod_ssr").uint8("dispersive_bias").uint8("mw_consistency").uint16("yaw").int8("yaw_rate").array("biases",{type:l.prototype.parser,readUntil:"eof"}),w.prototype.fieldSpec=[],w.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),w.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]),w.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),w.prototype.fieldSpec.push(["iod_ssr","writeUInt8",1]),w.prototype.fieldSpec.push(["dispersive_bias","writeUInt8",1]),w.prototype.fieldSpec.push(["mw_consistency","writeUInt8",1]),w.prototype.fieldSpec.push(["yaw","writeUInt16LE",2]),w.prototype.fieldSpec.push(["yaw_rate","writeInt8",1]),w.prototype.fieldSpec.push(["biases","array",l.prototype.fieldSpec,function(){return this.fields.array.length},null]);var E=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_STEC_CORRECTION_DEP",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(p.prototype)).messageType="MSG_SSR_STEC_CORRECTION_DEP",E.prototype.msg_type=1531,E.prototype.constructor=E,E.prototype.parser=(new o).endianess("little").nest("header",{type:c.prototype.parser}).array("stec_sat_list",{type:y.prototype.parser,readUntil:"eof"}),E.prototype.fieldSpec=[],E.prototype.fieldSpec.push(["header",c.prototype.fieldSpec]),E.prototype.fieldSpec.push(["stec_sat_list","array",y.prototype.fieldSpec,function(){return this.fields.array.length},null]);var m=function(e,t){return p.call(this,e),this.messageType="BoundsHeader",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(p.prototype)).messageType="BoundsHeader",m.prototype.constructor=m,m.prototype.parser=(new o).endianess("little").nest("time",{type:s.prototype.parser}).uint8("num_msgs").uint8("seq_num").uint8("update_interval").uint8("sol_id"),m.prototype.fieldSpec=[],m.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),m.prototype.fieldSpec.push(["num_msgs","writeUInt8",1]),m.prototype.fieldSpec.push(["seq_num","writeUInt8",1]),m.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),m.prototype.fieldSpec.push(["sol_id","writeUInt8",1]);var b=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_STEC_CORRECTION",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(p.prototype)).messageType="MSG_SSR_STEC_CORRECTION",b.prototype.msg_type=1533,b.prototype.constructor=b,b.prototype.parser=(new o).endianess("little").nest("header",{type:m.prototype.parser}).uint8("ssr_iod_atmo").uint16("tile_set_id").uint16("tile_id").uint8("n_sats").array("stec_sat_list",{type:y.prototype.parser,length:"n_sats"}),b.prototype.fieldSpec=[],b.prototype.fieldSpec.push(["header",m.prototype.fieldSpec]),b.prototype.fieldSpec.push(["ssr_iod_atmo","writeUInt8",1]),b.prototype.fieldSpec.push(["tile_set_id","writeUInt16LE",2]),b.prototype.fieldSpec.push(["tile_id","writeUInt16LE",2]),b.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),b.prototype.fieldSpec.push(["stec_sat_list","array",y.prototype.fieldSpec,function(){return this.fields.array.length},"n_sats"]);var v=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_GRIDDED_CORRECTION",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(p.prototype)).messageType="MSG_SSR_GRIDDED_CORRECTION",v.prototype.msg_type=1532,v.prototype.constructor=v,v.prototype.parser=(new o).endianess("little").nest("header",{type:u.prototype.parser}).uint16("index").nest("tropo_delay_correction",{type:f.prototype.parser}).array("stec_residuals",{type:_.prototype.parser,readUntil:"eof"}),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["header",u.prototype.fieldSpec]),v.prototype.fieldSpec.push(["index","writeUInt16LE",2]),v.prototype.fieldSpec.push(["tropo_delay_correction",f.prototype.fieldSpec]),v.prototype.fieldSpec.push(["stec_residuals","array",_.prototype.fieldSpec,function(){return this.fields.array.length},null]);var I=function(e,t){return p.call(this,e),this.messageType="STECSatElementIntegrity",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(p.prototype)).messageType="STECSatElementIntegrity",I.prototype.constructor=I,I.prototype.parser=(new o).endianess("little").nest("stec_residual",{type:_.prototype.parser}).uint8("stec_bound_mu").uint8("stec_bound_sig").uint8("stec_bound_mu_dot").uint8("stec_bound_sig_dot"),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["stec_residual",_.prototype.fieldSpec]),I.prototype.fieldSpec.push(["stec_bound_mu","writeUInt8",1]),I.prototype.fieldSpec.push(["stec_bound_sig","writeUInt8",1]),I.prototype.fieldSpec.push(["stec_bound_mu_dot","writeUInt8",1]),I.prototype.fieldSpec.push(["stec_bound_sig_dot","writeUInt8",1]);var L=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_GRIDDED_CORRECTION_BOUNDS",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(p.prototype)).messageType="MSG_SSR_GRIDDED_CORRECTION_BOUNDS",L.prototype.msg_type=1534,L.prototype.constructor=L,L.prototype.parser=(new o).endianess("little").nest("header",{type:m.prototype.parser}).uint8("ssr_iod_atmo").uint16("tile_set_id").uint16("tile_id").uint8("tropo_qi").uint16("grid_point_id").nest("tropo_delay_correction",{type:f.prototype.parser}).uint8("tropo_bound_mu").uint8("tropo_bound_sig").uint8("n_sats").array("stec_sat_list",{type:I.prototype.parser,length:"n_sats"}),L.prototype.fieldSpec=[],L.prototype.fieldSpec.push(["header",m.prototype.fieldSpec]),L.prototype.fieldSpec.push(["ssr_iod_atmo","writeUInt8",1]),L.prototype.fieldSpec.push(["tile_set_id","writeUInt16LE",2]),L.prototype.fieldSpec.push(["tile_id","writeUInt16LE",2]),L.prototype.fieldSpec.push(["tropo_qi","writeUInt8",1]),L.prototype.fieldSpec.push(["grid_point_id","writeUInt16LE",2]),L.prototype.fieldSpec.push(["tropo_delay_correction",f.prototype.fieldSpec]),L.prototype.fieldSpec.push(["tropo_bound_mu","writeUInt8",1]),L.prototype.fieldSpec.push(["tropo_bound_sig","writeUInt8",1]),L.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),L.prototype.fieldSpec.push(["stec_sat_list","array",I.prototype.fieldSpec,function(){return this.fields.array.length},"n_sats"]);var T=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_TILE_DEFINITION_DEP",this.fields=t||this.parser.parse(e.payload),this};(T.prototype=Object.create(p.prototype)).messageType="MSG_SSR_TILE_DEFINITION_DEP",T.prototype.msg_type=1526,T.prototype.constructor=T,T.prototype.parser=(new o).endianess("little").uint16("tile_set_id").uint16("tile_id").int16("corner_nw_lat").int16("corner_nw_lon").uint16("spacing_lat").uint16("spacing_lon").uint16("rows").uint16("cols").uint64("bitmask"),T.prototype.fieldSpec=[],T.prototype.fieldSpec.push(["tile_set_id","writeUInt16LE",2]),T.prototype.fieldSpec.push(["tile_id","writeUInt16LE",2]),T.prototype.fieldSpec.push(["corner_nw_lat","writeInt16LE",2]),T.prototype.fieldSpec.push(["corner_nw_lon","writeInt16LE",2]),T.prototype.fieldSpec.push(["spacing_lat","writeUInt16LE",2]),T.prototype.fieldSpec.push(["spacing_lon","writeUInt16LE",2]),T.prototype.fieldSpec.push(["rows","writeUInt16LE",2]),T.prototype.fieldSpec.push(["cols","writeUInt16LE",2]),T.prototype.fieldSpec.push(["bitmask","writeUInt64LE",8]);var U=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_TILE_DEFINITION",this.fields=t||this.parser.parse(e.payload),this};(U.prototype=Object.create(p.prototype)).messageType="MSG_SSR_TILE_DEFINITION",U.prototype.msg_type=1527,U.prototype.constructor=U,U.prototype.parser=(new o).endianess("little").uint8("ssr_sol_id").uint16("tile_set_id").uint16("tile_id").int16("corner_nw_lat").int16("corner_nw_lon").uint16("spacing_lat").uint16("spacing_lon").uint16("rows").uint16("cols").uint64("bitmask"),U.prototype.fieldSpec=[],U.prototype.fieldSpec.push(["ssr_sol_id","writeUInt8",1]),U.prototype.fieldSpec.push(["tile_set_id","writeUInt16LE",2]),U.prototype.fieldSpec.push(["tile_id","writeUInt16LE",2]),U.prototype.fieldSpec.push(["corner_nw_lat","writeInt16LE",2]),U.prototype.fieldSpec.push(["corner_nw_lon","writeInt16LE",2]),U.prototype.fieldSpec.push(["spacing_lat","writeUInt16LE",2]),U.prototype.fieldSpec.push(["spacing_lon","writeUInt16LE",2]),U.prototype.fieldSpec.push(["rows","writeUInt16LE",2]),U.prototype.fieldSpec.push(["cols","writeUInt16LE",2]),U.prototype.fieldSpec.push(["bitmask","writeUInt64LE",8]);var M=function(e,t){return p.call(this,e),this.messageType="SatelliteAPC",this.fields=t||this.parser.parse(e.payload),this};(M.prototype=Object.create(p.prototype)).messageType="SatelliteAPC",M.prototype.constructor=M,M.prototype.parser=(new o).endianess("little").nest("sid",{type:i.prototype.parser}).uint8("sat_info").uint16("svn").array("pco",{length:3,type:"int16le"}).array("pcv",{length:21,type:"int8"}),M.prototype.fieldSpec=[],M.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]),M.prototype.fieldSpec.push(["sat_info","writeUInt8",1]),M.prototype.fieldSpec.push(["svn","writeUInt16LE",2]),M.prototype.fieldSpec.push(["pco","array","writeInt16LE",function(){return 2},3]),M.prototype.fieldSpec.push(["pcv","array","writeInt8",function(){return 1},21]);var D=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_SATELLITE_APC",this.fields=t||this.parser.parse(e.payload),this};(D.prototype=Object.create(p.prototype)).messageType="MSG_SSR_SATELLITE_APC",D.prototype.msg_type=1540,D.prototype.constructor=D,D.prototype.parser=(new o).endianess("little").array("apc",{type:M.prototype.parser,readUntil:"eof"}),D.prototype.fieldSpec=[],D.prototype.fieldSpec.push(["apc","array",M.prototype.fieldSpec,function(){return this.fields.array.length},null]);var O=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_ORBIT_CLOCK_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(O.prototype=Object.create(p.prototype)).messageType="MSG_SSR_ORBIT_CLOCK_DEP_A",O.prototype.msg_type=1500,O.prototype.constructor=O,O.prototype.parser=(new o).endianess("little").nest("time",{type:s.prototype.parser}).nest("sid",{type:i.prototype.parser}).uint8("update_interval").uint8("iod_ssr").uint8("iod").int32("radial").int32("along").int32("cross").int32("dot_radial").int32("dot_along").int32("dot_cross").int32("c0").int32("c1").int32("c2"),O.prototype.fieldSpec=[],O.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),O.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]),O.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),O.prototype.fieldSpec.push(["iod_ssr","writeUInt8",1]),O.prototype.fieldSpec.push(["iod","writeUInt8",1]),O.prototype.fieldSpec.push(["radial","writeInt32LE",4]),O.prototype.fieldSpec.push(["along","writeInt32LE",4]),O.prototype.fieldSpec.push(["cross","writeInt32LE",4]),O.prototype.fieldSpec.push(["dot_radial","writeInt32LE",4]),O.prototype.fieldSpec.push(["dot_along","writeInt32LE",4]),O.prototype.fieldSpec.push(["dot_cross","writeInt32LE",4]),O.prototype.fieldSpec.push(["c0","writeInt32LE",4]),O.prototype.fieldSpec.push(["c1","writeInt32LE",4]),O.prototype.fieldSpec.push(["c2","writeInt32LE",4]);var G=function(e,t){return p.call(this,e),this.messageType="STECHeaderDepA",this.fields=t||this.parser.parse(e.payload),this};(G.prototype=Object.create(p.prototype)).messageType="STECHeaderDepA",G.prototype.constructor=G,G.prototype.parser=(new o).endianess("little").nest("time",{type:s.prototype.parser}).uint8("num_msgs").uint8("seq_num").uint8("update_interval").uint8("iod_atmo"),G.prototype.fieldSpec=[],G.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),G.prototype.fieldSpec.push(["num_msgs","writeUInt8",1]),G.prototype.fieldSpec.push(["seq_num","writeUInt8",1]),G.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),G.prototype.fieldSpec.push(["iod_atmo","writeUInt8",1]);var A=function(e,t){return p.call(this,e),this.messageType="GriddedCorrectionHeaderDepA",this.fields=t||this.parser.parse(e.payload),this};(A.prototype=Object.create(p.prototype)).messageType="GriddedCorrectionHeaderDepA",A.prototype.constructor=A,A.prototype.parser=(new o).endianess("little").nest("time",{type:s.prototype.parser}).uint16("num_msgs").uint16("seq_num").uint8("update_interval").uint8("iod_atmo").uint8("tropo_quality_indicator"),A.prototype.fieldSpec=[],A.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),A.prototype.fieldSpec.push(["num_msgs","writeUInt16LE",2]),A.prototype.fieldSpec.push(["seq_num","writeUInt16LE",2]),A.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),A.prototype.fieldSpec.push(["iod_atmo","writeUInt8",1]),A.prototype.fieldSpec.push(["tropo_quality_indicator","writeUInt8",1]);var C=function(e,t){return p.call(this,e),this.messageType="GridDefinitionHeaderDepA",this.fields=t||this.parser.parse(e.payload),this};(C.prototype=Object.create(p.prototype)).messageType="GridDefinitionHeaderDepA",C.prototype.constructor=C,C.prototype.parser=(new o).endianess("little").uint8("region_size_inverse").uint16("area_width").uint16("lat_nw_corner_enc").uint16("lon_nw_corner_enc").uint8("num_msgs").uint8("seq_num"),C.prototype.fieldSpec=[],C.prototype.fieldSpec.push(["region_size_inverse","writeUInt8",1]),C.prototype.fieldSpec.push(["area_width","writeUInt16LE",2]),C.prototype.fieldSpec.push(["lat_nw_corner_enc","writeUInt16LE",2]),C.prototype.fieldSpec.push(["lon_nw_corner_enc","writeUInt16LE",2]),C.prototype.fieldSpec.push(["num_msgs","writeUInt8",1]),C.prototype.fieldSpec.push(["seq_num","writeUInt8",1]);var R=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_STEC_CORRECTION_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(R.prototype=Object.create(p.prototype)).messageType="MSG_SSR_STEC_CORRECTION_DEP_A",R.prototype.msg_type=1515,R.prototype.constructor=R,R.prototype.parser=(new o).endianess("little").nest("header",{type:G.prototype.parser}).array("stec_sat_list",{type:y.prototype.parser,readUntil:"eof"}),R.prototype.fieldSpec=[],R.prototype.fieldSpec.push(["header",G.prototype.fieldSpec]),R.prototype.fieldSpec.push(["stec_sat_list","array",y.prototype.fieldSpec,function(){return this.fields.array.length},null]);var P=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_GRIDDED_CORRECTION_NO_STD_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(P.prototype=Object.create(p.prototype)).messageType="MSG_SSR_GRIDDED_CORRECTION_NO_STD_DEP_A",P.prototype.msg_type=1520,P.prototype.constructor=P,P.prototype.parser=(new o).endianess("little").nest("header",{type:A.prototype.parser}).uint16("index").nest("tropo_delay_correction",{type:h.prototype.parser}).array("stec_residuals",{type:d.prototype.parser,readUntil:"eof"}),P.prototype.fieldSpec=[],P.prototype.fieldSpec.push(["header",A.prototype.fieldSpec]),P.prototype.fieldSpec.push(["index","writeUInt16LE",2]),P.prototype.fieldSpec.push(["tropo_delay_correction",h.prototype.fieldSpec]),P.prototype.fieldSpec.push(["stec_residuals","array",d.prototype.fieldSpec,function(){return this.fields.array.length},null]);var N=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_GRIDDED_CORRECTION_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(N.prototype=Object.create(p.prototype)).messageType="MSG_SSR_GRIDDED_CORRECTION_DEP_A",N.prototype.msg_type=1530,N.prototype.constructor=N,N.prototype.parser=(new o).endianess("little").nest("header",{type:A.prototype.parser}).uint16("index").nest("tropo_delay_correction",{type:f.prototype.parser}).array("stec_residuals",{type:_.prototype.parser,readUntil:"eof"}),N.prototype.fieldSpec=[],N.prototype.fieldSpec.push(["header",A.prototype.fieldSpec]),N.prototype.fieldSpec.push(["index","writeUInt16LE",2]),N.prototype.fieldSpec.push(["tropo_delay_correction",f.prototype.fieldSpec]),N.prototype.fieldSpec.push(["stec_residuals","array",_.prototype.fieldSpec,function(){return this.fields.array.length},null]);var j=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_GRID_DEFINITION_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(j.prototype=Object.create(p.prototype)).messageType="MSG_SSR_GRID_DEFINITION_DEP_A",j.prototype.msg_type=1525,j.prototype.constructor=j,j.prototype.parser=(new o).endianess("little").nest("header",{type:C.prototype.parser}).array("rle_list",{type:"uint8",readUntil:"eof"}),j.prototype.fieldSpec=[],j.prototype.fieldSpec.push(["header",C.prototype.fieldSpec]),j.prototype.fieldSpec.push(["rle_list","array","writeUInt8",function(){return 1},null]);var x=function(e,t){return p.call(this,e),this.messageType="OrbitClockBound",this.fields=t||this.parser.parse(e.payload),this};(x.prototype=Object.create(p.prototype)).messageType="OrbitClockBound",x.prototype.constructor=x,x.prototype.parser=(new o).endianess("little").uint8("sat_id").uint8("orb_radial_bound_mu").uint8("orb_along_bound_mu").uint8("orb_cross_bound_mu").uint8("orb_radial_bound_sig").uint8("orb_along_bound_sig").uint8("orb_cross_bound_sig").uint8("clock_bound_mu").uint8("clock_bound_sig"),x.prototype.fieldSpec=[],x.prototype.fieldSpec.push(["sat_id","writeUInt8",1]),x.prototype.fieldSpec.push(["orb_radial_bound_mu","writeUInt8",1]),x.prototype.fieldSpec.push(["orb_along_bound_mu","writeUInt8",1]),x.prototype.fieldSpec.push(["orb_cross_bound_mu","writeUInt8",1]),x.prototype.fieldSpec.push(["orb_radial_bound_sig","writeUInt8",1]),x.prototype.fieldSpec.push(["orb_along_bound_sig","writeUInt8",1]),x.prototype.fieldSpec.push(["orb_cross_bound_sig","writeUInt8",1]),x.prototype.fieldSpec.push(["clock_bound_mu","writeUInt8",1]),x.prototype.fieldSpec.push(["clock_bound_sig","writeUInt8",1]);var k=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_ORBIT_CLOCK_BOUNDS",this.fields=t||this.parser.parse(e.payload),this};(k.prototype=Object.create(p.prototype)).messageType="MSG_SSR_ORBIT_CLOCK_BOUNDS",k.prototype.msg_type=1502,k.prototype.constructor=k,k.prototype.parser=(new o).endianess("little").nest("header",{type:m.prototype.parser}).uint8("ssr_iod").uint8("const_id").uint8("n_sats").array("orbit_clock_bounds",{type:x.prototype.parser,length:"n_sats"}),k.prototype.fieldSpec=[],k.prototype.fieldSpec.push(["header",m.prototype.fieldSpec]),k.prototype.fieldSpec.push(["ssr_iod","writeUInt8",1]),k.prototype.fieldSpec.push(["const_id","writeUInt8",1]),k.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),k.prototype.fieldSpec.push(["orbit_clock_bounds","array",x.prototype.fieldSpec,function(){return this.fields.array.length},"n_sats"]);var F=function(e,t){return p.call(this,e),this.messageType="CodePhaseBiasesSatSig",this.fields=t||this.parser.parse(e.payload),this};(F.prototype=Object.create(p.prototype)).messageType="CodePhaseBiasesSatSig",F.prototype.constructor=F,F.prototype.parser=(new o).endianess("little").uint8("sat_id").uint8("signal_id").uint8("code_bias_bound_mu").uint8("code_bias_bound_sig").uint8("phase_bias_bound_mu").uint8("phase_bias_bound_sig"),F.prototype.fieldSpec=[],F.prototype.fieldSpec.push(["sat_id","writeUInt8",1]),F.prototype.fieldSpec.push(["signal_id","writeUInt8",1]),F.prototype.fieldSpec.push(["code_bias_bound_mu","writeUInt8",1]),F.prototype.fieldSpec.push(["code_bias_bound_sig","writeUInt8",1]),F.prototype.fieldSpec.push(["phase_bias_bound_mu","writeUInt8",1]),F.prototype.fieldSpec.push(["phase_bias_bound_sig","writeUInt8",1]);var B=function(e,t){return p.call(this,e),this.messageType="MSG_SSR_CODE_PHASE_BIASES_BOUNDS",this.fields=t||this.parser.parse(e.payload),this};(B.prototype=Object.create(p.prototype)).messageType="MSG_SSR_CODE_PHASE_BIASES_BOUNDS",B.prototype.msg_type=1516,B.prototype.constructor=B,B.prototype.parser=(new o).endianess("little").nest("header",{type:m.prototype.parser}).uint8("ssr_iod").uint8("const_id").uint8("n_sats_signals").array("satellites_signals",{type:F.prototype.parser,length:"n_sats_signals"}),B.prototype.fieldSpec=[],B.prototype.fieldSpec.push(["header",m.prototype.fieldSpec]),B.prototype.fieldSpec.push(["ssr_iod","writeUInt8",1]),B.prototype.fieldSpec.push(["const_id","writeUInt8",1]),B.prototype.fieldSpec.push(["n_sats_signals","writeUInt8",1]),B.prototype.fieldSpec.push(["satellites_signals","array",F.prototype.fieldSpec,function(){return this.fields.array.length},"n_sats_signals"]),e.exports={CodeBiasesContent:a,PhaseBiasesContent:l,STECHeader:c,GriddedCorrectionHeader:u,STECSatElement:y,TroposphericDelayCorrectionNoStd:h,TroposphericDelayCorrection:f,STECResidualNoStd:d,STECResidual:_,1501:S,MsgSsrOrbitClock:S,1505:g,MsgSsrCodeBiases:g,1510:w,MsgSsrPhaseBiases:w,1531:E,MsgSsrStecCorrectionDep:E,BoundsHeader:m,1533:b,MsgSsrStecCorrection:b,1532:v,MsgSsrGriddedCorrection:v,STECSatElementIntegrity:I,1534:L,MsgSsrGriddedCorrectionBounds:L,1526:T,MsgSsrTileDefinitionDep:T,1527:U,MsgSsrTileDefinition:U,SatelliteAPC:M,1540:D,MsgSsrSatelliteApc:D,1500:O,MsgSsrOrbitClockDepA:O,STECHeaderDepA:G,GriddedCorrectionHeaderDepA:A,GridDefinitionHeaderDepA:C,1515:R,MsgSsrStecCorrectionDepA:R,1520:P,MsgSsrGriddedCorrectionNoStdDepA:P,1530:N,MsgSsrGriddedCorrectionDepA:N,1525:j,MsgSsrGridDefinitionDepA:j,OrbitClockBound:x,1502:k,MsgSsrOrbitClockBounds:k,CodePhaseBiasesSatSig:F,1516:B,MsgSsrCodePhaseBiasesBounds:B}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_STARTUP",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_STARTUP",i.prototype.msg_type=65280,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint8("cause").uint8("startup_type").uint16("reserved"),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["cause","writeUInt8",1]),i.prototype.fieldSpec.push(["startup_type","writeUInt8",1]),i.prototype.fieldSpec.push(["reserved","writeUInt16LE",2]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_DGNSS_STATUS",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_DGNSS_STATUS",s.prototype.msg_type=65282,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint8("flags").uint16("latency").uint8("num_signals").string("source",{greedy:!0}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["flags","writeUInt8",1]),s.prototype.fieldSpec.push(["latency","writeUInt16LE",2]),s.prototype.fieldSpec.push(["num_signals","writeUInt8",1]),s.prototype.fieldSpec.push(["source","string",null]);var n=function(e,t){return p.call(this,e),this.messageType="MSG_HEARTBEAT",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(p.prototype)).messageType="MSG_HEARTBEAT",n.prototype.msg_type=65535,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").uint32("flags"),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["flags","writeUInt32LE",4]);var a=function(e,t){return p.call(this,e),this.messageType="SubSystemReport",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(p.prototype)).messageType="SubSystemReport",a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").uint16("component").uint8("generic").uint8("specific"),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["component","writeUInt16LE",2]),a.prototype.fieldSpec.push(["generic","writeUInt8",1]),a.prototype.fieldSpec.push(["specific","writeUInt8",1]);var l=function(e,t){return p.call(this,e),this.messageType="MSG_STATUS_REPORT",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(p.prototype)).messageType="MSG_STATUS_REPORT",l.prototype.msg_type=65534,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").uint16("reporting_system").uint16("sbp_version").uint32("sequence").uint32("uptime").array("status",{type:a.prototype.parser,readUntil:"eof"}),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["reporting_system","writeUInt16LE",2]),l.prototype.fieldSpec.push(["sbp_version","writeUInt16LE",2]),l.prototype.fieldSpec.push(["sequence","writeUInt32LE",4]),l.prototype.fieldSpec.push(["uptime","writeUInt32LE",4]),l.prototype.fieldSpec.push(["status","array",a.prototype.fieldSpec,function(){return this.fields.array.length},null]);var c=function(e,t){return p.call(this,e),this.messageType="StatusJournalItem",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(p.prototype)).messageType="StatusJournalItem",c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint32("uptime").nest("report",{type:a.prototype.parser}),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["uptime","writeUInt32LE",4]),c.prototype.fieldSpec.push(["report",a.prototype.fieldSpec]);var u=function(e,t){return p.call(this,e),this.messageType="MSG_STATUS_JOURNAL",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="MSG_STATUS_JOURNAL",u.prototype.msg_type=65533,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint16("reporting_system").uint16("sbp_version").uint32("total_status_reports").uint8("sequence_descriptor").array("journal",{type:c.prototype.parser,readUntil:"eof"}),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["reporting_system","writeUInt16LE",2]),u.prototype.fieldSpec.push(["sbp_version","writeUInt16LE",2]),u.prototype.fieldSpec.push(["total_status_reports","writeUInt32LE",4]),u.prototype.fieldSpec.push(["sequence_descriptor","writeUInt8",1]),u.prototype.fieldSpec.push(["journal","array",c.prototype.fieldSpec,function(){return this.fields.array.length},null]);var y=function(e,t){return p.call(this,e),this.messageType="MSG_INS_STATUS",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="MSG_INS_STATUS",y.prototype.msg_type=65283,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").uint32("flags"),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["flags","writeUInt32LE",4]);var h=function(e,t){return p.call(this,e),this.messageType="MSG_CSAC_TELEMETRY",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_CSAC_TELEMETRY",h.prototype.msg_type=65284,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").uint8("id").string("telemetry",{greedy:!0}),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["id","writeUInt8",1]),h.prototype.fieldSpec.push(["telemetry","string",null]);var f=function(e,t){return p.call(this,e),this.messageType="MSG_CSAC_TELEMETRY_LABELS",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="MSG_CSAC_TELEMETRY_LABELS",f.prototype.msg_type=65285,f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").uint8("id").string("telemetry_labels",{greedy:!0}),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["id","writeUInt8",1]),f.prototype.fieldSpec.push(["telemetry_labels","string",null]);var d=function(e,t){return p.call(this,e),this.messageType="MSG_INS_UPDATES",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(p.prototype)).messageType="MSG_INS_UPDATES",d.prototype.msg_type=65286,d.prototype.constructor=d,d.prototype.parser=(new o).endianess("little").uint32("tow").uint8("gnsspos").uint8("gnssvel").uint8("wheelticks").uint8("speed").uint8("nhc").uint8("zerovel"),d.prototype.fieldSpec=[],d.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),d.prototype.fieldSpec.push(["gnsspos","writeUInt8",1]),d.prototype.fieldSpec.push(["gnssvel","writeUInt8",1]),d.prototype.fieldSpec.push(["wheelticks","writeUInt8",1]),d.prototype.fieldSpec.push(["speed","writeUInt8",1]),d.prototype.fieldSpec.push(["nhc","writeUInt8",1]),d.prototype.fieldSpec.push(["zerovel","writeUInt8",1]);var _=function(e,t){return p.call(this,e),this.messageType="MSG_GNSS_TIME_OFFSET",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(p.prototype)).messageType="MSG_GNSS_TIME_OFFSET",_.prototype.msg_type=65287,_.prototype.constructor=_,_.prototype.parser=(new o).endianess("little").int16("weeks").int32("milliseconds").int16("microseconds").uint8("flags"),_.prototype.fieldSpec=[],_.prototype.fieldSpec.push(["weeks","writeInt16LE",2]),_.prototype.fieldSpec.push(["milliseconds","writeInt32LE",4]),_.prototype.fieldSpec.push(["microseconds","writeInt16LE",2]),_.prototype.fieldSpec.push(["flags","writeUInt8",1]);var S=function(e,t){return p.call(this,e),this.messageType="MSG_PPS_TIME",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(p.prototype)).messageType="MSG_PPS_TIME",S.prototype.msg_type=65288,S.prototype.constructor=S,S.prototype.parser=(new o).endianess("little").uint64("time").uint8("flags"),S.prototype.fieldSpec=[],S.prototype.fieldSpec.push(["time","writeUInt64LE",8]),S.prototype.fieldSpec.push(["flags","writeUInt8",1]);var g=function(e,t){return p.call(this,e),this.messageType="MSG_SENSOR_AID_EVENT",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(p.prototype)).messageType="MSG_SENSOR_AID_EVENT",g.prototype.msg_type=65289,g.prototype.constructor=g,g.prototype.parser=(new o).endianess("little").uint32("time").uint8("sensor_type").uint16("sensor_id").uint8("sensor_state").uint8("n_available_meas").uint8("n_attempted_meas").uint8("n_accepted_meas").uint32("flags"),g.prototype.fieldSpec=[],g.prototype.fieldSpec.push(["time","writeUInt32LE",4]),g.prototype.fieldSpec.push(["sensor_type","writeUInt8",1]),g.prototype.fieldSpec.push(["sensor_id","writeUInt16LE",2]),g.prototype.fieldSpec.push(["sensor_state","writeUInt8",1]),g.prototype.fieldSpec.push(["n_available_meas","writeUInt8",1]),g.prototype.fieldSpec.push(["n_attempted_meas","writeUInt8",1]),g.prototype.fieldSpec.push(["n_accepted_meas","writeUInt8",1]),g.prototype.fieldSpec.push(["flags","writeUInt32LE",4]);var w=function(e,t){return p.call(this,e),this.messageType="MSG_GROUP_META",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(p.prototype)).messageType="MSG_GROUP_META",w.prototype.msg_type=65290,w.prototype.constructor=w,w.prototype.parser=(new o).endianess("little").uint8("group_id").uint8("flags").uint8("n_group_msgs").array("group_msgs",{type:"uint16le",length:"n_group_msgs"}),w.prototype.fieldSpec=[],w.prototype.fieldSpec.push(["group_id","writeUInt8",1]),w.prototype.fieldSpec.push(["flags","writeUInt8",1]),w.prototype.fieldSpec.push(["n_group_msgs","writeUInt8",1]),w.prototype.fieldSpec.push(["group_msgs","array","writeUInt16LE",function(){return 2},"n_group_msgs"]),e.exports={65280:i,MsgStartup:i,65282:s,MsgDgnssStatus:s,65535:n,MsgHeartbeat:n,SubSystemReport:a,65534:l,MsgStatusReport:l,StatusJournalItem:c,65533:u,MsgStatusJournal:u,65283:y,MsgInsStatus:y,65284:h,MsgCsacTelemetry:h,65285:f,MsgCsacTelemetryLabels:f,65286:d,MsgInsUpdates:d,65287:_,MsgGnssTimeOffset:_,65288:S,MsgPpsTime:S,65289:g,MsgSensorAidEvent:g,65290:w,MsgGroupMeta:w}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,r(0).CarrierPhase),s=r(0).GnssSignal,n=r(0).GnssSignalDep,a=r(0).GPSTime,l=r(0).GPSTimeDep,c=(r(0).GPSTimeSec,r(0).SvId,function(e,t){return p.call(this,e),this.messageType="MSG_TRACKING_STATE_DETAILED_DEP_A",this.fields=t||this.parser.parse(e.payload),this});(c.prototype=Object.create(p.prototype)).messageType="MSG_TRACKING_STATE_DETAILED_DEP_A",c.prototype.msg_type=33,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").uint64("recv_time").nest("tot",{type:a.prototype.parser}).uint32("P").uint16("P_std").nest("L",{type:i.prototype.parser}).uint8("cn0").uint16("lock").nest("sid",{type:s.prototype.parser}).int32("doppler").uint16("doppler_std").uint32("uptime").int16("clock_offset").int16("clock_drift").uint16("corr_spacing").int8("acceleration").uint8("sync_flags").uint8("tow_flags").uint8("track_flags").uint8("nav_flags").uint8("pset_flags").uint8("misc_flags"),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["recv_time","writeUInt64LE",8]),c.prototype.fieldSpec.push(["tot",a.prototype.fieldSpec]),c.prototype.fieldSpec.push(["P","writeUInt32LE",4]),c.prototype.fieldSpec.push(["P_std","writeUInt16LE",2]),c.prototype.fieldSpec.push(["L",i.prototype.fieldSpec]),c.prototype.fieldSpec.push(["cn0","writeUInt8",1]),c.prototype.fieldSpec.push(["lock","writeUInt16LE",2]),c.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),c.prototype.fieldSpec.push(["doppler","writeInt32LE",4]),c.prototype.fieldSpec.push(["doppler_std","writeUInt16LE",2]),c.prototype.fieldSpec.push(["uptime","writeUInt32LE",4]),c.prototype.fieldSpec.push(["clock_offset","writeInt16LE",2]),c.prototype.fieldSpec.push(["clock_drift","writeInt16LE",2]),c.prototype.fieldSpec.push(["corr_spacing","writeUInt16LE",2]),c.prototype.fieldSpec.push(["acceleration","writeInt8",1]),c.prototype.fieldSpec.push(["sync_flags","writeUInt8",1]),c.prototype.fieldSpec.push(["tow_flags","writeUInt8",1]),c.prototype.fieldSpec.push(["track_flags","writeUInt8",1]),c.prototype.fieldSpec.push(["nav_flags","writeUInt8",1]),c.prototype.fieldSpec.push(["pset_flags","writeUInt8",1]),c.prototype.fieldSpec.push(["misc_flags","writeUInt8",1]);var u=function(e,t){return p.call(this,e),this.messageType="MSG_TRACKING_STATE_DETAILED_DEP",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(p.prototype)).messageType="MSG_TRACKING_STATE_DETAILED_DEP",u.prototype.msg_type=17,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").uint64("recv_time").nest("tot",{type:l.prototype.parser}).uint32("P").uint16("P_std").nest("L",{type:i.prototype.parser}).uint8("cn0").uint16("lock").nest("sid",{type:n.prototype.parser}).int32("doppler").uint16("doppler_std").uint32("uptime").int16("clock_offset").int16("clock_drift").uint16("corr_spacing").int8("acceleration").uint8("sync_flags").uint8("tow_flags").uint8("track_flags").uint8("nav_flags").uint8("pset_flags").uint8("misc_flags"),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["recv_time","writeUInt64LE",8]),u.prototype.fieldSpec.push(["tot",l.prototype.fieldSpec]),u.prototype.fieldSpec.push(["P","writeUInt32LE",4]),u.prototype.fieldSpec.push(["P_std","writeUInt16LE",2]),u.prototype.fieldSpec.push(["L",i.prototype.fieldSpec]),u.prototype.fieldSpec.push(["cn0","writeUInt8",1]),u.prototype.fieldSpec.push(["lock","writeUInt16LE",2]),u.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),u.prototype.fieldSpec.push(["doppler","writeInt32LE",4]),u.prototype.fieldSpec.push(["doppler_std","writeUInt16LE",2]),u.prototype.fieldSpec.push(["uptime","writeUInt32LE",4]),u.prototype.fieldSpec.push(["clock_offset","writeInt16LE",2]),u.prototype.fieldSpec.push(["clock_drift","writeInt16LE",2]),u.prototype.fieldSpec.push(["corr_spacing","writeUInt16LE",2]),u.prototype.fieldSpec.push(["acceleration","writeInt8",1]),u.prototype.fieldSpec.push(["sync_flags","writeUInt8",1]),u.prototype.fieldSpec.push(["tow_flags","writeUInt8",1]),u.prototype.fieldSpec.push(["track_flags","writeUInt8",1]),u.prototype.fieldSpec.push(["nav_flags","writeUInt8",1]),u.prototype.fieldSpec.push(["pset_flags","writeUInt8",1]),u.prototype.fieldSpec.push(["misc_flags","writeUInt8",1]);var y=function(e,t){return p.call(this,e),this.messageType="TrackingChannelState",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(p.prototype)).messageType="TrackingChannelState",y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").nest("sid",{type:s.prototype.parser}).uint8("fcn").uint8("cn0"),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),y.prototype.fieldSpec.push(["fcn","writeUInt8",1]),y.prototype.fieldSpec.push(["cn0","writeUInt8",1]);var h=function(e,t){return p.call(this,e),this.messageType="MSG_TRACKING_STATE",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(p.prototype)).messageType="MSG_TRACKING_STATE",h.prototype.msg_type=65,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").array("states",{type:y.prototype.parser,readUntil:"eof"}),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["states","array",y.prototype.fieldSpec,function(){return this.fields.array.length},null]);var f=function(e,t){return p.call(this,e),this.messageType="MeasurementState",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(p.prototype)).messageType="MeasurementState",f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little").nest("mesid",{type:s.prototype.parser}).uint8("cn0"),f.prototype.fieldSpec=[],f.prototype.fieldSpec.push(["mesid",s.prototype.fieldSpec]),f.prototype.fieldSpec.push(["cn0","writeUInt8",1]);var d=function(e,t){return p.call(this,e),this.messageType="MSG_MEASUREMENT_STATE",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(p.prototype)).messageType="MSG_MEASUREMENT_STATE",d.prototype.msg_type=97,d.prototype.constructor=d,d.prototype.parser=(new o).endianess("little").array("states",{type:f.prototype.parser,readUntil:"eof"}),d.prototype.fieldSpec=[],d.prototype.fieldSpec.push(["states","array",f.prototype.fieldSpec,function(){return this.fields.array.length},null]);var _=function(e,t){return p.call(this,e),this.messageType="TrackingChannelCorrelation",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(p.prototype)).messageType="TrackingChannelCorrelation",_.prototype.constructor=_,_.prototype.parser=(new o).endianess("little").int16("I").int16("Q"),_.prototype.fieldSpec=[],_.prototype.fieldSpec.push(["I","writeInt16LE",2]),_.prototype.fieldSpec.push(["Q","writeInt16LE",2]);var S=function(e,t){return p.call(this,e),this.messageType="MSG_TRACKING_IQ",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(p.prototype)).messageType="MSG_TRACKING_IQ",S.prototype.msg_type=45,S.prototype.constructor=S,S.prototype.parser=(new o).endianess("little").uint8("channel").nest("sid",{type:s.prototype.parser}).array("corrs",{length:3,type:_.prototype.parser}),S.prototype.fieldSpec=[],S.prototype.fieldSpec.push(["channel","writeUInt8",1]),S.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),S.prototype.fieldSpec.push(["corrs","array",_.prototype.fieldSpec,function(){return this.fields.array.length},3]);var g=function(e,t){return p.call(this,e),this.messageType="TrackingChannelCorrelationDep",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(p.prototype)).messageType="TrackingChannelCorrelationDep",g.prototype.constructor=g,g.prototype.parser=(new o).endianess("little").int32("I").int32("Q"),g.prototype.fieldSpec=[],g.prototype.fieldSpec.push(["I","writeInt32LE",4]),g.prototype.fieldSpec.push(["Q","writeInt32LE",4]);var w=function(e,t){return p.call(this,e),this.messageType="MSG_TRACKING_IQ_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(p.prototype)).messageType="MSG_TRACKING_IQ_DEP_B",w.prototype.msg_type=44,w.prototype.constructor=w,w.prototype.parser=(new o).endianess("little").uint8("channel").nest("sid",{type:s.prototype.parser}).array("corrs",{length:3,type:g.prototype.parser}),w.prototype.fieldSpec=[],w.prototype.fieldSpec.push(["channel","writeUInt8",1]),w.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]),w.prototype.fieldSpec.push(["corrs","array",g.prototype.fieldSpec,function(){return this.fields.array.length},3]);var E=function(e,t){return p.call(this,e),this.messageType="MSG_TRACKING_IQ_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(p.prototype)).messageType="MSG_TRACKING_IQ_DEP_A",E.prototype.msg_type=28,E.prototype.constructor=E,E.prototype.parser=(new o).endianess("little").uint8("channel").nest("sid",{type:n.prototype.parser}).array("corrs",{length:3,type:g.prototype.parser}),E.prototype.fieldSpec=[],E.prototype.fieldSpec.push(["channel","writeUInt8",1]),E.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),E.prototype.fieldSpec.push(["corrs","array",g.prototype.fieldSpec,function(){return this.fields.array.length},3]);var m=function(e,t){return p.call(this,e),this.messageType="TrackingChannelStateDepA",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(p.prototype)).messageType="TrackingChannelStateDepA",m.prototype.constructor=m,m.prototype.parser=(new o).endianess("little").uint8("state").uint8("prn").floatle("cn0"),m.prototype.fieldSpec=[],m.prototype.fieldSpec.push(["state","writeUInt8",1]),m.prototype.fieldSpec.push(["prn","writeUInt8",1]),m.prototype.fieldSpec.push(["cn0","writeFloatLE",4]);var b=function(e,t){return p.call(this,e),this.messageType="MSG_TRACKING_STATE_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(p.prototype)).messageType="MSG_TRACKING_STATE_DEP_A",b.prototype.msg_type=22,b.prototype.constructor=b,b.prototype.parser=(new o).endianess("little").array("states",{type:m.prototype.parser,readUntil:"eof"}),b.prototype.fieldSpec=[],b.prototype.fieldSpec.push(["states","array",m.prototype.fieldSpec,function(){return this.fields.array.length},null]);var v=function(e,t){return p.call(this,e),this.messageType="TrackingChannelStateDepB",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(p.prototype)).messageType="TrackingChannelStateDepB",v.prototype.constructor=v,v.prototype.parser=(new o).endianess("little").uint8("state").nest("sid",{type:n.prototype.parser}).floatle("cn0"),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["state","writeUInt8",1]),v.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),v.prototype.fieldSpec.push(["cn0","writeFloatLE",4]);var I=function(e,t){return p.call(this,e),this.messageType="MSG_TRACKING_STATE_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(p.prototype)).messageType="MSG_TRACKING_STATE_DEP_B",I.prototype.msg_type=19,I.prototype.constructor=I,I.prototype.parser=(new o).endianess("little").array("states",{type:v.prototype.parser,readUntil:"eof"}),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["states","array",v.prototype.fieldSpec,function(){return this.fields.array.length},null]),e.exports={33:c,MsgTrackingStateDetailedDepA:c,17:u,MsgTrackingStateDetailedDep:u,TrackingChannelState:y,65:h,MsgTrackingState:h,MeasurementState:f,97:d,MsgMeasurementState:d,TrackingChannelCorrelation:_,45:S,MsgTrackingIq:S,TrackingChannelCorrelationDep:g,44:w,MsgTrackingIqDepB:w,28:E,MsgTrackingIqDepA:E,TrackingChannelStateDepA:m,22:b,MsgTrackingStateDepA:b,TrackingChannelStateDepB:v,19:I,MsgTrackingStateDepB:I}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_USER_DATA",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_USER_DATA",i.prototype.msg_type=2048,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").array("contents",{type:"uint8",readUntil:"eof"}),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["contents","array","writeUInt8",function(){return 1},null]),e.exports={2048:i,MsgUserData:i}},function(e,t,r){var p=r(2),o=r(4),i=(r(3),r(1).UINT64,function(e,t){return p.call(this,e),this.messageType="MSG_ODOMETRY",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(p.prototype)).messageType="MSG_ODOMETRY",i.prototype.msg_type=2307,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").uint32("tow").int32("velocity").uint8("flags"),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),i.prototype.fieldSpec.push(["velocity","writeInt32LE",4]),i.prototype.fieldSpec.push(["flags","writeUInt8",1]);var s=function(e,t){return p.call(this,e),this.messageType="MSG_WHEELTICK",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(p.prototype)).messageType="MSG_WHEELTICK",s.prototype.msg_type=2308,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").uint64("time").uint8("flags").uint8("source").int32("ticks"),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["time","writeUInt64LE",8]),s.prototype.fieldSpec.push(["flags","writeUInt8",1]),s.prototype.fieldSpec.push(["source","writeUInt8",1]),s.prototype.fieldSpec.push(["ticks","writeInt32LE",4]),e.exports={2307:i,MsgOdometry:i,2308:s,MsgWheeltick:s}}]); \ No newline at end of file diff --git a/javascript/sbp/ssr.js b/javascript/sbp/ssr.js index 06e7beb200..cbf99e4b5b 100644 --- a/javascript/sbp/ssr.js +++ b/javascript/sbp/ssr.js @@ -521,7 +521,7 @@ MsgSsrPhaseBiases.prototype.fieldSpec.push(['yaw_rate', 'writeInt8', 1]); MsgSsrPhaseBiases.prototype.fieldSpec.push(['biases', 'array', PhaseBiasesContent.prototype.fieldSpec, function () { return this.fields.array.length; }, null]); /** - * SBP class for message MSG_SSR_STEC_CORRECTION (0x05FB). + * SBP class for message MSG_SSR_STEC_CORRECTION_DEP (0x05FB). * * The Slant Total Electron Content per space vehicle, given as polynomial * approximation for a given tile. This should be combined with the @@ -535,6 +535,76 @@ MsgSsrPhaseBiases.prototype.fieldSpec.push(['biases', 'array', PhaseBiasesConten * * @param sbp An SBP object with a payload to be decoded. */ +var MsgSsrStecCorrectionDep = function (sbp, fields) { + SBP.call(this, sbp); + this.messageType = "MSG_SSR_STEC_CORRECTION_DEP"; + this.fields = (fields || this.parser.parse(sbp.payload)); + + return this; +}; +MsgSsrStecCorrectionDep.prototype = Object.create(SBP.prototype); +MsgSsrStecCorrectionDep.prototype.messageType = "MSG_SSR_STEC_CORRECTION_DEP"; +MsgSsrStecCorrectionDep.prototype.msg_type = 0x05FB; +MsgSsrStecCorrectionDep.prototype.constructor = MsgSsrStecCorrectionDep; +MsgSsrStecCorrectionDep.prototype.parser = new Parser() + .endianess('little') + .nest('header', { type: STECHeader.prototype.parser }) + .array('stec_sat_list', { type: STECSatElement.prototype.parser, readUntil: 'eof' }); +MsgSsrStecCorrectionDep.prototype.fieldSpec = []; +MsgSsrStecCorrectionDep.prototype.fieldSpec.push(['header', STECHeader.prototype.fieldSpec]); +MsgSsrStecCorrectionDep.prototype.fieldSpec.push(['stec_sat_list', 'array', STECSatElement.prototype.fieldSpec, function () { return this.fields.array.length; }, null]); + +/** + * SBP class for message fragment BoundsHeader + * + + * Fields in the SBP payload (`sbp.payload`): + * @field time GPSTimeSec GNSS reference time of the bound + * @field num_msgs number (unsigned 8-bit int, 1 byte) Number of messages in the dataset + * @field seq_num number (unsigned 8-bit int, 1 byte) Position of this message in the dataset + * @field update_interval number (unsigned 8-bit int, 1 byte) Update interval between consecutive bounds. Similar to RTCM DF391. + * @field sol_id number (unsigned 8-bit int, 1 byte) SSR Solution ID. + * + * @param sbp An SBP object with a payload to be decoded. + */ +var BoundsHeader = function (sbp, fields) { + SBP.call(this, sbp); + this.messageType = "BoundsHeader"; + this.fields = (fields || this.parser.parse(sbp.payload)); + + return this; +}; +BoundsHeader.prototype = Object.create(SBP.prototype); +BoundsHeader.prototype.messageType = "BoundsHeader"; +BoundsHeader.prototype.constructor = BoundsHeader; +BoundsHeader.prototype.parser = new Parser() + .endianess('little') + .nest('time', { type: GPSTimeSec.prototype.parser }) + .uint8('num_msgs') + .uint8('seq_num') + .uint8('update_interval') + .uint8('sol_id'); +BoundsHeader.prototype.fieldSpec = []; +BoundsHeader.prototype.fieldSpec.push(['time', GPSTimeSec.prototype.fieldSpec]); +BoundsHeader.prototype.fieldSpec.push(['num_msgs', 'writeUInt8', 1]); +BoundsHeader.prototype.fieldSpec.push(['seq_num', 'writeUInt8', 1]); +BoundsHeader.prototype.fieldSpec.push(['update_interval', 'writeUInt8', 1]); +BoundsHeader.prototype.fieldSpec.push(['sol_id', 'writeUInt8', 1]); + +/** + * SBP class for message MSG_SSR_STEC_CORRECTION (0x05FD). + * + + * Fields in the SBP payload (`sbp.payload`): + * @field header BoundsHeader Header of a STEC correction with bounds message. + * @field ssr_iod_atmo number (unsigned 8-bit int, 1 byte) IOD of the SSR atmospheric correction + * @field tile_set_id number (unsigned 16-bit int, 2 bytes) Tile set ID + * @field tile_id number (unsigned 16-bit int, 2 bytes) Tile ID + * @field n_sats number (unsigned 8-bit int, 1 byte) Number of satellites. + * @field stec_sat_list array Array of STEC polynomial coefficients for each space vehicle. + * + * @param sbp An SBP object with a payload to be decoded. + */ var MsgSsrStecCorrection = function (sbp, fields) { SBP.call(this, sbp); this.messageType = "MSG_SSR_STEC_CORRECTION"; @@ -544,15 +614,23 @@ var MsgSsrStecCorrection = function (sbp, fields) { }; MsgSsrStecCorrection.prototype = Object.create(SBP.prototype); MsgSsrStecCorrection.prototype.messageType = "MSG_SSR_STEC_CORRECTION"; -MsgSsrStecCorrection.prototype.msg_type = 0x05FB; +MsgSsrStecCorrection.prototype.msg_type = 0x05FD; MsgSsrStecCorrection.prototype.constructor = MsgSsrStecCorrection; MsgSsrStecCorrection.prototype.parser = new Parser() .endianess('little') - .nest('header', { type: STECHeader.prototype.parser }) - .array('stec_sat_list', { type: STECSatElement.prototype.parser, readUntil: 'eof' }); + .nest('header', { type: BoundsHeader.prototype.parser }) + .uint8('ssr_iod_atmo') + .uint16('tile_set_id') + .uint16('tile_id') + .uint8('n_sats') + .array('stec_sat_list', { type: STECSatElement.prototype.parser, length: 'n_sats' }); MsgSsrStecCorrection.prototype.fieldSpec = []; -MsgSsrStecCorrection.prototype.fieldSpec.push(['header', STECHeader.prototype.fieldSpec]); -MsgSsrStecCorrection.prototype.fieldSpec.push(['stec_sat_list', 'array', STECSatElement.prototype.fieldSpec, function () { return this.fields.array.length; }, null]); +MsgSsrStecCorrection.prototype.fieldSpec.push(['header', BoundsHeader.prototype.fieldSpec]); +MsgSsrStecCorrection.prototype.fieldSpec.push(['ssr_iod_atmo', 'writeUInt8', 1]); +MsgSsrStecCorrection.prototype.fieldSpec.push(['tile_set_id', 'writeUInt16LE', 2]); +MsgSsrStecCorrection.prototype.fieldSpec.push(['tile_id', 'writeUInt16LE', 2]); +MsgSsrStecCorrection.prototype.fieldSpec.push(['n_sats', 'writeUInt8', 1]); +MsgSsrStecCorrection.prototype.fieldSpec.push(['stec_sat_list', 'array', STECSatElement.prototype.fieldSpec, function () { return this.fields.array.length; }, 'n_sats']); /** * SBP class for message MSG_SSR_GRIDDED_CORRECTION (0x05FC). @@ -592,7 +670,177 @@ MsgSsrGriddedCorrection.prototype.fieldSpec.push(['tropo_delay_correction', Trop MsgSsrGriddedCorrection.prototype.fieldSpec.push(['stec_residuals', 'array', STECResidual.prototype.fieldSpec, function () { return this.fields.array.length; }, null]); /** - * SBP class for message MSG_SSR_TILE_DEFINITION (0x05F6). + * SBP class for message fragment STECSatElementIntegrity + * + * STEC polynomial and bounds for the given satellite. + * + * Fields in the SBP payload (`sbp.payload`): + * @field stec_residual STECResidual STEC residuals (mean, stddev) + * @field stec_bound_mu number (unsigned 8-bit int, 1 byte) STEC Error Bound Mean (range 0-17.5) i<= 200, mean = 0.01i 200230, mean=5+0.5(i-230) + * @field stec_bound_sig number (unsigned 8-bit int, 1 byte) STEC Error Bound Standard Deviation (range 0-17.5) i<= 200, mean = 0.01i + * 200230, mean=5+0.5(i-230) + * @field stec_bound_mu_dot number (unsigned 8-bit int, 1 byte) STEC Error Bound Mean First derivative degradation parameter(range 0-0.01275) + * @field stec_bound_sig_dot number (unsigned 8-bit int, 1 byte) STEC Error Bound Standard Deviation First derivative degradation parameter + * (range 0-0.01275) + * + * @param sbp An SBP object with a payload to be decoded. + */ +var STECSatElementIntegrity = function (sbp, fields) { + SBP.call(this, sbp); + this.messageType = "STECSatElementIntegrity"; + this.fields = (fields || this.parser.parse(sbp.payload)); + + return this; +}; +STECSatElementIntegrity.prototype = Object.create(SBP.prototype); +STECSatElementIntegrity.prototype.messageType = "STECSatElementIntegrity"; +STECSatElementIntegrity.prototype.constructor = STECSatElementIntegrity; +STECSatElementIntegrity.prototype.parser = new Parser() + .endianess('little') + .nest('stec_residual', { type: STECResidual.prototype.parser }) + .uint8('stec_bound_mu') + .uint8('stec_bound_sig') + .uint8('stec_bound_mu_dot') + .uint8('stec_bound_sig_dot'); +STECSatElementIntegrity.prototype.fieldSpec = []; +STECSatElementIntegrity.prototype.fieldSpec.push(['stec_residual', STECResidual.prototype.fieldSpec]); +STECSatElementIntegrity.prototype.fieldSpec.push(['stec_bound_mu', 'writeUInt8', 1]); +STECSatElementIntegrity.prototype.fieldSpec.push(['stec_bound_sig', 'writeUInt8', 1]); +STECSatElementIntegrity.prototype.fieldSpec.push(['stec_bound_mu_dot', 'writeUInt8', 1]); +STECSatElementIntegrity.prototype.fieldSpec.push(['stec_bound_sig_dot', 'writeUInt8', 1]); + +/** + * SBP class for message MSG_SSR_GRIDDED_CORRECTION_BOUNDS (0x05FE). + * + + * Fields in the SBP payload (`sbp.payload`): + * @field header BoundsHeader Header of a bounds message. + * @field ssr_iod_atmo number (unsigned 8-bit int, 1 byte) IOD of the SSR atmospheric correction. + * @field tile_set_id number (unsigned 16-bit int, 2 bytes) Unique identifier of the set this tile belongs to. + * @field tile_id number (unsigned 16-bit int, 2 bytes) Unique identifier of this tile in the tile set. + * @field tropo_qi number (unsigned 8-bit int, 1 byte) Tropo Quality Indicator. Similar to RTCM DF389. + * @field grid_point_id number (unsigned 16-bit int, 2 bytes) Index of the Grid Point. + * @field tropo_delay_correction TroposphericDelayCorrection Tropospheric delay at grid point. + * @field tropo_bound_mu number (unsigned 8-bit int, 1 byte) Troposphere Error Bound Mean (range 0-1.275). + * @field tropo_bound_sig number (unsigned 8-bit int, 1 byte) Troposphere Error Bound Standard Deviation (range 0-1.275) + * @field n_sats number (unsigned 8-bit int, 1 byte) Number of satellites. + * @field stec_sat_list array Array of STEC polynomial coefficients and its bounds for each space vehicle. + * + * @param sbp An SBP object with a payload to be decoded. + */ +var MsgSsrGriddedCorrectionBounds = function (sbp, fields) { + SBP.call(this, sbp); + this.messageType = "MSG_SSR_GRIDDED_CORRECTION_BOUNDS"; + this.fields = (fields || this.parser.parse(sbp.payload)); + + return this; +}; +MsgSsrGriddedCorrectionBounds.prototype = Object.create(SBP.prototype); +MsgSsrGriddedCorrectionBounds.prototype.messageType = "MSG_SSR_GRIDDED_CORRECTION_BOUNDS"; +MsgSsrGriddedCorrectionBounds.prototype.msg_type = 0x05FE; +MsgSsrGriddedCorrectionBounds.prototype.constructor = MsgSsrGriddedCorrectionBounds; +MsgSsrGriddedCorrectionBounds.prototype.parser = new Parser() + .endianess('little') + .nest('header', { type: BoundsHeader.prototype.parser }) + .uint8('ssr_iod_atmo') + .uint16('tile_set_id') + .uint16('tile_id') + .uint8('tropo_qi') + .uint16('grid_point_id') + .nest('tropo_delay_correction', { type: TroposphericDelayCorrection.prototype.parser }) + .uint8('tropo_bound_mu') + .uint8('tropo_bound_sig') + .uint8('n_sats') + .array('stec_sat_list', { type: STECSatElementIntegrity.prototype.parser, length: 'n_sats' }); +MsgSsrGriddedCorrectionBounds.prototype.fieldSpec = []; +MsgSsrGriddedCorrectionBounds.prototype.fieldSpec.push(['header', BoundsHeader.prototype.fieldSpec]); +MsgSsrGriddedCorrectionBounds.prototype.fieldSpec.push(['ssr_iod_atmo', 'writeUInt8', 1]); +MsgSsrGriddedCorrectionBounds.prototype.fieldSpec.push(['tile_set_id', 'writeUInt16LE', 2]); +MsgSsrGriddedCorrectionBounds.prototype.fieldSpec.push(['tile_id', 'writeUInt16LE', 2]); +MsgSsrGriddedCorrectionBounds.prototype.fieldSpec.push(['tropo_qi', 'writeUInt8', 1]); +MsgSsrGriddedCorrectionBounds.prototype.fieldSpec.push(['grid_point_id', 'writeUInt16LE', 2]); +MsgSsrGriddedCorrectionBounds.prototype.fieldSpec.push(['tropo_delay_correction', TroposphericDelayCorrection.prototype.fieldSpec]); +MsgSsrGriddedCorrectionBounds.prototype.fieldSpec.push(['tropo_bound_mu', 'writeUInt8', 1]); +MsgSsrGriddedCorrectionBounds.prototype.fieldSpec.push(['tropo_bound_sig', 'writeUInt8', 1]); +MsgSsrGriddedCorrectionBounds.prototype.fieldSpec.push(['n_sats', 'writeUInt8', 1]); +MsgSsrGriddedCorrectionBounds.prototype.fieldSpec.push(['stec_sat_list', 'array', STECSatElementIntegrity.prototype.fieldSpec, function () { return this.fields.array.length; }, 'n_sats']); + +/** + * SBP class for message MSG_SSR_TILE_DEFINITION_DEP (0x05F6). + * + * Provides the correction point coordinates for the atmospheric correction values + * in the MSG_SSR_STEC_CORRECTION_DEP and MSG_SSR_GRIDDED_CORRECTION messages. + * Based on ETSI TS 137 355 V16.1.0 (LTE Positioning Protocol) information element + * GNSS-SSR-CorrectionPoints. SBP only supports gridded arrays of correction + * points, not lists of points. + * + * Fields in the SBP payload (`sbp.payload`): + * @field tile_set_id number (unsigned 16-bit int, 2 bytes) Unique identifier of the tile set this tile belongs to. + * @field tile_id number (unsigned 16-bit int, 2 bytes) Unique identifier of this tile in the tile set. See GNSS-SSR- + * ArrayOfCorrectionPoints field correctionPointSetID. + * @field corner_nw_lat number (signed 16-bit int, 2 bytes) North-West corner correction point latitude. The relation between the latitude + * X in the range [-90, 90] and the coded number N is: N = floor((X / 90) * 2^14) + * See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLatitude. + * @field corner_nw_lon number (signed 16-bit int, 2 bytes) North-West corner correction point longitude. The relation between the + * longitude X in the range [-180, 180] and the coded number N is: N = floor((X / + * 180) * 2^15) See GNSS-SSR-ArrayOfCorrectionPoints field + * referencePointLongitude. + * @field spacing_lat number (unsigned 16-bit int, 2 bytes) Spacing of the correction points in the latitude direction. See GNSS-SSR- + * ArrayOfCorrectionPoints field stepOfLatitude. + * @field spacing_lon number (unsigned 16-bit int, 2 bytes) Spacing of the correction points in the longitude direction. See GNSS-SSR- + * ArrayOfCorrectionPoints field stepOfLongitude. + * @field rows number (unsigned 16-bit int, 2 bytes) Number of steps in the latitude direction. See GNSS-SSR-ArrayOfCorrectionPoints + * field numberOfStepsLatitude. + * @field cols number (unsigned 16-bit int, 2 bytes) Number of steps in the longitude direction. See GNSS-SSR- + * ArrayOfCorrectionPoints field numberOfStepsLongitude. + * @field bitmask number (unsigned 64-bit int, 8 bytes) Specifies the availability of correction data at the correction points in the + * array. If a specific bit is enabled (set to 1), the correction is not + * available. Only the first rows * cols bits are used, the remainder are set to 0. + * If there are more then 64 correction points the remaining corrections are always + * available. Starting with the northwest corner of the array (top left on a north + * oriented map) the correction points are enumerated with row precedence - first + * row west to east, second row west to east, until last row west to east - ending + * with the southeast corner of the array. See GNSS-SSR-ArrayOfCorrectionPoints + * field bitmaskOfGrids but note the definition of the bits is inverted. + * + * @param sbp An SBP object with a payload to be decoded. + */ +var MsgSsrTileDefinitionDep = function (sbp, fields) { + SBP.call(this, sbp); + this.messageType = "MSG_SSR_TILE_DEFINITION_DEP"; + this.fields = (fields || this.parser.parse(sbp.payload)); + + return this; +}; +MsgSsrTileDefinitionDep.prototype = Object.create(SBP.prototype); +MsgSsrTileDefinitionDep.prototype.messageType = "MSG_SSR_TILE_DEFINITION_DEP"; +MsgSsrTileDefinitionDep.prototype.msg_type = 0x05F6; +MsgSsrTileDefinitionDep.prototype.constructor = MsgSsrTileDefinitionDep; +MsgSsrTileDefinitionDep.prototype.parser = new Parser() + .endianess('little') + .uint16('tile_set_id') + .uint16('tile_id') + .int16('corner_nw_lat') + .int16('corner_nw_lon') + .uint16('spacing_lat') + .uint16('spacing_lon') + .uint16('rows') + .uint16('cols') + .uint64('bitmask'); +MsgSsrTileDefinitionDep.prototype.fieldSpec = []; +MsgSsrTileDefinitionDep.prototype.fieldSpec.push(['tile_set_id', 'writeUInt16LE', 2]); +MsgSsrTileDefinitionDep.prototype.fieldSpec.push(['tile_id', 'writeUInt16LE', 2]); +MsgSsrTileDefinitionDep.prototype.fieldSpec.push(['corner_nw_lat', 'writeInt16LE', 2]); +MsgSsrTileDefinitionDep.prototype.fieldSpec.push(['corner_nw_lon', 'writeInt16LE', 2]); +MsgSsrTileDefinitionDep.prototype.fieldSpec.push(['spacing_lat', 'writeUInt16LE', 2]); +MsgSsrTileDefinitionDep.prototype.fieldSpec.push(['spacing_lon', 'writeUInt16LE', 2]); +MsgSsrTileDefinitionDep.prototype.fieldSpec.push(['rows', 'writeUInt16LE', 2]); +MsgSsrTileDefinitionDep.prototype.fieldSpec.push(['cols', 'writeUInt16LE', 2]); +MsgSsrTileDefinitionDep.prototype.fieldSpec.push(['bitmask', 'writeUInt64LE', 8]); + +/** + * SBP class for message MSG_SSR_TILE_DEFINITION (0x05F7). * * Provides the correction point coordinates for the atmospheric correction values * in the MSG_SSR_STEC_CORRECTION and MSG_SSR_GRIDDED_CORRECTION messages. Based @@ -601,6 +849,7 @@ MsgSsrGriddedCorrection.prototype.fieldSpec.push(['stec_residuals', 'array', STE * lists of points. * * Fields in the SBP payload (`sbp.payload`): + * @field ssr_sol_id number (unsigned 8-bit int, 1 byte) SSR Solution ID. * @field tile_set_id number (unsigned 16-bit int, 2 bytes) Unique identifier of the tile set this tile belongs to. * @field tile_id number (unsigned 16-bit int, 2 bytes) Unique identifier of this tile in the tile set. See GNSS-SSR- * ArrayOfCorrectionPoints field correctionPointSetID. @@ -640,10 +889,11 @@ var MsgSsrTileDefinition = function (sbp, fields) { }; MsgSsrTileDefinition.prototype = Object.create(SBP.prototype); MsgSsrTileDefinition.prototype.messageType = "MSG_SSR_TILE_DEFINITION"; -MsgSsrTileDefinition.prototype.msg_type = 0x05F6; +MsgSsrTileDefinition.prototype.msg_type = 0x05F7; MsgSsrTileDefinition.prototype.constructor = MsgSsrTileDefinition; MsgSsrTileDefinition.prototype.parser = new Parser() .endianess('little') + .uint8('ssr_sol_id') .uint16('tile_set_id') .uint16('tile_id') .int16('corner_nw_lat') @@ -654,6 +904,7 @@ MsgSsrTileDefinition.prototype.parser = new Parser() .uint16('cols') .uint64('bitmask'); MsgSsrTileDefinition.prototype.fieldSpec = []; +MsgSsrTileDefinition.prototype.fieldSpec.push(['ssr_sol_id', 'writeUInt8', 1]); MsgSsrTileDefinition.prototype.fieldSpec.push(['tile_set_id', 'writeUInt16LE', 2]); MsgSsrTileDefinition.prototype.fieldSpec.push(['tile_id', 'writeUInt16LE', 2]); MsgSsrTileDefinition.prototype.fieldSpec.push(['corner_nw_lat', 'writeInt16LE', 2]); @@ -1058,43 +1309,6 @@ MsgSsrGridDefinitionDepA.prototype.fieldSpec = []; MsgSsrGridDefinitionDepA.prototype.fieldSpec.push(['header', GridDefinitionHeaderDepA.prototype.fieldSpec]); MsgSsrGridDefinitionDepA.prototype.fieldSpec.push(['rle_list', 'array', 'writeUInt8', function () { return 1; }, null]); -/** - * SBP class for message fragment BoundsHeader - * - - * Fields in the SBP payload (`sbp.payload`): - * @field time GPSTimeSec GNSS reference time of the bound - * @field num_msgs number (unsigned 8-bit int, 1 byte) Number of messages in the dataset - * @field seq_num number (unsigned 8-bit int, 1 byte) Position of this message in the dataset - * @field update_interval number (unsigned 8-bit int, 1 byte) Update interval between consecutive bounds. Similar to RTCM DF391. - * @field sol_id number (unsigned 8-bit int, 1 byte) SSR Solution ID. - * - * @param sbp An SBP object with a payload to be decoded. - */ -var BoundsHeader = function (sbp, fields) { - SBP.call(this, sbp); - this.messageType = "BoundsHeader"; - this.fields = (fields || this.parser.parse(sbp.payload)); - - return this; -}; -BoundsHeader.prototype = Object.create(SBP.prototype); -BoundsHeader.prototype.messageType = "BoundsHeader"; -BoundsHeader.prototype.constructor = BoundsHeader; -BoundsHeader.prototype.parser = new Parser() - .endianess('little') - .nest('time', { type: GPSTimeSec.prototype.parser }) - .uint8('num_msgs') - .uint8('seq_num') - .uint8('update_interval') - .uint8('sol_id'); -BoundsHeader.prototype.fieldSpec = []; -BoundsHeader.prototype.fieldSpec.push(['time', GPSTimeSec.prototype.fieldSpec]); -BoundsHeader.prototype.fieldSpec.push(['num_msgs', 'writeUInt8', 1]); -BoundsHeader.prototype.fieldSpec.push(['seq_num', 'writeUInt8', 1]); -BoundsHeader.prototype.fieldSpec.push(['update_interval', 'writeUInt8', 1]); -BoundsHeader.prototype.fieldSpec.push(['sol_id', 'writeUInt8', 1]); - /** * SBP class for message fragment OrbitClockBound * @@ -1288,11 +1502,19 @@ module.exports = { MsgSsrCodeBiases: MsgSsrCodeBiases, 0x05E6: MsgSsrPhaseBiases, MsgSsrPhaseBiases: MsgSsrPhaseBiases, - 0x05FB: MsgSsrStecCorrection, + 0x05FB: MsgSsrStecCorrectionDep, + MsgSsrStecCorrectionDep: MsgSsrStecCorrectionDep, + BoundsHeader: BoundsHeader, + 0x05FD: MsgSsrStecCorrection, MsgSsrStecCorrection: MsgSsrStecCorrection, 0x05FC: MsgSsrGriddedCorrection, MsgSsrGriddedCorrection: MsgSsrGriddedCorrection, - 0x05F6: MsgSsrTileDefinition, + STECSatElementIntegrity: STECSatElementIntegrity, + 0x05FE: MsgSsrGriddedCorrectionBounds, + MsgSsrGriddedCorrectionBounds: MsgSsrGriddedCorrectionBounds, + 0x05F6: MsgSsrTileDefinitionDep, + MsgSsrTileDefinitionDep: MsgSsrTileDefinitionDep, + 0x05F7: MsgSsrTileDefinition, MsgSsrTileDefinition: MsgSsrTileDefinition, SatelliteAPC: SatelliteAPC, 0x0604: MsgSsrSatelliteApc, @@ -1310,7 +1532,6 @@ module.exports = { MsgSsrGriddedCorrectionDepA: MsgSsrGriddedCorrectionDepA, 0x05F5: MsgSsrGridDefinitionDepA, MsgSsrGridDefinitionDepA: MsgSsrGridDefinitionDepA, - BoundsHeader: BoundsHeader, OrbitClockBound: OrbitClockBound, 0x05DE: MsgSsrOrbitClockBounds, MsgSsrOrbitClockBounds: MsgSsrOrbitClockBounds, diff --git a/jsonschema/MsgSsrGriddedCorrectionBounds.json b/jsonschema/MsgSsrGriddedCorrectionBounds.json new file mode 100644 index 0000000000..c925f9df1c --- /dev/null +++ b/jsonschema/MsgSsrGriddedCorrectionBounds.json @@ -0,0 +1,44 @@ +{ + "copyright": [ + "Copyright (C) 2019-2021 Swift Navigation Inc.", + "Contact: https://support.swiftnav.com", + "", + "This source is subject to the license found in the file 'LICENSE' which must", + "be be distributed together with this source. All other rights reserved.", + "", + "THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF ANY KIND,", + "EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED", + "WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE." + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "#MsgSsrGriddedCorrectionBounds", + "title":"MsgSsrGriddedCorrectionBounds", + "description":"", + "type": "object", + "properties": { + "header": {"$ref": "BoundsHeader.json"}, + "ssr_iod_atmo": {"type": "integer"}, + "tile_set_id": {"type": "integer"}, + "tile_id": {"type": "integer"}, + "tropo_qi": {"type": "integer"}, + "grid_point_id": {"type": "integer"}, + "tropo_delay_correction": {"$ref": "TroposphericDelayCorrection.json"}, + "tropo_bound_mu": {"type": "integer"}, + "tropo_bound_sig": {"type": "integer"}, + "n_sats": {"type": "integer"}, + "stec_sat_list": {"type": "array", "items": {"$ref": "STECSatElementIntegrity.json"}} + }, + "required": [ + "header", + "ssr_iod_atmo", + "tile_set_id", + "tile_id", + "tropo_qi", + "grid_point_id", + "tropo_delay_correction", + "tropo_bound_mu", + "tropo_bound_sig", + "n_sats", + "stec_sat_list" + ] +} \ No newline at end of file diff --git a/jsonschema/MsgSsrStecCorrection.json b/jsonschema/MsgSsrStecCorrection.json index c5767fa002..a02b001d04 100644 --- a/jsonschema/MsgSsrStecCorrection.json +++ b/jsonschema/MsgSsrStecCorrection.json @@ -13,14 +13,22 @@ "$schema": "http://json-schema.org/draft-06/schema#", "$id": "#MsgSsrStecCorrection", "title":"MsgSsrStecCorrection", - "description":"The Slant Total Electron Content per space vehicle, given as polynomial approximation for a given tile. This should be combined with the MSG_SSR_GRIDDED_CORRECTION message to get the state space representation of the atmospheric delay.,\n,\nIt is typically equivalent to the QZSS CLAS Sub Type 8 messages.\n", + "description":"", "type": "object", "properties": { - "header": {"$ref": "STECHeader.json"}, + "header": {"$ref": "BoundsHeader.json"}, + "ssr_iod_atmo": {"type": "integer"}, + "tile_set_id": {"type": "integer"}, + "tile_id": {"type": "integer"}, + "n_sats": {"type": "integer"}, "stec_sat_list": {"type": "array", "items": {"$ref": "STECSatElement.json"}} }, "required": [ "header", + "ssr_iod_atmo", + "tile_set_id", + "tile_id", + "n_sats", "stec_sat_list" ] } \ No newline at end of file diff --git a/jsonschema/MsgSsrTileDefinition.json b/jsonschema/MsgSsrTileDefinition.json index c6438bb85e..d9cadfd546 100644 --- a/jsonschema/MsgSsrTileDefinition.json +++ b/jsonschema/MsgSsrTileDefinition.json @@ -16,6 +16,7 @@ "description":"Provides the correction point coordinates for the atmospheric correction values in the MSG_SSR_STEC_CORRECTION and MSG_SSR_GRIDDED_CORRECTION messages.,\n,\nBased on ETSI TS 137 355 V16.1.0 (LTE Positioning Protocol) information element GNSS-SSR-CorrectionPoints. SBP only supports gridded arrays of correction points, not lists of points.\n", "type": "object", "properties": { + "ssr_sol_id": {"type": "integer"}, "tile_set_id": {"type": "integer"}, "tile_id": {"type": "integer"}, "corner_nw_lat": {"type": "integer"}, @@ -27,6 +28,7 @@ "bitmask": {"type": "integer"} }, "required": [ + "ssr_sol_id", "tile_set_id", "tile_id", "corner_nw_lat", diff --git a/jsonschema/STECSatElementIntegrity.json b/jsonschema/STECSatElementIntegrity.json new file mode 100644 index 0000000000..d888aa519e --- /dev/null +++ b/jsonschema/STECSatElementIntegrity.json @@ -0,0 +1,32 @@ +{ + "copyright": [ + "Copyright (C) 2019-2021 Swift Navigation Inc.", + "Contact: https://support.swiftnav.com", + "", + "This source is subject to the license found in the file 'LICENSE' which must", + "be be distributed together with this source. All other rights reserved.", + "", + "THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF ANY KIND,", + "EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED", + "WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE." + ], + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "#STECSatElementIntegrity", + "title":"STECSatElementIntegrity", + "description":"STEC polynomial and bounds for the given satellite.\n", + "type": "object", + "properties": { + "stec_residual": {"$ref": "STECResidual.json"}, + "stec_bound_mu": {"type": "integer"}, + "stec_bound_sig": {"type": "integer"}, + "stec_bound_mu_dot": {"type": "integer"}, + "stec_bound_sig_dot": {"type": "integer"} + }, + "required": [ + "stec_residual", + "stec_bound_mu", + "stec_bound_sig", + "stec_bound_mu_dot", + "stec_bound_sig_dot" + ] +} \ No newline at end of file diff --git a/proto/ssr.proto b/proto/ssr.proto index 875baeaee8..2c0cb28622 100644 --- a/proto/ssr.proto +++ b/proto/ssr.proto @@ -182,18 +182,29 @@ message MsgSsrPhaseBiases { repeated PhaseBiasesContent biases = 9; } -/** STEC correction polynomial coefficients +/** Header for the Bounds messages * - * The Slant Total Electron Content per space vehicle, given as polynomial - * approximation for a given tile. This should be combined with the - * MSG_SSR_GRIDDED_CORRECTION message to get the state space representation of - * the atmospheric delay. +None + */ +message BoundsHeader { + gnss.GpsTimeSec time = 1; + uint32 num_msgs = 2; + uint32 seq_num = 3; + uint32 update_interval = 4; + uint32 sol_id = 5; +} + +/** STEC correction polynomial coefficients * - * It is typically equivalent to the QZSS CLAS Sub Type 8 messages. +None */ message MsgSsrStecCorrection { - STECHeader header = 1; - repeated STECSatElement stec_sat_list = 2; + BoundsHeader header = 1; + uint32 ssr_iod_atmo = 2; + uint32 tile_set_id = 3; + uint32 tile_id = 4; + uint32 n_sats = 5; + repeated STECSatElement stec_sat_list = 6; } /** Gridded troposphere and STEC correction residuals @@ -209,6 +220,36 @@ message MsgSsrGriddedCorrection { repeated STECResidual stec_residuals = 4; } +/** None + * + * STEC polynomial and bounds for the given satellite. + */ +message STECSatElementIntegrity { + STECResidual stec_residual = 1; + uint32 stec_bound_mu = 2; + uint32 stec_bound_sig = 3; + uint32 stec_bound_mu_dot = 4; + uint32 stec_bound_sig_dot = 5; +} + +/** Gridded troposhere and STEC correction residuals bounds + * +None + */ +message MsgSsrGriddedCorrectionBounds { + BoundsHeader header = 1; + uint32 ssr_iod_atmo = 2; + uint32 tile_set_id = 3; + uint32 tile_id = 4; + uint32 tropo_qi = 5; + uint32 grid_point_id = 6; + TroposphericDelayCorrection tropo_delay_correction = 7; + uint32 tropo_bound_mu = 8; + uint32 tropo_bound_sig = 9; + uint32 n_sats = 10; + repeated STECSatElementIntegrity stec_sat_list = 11; +} + /** Definition of a SSR atmospheric correction tile. * @@ -221,15 +262,16 @@ message MsgSsrGriddedCorrection { * correction points, not lists of points. */ message MsgSsrTileDefinition { - uint32 tile_set_id = 1; - uint32 tile_id = 2; - sint32 corner_nw_lat = 3; - sint32 corner_nw_lon = 4; - uint32 spacing_lat = 5; - uint32 spacing_lon = 6; - uint32 rows = 7; - uint32 cols = 8; - uint64 bitmask = 9; + uint32 ssr_sol_id = 1; + uint32 tile_set_id = 2; + uint32 tile_id = 3; + sint32 corner_nw_lat = 4; + sint32 corner_nw_lon = 5; + uint32 spacing_lat = 6; + uint32 spacing_lon = 7; + uint32 rows = 8; + uint32 cols = 9; + uint64 bitmask = 10; } /** Antenna phase center correction @@ -253,18 +295,6 @@ message MsgSsrSatelliteApc { repeated SatelliteAPC apc = 1; } -/** Header for the Bounds messages - * -None - */ -message BoundsHeader { - gnss.GpsTimeSec time = 1; - uint32 num_msgs = 2; - uint32 seq_num = 3; - uint32 update_interval = 4; - uint32 sol_id = 5; -} - /** None * * Orbit and clock bound. diff --git a/python/sbp/ssr.py b/python/sbp/ssr.py index b73d357545..0aceb358b3 100644 --- a/python/sbp/ssr.py +++ b/python/sbp/ssr.py @@ -447,6 +447,111 @@ def from_binary(self, d): for n in self.__class__.__slots__: setattr(self, n, getattr(p, n)) +class BoundsHeader(object): + """BoundsHeader. + + + Parameters + ---------- + time : GPSTimeSec + GNSS reference time of the bound + num_msgs : int + Number of messages in the dataset + seq_num : int + Position of this message in the dataset + update_interval : int + Update interval between consecutive bounds. Similar to RTCM DF391. + sol_id : int + SSR Solution ID. + + """ + _parser = construct.Struct( + 'time' / GPSTimeSec._parser, + 'num_msgs' / construct.Int8ul, + 'seq_num' / construct.Int8ul, + 'update_interval' / construct.Int8ul, + 'sol_id' / construct.Int8ul,) + __slots__ = [ + 'time', + 'num_msgs', + 'seq_num', + 'update_interval', + 'sol_id', + ] + + def __init__(self, payload=None, **kwargs): + if payload: + self.from_binary(payload) + else: + self.time = kwargs.pop('time') + self.num_msgs = kwargs.pop('num_msgs') + self.seq_num = kwargs.pop('seq_num') + self.update_interval = kwargs.pop('update_interval') + self.sol_id = kwargs.pop('sol_id') + + def __repr__(self): + return fmt_repr(self) + + def from_binary(self, d): + p = BoundsHeader._parser.parse(d) + for n in self.__class__.__slots__: + setattr(self, n, getattr(p, n)) + +class STECSatElementIntegrity(object): + """STECSatElementIntegrity. + + STEC polynomial and bounds for the given satellite. + + Parameters + ---------- + stec_residual : STECResidual + STEC residuals (mean, stddev) + stec_bound_mu : int + STEC Error Bound Mean (range 0-17.5) i<= 200, mean = 0.01i 200230, mean=5+0.5(i-230) + stec_bound_sig : int + STEC Error Bound Standard Deviation (range 0-17.5) i<= 200, mean = 0.01i + 200230, mean=5+0.5(i-230) + stec_bound_mu_dot : int + STEC Error Bound Mean First derivative degradation parameter(range + 0-0.01275) + stec_bound_sig_dot : int + STEC Error Bound Standard Deviation First derivative degradation parameter + (range 0-0.01275) + + """ + _parser = construct.Struct( + 'stec_residual' / STECResidual._parser, + 'stec_bound_mu' / construct.Int8ul, + 'stec_bound_sig' / construct.Int8ul, + 'stec_bound_mu_dot' / construct.Int8ul, + 'stec_bound_sig_dot' / construct.Int8ul,) + __slots__ = [ + 'stec_residual', + 'stec_bound_mu', + 'stec_bound_sig', + 'stec_bound_mu_dot', + 'stec_bound_sig_dot', + ] + + def __init__(self, payload=None, **kwargs): + if payload: + self.from_binary(payload) + else: + self.stec_residual = kwargs.pop('stec_residual') + self.stec_bound_mu = kwargs.pop('stec_bound_mu') + self.stec_bound_sig = kwargs.pop('stec_bound_sig') + self.stec_bound_mu_dot = kwargs.pop('stec_bound_mu_dot') + self.stec_bound_sig_dot = kwargs.pop('stec_bound_sig_dot') + + def __repr__(self): + return fmt_repr(self) + + def from_binary(self, d): + p = STECSatElementIntegrity._parser.parse(d) + for n in self.__class__.__slots__: + setattr(self, n, getattr(p, n)) + class SatelliteAPC(object): """SatelliteAPC. @@ -673,56 +778,6 @@ def from_binary(self, d): for n in self.__class__.__slots__: setattr(self, n, getattr(p, n)) -class BoundsHeader(object): - """BoundsHeader. - - - Parameters - ---------- - time : GPSTimeSec - GNSS reference time of the bound - num_msgs : int - Number of messages in the dataset - seq_num : int - Position of this message in the dataset - update_interval : int - Update interval between consecutive bounds. Similar to RTCM DF391. - sol_id : int - SSR Solution ID. - - """ - _parser = construct.Struct( - 'time' / GPSTimeSec._parser, - 'num_msgs' / construct.Int8ul, - 'seq_num' / construct.Int8ul, - 'update_interval' / construct.Int8ul, - 'sol_id' / construct.Int8ul,) - __slots__ = [ - 'time', - 'num_msgs', - 'seq_num', - 'update_interval', - 'sol_id', - ] - - def __init__(self, payload=None, **kwargs): - if payload: - self.from_binary(payload) - else: - self.time = kwargs.pop('time') - self.num_msgs = kwargs.pop('num_msgs') - self.seq_num = kwargs.pop('seq_num') - self.update_interval = kwargs.pop('update_interval') - self.sol_id = kwargs.pop('sol_id') - - def __repr__(self): - return fmt_repr(self) - - def from_binary(self, d): - p = BoundsHeader._parser.parse(d) - for n in self.__class__.__slots__: - setattr(self, n, getattr(p, n)) - class OrbitClockBound(object): """OrbitClockBound. @@ -1266,11 +1321,11 @@ def to_json_dict(self): d.update(j) return d -SBP_MSG_SSR_STEC_CORRECTION = 0x05FB -class MsgSsrStecCorrection(SBP): - """SBP class for message MSG_SSR_STEC_CORRECTION (0x05FB). +SBP_MSG_SSR_STEC_CORRECTION_DEP = 0x05FB +class MsgSsrStecCorrectionDep(SBP): + """SBP class for message MSG_SSR_STEC_CORRECTION_DEP (0x05FB). - You can have MSG_SSR_STEC_CORRECTION inherit its fields directly + You can have MSG_SSR_STEC_CORRECTION_DEP inherit its fields directly from an inherited SBP object, or construct it inline using a dict of its fields. @@ -1302,6 +1357,115 @@ class MsgSsrStecCorrection(SBP): 'stec_sat_list', ] + def __init__(self, sbp=None, **kwargs): + if sbp: + super( MsgSsrStecCorrectionDep, + self).__init__(sbp.msg_type, sbp.sender, sbp.length, + sbp.payload, sbp.crc) + self.from_binary(sbp.payload) + else: + super( MsgSsrStecCorrectionDep, self).__init__() + self.msg_type = SBP_MSG_SSR_STEC_CORRECTION_DEP + self.sender = kwargs.pop('sender', SENDER_ID) + self.header = kwargs.pop('header') + self.stec_sat_list = kwargs.pop('stec_sat_list') + + def __repr__(self): + return fmt_repr(self) + + @staticmethod + def from_json(s): + """Given a JSON-encoded string s, build a message object. + + """ + d = json.loads(s) + return MsgSsrStecCorrectionDep.from_json_dict(d) + + @staticmethod + def from_json_dict(d): + sbp = SBP.from_json_dict(d) + return MsgSsrStecCorrectionDep(sbp, **d) + + + def from_binary(self, d): + """Given a binary payload d, update the appropriate payload fields of + the message. + + """ + p = MsgSsrStecCorrectionDep._parser.parse(d) + for n in self.__class__.__slots__: + setattr(self, n, getattr(p, n)) + + def to_binary(self): + """Produce a framed/packed SBP message. + + """ + c = containerize(exclude_fields(self)) + self.payload = MsgSsrStecCorrectionDep._parser.build(c) + return self.pack() + + def into_buffer(self, buf, offset): + """Produce a framed/packed SBP message into the provided buffer and offset. + + """ + self.payload = containerize(exclude_fields(self)) + self.parser = MsgSsrStecCorrectionDep._parser + self.stream_payload.reset(buf, offset) + return self.pack_into(buf, offset, self._build_payload) + + def to_json_dict(self): + self.to_binary() + d = super( MsgSsrStecCorrectionDep, self).to_json_dict() + j = walk_json_dict(exclude_fields(self)) + d.update(j) + return d + +SBP_MSG_SSR_STEC_CORRECTION = 0x05FD +class MsgSsrStecCorrection(SBP): + """SBP class for message MSG_SSR_STEC_CORRECTION (0x05FD). + + You can have MSG_SSR_STEC_CORRECTION inherit its fields directly + from an inherited SBP object, or construct it inline using a dict + of its fields. + + + + Parameters + ---------- + sbp : SBP + SBP parent object to inherit from. + header : BoundsHeader + Header of a STEC correction with bounds message. + ssr_iod_atmo : int + IOD of the SSR atmospheric correction + tile_set_id : int + Tile set ID + tile_id : int + Tile ID + n_sats : int + Number of satellites. + stec_sat_list : array + Array of STEC polynomial coefficients for each space vehicle. + sender : int + Optional sender ID, defaults to SENDER_ID (see sbp/msg.py). + + """ + _parser = construct.Struct( + 'header' / BoundsHeader._parser, + 'ssr_iod_atmo' / construct.Int8ul, + 'tile_set_id' / construct.Int16ul, + 'tile_id' / construct.Int16ul, + 'n_sats' / construct.Int8ul, + 'stec_sat_list' / construct.GreedyRange(STECSatElement._parser),) + __slots__ = [ + 'header', + 'ssr_iod_atmo', + 'tile_set_id', + 'tile_id', + 'n_sats', + 'stec_sat_list', + ] + def __init__(self, sbp=None, **kwargs): if sbp: super( MsgSsrStecCorrection, @@ -1313,6 +1477,10 @@ def __init__(self, sbp=None, **kwargs): self.msg_type = SBP_MSG_SSR_STEC_CORRECTION self.sender = kwargs.pop('sender', SENDER_ID) self.header = kwargs.pop('header') + self.ssr_iod_atmo = kwargs.pop('ssr_iod_atmo') + self.tile_set_id = kwargs.pop('tile_set_id') + self.tile_id = kwargs.pop('tile_id') + self.n_sats = kwargs.pop('n_sats') self.stec_sat_list = kwargs.pop('stec_sat_list') def __repr__(self): @@ -1471,9 +1639,320 @@ def to_json_dict(self): d.update(j) return d -SBP_MSG_SSR_TILE_DEFINITION = 0x05F6 +SBP_MSG_SSR_GRIDDED_CORRECTION_BOUNDS = 0x05FE +class MsgSsrGriddedCorrectionBounds(SBP): + """SBP class for message MSG_SSR_GRIDDED_CORRECTION_BOUNDS (0x05FE). + + You can have MSG_SSR_GRIDDED_CORRECTION_BOUNDS inherit its fields directly + from an inherited SBP object, or construct it inline using a dict + of its fields. + + + + Parameters + ---------- + sbp : SBP + SBP parent object to inherit from. + header : BoundsHeader + Header of a bounds message. + ssr_iod_atmo : int + IOD of the SSR atmospheric correction. + tile_set_id : int + Unique identifier of the set this tile belongs to. + tile_id : int + Unique identifier of this tile in the tile set. + tropo_qi : int + Tropo Quality Indicator. Similar to RTCM DF389. + grid_point_id : int + Index of the Grid Point. + tropo_delay_correction : TroposphericDelayCorrection + Tropospheric delay at grid point. + tropo_bound_mu : int + Troposphere Error Bound Mean (range 0-1.275). + tropo_bound_sig : int + Troposphere Error Bound Standard Deviation (range 0-1.275) + n_sats : int + Number of satellites. + stec_sat_list : array + Array of STEC polynomial coefficients and its bounds for each space + vehicle. + sender : int + Optional sender ID, defaults to SENDER_ID (see sbp/msg.py). + + """ + _parser = construct.Struct( + 'header' / BoundsHeader._parser, + 'ssr_iod_atmo' / construct.Int8ul, + 'tile_set_id' / construct.Int16ul, + 'tile_id' / construct.Int16ul, + 'tropo_qi' / construct.Int8ul, + 'grid_point_id' / construct.Int16ul, + 'tropo_delay_correction' / TroposphericDelayCorrection._parser, + 'tropo_bound_mu' / construct.Int8ul, + 'tropo_bound_sig' / construct.Int8ul, + 'n_sats' / construct.Int8ul, + 'stec_sat_list' / construct.GreedyRange(STECSatElementIntegrity._parser),) + __slots__ = [ + 'header', + 'ssr_iod_atmo', + 'tile_set_id', + 'tile_id', + 'tropo_qi', + 'grid_point_id', + 'tropo_delay_correction', + 'tropo_bound_mu', + 'tropo_bound_sig', + 'n_sats', + 'stec_sat_list', + ] + + def __init__(self, sbp=None, **kwargs): + if sbp: + super( MsgSsrGriddedCorrectionBounds, + self).__init__(sbp.msg_type, sbp.sender, sbp.length, + sbp.payload, sbp.crc) + self.from_binary(sbp.payload) + else: + super( MsgSsrGriddedCorrectionBounds, self).__init__() + self.msg_type = SBP_MSG_SSR_GRIDDED_CORRECTION_BOUNDS + self.sender = kwargs.pop('sender', SENDER_ID) + self.header = kwargs.pop('header') + self.ssr_iod_atmo = kwargs.pop('ssr_iod_atmo') + self.tile_set_id = kwargs.pop('tile_set_id') + self.tile_id = kwargs.pop('tile_id') + self.tropo_qi = kwargs.pop('tropo_qi') + self.grid_point_id = kwargs.pop('grid_point_id') + self.tropo_delay_correction = kwargs.pop('tropo_delay_correction') + self.tropo_bound_mu = kwargs.pop('tropo_bound_mu') + self.tropo_bound_sig = kwargs.pop('tropo_bound_sig') + self.n_sats = kwargs.pop('n_sats') + self.stec_sat_list = kwargs.pop('stec_sat_list') + + def __repr__(self): + return fmt_repr(self) + + @staticmethod + def from_json(s): + """Given a JSON-encoded string s, build a message object. + + """ + d = json.loads(s) + return MsgSsrGriddedCorrectionBounds.from_json_dict(d) + + @staticmethod + def from_json_dict(d): + sbp = SBP.from_json_dict(d) + return MsgSsrGriddedCorrectionBounds(sbp, **d) + + + def from_binary(self, d): + """Given a binary payload d, update the appropriate payload fields of + the message. + + """ + p = MsgSsrGriddedCorrectionBounds._parser.parse(d) + for n in self.__class__.__slots__: + setattr(self, n, getattr(p, n)) + + def to_binary(self): + """Produce a framed/packed SBP message. + + """ + c = containerize(exclude_fields(self)) + self.payload = MsgSsrGriddedCorrectionBounds._parser.build(c) + return self.pack() + + def into_buffer(self, buf, offset): + """Produce a framed/packed SBP message into the provided buffer and offset. + + """ + self.payload = containerize(exclude_fields(self)) + self.parser = MsgSsrGriddedCorrectionBounds._parser + self.stream_payload.reset(buf, offset) + return self.pack_into(buf, offset, self._build_payload) + + def to_json_dict(self): + self.to_binary() + d = super( MsgSsrGriddedCorrectionBounds, self).to_json_dict() + j = walk_json_dict(exclude_fields(self)) + d.update(j) + return d + +SBP_MSG_SSR_TILE_DEFINITION_DEP = 0x05F6 +class MsgSsrTileDefinitionDep(SBP): + """SBP class for message MSG_SSR_TILE_DEFINITION_DEP (0x05F6). + + You can have MSG_SSR_TILE_DEFINITION_DEP inherit its fields directly + from an inherited SBP object, or construct it inline using a dict + of its fields. + + + Provides the correction point coordinates for the atmospheric correction + values in the MSG_SSR_STEC_CORRECTION_DEP and MSG_SSR_GRIDDED_CORRECTION + messages. + + Based on ETSI TS 137 355 V16.1.0 (LTE Positioning Protocol) information + element GNSS-SSR-CorrectionPoints. SBP only supports gridded arrays of + correction points, not lists of points. + + Parameters + ---------- + sbp : SBP + SBP parent object to inherit from. + tile_set_id : int + Unique identifier of the tile set this tile belongs to. + tile_id : int + Unique identifier of this tile in the tile set. + See GNSS-SSR-ArrayOfCorrectionPoints field correctionPointSetID. + corner_nw_lat : int + North-West corner correction point latitude. + + The relation between the latitude X in the range [-90, 90] and the coded + number N is: + + N = floor((X / 90) * 2^14) + + See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLatitude. + corner_nw_lon : int + North-West corner correction point longitude. + + The relation between the longitude X in the range [-180, 180] and the + coded number N is: + + N = floor((X / 180) * 2^15) + + See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLongitude. + spacing_lat : int + Spacing of the correction points in the latitude direction. + + See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLatitude. + spacing_lon : int + Spacing of the correction points in the longitude direction. + + See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLongitude. + rows : int + Number of steps in the latitude direction. + + See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLatitude. + cols : int + Number of steps in the longitude direction. + + See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLongitude. + bitmask : int + Specifies the availability of correction data at the correction points in + the array. + + If a specific bit is enabled (set to 1), the correction is not available. + Only the first rows * cols bits are used, the remainder are set to 0. If + there are more then 64 correction points the remaining corrections are + always available. + + Starting with the northwest corner of the array (top left on a north + oriented map) the correction points are enumerated with row precedence - + first row west to east, second row west to east, until last row west to + east - ending with the southeast corner of the array. + + See GNSS-SSR-ArrayOfCorrectionPoints field bitmaskOfGrids but note the + definition of the bits is inverted. + sender : int + Optional sender ID, defaults to SENDER_ID (see sbp/msg.py). + + """ + _parser = construct.Struct( + 'tile_set_id' / construct.Int16ul, + 'tile_id' / construct.Int16ul, + 'corner_nw_lat' / construct.Int16sl, + 'corner_nw_lon' / construct.Int16sl, + 'spacing_lat' / construct.Int16ul, + 'spacing_lon' / construct.Int16ul, + 'rows' / construct.Int16ul, + 'cols' / construct.Int16ul, + 'bitmask' / construct.Int64ul,) + __slots__ = [ + 'tile_set_id', + 'tile_id', + 'corner_nw_lat', + 'corner_nw_lon', + 'spacing_lat', + 'spacing_lon', + 'rows', + 'cols', + 'bitmask', + ] + + def __init__(self, sbp=None, **kwargs): + if sbp: + super( MsgSsrTileDefinitionDep, + self).__init__(sbp.msg_type, sbp.sender, sbp.length, + sbp.payload, sbp.crc) + self.from_binary(sbp.payload) + else: + super( MsgSsrTileDefinitionDep, self).__init__() + self.msg_type = SBP_MSG_SSR_TILE_DEFINITION_DEP + self.sender = kwargs.pop('sender', SENDER_ID) + self.tile_set_id = kwargs.pop('tile_set_id') + self.tile_id = kwargs.pop('tile_id') + self.corner_nw_lat = kwargs.pop('corner_nw_lat') + self.corner_nw_lon = kwargs.pop('corner_nw_lon') + self.spacing_lat = kwargs.pop('spacing_lat') + self.spacing_lon = kwargs.pop('spacing_lon') + self.rows = kwargs.pop('rows') + self.cols = kwargs.pop('cols') + self.bitmask = kwargs.pop('bitmask') + + def __repr__(self): + return fmt_repr(self) + + @staticmethod + def from_json(s): + """Given a JSON-encoded string s, build a message object. + + """ + d = json.loads(s) + return MsgSsrTileDefinitionDep.from_json_dict(d) + + @staticmethod + def from_json_dict(d): + sbp = SBP.from_json_dict(d) + return MsgSsrTileDefinitionDep(sbp, **d) + + + def from_binary(self, d): + """Given a binary payload d, update the appropriate payload fields of + the message. + + """ + p = MsgSsrTileDefinitionDep._parser.parse(d) + for n in self.__class__.__slots__: + setattr(self, n, getattr(p, n)) + + def to_binary(self): + """Produce a framed/packed SBP message. + + """ + c = containerize(exclude_fields(self)) + self.payload = MsgSsrTileDefinitionDep._parser.build(c) + return self.pack() + + def into_buffer(self, buf, offset): + """Produce a framed/packed SBP message into the provided buffer and offset. + + """ + self.payload = containerize(exclude_fields(self)) + self.parser = MsgSsrTileDefinitionDep._parser + self.stream_payload.reset(buf, offset) + return self.pack_into(buf, offset, self._build_payload) + + def to_json_dict(self): + self.to_binary() + d = super( MsgSsrTileDefinitionDep, self).to_json_dict() + j = walk_json_dict(exclude_fields(self)) + d.update(j) + return d + +SBP_MSG_SSR_TILE_DEFINITION = 0x05F7 class MsgSsrTileDefinition(SBP): - """SBP class for message MSG_SSR_TILE_DEFINITION (0x05F6). + """SBP class for message MSG_SSR_TILE_DEFINITION (0x05F7). You can have MSG_SSR_TILE_DEFINITION inherit its fields directly from an inherited SBP object, or construct it inline using a dict @@ -1492,6 +1971,8 @@ class MsgSsrTileDefinition(SBP): ---------- sbp : SBP SBP parent object to inherit from. + ssr_sol_id : int + SSR Solution ID. tile_set_id : int Unique identifier of the tile set this tile belongs to. tile_id : int @@ -1552,6 +2033,7 @@ class MsgSsrTileDefinition(SBP): """ _parser = construct.Struct( + 'ssr_sol_id' / construct.Int8ul, 'tile_set_id' / construct.Int16ul, 'tile_id' / construct.Int16ul, 'corner_nw_lat' / construct.Int16sl, @@ -1562,6 +2044,7 @@ class MsgSsrTileDefinition(SBP): 'cols' / construct.Int16ul, 'bitmask' / construct.Int64ul,) __slots__ = [ + 'ssr_sol_id', 'tile_set_id', 'tile_id', 'corner_nw_lat', @@ -1583,6 +2066,7 @@ def __init__(self, sbp=None, **kwargs): super( MsgSsrTileDefinition, self).__init__() self.msg_type = SBP_MSG_SSR_TILE_DEFINITION self.sender = kwargs.pop('sender', SENDER_ID) + self.ssr_sol_id = kwargs.pop('ssr_sol_id') self.tile_set_id = kwargs.pop('tile_set_id') self.tile_id = kwargs.pop('tile_id') self.corner_nw_lat = kwargs.pop('corner_nw_lat') @@ -2502,9 +2986,12 @@ def to_json_dict(self): 0x05DD: MsgSsrOrbitClock, 0x05E1: MsgSsrCodeBiases, 0x05E6: MsgSsrPhaseBiases, - 0x05FB: MsgSsrStecCorrection, + 0x05FB: MsgSsrStecCorrectionDep, + 0x05FD: MsgSsrStecCorrection, 0x05FC: MsgSsrGriddedCorrection, - 0x05F6: MsgSsrTileDefinition, + 0x05FE: MsgSsrGriddedCorrectionBounds, + 0x05F6: MsgSsrTileDefinitionDep, + 0x05F7: MsgSsrTileDefinition, 0x0604: MsgSsrSatelliteApc, 0x05DC: MsgSsrOrbitClockDepA, 0x05EB: MsgSsrStecCorrectionDepA, diff --git a/python/tests/sbp/test_table.py b/python/tests/sbp/test_table.py index cb6f9e54a1..cddd60f663 100644 --- a/python/tests/sbp/test_table.py +++ b/python/tests/sbp/test_table.py @@ -40,7 +40,7 @@ def test_table_count(): Test number of available messages to deserialize. """ - number_of_messages = 207 + number_of_messages = 210 assert len(_SBP_TABLE) == number_of_messages def test_table_unqiue_count(): diff --git a/rust/sbp/src/messages/mod.rs b/rust/sbp/src/messages/mod.rs index 1e0619189d..26d50ca1ef 100644 --- a/rust/sbp/src/messages/mod.rs +++ b/rust/sbp/src/messages/mod.rs @@ -204,6 +204,7 @@ use self::ssr::msg_ssr_code_biases::MsgSsrCodeBiases; use self::ssr::msg_ssr_code_phase_biases_bounds::MsgSsrCodePhaseBiasesBounds; use self::ssr::msg_ssr_grid_definition_dep_a::MsgSsrGridDefinitionDepA; use self::ssr::msg_ssr_gridded_correction::MsgSsrGriddedCorrection; +use self::ssr::msg_ssr_gridded_correction_bounds::MsgSsrGriddedCorrectionBounds; use self::ssr::msg_ssr_gridded_correction_dep_a::MsgSsrGriddedCorrectionDepA; use self::ssr::msg_ssr_gridded_correction_no_std_dep_a::MsgSsrGriddedCorrectionNoStdDepA; use self::ssr::msg_ssr_orbit_clock::MsgSsrOrbitClock; @@ -212,8 +213,10 @@ use self::ssr::msg_ssr_orbit_clock_dep_a::MsgSsrOrbitClockDepA; use self::ssr::msg_ssr_phase_biases::MsgSsrPhaseBiases; use self::ssr::msg_ssr_satellite_apc::MsgSsrSatelliteApc; use self::ssr::msg_ssr_stec_correction::MsgSsrStecCorrection; +use self::ssr::msg_ssr_stec_correction_dep::MsgSsrStecCorrectionDep; use self::ssr::msg_ssr_stec_correction_dep_a::MsgSsrStecCorrectionDepA; use self::ssr::msg_ssr_tile_definition::MsgSsrTileDefinition; +use self::ssr::msg_ssr_tile_definition_dep::MsgSsrTileDefinitionDep; use self::system::msg_csac_telemetry::MsgCsacTelemetry; use self::system::msg_csac_telemetry_labels::MsgCsacTelemetryLabels; use self::system::msg_dgnss_status::MsgDgnssStatus; @@ -663,13 +666,19 @@ pub enum Sbp { /// Deprecated MsgSsrGridDefinitionDepA(MsgSsrGridDefinitionDepA), /// Definition of a SSR atmospheric correction tile. + MsgSsrTileDefinitionDep(MsgSsrTileDefinitionDep), + /// Definition of a SSR atmospheric correction tile. MsgSsrTileDefinition(MsgSsrTileDefinition), /// Deprecated MsgSsrGriddedCorrectionDepA(MsgSsrGriddedCorrectionDepA), /// STEC correction polynomial coefficients - MsgSsrStecCorrection(MsgSsrStecCorrection), + MsgSsrStecCorrectionDep(MsgSsrStecCorrectionDep), /// Gridded troposphere and STEC correction residuals MsgSsrGriddedCorrection(MsgSsrGriddedCorrection), + /// STEC correction polynomial coefficients + MsgSsrStecCorrection(MsgSsrStecCorrection), + /// Gridded troposhere and STEC correction residuals bounds + MsgSsrGriddedCorrectionBounds(MsgSsrGriddedCorrectionBounds), /// Satellite antenna phase center corrections MsgSsrSatelliteApc(MsgSsrSatelliteApc), /// OSR corrections @@ -1606,6 +1615,11 @@ impl Sbp { msg.set_sender_id(frame.sender_id); Ok(Sbp::MsgSsrGridDefinitionDepA(msg)) } + MsgSsrTileDefinitionDep::MESSAGE_TYPE => { + let mut msg = MsgSsrTileDefinitionDep::parse(&mut frame.payload)?; + msg.set_sender_id(frame.sender_id); + Ok(Sbp::MsgSsrTileDefinitionDep(msg)) + } MsgSsrTileDefinition::MESSAGE_TYPE => { let mut msg = MsgSsrTileDefinition::parse(&mut frame.payload)?; msg.set_sender_id(frame.sender_id); @@ -1616,16 +1630,26 @@ impl Sbp { msg.set_sender_id(frame.sender_id); Ok(Sbp::MsgSsrGriddedCorrectionDepA(msg)) } - MsgSsrStecCorrection::MESSAGE_TYPE => { - let mut msg = MsgSsrStecCorrection::parse(&mut frame.payload)?; + MsgSsrStecCorrectionDep::MESSAGE_TYPE => { + let mut msg = MsgSsrStecCorrectionDep::parse(&mut frame.payload)?; msg.set_sender_id(frame.sender_id); - Ok(Sbp::MsgSsrStecCorrection(msg)) + Ok(Sbp::MsgSsrStecCorrectionDep(msg)) } MsgSsrGriddedCorrection::MESSAGE_TYPE => { let mut msg = MsgSsrGriddedCorrection::parse(&mut frame.payload)?; msg.set_sender_id(frame.sender_id); Ok(Sbp::MsgSsrGriddedCorrection(msg)) } + MsgSsrStecCorrection::MESSAGE_TYPE => { + let mut msg = MsgSsrStecCorrection::parse(&mut frame.payload)?; + msg.set_sender_id(frame.sender_id); + Ok(Sbp::MsgSsrStecCorrection(msg)) + } + MsgSsrGriddedCorrectionBounds::MESSAGE_TYPE => { + let mut msg = MsgSsrGriddedCorrectionBounds::parse(&mut frame.payload)?; + msg.set_sender_id(frame.sender_id); + Ok(Sbp::MsgSsrGriddedCorrectionBounds(msg)) + } MsgSsrSatelliteApc::MESSAGE_TYPE => { let mut msg = MsgSsrSatelliteApc::parse(&mut frame.payload)?; msg.set_sender_id(frame.sender_id); @@ -1989,10 +2013,13 @@ impl SbpMessage for Sbp { Sbp::MsgSsrCodePhaseBiasesBounds(msg) => msg.message_name(), Sbp::MsgSsrGriddedCorrectionNoStdDepA(msg) => msg.message_name(), Sbp::MsgSsrGridDefinitionDepA(msg) => msg.message_name(), + Sbp::MsgSsrTileDefinitionDep(msg) => msg.message_name(), Sbp::MsgSsrTileDefinition(msg) => msg.message_name(), Sbp::MsgSsrGriddedCorrectionDepA(msg) => msg.message_name(), - Sbp::MsgSsrStecCorrection(msg) => msg.message_name(), + Sbp::MsgSsrStecCorrectionDep(msg) => msg.message_name(), Sbp::MsgSsrGriddedCorrection(msg) => msg.message_name(), + Sbp::MsgSsrStecCorrection(msg) => msg.message_name(), + Sbp::MsgSsrGriddedCorrectionBounds(msg) => msg.message_name(), Sbp::MsgSsrSatelliteApc(msg) => msg.message_name(), Sbp::MsgOsr(msg) => msg.message_name(), Sbp::MsgUserData(msg) => msg.message_name(), @@ -2202,10 +2229,13 @@ impl SbpMessage for Sbp { Sbp::MsgSsrCodePhaseBiasesBounds(msg) => msg.message_type(), Sbp::MsgSsrGriddedCorrectionNoStdDepA(msg) => msg.message_type(), Sbp::MsgSsrGridDefinitionDepA(msg) => msg.message_type(), + Sbp::MsgSsrTileDefinitionDep(msg) => msg.message_type(), Sbp::MsgSsrTileDefinition(msg) => msg.message_type(), Sbp::MsgSsrGriddedCorrectionDepA(msg) => msg.message_type(), - Sbp::MsgSsrStecCorrection(msg) => msg.message_type(), + Sbp::MsgSsrStecCorrectionDep(msg) => msg.message_type(), Sbp::MsgSsrGriddedCorrection(msg) => msg.message_type(), + Sbp::MsgSsrStecCorrection(msg) => msg.message_type(), + Sbp::MsgSsrGriddedCorrectionBounds(msg) => msg.message_type(), Sbp::MsgSsrSatelliteApc(msg) => msg.message_type(), Sbp::MsgOsr(msg) => msg.message_type(), Sbp::MsgUserData(msg) => msg.message_type(), @@ -2415,10 +2445,13 @@ impl SbpMessage for Sbp { Sbp::MsgSsrCodePhaseBiasesBounds(msg) => msg.sender_id(), Sbp::MsgSsrGriddedCorrectionNoStdDepA(msg) => msg.sender_id(), Sbp::MsgSsrGridDefinitionDepA(msg) => msg.sender_id(), + Sbp::MsgSsrTileDefinitionDep(msg) => msg.sender_id(), Sbp::MsgSsrTileDefinition(msg) => msg.sender_id(), Sbp::MsgSsrGriddedCorrectionDepA(msg) => msg.sender_id(), - Sbp::MsgSsrStecCorrection(msg) => msg.sender_id(), + Sbp::MsgSsrStecCorrectionDep(msg) => msg.sender_id(), Sbp::MsgSsrGriddedCorrection(msg) => msg.sender_id(), + Sbp::MsgSsrStecCorrection(msg) => msg.sender_id(), + Sbp::MsgSsrGriddedCorrectionBounds(msg) => msg.sender_id(), Sbp::MsgSsrSatelliteApc(msg) => msg.sender_id(), Sbp::MsgOsr(msg) => msg.sender_id(), Sbp::MsgUserData(msg) => msg.sender_id(), @@ -2628,10 +2661,13 @@ impl SbpMessage for Sbp { Sbp::MsgSsrCodePhaseBiasesBounds(msg) => msg.set_sender_id(new_id), Sbp::MsgSsrGriddedCorrectionNoStdDepA(msg) => msg.set_sender_id(new_id), Sbp::MsgSsrGridDefinitionDepA(msg) => msg.set_sender_id(new_id), + Sbp::MsgSsrTileDefinitionDep(msg) => msg.set_sender_id(new_id), Sbp::MsgSsrTileDefinition(msg) => msg.set_sender_id(new_id), Sbp::MsgSsrGriddedCorrectionDepA(msg) => msg.set_sender_id(new_id), - Sbp::MsgSsrStecCorrection(msg) => msg.set_sender_id(new_id), + Sbp::MsgSsrStecCorrectionDep(msg) => msg.set_sender_id(new_id), Sbp::MsgSsrGriddedCorrection(msg) => msg.set_sender_id(new_id), + Sbp::MsgSsrStecCorrection(msg) => msg.set_sender_id(new_id), + Sbp::MsgSsrGriddedCorrectionBounds(msg) => msg.set_sender_id(new_id), Sbp::MsgSsrSatelliteApc(msg) => msg.set_sender_id(new_id), Sbp::MsgOsr(msg) => msg.set_sender_id(new_id), Sbp::MsgUserData(msg) => msg.set_sender_id(new_id), @@ -2841,10 +2877,13 @@ impl SbpMessage for Sbp { Sbp::MsgSsrCodePhaseBiasesBounds(msg) => msg.encoded_len(), Sbp::MsgSsrGriddedCorrectionNoStdDepA(msg) => msg.encoded_len(), Sbp::MsgSsrGridDefinitionDepA(msg) => msg.encoded_len(), + Sbp::MsgSsrTileDefinitionDep(msg) => msg.encoded_len(), Sbp::MsgSsrTileDefinition(msg) => msg.encoded_len(), Sbp::MsgSsrGriddedCorrectionDepA(msg) => msg.encoded_len(), - Sbp::MsgSsrStecCorrection(msg) => msg.encoded_len(), + Sbp::MsgSsrStecCorrectionDep(msg) => msg.encoded_len(), Sbp::MsgSsrGriddedCorrection(msg) => msg.encoded_len(), + Sbp::MsgSsrStecCorrection(msg) => msg.encoded_len(), + Sbp::MsgSsrGriddedCorrectionBounds(msg) => msg.encoded_len(), Sbp::MsgSsrSatelliteApc(msg) => msg.encoded_len(), Sbp::MsgOsr(msg) => msg.encoded_len(), Sbp::MsgUserData(msg) => msg.encoded_len(), @@ -3057,10 +3096,13 @@ impl SbpMessage for Sbp { Sbp::MsgSsrCodePhaseBiasesBounds(msg) => msg.gps_time(), Sbp::MsgSsrGriddedCorrectionNoStdDepA(msg) => msg.gps_time(), Sbp::MsgSsrGridDefinitionDepA(msg) => msg.gps_time(), + Sbp::MsgSsrTileDefinitionDep(msg) => msg.gps_time(), Sbp::MsgSsrTileDefinition(msg) => msg.gps_time(), Sbp::MsgSsrGriddedCorrectionDepA(msg) => msg.gps_time(), - Sbp::MsgSsrStecCorrection(msg) => msg.gps_time(), + Sbp::MsgSsrStecCorrectionDep(msg) => msg.gps_time(), Sbp::MsgSsrGriddedCorrection(msg) => msg.gps_time(), + Sbp::MsgSsrStecCorrection(msg) => msg.gps_time(), + Sbp::MsgSsrGriddedCorrectionBounds(msg) => msg.gps_time(), Sbp::MsgSsrSatelliteApc(msg) => msg.gps_time(), Sbp::MsgOsr(msg) => msg.gps_time(), Sbp::MsgUserData(msg) => msg.gps_time(), @@ -3278,10 +3320,13 @@ impl WireFormat for Sbp { Sbp::MsgSsrCodePhaseBiasesBounds(msg) => WireFormat::write(msg, buf), Sbp::MsgSsrGriddedCorrectionNoStdDepA(msg) => WireFormat::write(msg, buf), Sbp::MsgSsrGridDefinitionDepA(msg) => WireFormat::write(msg, buf), + Sbp::MsgSsrTileDefinitionDep(msg) => WireFormat::write(msg, buf), Sbp::MsgSsrTileDefinition(msg) => WireFormat::write(msg, buf), Sbp::MsgSsrGriddedCorrectionDepA(msg) => WireFormat::write(msg, buf), - Sbp::MsgSsrStecCorrection(msg) => WireFormat::write(msg, buf), + Sbp::MsgSsrStecCorrectionDep(msg) => WireFormat::write(msg, buf), Sbp::MsgSsrGriddedCorrection(msg) => WireFormat::write(msg, buf), + Sbp::MsgSsrStecCorrection(msg) => WireFormat::write(msg, buf), + Sbp::MsgSsrGriddedCorrectionBounds(msg) => WireFormat::write(msg, buf), Sbp::MsgSsrSatelliteApc(msg) => WireFormat::write(msg, buf), Sbp::MsgOsr(msg) => WireFormat::write(msg, buf), Sbp::MsgUserData(msg) => WireFormat::write(msg, buf), @@ -3491,10 +3536,13 @@ impl WireFormat for Sbp { Sbp::MsgSsrCodePhaseBiasesBounds(msg) => WireFormat::len(msg), Sbp::MsgSsrGriddedCorrectionNoStdDepA(msg) => WireFormat::len(msg), Sbp::MsgSsrGridDefinitionDepA(msg) => WireFormat::len(msg), + Sbp::MsgSsrTileDefinitionDep(msg) => WireFormat::len(msg), Sbp::MsgSsrTileDefinition(msg) => WireFormat::len(msg), Sbp::MsgSsrGriddedCorrectionDepA(msg) => WireFormat::len(msg), - Sbp::MsgSsrStecCorrection(msg) => WireFormat::len(msg), + Sbp::MsgSsrStecCorrectionDep(msg) => WireFormat::len(msg), Sbp::MsgSsrGriddedCorrection(msg) => WireFormat::len(msg), + Sbp::MsgSsrStecCorrection(msg) => WireFormat::len(msg), + Sbp::MsgSsrGriddedCorrectionBounds(msg) => WireFormat::len(msg), Sbp::MsgSsrSatelliteApc(msg) => WireFormat::len(msg), Sbp::MsgOsr(msg) => WireFormat::len(msg), Sbp::MsgUserData(msg) => WireFormat::len(msg), @@ -4533,6 +4581,12 @@ impl From for Sbp { } } +impl From for Sbp { + fn from(msg: MsgSsrTileDefinitionDep) -> Self { + Sbp::MsgSsrTileDefinitionDep(msg) + } +} + impl From for Sbp { fn from(msg: MsgSsrTileDefinition) -> Self { Sbp::MsgSsrTileDefinition(msg) @@ -4545,9 +4599,9 @@ impl From for Sbp { } } -impl From for Sbp { - fn from(msg: MsgSsrStecCorrection) -> Self { - Sbp::MsgSsrStecCorrection(msg) +impl From for Sbp { + fn from(msg: MsgSsrStecCorrectionDep) -> Self { + Sbp::MsgSsrStecCorrectionDep(msg) } } @@ -4557,6 +4611,18 @@ impl From for Sbp { } } +impl From for Sbp { + fn from(msg: MsgSsrStecCorrection) -> Self { + Sbp::MsgSsrStecCorrection(msg) + } +} + +impl From for Sbp { + fn from(msg: MsgSsrGriddedCorrectionBounds) -> Self { + Sbp::MsgSsrGriddedCorrectionBounds(msg) + } +} + impl From for Sbp { fn from(msg: MsgSsrSatelliteApc) -> Self { Sbp::MsgSsrSatelliteApc(msg) diff --git a/rust/sbp/src/messages/ssr.rs b/rust/sbp/src/messages/ssr.rs index 771430b330..9963d92b77 100644 --- a/rust/sbp/src/messages/ssr.rs +++ b/rust/sbp/src/messages/ssr.rs @@ -23,6 +23,7 @@ pub use msg_ssr_code_biases::MsgSsrCodeBiases; pub use msg_ssr_code_phase_biases_bounds::MsgSsrCodePhaseBiasesBounds; pub use msg_ssr_grid_definition_dep_a::MsgSsrGridDefinitionDepA; pub use msg_ssr_gridded_correction::MsgSsrGriddedCorrection; +pub use msg_ssr_gridded_correction_bounds::MsgSsrGriddedCorrectionBounds; pub use msg_ssr_gridded_correction_dep_a::MsgSsrGriddedCorrectionDepA; pub use msg_ssr_gridded_correction_no_std_dep_a::MsgSsrGriddedCorrectionNoStdDepA; pub use msg_ssr_orbit_clock::MsgSsrOrbitClock; @@ -31,8 +32,10 @@ pub use msg_ssr_orbit_clock_dep_a::MsgSsrOrbitClockDepA; pub use msg_ssr_phase_biases::MsgSsrPhaseBiases; pub use msg_ssr_satellite_apc::MsgSsrSatelliteApc; pub use msg_ssr_stec_correction::MsgSsrStecCorrection; +pub use msg_ssr_stec_correction_dep::MsgSsrStecCorrectionDep; pub use msg_ssr_stec_correction_dep_a::MsgSsrStecCorrectionDepA; pub use msg_ssr_tile_definition::MsgSsrTileDefinition; +pub use msg_ssr_tile_definition_dep::MsgSsrTileDefinitionDep; pub use orbit_clock_bound::OrbitClockBound; pub use phase_biases_content::PhaseBiasesContent; pub use satellite_apc::SatelliteAPC; @@ -41,6 +44,7 @@ pub use stec_header_dep_a::STECHeaderDepA; pub use stec_residual::STECResidual; pub use stec_residual_no_std::STECResidualNoStd; pub use stec_sat_element::STECSatElement; +pub use stec_sat_element_integrity::STECSatElementIntegrity; pub use tropospheric_delay_correction::TroposphericDelayCorrection; pub use tropospheric_delay_correction_no_std::TroposphericDelayCorrectionNoStd; @@ -747,6 +751,145 @@ pub mod msg_ssr_gridded_correction { } } +pub mod msg_ssr_gridded_correction_bounds { + #![allow(unused_imports)] + + use super::*; + use crate::messages::gnss::*; + use crate::messages::lib::*; + /// Gridded troposhere and STEC correction residuals bounds + #[cfg_attr(feature = "serde", derive(serde::Serialize))] + #[derive(Debug, Clone)] + pub struct MsgSsrGriddedCorrectionBounds { + /// The message sender_id + #[cfg_attr(feature = "serde", serde(skip_serializing))] + pub sender_id: Option, + /// Header of a bounds message. + #[cfg_attr(feature = "serde", serde(rename(serialize = "header")))] + pub header: BoundsHeader, + /// IOD of the SSR atmospheric correction. + #[cfg_attr(feature = "serde", serde(rename(serialize = "ssr_iod_atmo")))] + pub ssr_iod_atmo: u8, + /// Unique identifier of the set this tile belongs to. + #[cfg_attr(feature = "serde", serde(rename(serialize = "tile_set_id")))] + pub tile_set_id: u16, + /// Unique identifier of this tile in the tile set. + #[cfg_attr(feature = "serde", serde(rename(serialize = "tile_id")))] + pub tile_id: u16, + /// Tropo Quality Indicator. Similar to RTCM DF389. + #[cfg_attr(feature = "serde", serde(rename(serialize = "tropo_qi")))] + pub tropo_qi: u8, + /// Index of the Grid Point. + #[cfg_attr(feature = "serde", serde(rename(serialize = "grid_point_id")))] + pub grid_point_id: u16, + /// Tropospheric delay at grid point. + #[cfg_attr(feature = "serde", serde(rename(serialize = "tropo_delay_correction")))] + pub tropo_delay_correction: TroposphericDelayCorrection, + /// Troposphere Error Bound Mean (range 0-1.275). + #[cfg_attr(feature = "serde", serde(rename(serialize = "tropo_bound_mu")))] + pub tropo_bound_mu: u8, + /// Troposphere Error Bound Standard Deviation (range 0-1.275) + #[cfg_attr(feature = "serde", serde(rename(serialize = "tropo_bound_sig")))] + pub tropo_bound_sig: u8, + /// Number of satellites. + #[cfg_attr(feature = "serde", serde(rename(serialize = "n_sats")))] + pub n_sats: u8, + /// Array of STEC polynomial coefficients and its bounds for each space + /// vehicle. + #[cfg_attr(feature = "serde", serde(rename(serialize = "stec_sat_list")))] + pub stec_sat_list: Vec, + } + + impl ConcreteMessage for MsgSsrGriddedCorrectionBounds { + const MESSAGE_TYPE: u16 = 1534; + const MESSAGE_NAME: &'static str = "MSG_SSR_GRIDDED_CORRECTION_BOUNDS"; + } + + impl SbpMessage for MsgSsrGriddedCorrectionBounds { + fn message_name(&self) -> &'static str { + ::MESSAGE_NAME + } + fn message_type(&self) -> u16 { + ::MESSAGE_TYPE + } + fn sender_id(&self) -> Option { + self.sender_id + } + fn set_sender_id(&mut self, new_id: u16) { + self.sender_id = Some(new_id); + } + fn encoded_len(&self) -> usize { + WireFormat::len(self) + crate::HEADER_LEN + crate::CRC_LEN + } + } + + impl TryFrom for MsgSsrGriddedCorrectionBounds { + type Error = TryFromSbpError; + fn try_from(msg: Sbp) -> Result { + match msg { + Sbp::MsgSsrGriddedCorrectionBounds(m) => Ok(m), + _ => Err(TryFromSbpError), + } + } + } + + impl WireFormat for MsgSsrGriddedCorrectionBounds { + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + as WireFormat>::MIN_LEN; + fn len(&self) -> usize { + WireFormat::len(&self.header) + + WireFormat::len(&self.ssr_iod_atmo) + + WireFormat::len(&self.tile_set_id) + + WireFormat::len(&self.tile_id) + + WireFormat::len(&self.tropo_qi) + + WireFormat::len(&self.grid_point_id) + + WireFormat::len(&self.tropo_delay_correction) + + WireFormat::len(&self.tropo_bound_mu) + + WireFormat::len(&self.tropo_bound_sig) + + WireFormat::len(&self.n_sats) + + WireFormat::len(&self.stec_sat_list) + } + fn write(&self, buf: &mut B) { + WireFormat::write(&self.header, buf); + WireFormat::write(&self.ssr_iod_atmo, buf); + WireFormat::write(&self.tile_set_id, buf); + WireFormat::write(&self.tile_id, buf); + WireFormat::write(&self.tropo_qi, buf); + WireFormat::write(&self.grid_point_id, buf); + WireFormat::write(&self.tropo_delay_correction, buf); + WireFormat::write(&self.tropo_bound_mu, buf); + WireFormat::write(&self.tropo_bound_sig, buf); + WireFormat::write(&self.n_sats, buf); + WireFormat::write(&self.stec_sat_list, buf); + } + fn parse_unchecked(buf: &mut B) -> Self { + MsgSsrGriddedCorrectionBounds { + sender_id: None, + header: WireFormat::parse_unchecked(buf), + ssr_iod_atmo: WireFormat::parse_unchecked(buf), + tile_set_id: WireFormat::parse_unchecked(buf), + tile_id: WireFormat::parse_unchecked(buf), + tropo_qi: WireFormat::parse_unchecked(buf), + grid_point_id: WireFormat::parse_unchecked(buf), + tropo_delay_correction: WireFormat::parse_unchecked(buf), + tropo_bound_mu: WireFormat::parse_unchecked(buf), + tropo_bound_sig: WireFormat::parse_unchecked(buf), + n_sats: WireFormat::parse_unchecked(buf), + stec_sat_list: WireFormat::parse_unchecked(buf), + } + } + } +} + pub mod msg_ssr_gridded_correction_dep_a { #![allow(unused_imports)] @@ -1631,6 +1774,109 @@ pub mod msg_ssr_satellite_apc { pub mod msg_ssr_stec_correction { #![allow(unused_imports)] + use super::*; + use crate::messages::gnss::*; + use crate::messages::lib::*; + /// STEC correction polynomial coefficients + #[cfg_attr(feature = "serde", derive(serde::Serialize))] + #[derive(Debug, Clone)] + pub struct MsgSsrStecCorrection { + /// The message sender_id + #[cfg_attr(feature = "serde", serde(skip_serializing))] + pub sender_id: Option, + /// Header of a STEC correction with bounds message. + #[cfg_attr(feature = "serde", serde(rename(serialize = "header")))] + pub header: BoundsHeader, + /// IOD of the SSR atmospheric correction + #[cfg_attr(feature = "serde", serde(rename(serialize = "ssr_iod_atmo")))] + pub ssr_iod_atmo: u8, + /// Tile set ID + #[cfg_attr(feature = "serde", serde(rename(serialize = "tile_set_id")))] + pub tile_set_id: u16, + /// Tile ID + #[cfg_attr(feature = "serde", serde(rename(serialize = "tile_id")))] + pub tile_id: u16, + /// Number of satellites. + #[cfg_attr(feature = "serde", serde(rename(serialize = "n_sats")))] + pub n_sats: u8, + /// Array of STEC polynomial coefficients for each space vehicle. + #[cfg_attr(feature = "serde", serde(rename(serialize = "stec_sat_list")))] + pub stec_sat_list: Vec, + } + + impl ConcreteMessage for MsgSsrStecCorrection { + const MESSAGE_TYPE: u16 = 1533; + const MESSAGE_NAME: &'static str = "MSG_SSR_STEC_CORRECTION"; + } + + impl SbpMessage for MsgSsrStecCorrection { + fn message_name(&self) -> &'static str { + ::MESSAGE_NAME + } + fn message_type(&self) -> u16 { + ::MESSAGE_TYPE + } + fn sender_id(&self) -> Option { + self.sender_id + } + fn set_sender_id(&mut self, new_id: u16) { + self.sender_id = Some(new_id); + } + fn encoded_len(&self) -> usize { + WireFormat::len(self) + crate::HEADER_LEN + crate::CRC_LEN + } + } + + impl TryFrom for MsgSsrStecCorrection { + type Error = TryFromSbpError; + fn try_from(msg: Sbp) -> Result { + match msg { + Sbp::MsgSsrStecCorrection(m) => Ok(m), + _ => Err(TryFromSbpError), + } + } + } + + impl WireFormat for MsgSsrStecCorrection { + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + as WireFormat>::MIN_LEN; + fn len(&self) -> usize { + WireFormat::len(&self.header) + + WireFormat::len(&self.ssr_iod_atmo) + + WireFormat::len(&self.tile_set_id) + + WireFormat::len(&self.tile_id) + + WireFormat::len(&self.n_sats) + + WireFormat::len(&self.stec_sat_list) + } + fn write(&self, buf: &mut B) { + WireFormat::write(&self.header, buf); + WireFormat::write(&self.ssr_iod_atmo, buf); + WireFormat::write(&self.tile_set_id, buf); + WireFormat::write(&self.tile_id, buf); + WireFormat::write(&self.n_sats, buf); + WireFormat::write(&self.stec_sat_list, buf); + } + fn parse_unchecked(buf: &mut B) -> Self { + MsgSsrStecCorrection { + sender_id: None, + header: WireFormat::parse_unchecked(buf), + ssr_iod_atmo: WireFormat::parse_unchecked(buf), + tile_set_id: WireFormat::parse_unchecked(buf), + tile_id: WireFormat::parse_unchecked(buf), + n_sats: WireFormat::parse_unchecked(buf), + stec_sat_list: WireFormat::parse_unchecked(buf), + } + } + } +} + +pub mod msg_ssr_stec_correction_dep { + #![allow(unused_imports)] + use super::*; use crate::messages::gnss::*; use crate::messages::lib::*; @@ -1646,7 +1892,7 @@ pub mod msg_ssr_stec_correction { /// #[cfg_attr(feature = "serde", derive(serde::Serialize))] #[derive(Debug, Clone)] - pub struct MsgSsrStecCorrection { + pub struct MsgSsrStecCorrectionDep { /// The message sender_id #[cfg_attr(feature = "serde", serde(skip_serializing))] pub sender_id: Option, @@ -1658,12 +1904,12 @@ pub mod msg_ssr_stec_correction { pub stec_sat_list: Vec, } - impl ConcreteMessage for MsgSsrStecCorrection { + impl ConcreteMessage for MsgSsrStecCorrectionDep { const MESSAGE_TYPE: u16 = 1531; - const MESSAGE_NAME: &'static str = "MSG_SSR_STEC_CORRECTION"; + const MESSAGE_NAME: &'static str = "MSG_SSR_STEC_CORRECTION_DEP"; } - impl SbpMessage for MsgSsrStecCorrection { + impl SbpMessage for MsgSsrStecCorrectionDep { fn message_name(&self) -> &'static str { ::MESSAGE_NAME } @@ -1681,17 +1927,17 @@ pub mod msg_ssr_stec_correction { } } - impl TryFrom for MsgSsrStecCorrection { + impl TryFrom for MsgSsrStecCorrectionDep { type Error = TryFromSbpError; fn try_from(msg: Sbp) -> Result { match msg { - Sbp::MsgSsrStecCorrection(m) => Ok(m), + Sbp::MsgSsrStecCorrectionDep(m) => Ok(m), _ => Err(TryFromSbpError), } } } - impl WireFormat for MsgSsrStecCorrection { + impl WireFormat for MsgSsrStecCorrectionDep { const MIN_LEN: usize = ::MIN_LEN + as WireFormat>::MIN_LEN; fn len(&self) -> usize { @@ -1702,7 +1948,7 @@ pub mod msg_ssr_stec_correction { WireFormat::write(&self.stec_sat_list, buf); } fn parse_unchecked(buf: &mut B) -> Self { - MsgSsrStecCorrection { + MsgSsrStecCorrectionDep { sender_id: None, header: WireFormat::parse_unchecked(buf), stec_sat_list: WireFormat::parse_unchecked(buf), @@ -1809,6 +2055,9 @@ pub mod msg_ssr_tile_definition { /// The message sender_id #[cfg_attr(feature = "serde", serde(skip_serializing))] pub sender_id: Option, + /// SSR Solution ID. + #[cfg_attr(feature = "serde", serde(rename(serialize = "ssr_sol_id")))] + pub ssr_sol_id: u8, /// Unique identifier of the tile set this tile belongs to. #[cfg_attr(feature = "serde", serde(rename(serialize = "tile_set_id")))] pub tile_set_id: u16, @@ -1876,7 +2125,7 @@ pub mod msg_ssr_tile_definition { } impl ConcreteMessage for MsgSsrTileDefinition { - const MESSAGE_TYPE: u16 = 1526; + const MESSAGE_TYPE: u16 = 1527; const MESSAGE_NAME: &'static str = "MSG_SSR_TILE_DEFINITION"; } @@ -1909,6 +2158,182 @@ pub mod msg_ssr_tile_definition { } impl WireFormat for MsgSsrTileDefinition { + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN; + fn len(&self) -> usize { + WireFormat::len(&self.ssr_sol_id) + + WireFormat::len(&self.tile_set_id) + + WireFormat::len(&self.tile_id) + + WireFormat::len(&self.corner_nw_lat) + + WireFormat::len(&self.corner_nw_lon) + + WireFormat::len(&self.spacing_lat) + + WireFormat::len(&self.spacing_lon) + + WireFormat::len(&self.rows) + + WireFormat::len(&self.cols) + + WireFormat::len(&self.bitmask) + } + fn write(&self, buf: &mut B) { + WireFormat::write(&self.ssr_sol_id, buf); + WireFormat::write(&self.tile_set_id, buf); + WireFormat::write(&self.tile_id, buf); + WireFormat::write(&self.corner_nw_lat, buf); + WireFormat::write(&self.corner_nw_lon, buf); + WireFormat::write(&self.spacing_lat, buf); + WireFormat::write(&self.spacing_lon, buf); + WireFormat::write(&self.rows, buf); + WireFormat::write(&self.cols, buf); + WireFormat::write(&self.bitmask, buf); + } + fn parse_unchecked(buf: &mut B) -> Self { + MsgSsrTileDefinition { + sender_id: None, + ssr_sol_id: WireFormat::parse_unchecked(buf), + tile_set_id: WireFormat::parse_unchecked(buf), + tile_id: WireFormat::parse_unchecked(buf), + corner_nw_lat: WireFormat::parse_unchecked(buf), + corner_nw_lon: WireFormat::parse_unchecked(buf), + spacing_lat: WireFormat::parse_unchecked(buf), + spacing_lon: WireFormat::parse_unchecked(buf), + rows: WireFormat::parse_unchecked(buf), + cols: WireFormat::parse_unchecked(buf), + bitmask: WireFormat::parse_unchecked(buf), + } + } + } +} + +pub mod msg_ssr_tile_definition_dep { + #![allow(unused_imports)] + + use super::*; + use crate::messages::gnss::*; + use crate::messages::lib::*; + + /// Definition of a SSR atmospheric correction tile. + + /// + /// Provides the correction point coordinates for the atmospheric correction + /// values in the MSG_SSR_STEC_CORRECTION_DEP and MSG_SSR_GRIDDED_CORRECTION + /// messages. + /// + /// Based on ETSI TS 137 355 V16.1.0 (LTE Positioning Protocol) information + /// element GNSS-SSR-CorrectionPoints. SBP only supports gridded arrays of + /// correction points, not lists of points. + /// + #[cfg_attr(feature = "serde", derive(serde::Serialize))] + #[derive(Debug, Clone)] + pub struct MsgSsrTileDefinitionDep { + /// The message sender_id + #[cfg_attr(feature = "serde", serde(skip_serializing))] + pub sender_id: Option, + /// Unique identifier of the tile set this tile belongs to. + #[cfg_attr(feature = "serde", serde(rename(serialize = "tile_set_id")))] + pub tile_set_id: u16, + /// Unique identifier of this tile in the tile set. + /// See GNSS-SSR-ArrayOfCorrectionPoints field correctionPointSetID. + #[cfg_attr(feature = "serde", serde(rename(serialize = "tile_id")))] + pub tile_id: u16, + /// North-West corner correction point latitude. + /// + /// The relation between the latitude X in the range \[-90, 90\] and the coded + /// number N is: + /// + /// N = floor((X / 90) * 2^14) + /// + /// See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLatitude. + #[cfg_attr(feature = "serde", serde(rename(serialize = "corner_nw_lat")))] + pub corner_nw_lat: i16, + /// North-West corner correction point longitude. + /// + /// The relation between the longitude X in the range \[-180, 180\] and the + /// coded number N is: + /// + /// N = floor((X / 180) * 2^15) + /// + /// See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLongitude. + #[cfg_attr(feature = "serde", serde(rename(serialize = "corner_nw_lon")))] + pub corner_nw_lon: i16, + /// Spacing of the correction points in the latitude direction. + /// + /// See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLatitude. + #[cfg_attr(feature = "serde", serde(rename(serialize = "spacing_lat")))] + pub spacing_lat: u16, + /// Spacing of the correction points in the longitude direction. + /// + /// See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLongitude. + #[cfg_attr(feature = "serde", serde(rename(serialize = "spacing_lon")))] + pub spacing_lon: u16, + /// Number of steps in the latitude direction. + /// + /// See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLatitude. + #[cfg_attr(feature = "serde", serde(rename(serialize = "rows")))] + pub rows: u16, + /// Number of steps in the longitude direction. + /// + /// See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLongitude. + #[cfg_attr(feature = "serde", serde(rename(serialize = "cols")))] + pub cols: u16, + /// Specifies the availability of correction data at the correction points + /// in the array. + /// + /// If a specific bit is enabled (set to 1), the correction is not + /// available. Only the first rows * cols bits are used, the remainder are + /// set to 0. If there are more then 64 correction points the remaining + /// corrections are always available. + /// + /// Starting with the northwest corner of the array (top left on a north + /// oriented map) the correction points are enumerated with row precedence - + /// first row west to east, second row west to east, until last row west to + /// east - ending with the southeast corner of the array. + /// + /// See GNSS-SSR-ArrayOfCorrectionPoints field bitmaskOfGrids but note the + /// definition of the bits is inverted. + #[cfg_attr(feature = "serde", serde(rename(serialize = "bitmask")))] + pub bitmask: u64, + } + + impl ConcreteMessage for MsgSsrTileDefinitionDep { + const MESSAGE_TYPE: u16 = 1526; + const MESSAGE_NAME: &'static str = "MSG_SSR_TILE_DEFINITION_DEP"; + } + + impl SbpMessage for MsgSsrTileDefinitionDep { + fn message_name(&self) -> &'static str { + ::MESSAGE_NAME + } + fn message_type(&self) -> u16 { + ::MESSAGE_TYPE + } + fn sender_id(&self) -> Option { + self.sender_id + } + fn set_sender_id(&mut self, new_id: u16) { + self.sender_id = Some(new_id); + } + fn encoded_len(&self) -> usize { + WireFormat::len(self) + crate::HEADER_LEN + crate::CRC_LEN + } + } + + impl TryFrom for MsgSsrTileDefinitionDep { + type Error = TryFromSbpError; + fn try_from(msg: Sbp) -> Result { + match msg { + Sbp::MsgSsrTileDefinitionDep(m) => Ok(m), + _ => Err(TryFromSbpError), + } + } + } + + impl WireFormat for MsgSsrTileDefinitionDep { const MIN_LEN: usize = ::MIN_LEN + ::MIN_LEN + ::MIN_LEN @@ -1941,7 +2366,7 @@ pub mod msg_ssr_tile_definition { WireFormat::write(&self.bitmask, buf); } fn parse_unchecked(buf: &mut B) -> Self { - MsgSsrTileDefinition { + MsgSsrTileDefinitionDep { sender_id: None, tile_set_id: WireFormat::parse_unchecked(buf), tile_id: WireFormat::parse_unchecked(buf), @@ -2411,6 +2836,73 @@ pub mod stec_sat_element { } } +pub mod stec_sat_element_integrity { + #![allow(unused_imports)] + + use super::*; + use crate::messages::gnss::*; + use crate::messages::lib::*; + + /// None + /// + /// STEC polynomial and bounds for the given satellite. + /// + #[cfg_attr(feature = "serde", derive(serde::Serialize))] + #[derive(Debug, Clone)] + pub struct STECSatElementIntegrity { + /// STEC residuals (mean, stddev) + #[cfg_attr(feature = "serde", serde(rename(serialize = "stec_residual")))] + pub stec_residual: STECResidual, + /// STEC Error Bound Mean (range 0-17.5) i<= 200, mean = 0.01i 200230, mean=5+0.5(i-230) + #[cfg_attr(feature = "serde", serde(rename(serialize = "stec_bound_mu")))] + pub stec_bound_mu: u8, + /// STEC Error Bound Standard Deviation (range 0-17.5) i<= 200, mean = 0.01i + /// 200230, mean=5+0.5(i-230) + #[cfg_attr(feature = "serde", serde(rename(serialize = "stec_bound_sig")))] + pub stec_bound_sig: u8, + /// STEC Error Bound Mean First derivative degradation parameter(range + /// 0-0.01275) + #[cfg_attr(feature = "serde", serde(rename(serialize = "stec_bound_mu_dot")))] + pub stec_bound_mu_dot: u8, + /// STEC Error Bound Standard Deviation First derivative degradation + /// parameter (range 0-0.01275) + #[cfg_attr(feature = "serde", serde(rename(serialize = "stec_bound_sig_dot")))] + pub stec_bound_sig_dot: u8, + } + + impl WireFormat for STECSatElementIntegrity { + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN; + fn len(&self) -> usize { + WireFormat::len(&self.stec_residual) + + WireFormat::len(&self.stec_bound_mu) + + WireFormat::len(&self.stec_bound_sig) + + WireFormat::len(&self.stec_bound_mu_dot) + + WireFormat::len(&self.stec_bound_sig_dot) + } + fn write(&self, buf: &mut B) { + WireFormat::write(&self.stec_residual, buf); + WireFormat::write(&self.stec_bound_mu, buf); + WireFormat::write(&self.stec_bound_sig, buf); + WireFormat::write(&self.stec_bound_mu_dot, buf); + WireFormat::write(&self.stec_bound_sig_dot, buf); + } + fn parse_unchecked(buf: &mut B) -> Self { + STECSatElementIntegrity { + stec_residual: WireFormat::parse_unchecked(buf), + stec_bound_mu: WireFormat::parse_unchecked(buf), + stec_bound_sig: WireFormat::parse_unchecked(buf), + stec_bound_mu_dot: WireFormat::parse_unchecked(buf), + stec_bound_sig_dot: WireFormat::parse_unchecked(buf), + } + } + } +} + pub mod satellite_apc { #![allow(unused_imports)] diff --git a/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_gridded_correction_bounds.rs b/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_gridded_correction_bounds.rs new file mode 100644 index 0000000000..511027ffab --- /dev/null +++ b/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_gridded_correction_bounds.rs @@ -0,0 +1,193 @@ +// +// Copyright (C) 2019-2021 Swift Navigation Inc. +// Contact: https://support.swiftnav.com +// +// This source is subject to the license found in the file 'LICENSE' which must +// be be distributed together with this source. All other rights reserved. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +// EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + +// This file was auto-generated from spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml by generate.py. Do not modify by hand! + +use crate::*; + +#[test] +fn test_auto_check_sbp_ssr_msg_ssr_gridded_correction_bounds() { + { + let mut payload = Cursor::new(vec![ + 85, 254, 5, 66, 0, 43, 180, 0, 0, 0, 3, 0, 1, 1, 10, 0, 15, 1, 0, 10, 0, 39, 232, 3, + 244, 1, 100, 200, 150, 100, 2, 5, 10, 16, 0, 17, 18, 19, 20, 21, 6, 10, 22, 0, 23, 24, + 25, 26, 27, 112, 145, + ]); + + // Test the round trip payload parsing + let sbp_msg = { + let mut msgs = iter_messages(&mut payload); + msgs.next() + .expect("no message found") + .expect("failed to parse message") + }; + match &sbp_msg { + sbp::messages::Sbp::MsgSsrGriddedCorrectionBounds(msg) => { + assert_eq!( + msg.message_type(), + 1534, + "Incorrect message type, expected 1534, is {}", + msg.message_type() + ); + let sender_id = msg.sender_id().unwrap(); + assert_eq!( + sender_id, 0x0042, + "incorrect sender id, expected 0x0042, is {}", + sender_id + ); + assert_eq!( + msg.grid_point_id, 1000, + "incorrect value for grid_point_id, expected 1000, is {}", + msg.grid_point_id + ); + assert_eq!( + msg.header.num_msgs, 1, + "incorrect value for header.num_msgs, expected 1, is {}", + msg.header.num_msgs + ); + assert_eq!( + msg.header.seq_num, 1, + "incorrect value for header.seq_num, expected 1, is {}", + msg.header.seq_num + ); + assert_eq!( + msg.header.sol_id, 0, + "incorrect value for header.sol_id, expected 0, is {}", + msg.header.sol_id + ); + assert_eq!( + msg.header.time.tow, 180, + "incorrect value for header.time.tow, expected 180, is {}", + msg.header.time.tow + ); + assert_eq!( + msg.header.time.wn, 3, + "incorrect value for header.time.wn, expected 3, is {}", + msg.header.time.wn + ); + assert_eq!( + msg.header.update_interval, 10, + "incorrect value for header.update_interval, expected 10, is {}", + msg.header.update_interval + ); + assert_eq!( + msg.n_sats, 2, + "incorrect value for n_sats, expected 2, is {}", + msg.n_sats + ); + assert_eq!( + msg.ssr_iod_atmo, 15, + "incorrect value for ssr_iod_atmo, expected 15, is {}", + msg.ssr_iod_atmo + ); + assert_eq!( + msg.stec_sat_list[0].stec_bound_mu, 18, + "incorrect value for stec_sat_list[0].stec_bound_mu, expected 18, is {}", + msg.stec_sat_list[0].stec_bound_mu + ); + assert_eq!( + msg.stec_sat_list[0].stec_bound_mu_dot, 20, + "incorrect value for stec_sat_list[0].stec_bound_mu_dot, expected 20, is {}", + msg.stec_sat_list[0].stec_bound_mu_dot + ); + assert_eq!( + msg.stec_sat_list[0].stec_bound_sig, 19, + "incorrect value for stec_sat_list[0].stec_bound_sig, expected 19, is {}", + msg.stec_sat_list[0].stec_bound_sig + ); + assert_eq!( + msg.stec_sat_list[0].stec_bound_sig_dot, 21, + "incorrect value for stec_sat_list[0].stec_bound_sig_dot, expected 21, is {}", + msg.stec_sat_list[0].stec_bound_sig_dot + ); + assert_eq!(msg.stec_sat_list[0].stec_residual.residual, 16, "incorrect value for stec_sat_list[0].stec_residual.residual, expected 16, is {}", msg.stec_sat_list[0].stec_residual.residual); + assert_eq!( + msg.stec_sat_list[0].stec_residual.stddev, 17, + "incorrect value for stec_sat_list[0].stec_residual.stddev, expected 17, is {}", + msg.stec_sat_list[0].stec_residual.stddev + ); + assert_eq!(msg.stec_sat_list[0].stec_residual.sv_id.constellation, 10, "incorrect value for stec_sat_list[0].stec_residual.sv_id.constellation, expected 10, is {}", msg.stec_sat_list[0].stec_residual.sv_id.constellation); + assert_eq!(msg.stec_sat_list[0].stec_residual.sv_id.sat_id, 5, "incorrect value for stec_sat_list[0].stec_residual.sv_id.sat_id, expected 5, is {}", msg.stec_sat_list[0].stec_residual.sv_id.sat_id); + assert_eq!( + msg.stec_sat_list[1].stec_bound_mu, 24, + "incorrect value for stec_sat_list[1].stec_bound_mu, expected 24, is {}", + msg.stec_sat_list[1].stec_bound_mu + ); + assert_eq!( + msg.stec_sat_list[1].stec_bound_mu_dot, 26, + "incorrect value for stec_sat_list[1].stec_bound_mu_dot, expected 26, is {}", + msg.stec_sat_list[1].stec_bound_mu_dot + ); + assert_eq!( + msg.stec_sat_list[1].stec_bound_sig, 25, + "incorrect value for stec_sat_list[1].stec_bound_sig, expected 25, is {}", + msg.stec_sat_list[1].stec_bound_sig + ); + assert_eq!( + msg.stec_sat_list[1].stec_bound_sig_dot, 27, + "incorrect value for stec_sat_list[1].stec_bound_sig_dot, expected 27, is {}", + msg.stec_sat_list[1].stec_bound_sig_dot + ); + assert_eq!(msg.stec_sat_list[1].stec_residual.residual, 22, "incorrect value for stec_sat_list[1].stec_residual.residual, expected 22, is {}", msg.stec_sat_list[1].stec_residual.residual); + assert_eq!( + msg.stec_sat_list[1].stec_residual.stddev, 23, + "incorrect value for stec_sat_list[1].stec_residual.stddev, expected 23, is {}", + msg.stec_sat_list[1].stec_residual.stddev + ); + assert_eq!(msg.stec_sat_list[1].stec_residual.sv_id.constellation, 10, "incorrect value for stec_sat_list[1].stec_residual.sv_id.constellation, expected 10, is {}", msg.stec_sat_list[1].stec_residual.sv_id.constellation); + assert_eq!(msg.stec_sat_list[1].stec_residual.sv_id.sat_id, 6, "incorrect value for stec_sat_list[1].stec_residual.sv_id.sat_id, expected 6, is {}", msg.stec_sat_list[1].stec_residual.sv_id.sat_id); + assert_eq!( + msg.tile_id, 10, + "incorrect value for tile_id, expected 10, is {}", + msg.tile_id + ); + assert_eq!( + msg.tile_set_id, 1, + "incorrect value for tile_set_id, expected 1, is {}", + msg.tile_set_id + ); + assert_eq!( + msg.tropo_bound_mu, 150, + "incorrect value for tropo_bound_mu, expected 150, is {}", + msg.tropo_bound_mu + ); + assert_eq!( + msg.tropo_bound_sig, 100, + "incorrect value for tropo_bound_sig, expected 100, is {}", + msg.tropo_bound_sig + ); + assert_eq!( + msg.tropo_delay_correction.hydro, 500, + "incorrect value for tropo_delay_correction.hydro, expected 500, is {}", + msg.tropo_delay_correction.hydro + ); + assert_eq!( + msg.tropo_delay_correction.stddev, 200, + "incorrect value for tropo_delay_correction.stddev, expected 200, is {}", + msg.tropo_delay_correction.stddev + ); + assert_eq!( + msg.tropo_delay_correction.wet, 100, + "incorrect value for tropo_delay_correction.wet, expected 100, is {}", + msg.tropo_delay_correction.wet + ); + assert_eq!( + msg.tropo_qi, 39, + "incorrect value for tropo_qi, expected 39, is {}", + msg.tropo_qi + ); + } + _ => panic!("Invalid message type! Expected a MsgSsrGriddedCorrectionBounds"), + }; + let frame = sbp::to_vec(&sbp_msg).unwrap(); + assert_eq!(frame, payload.into_inner()); + } +} diff --git a/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_stec_correction.rs b/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_stec_correction.rs new file mode 100644 index 0000000000..6c84a0ca11 --- /dev/null +++ b/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_stec_correction.rs @@ -0,0 +1,163 @@ +// +// Copyright (C) 2019-2021 Swift Navigation Inc. +// Contact: https://support.swiftnav.com +// +// This source is subject to the license found in the file 'LICENSE' which must +// be be distributed together with this source. All other rights reserved. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +// EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + +// This file was auto-generated from spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrection.yaml by generate.py. Do not modify by hand! + +use crate::*; + +#[test] +fn test_auto_check_sbp_ssr_msg_ssr_stec_correction() { + { + let mut payload = Cursor::new(vec![ + 85, 253, 5, 66, 0, 38, 180, 0, 0, 0, 3, 0, 1, 1, 10, 0, 15, 1, 0, 10, 0, 2, 1, 1, 1, + 63, 0, 62, 0, 61, 0, 60, 0, 31, 15, 5, 63, 0, 64, 0, 65, 0, 66, 0, 119, 50, + ]); + + // Test the round trip payload parsing + let sbp_msg = { + let mut msgs = iter_messages(&mut payload); + msgs.next() + .expect("no message found") + .expect("failed to parse message") + }; + match &sbp_msg { + sbp::messages::Sbp::MsgSsrStecCorrection(msg) => { + assert_eq!( + msg.message_type(), + 1533, + "Incorrect message type, expected 1533, is {}", + msg.message_type() + ); + let sender_id = msg.sender_id().unwrap(); + assert_eq!( + sender_id, 0x0042, + "incorrect sender id, expected 0x0042, is {}", + sender_id + ); + assert_eq!( + msg.header.num_msgs, 1, + "incorrect value for header.num_msgs, expected 1, is {}", + msg.header.num_msgs + ); + assert_eq!( + msg.header.seq_num, 1, + "incorrect value for header.seq_num, expected 1, is {}", + msg.header.seq_num + ); + assert_eq!( + msg.header.sol_id, 0, + "incorrect value for header.sol_id, expected 0, is {}", + msg.header.sol_id + ); + assert_eq!( + msg.header.time.tow, 180, + "incorrect value for header.time.tow, expected 180, is {}", + msg.header.time.tow + ); + assert_eq!( + msg.header.time.wn, 3, + "incorrect value for header.time.wn, expected 3, is {}", + msg.header.time.wn + ); + assert_eq!( + msg.header.update_interval, 10, + "incorrect value for header.update_interval, expected 10, is {}", + msg.header.update_interval + ); + assert_eq!( + msg.n_sats, 2, + "incorrect value for n_sats, expected 2, is {}", + msg.n_sats + ); + assert_eq!( + msg.ssr_iod_atmo, 15, + "incorrect value for ssr_iod_atmo, expected 15, is {}", + msg.ssr_iod_atmo + ); + assert_eq!( + msg.stec_sat_list[0].stec_coeff[0], 63, + "incorrect value for stec_sat_list[0].stec_coeff[0], expected 63, is {}", + msg.stec_sat_list[0].stec_coeff[0] + ); + assert_eq!( + msg.stec_sat_list[0].stec_coeff[1], 62, + "incorrect value for stec_sat_list[0].stec_coeff[1], expected 62, is {}", + msg.stec_sat_list[0].stec_coeff[1] + ); + assert_eq!( + msg.stec_sat_list[0].stec_coeff[2], 61, + "incorrect value for stec_sat_list[0].stec_coeff[2], expected 61, is {}", + msg.stec_sat_list[0].stec_coeff[2] + ); + assert_eq!( + msg.stec_sat_list[0].stec_coeff[3], 60, + "incorrect value for stec_sat_list[0].stec_coeff[3], expected 60, is {}", + msg.stec_sat_list[0].stec_coeff[3] + ); + assert_eq!(msg.stec_sat_list[0].stec_quality_indicator, 1, "incorrect value for stec_sat_list[0].stec_quality_indicator, expected 1, is {}", msg.stec_sat_list[0].stec_quality_indicator); + assert_eq!( + msg.stec_sat_list[0].sv_id.constellation, 1, + "incorrect value for stec_sat_list[0].sv_id.constellation, expected 1, is {}", + msg.stec_sat_list[0].sv_id.constellation + ); + assert_eq!( + msg.stec_sat_list[0].sv_id.sat_id, 1, + "incorrect value for stec_sat_list[0].sv_id.sat_id, expected 1, is {}", + msg.stec_sat_list[0].sv_id.sat_id + ); + assert_eq!( + msg.stec_sat_list[1].stec_coeff[0], 63, + "incorrect value for stec_sat_list[1].stec_coeff[0], expected 63, is {}", + msg.stec_sat_list[1].stec_coeff[0] + ); + assert_eq!( + msg.stec_sat_list[1].stec_coeff[1], 64, + "incorrect value for stec_sat_list[1].stec_coeff[1], expected 64, is {}", + msg.stec_sat_list[1].stec_coeff[1] + ); + assert_eq!( + msg.stec_sat_list[1].stec_coeff[2], 65, + "incorrect value for stec_sat_list[1].stec_coeff[2], expected 65, is {}", + msg.stec_sat_list[1].stec_coeff[2] + ); + assert_eq!( + msg.stec_sat_list[1].stec_coeff[3], 66, + "incorrect value for stec_sat_list[1].stec_coeff[3], expected 66, is {}", + msg.stec_sat_list[1].stec_coeff[3] + ); + assert_eq!(msg.stec_sat_list[1].stec_quality_indicator, 5, "incorrect value for stec_sat_list[1].stec_quality_indicator, expected 5, is {}", msg.stec_sat_list[1].stec_quality_indicator); + assert_eq!( + msg.stec_sat_list[1].sv_id.constellation, 15, + "incorrect value for stec_sat_list[1].sv_id.constellation, expected 15, is {}", + msg.stec_sat_list[1].sv_id.constellation + ); + assert_eq!( + msg.stec_sat_list[1].sv_id.sat_id, 31, + "incorrect value for stec_sat_list[1].sv_id.sat_id, expected 31, is {}", + msg.stec_sat_list[1].sv_id.sat_id + ); + assert_eq!( + msg.tile_id, 10, + "incorrect value for tile_id, expected 10, is {}", + msg.tile_id + ); + assert_eq!( + msg.tile_set_id, 1, + "incorrect value for tile_set_id, expected 1, is {}", + msg.tile_set_id + ); + } + _ => panic!("Invalid message type! Expected a MsgSsrStecCorrection"), + }; + let frame = sbp::to_vec(&sbp_msg).unwrap(); + assert_eq!(frame, payload.into_inner()); + } +} diff --git a/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_tile_definition.rs b/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_tile_definition.rs new file mode 100644 index 0000000000..0759f5c936 --- /dev/null +++ b/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_tile_definition.rs @@ -0,0 +1,101 @@ +// +// Copyright (C) 2019-2021 Swift Navigation Inc. +// Contact: https://support.swiftnav.com +// +// This source is subject to the license found in the file 'LICENSE' which must +// be be distributed together with this source. All other rights reserved. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +// EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + +// This file was auto-generated from spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinition.yaml by generate.py. Do not modify by hand! + +use crate::*; + +#[test] +fn test_auto_check_sbp_ssr_msg_ssr_tile_definition() { + { + let mut payload = Cursor::new(vec![ + 85, 247, 5, 66, 0, 25, 31, 0, 1, 0, 2, 0, 4, 0, 8, 0, 16, 0, 32, 0, 64, 0, 128, 210, 2, + 150, 73, 0, 0, 0, 0, 214, 71, + ]); + + // Test the round trip payload parsing + let sbp_msg = { + let mut msgs = iter_messages(&mut payload); + msgs.next() + .expect("no message found") + .expect("failed to parse message") + }; + match &sbp_msg { + sbp::messages::Sbp::MsgSsrTileDefinition(msg) => { + assert_eq!( + msg.message_type(), + 1527, + "Incorrect message type, expected 1527, is {}", + msg.message_type() + ); + let sender_id = msg.sender_id().unwrap(); + assert_eq!( + sender_id, 0x0042, + "incorrect sender id, expected 0x0042, is {}", + sender_id + ); + assert_eq!( + msg.bitmask, 1234567890, + "incorrect value for bitmask, expected 1234567890, is {}", + msg.bitmask + ); + assert_eq!( + msg.cols, 32768, + "incorrect value for cols, expected 32768, is {}", + msg.cols + ); + assert_eq!( + msg.corner_nw_lat, 1024, + "incorrect value for corner_nw_lat, expected 1024, is {}", + msg.corner_nw_lat + ); + assert_eq!( + msg.corner_nw_lon, 2048, + "incorrect value for corner_nw_lon, expected 2048, is {}", + msg.corner_nw_lon + ); + assert_eq!( + msg.rows, 16384, + "incorrect value for rows, expected 16384, is {}", + msg.rows + ); + assert_eq!( + msg.spacing_lat, 4096, + "incorrect value for spacing_lat, expected 4096, is {}", + msg.spacing_lat + ); + assert_eq!( + msg.spacing_lon, 8192, + "incorrect value for spacing_lon, expected 8192, is {}", + msg.spacing_lon + ); + assert_eq!( + msg.ssr_sol_id, 31, + "incorrect value for ssr_sol_id, expected 31, is {}", + msg.ssr_sol_id + ); + assert_eq!( + msg.tile_id, 512, + "incorrect value for tile_id, expected 512, is {}", + msg.tile_id + ); + assert_eq!( + msg.tile_set_id, 256, + "incorrect value for tile_set_id, expected 256, is {}", + msg.tile_set_id + ); + } + _ => panic!("Invalid message type! Expected a MsgSsrTileDefinition"), + }; + let frame = sbp::to_vec(&sbp_msg).unwrap(); + assert_eq!(frame, payload.into_inner()); + } +} diff --git a/rust/sbp/tests/integration/main.rs b/rust/sbp/tests/integration/main.rs index ebd82121f2..3d7d0f5481 100644 --- a/rust/sbp/tests/integration/main.rs +++ b/rust/sbp/tests/integration/main.rs @@ -83,7 +83,10 @@ mod auto_check_sbp_sbas_msg_sbas_raw; mod auto_check_sbp_settings_msg_settings_read_by_index_done; mod auto_check_sbp_settings_msg_settings_read_by_index_resp; mod auto_check_sbp_ssr_msg_ssr_code_phase_biases_bounds; +mod auto_check_sbp_ssr_msg_ssr_gridded_correction_bounds; mod auto_check_sbp_ssr_msg_ssr_orbit_clock_bounds; +mod auto_check_sbp_ssr_msg_ssr_stec_correction; +mod auto_check_sbp_ssr_msg_ssr_tile_definition; mod auto_check_sbp_system_msg_dgnss_status; mod auto_check_sbp_system_msg_group_meta; mod auto_check_sbp_system_msg_heartbeat; diff --git a/sbpjson/elm/SbpJson.elm b/sbpjson/elm/SbpJson.elm index d53974c362..cea7608b72 100644 --- a/sbpjson/elm/SbpJson.elm +++ b/sbpjson/elm/SbpJson.elm @@ -5,7 +5,7 @@ -- add these imports -- -- import Json.Decode exposing (decodeString)`); --- import SbpJson exposing (acqSvProfile, almanacCommonContent, boundsHeader, carrierPhase, codeBiasesContent, codePhaseBiasesSatSig, doppler, ephemerisCommonContent, estimatedHorizontalErrorEllipse, gnssInputType, gnssCapb, gnssSignal, gpsTime, gpsTimeSEC, gridElement, gridElementNoStd, griddedCorrectionHeader, imuInputType, latency, measurementState, msgAcqResult, msgAcqSvProfile, msgAgeCorrections, msgAlmanac, msgAlmanacGPS, msgAlmanacGlo, msgAngularRate, msgBasePosECEF, msgBasePosLLH, msgBaselineECEF, msgBaselineHeading, msgBaselineNED, msgBootloaderHandshakeReq, msgBootloaderHandshakeResp, msgBootloaderJumpToApp, msgCellModemStatus, msgCommandOutput, msgCommandReq, msgCommandResp, msgCsacTelemetry, msgCsacTelemetryLabels, msgCwResults, msgCwStart, msgDeviceMonitor, msgDgnssStatus, msgDops, msgEphemerisBds, msgEphemerisGPS, msgEphemerisGal, msgEphemerisGlo, msgEphemerisQzss, msgEphemerisSbas, msgEXTEvent, msgFileioConfigReq, msgFileioConfigResp, msgFileioReadDirReq, msgFileioReadDirResp, msgFileioReadReq, msgFileioReadResp, msgFileioRemove, msgFileioWriteReq, msgFileioWriteResp, msgFlashDone, msgFlashErase, msgFlashProgram, msgFlashReadReq, msgFlashReadResp, msgFrontEndGain, msgFwd, msgGPSTime, msgGPSTimeGnss, msgGloBiases, msgGnssCapb, msgGnssTimeOffset, msgGroupDelay, msgGroupMeta, msgHeartbeat, msgIarState, msgImuAux, msgImuRaw, msgInsStatus, msgInsUpdates, msgIono, msgLinuxCPUState, msgLinuxMemState, msgLinuxProcessFdCount, msgLinuxProcessFdSummary, msgLinuxProcessSocketCounts, msgLinuxProcessSocketQueues, msgLinuxSocketUsage, msgLinuxSysState, msgLog, msgM25FlashWriteStatus, msgMagRaw, msgMaskSatellite, msgMeasurementState, msgNapDeviceDnaReq, msgNapDeviceDnaResp, msgNdbEvent, msgNetworkBandwidthUsage, msgNetworkStateReq, msgNetworkStateResp, msgObs, msgOdometry, msgOrientEuler, msgOrientQuat, msgOsr, msgPosECEF, msgPosECEFCov, msgPosECEFCovGnss, msgPosECEFGnss, msgPosLLH, msgPosLLHAcc, msgPosLLHCov, msgPosLLHCovGnss, msgPosLLHGnss, msgPpsTime, msgProtectionLevel, msgReset, msgResetFilters, msgSbasRaw, msgSensorAidEvent, msgSetTime, msgSettingsReadByIndexDone, msgSettingsReadByIndexReq, msgSettingsReadByIndexResp, msgSettingsReadReq, msgSettingsReadResp, msgSettingsRegister, msgSettingsRegisterResp, msgSettingsSave, msgSettingsWrite, msgSettingsWriteResp, msgSolnMeta, msgSpecan, msgSsrCodeBiases, msgSsrCodePhaseBiasesBounds, msgSsrGriddedCorrection, msgSsrOrbitClock, msgSsrOrbitClockBounds, msgSsrPhaseBiases, msgSsrSatelliteApc, msgSsrStecCorrection, msgSsrTileDefinition, msgStartup, msgStatusJournal, msgStatusReport, msgStmFlashLockSector, msgStmFlashUnlockSector, msgStmUniqueIDReq, msgStmUniqueIDResp, msgSvAzEl, msgThreadState, msgTrackingIq, msgTrackingState, msgUARTState, msgUserData, msgUTCTime, msgUTCTimeGnss, msgVelBody, msgVelCog, msgVelECEF, msgVelECEFCov, msgVelECEFCovGnss, msgVelECEFGnss, msgVelNED, msgVelNEDCov, msgVelNEDCovGnss, msgVelNEDGnss, msgWheeltick, networkUsage, observationHeader, odoInputType, orbitClockBound, packedObsContent, packedOsrContent, period, phaseBiasesContent, stecHeader, stecResidual, stecResidualNoStd, stecSatElement, satelliteAPC, solutionInputType, statusJournalItem, subSystemReport, svAzEl, svID, trackingChannelCorrelation, trackingChannelState, troposphericDelayCorrection, troposphericDelayCorrectionNoStd, uartChannel) +-- import SbpJson exposing (acqSvProfile, almanacCommonContent, boundsHeader, carrierPhase, codeBiasesContent, codePhaseBiasesSatSig, doppler, ephemerisCommonContent, estimatedHorizontalErrorEllipse, gnssInputType, gnssCapb, gnssSignal, gpsTime, gpsTimeSEC, gridElement, gridElementNoStd, griddedCorrectionHeader, imuInputType, latency, measurementState, msgAcqResult, msgAcqSvProfile, msgAgeCorrections, msgAlmanac, msgAlmanacGPS, msgAlmanacGlo, msgAngularRate, msgBasePosECEF, msgBasePosLLH, msgBaselineECEF, msgBaselineHeading, msgBaselineNED, msgBootloaderHandshakeReq, msgBootloaderHandshakeResp, msgBootloaderJumpToApp, msgCellModemStatus, msgCommandOutput, msgCommandReq, msgCommandResp, msgCsacTelemetry, msgCsacTelemetryLabels, msgCwResults, msgCwStart, msgDeviceMonitor, msgDgnssStatus, msgDops, msgEphemerisBds, msgEphemerisGPS, msgEphemerisGal, msgEphemerisGlo, msgEphemerisQzss, msgEphemerisSbas, msgEXTEvent, msgFileioConfigReq, msgFileioConfigResp, msgFileioReadDirReq, msgFileioReadDirResp, msgFileioReadReq, msgFileioReadResp, msgFileioRemove, msgFileioWriteReq, msgFileioWriteResp, msgFlashDone, msgFlashErase, msgFlashProgram, msgFlashReadReq, msgFlashReadResp, msgFrontEndGain, msgFwd, msgGPSTime, msgGPSTimeGnss, msgGloBiases, msgGnssCapb, msgGnssTimeOffset, msgGroupDelay, msgGroupMeta, msgHeartbeat, msgIarState, msgImuAux, msgImuRaw, msgInsStatus, msgInsUpdates, msgIono, msgLinuxCPUState, msgLinuxMemState, msgLinuxProcessFdCount, msgLinuxProcessFdSummary, msgLinuxProcessSocketCounts, msgLinuxProcessSocketQueues, msgLinuxSocketUsage, msgLinuxSysState, msgLog, msgM25FlashWriteStatus, msgMagRaw, msgMaskSatellite, msgMeasurementState, msgNapDeviceDnaReq, msgNapDeviceDnaResp, msgNdbEvent, msgNetworkBandwidthUsage, msgNetworkStateReq, msgNetworkStateResp, msgObs, msgOdometry, msgOrientEuler, msgOrientQuat, msgOsr, msgPosECEF, msgPosECEFCov, msgPosECEFCovGnss, msgPosECEFGnss, msgPosLLH, msgPosLLHAcc, msgPosLLHCov, msgPosLLHCovGnss, msgPosLLHGnss, msgPpsTime, msgProtectionLevel, msgReset, msgResetFilters, msgSbasRaw, msgSensorAidEvent, msgSetTime, msgSettingsReadByIndexDone, msgSettingsReadByIndexReq, msgSettingsReadByIndexResp, msgSettingsReadReq, msgSettingsReadResp, msgSettingsRegister, msgSettingsRegisterResp, msgSettingsSave, msgSettingsWrite, msgSettingsWriteResp, msgSolnMeta, msgSpecan, msgSsrCodeBiases, msgSsrCodePhaseBiasesBounds, msgSsrGriddedCorrection, msgSsrGriddedCorrectionBounds, msgSsrOrbitClock, msgSsrOrbitClockBounds, msgSsrPhaseBiases, msgSsrSatelliteApc, msgSsrStecCorrection, msgSsrTileDefinition, msgStartup, msgStatusJournal, msgStatusReport, msgStmFlashLockSector, msgStmFlashUnlockSector, msgStmUniqueIDReq, msgStmUniqueIDResp, msgSvAzEl, msgThreadState, msgTrackingIq, msgTrackingState, msgUARTState, msgUserData, msgUTCTime, msgUTCTimeGnss, msgVelBody, msgVelCog, msgVelECEF, msgVelECEFCov, msgVelECEFCovGnss, msgVelECEFGnss, msgVelNED, msgVelNEDCov, msgVelNEDCovGnss, msgVelNEDGnss, msgWheeltick, networkUsage, observationHeader, odoInputType, orbitClockBound, packedObsContent, packedOsrContent, period, phaseBiasesContent, stecHeader, stecResidual, stecResidualNoStd, stecSatElement, stecSatElementIntegrity, satelliteAPC, solutionInputType, statusJournalItem, subSystemReport, svAzEl, svID, trackingChannelCorrelation, trackingChannelState, troposphericDelayCorrection, troposphericDelayCorrectionNoStd, uartChannel) -- -- and you're off to the races with -- @@ -147,6 +147,7 @@ -- decodeString msgSsrCodeBiases myJsonString -- decodeString msgSsrCodePhaseBiasesBounds myJsonString -- decodeString msgSsrGriddedCorrection myJsonString +-- decodeString msgSsrGriddedCorrectionBounds myJsonString -- decodeString msgSsrOrbitClock myJsonString -- decodeString msgSsrOrbitClockBounds myJsonString -- decodeString msgSsrPhaseBiases myJsonString @@ -191,6 +192,7 @@ -- decodeString stecResidual myJsonString -- decodeString stecResidualNoStd myJsonString -- decodeString stecSatElement myJsonString +-- decodeString stecSatElementIntegrity myJsonString -- decodeString satelliteAPC myJsonString -- decodeString solutionInputType myJsonString -- decodeString statusJournalItem myJsonString @@ -618,6 +620,9 @@ module SbpJson exposing , MsgSsrGriddedCorrection , msgSsrGriddedCorrectionToString , msgSsrGriddedCorrection + , MsgSsrGriddedCorrectionBounds + , msgSsrGriddedCorrectionBoundsToString + , msgSsrGriddedCorrectionBounds , MsgSsrOrbitClock , msgSsrOrbitClockToString , msgSsrOrbitClock @@ -750,6 +755,9 @@ module SbpJson exposing , STECSatElement , stecSatElementToString , stecSatElement + , STECSatElementIntegrity + , stecSatElementIntegrityToString + , stecSatElementIntegrity , SatelliteAPC , satelliteAPCToString , satelliteAPC @@ -2475,6 +2483,29 @@ type alias GriddedCorrectionHeader = , updateInterval : Int } +type alias MsgSsrGriddedCorrectionBounds = + { gridPointID : Int + , header : BoundsHeader + , nSats : Int + , ssrIodAtmo : Int + , stecSatList : Array STECSatElementIntegrity + , tileID : Int + , tileSetID : Int + , tropoBoundMu : Int + , tropoBoundSig : Int + , tropoDelayCorrection : TroposphericDelayCorrection + , tropoQi : Int + } + +{-| STEC polynomial and bounds for the given satellite. -} +type alias STECSatElementIntegrity = + { stecBoundMu : Int + , stecBoundMuDot : Int + , stecBoundSig : Int + , stecBoundSigDot : Int + , stecResidual : STECResidual + } + {-| The precise orbit and clock correction message is to be applied as a delta correction to broadcast ephemeris and is an equivalent to the 1060 /1066 RTCM message types. -} @@ -2557,28 +2588,13 @@ type alias SatelliteAPC = , svn : Int } -{-| The Slant Total Electron Content per space vehicle, given as polynomial approximation for -a given tile. This should be combined with the MSG_SSR_GRIDDED_CORRECTION message to get -the state space representation of the atmospheric delay., -, -It is typically equivalent to the QZSS CLAS Sub Type 8 messages. --} type alias MsgSsrStecCorrection = - { header : STECHeader + { header : BoundsHeader + , nSats : Int + , ssrIodAtmo : Int , stecSatList : Array STECSatElement - } - -{-| A full set of STEC information will likely span multiple SBP messages, since SBP message -a limited to 255 bytes. The header is used to tie multiple SBP messages into a sequence. --} -type alias STECHeader = - { iodAtmo : Int - , numMsgs : Int - , seqNum : Int , tileID : Int , tileSetID : Int - , time : GpsTimeSEC - , updateInterval : Int } {-| STEC polynomial for the given satellite. -} @@ -2603,6 +2619,7 @@ type alias MsgSsrTileDefinition = , rows : Int , spacingLat : Int , spacingLon : Int + , ssrSolID : Int , tileID : Int , tileSetID : Int } @@ -3029,6 +3046,19 @@ type alias OdoInputType = { flags : Int } +{-| A full set of STEC information will likely span multiple SBP messages, since SBP message +a limited to 255 bytes. The header is used to tie multiple SBP messages into a sequence. +-} +type alias STECHeader = + { iodAtmo : Int + , numMsgs : Int + , seqNum : Int + , tileID : Int + , tileSetID : Int + , time : GpsTimeSEC + , updateInterval : Int + } + -- decoders and encoders acqSvProfileToString : AcqSvProfile -> String @@ -3472,6 +3502,9 @@ msgSsrCodePhaseBiasesBoundsToString r = Jenc.encode 0 (encodeMsgSsrCodePhaseBias msgSsrGriddedCorrectionToString : MsgSsrGriddedCorrection -> String msgSsrGriddedCorrectionToString r = Jenc.encode 0 (encodeMsgSsrGriddedCorrection r) +msgSsrGriddedCorrectionBoundsToString : MsgSsrGriddedCorrectionBounds -> String +msgSsrGriddedCorrectionBoundsToString r = Jenc.encode 0 (encodeMsgSsrGriddedCorrectionBounds r) + msgSsrOrbitClockToString : MsgSsrOrbitClock -> String msgSsrOrbitClockToString r = Jenc.encode 0 (encodeMsgSsrOrbitClock r) @@ -3607,6 +3640,9 @@ stecResidualNoStdToString r = Jenc.encode 0 (encodeSTECResidualNoStd r) stecSatElementToString : STECSatElement -> String stecSatElementToString r = Jenc.encode 0 (encodeSTECSatElement r) +stecSatElementIntegrityToString : STECSatElementIntegrity -> String +stecSatElementIntegrityToString r = Jenc.encode 0 (encodeSTECSatElementIntegrity r) + satelliteAPCToString : SatelliteAPC -> String satelliteAPCToString r = Jenc.encode 0 (encodeSatelliteAPC r) @@ -6256,6 +6292,56 @@ encodeGriddedCorrectionHeader x = , ("update_interval", Jenc.int x.updateInterval) ] +msgSsrGriddedCorrectionBounds : Jdec.Decoder MsgSsrGriddedCorrectionBounds +msgSsrGriddedCorrectionBounds = + Jpipe.decode MsgSsrGriddedCorrectionBounds + |> Jpipe.required "grid_point_id" Jdec.int + |> Jpipe.required "header" boundsHeader + |> Jpipe.required "n_sats" Jdec.int + |> Jpipe.required "ssr_iod_atmo" Jdec.int + |> Jpipe.required "stec_sat_list" (Jdec.array stecSatElementIntegrity) + |> Jpipe.required "tile_id" Jdec.int + |> Jpipe.required "tile_set_id" Jdec.int + |> Jpipe.required "tropo_bound_mu" Jdec.int + |> Jpipe.required "tropo_bound_sig" Jdec.int + |> Jpipe.required "tropo_delay_correction" troposphericDelayCorrection + |> Jpipe.required "tropo_qi" Jdec.int + +encodeMsgSsrGriddedCorrectionBounds : MsgSsrGriddedCorrectionBounds -> Jenc.Value +encodeMsgSsrGriddedCorrectionBounds x = + Jenc.object + [ ("grid_point_id", Jenc.int x.gridPointID) + , ("header", encodeBoundsHeader x.header) + , ("n_sats", Jenc.int x.nSats) + , ("ssr_iod_atmo", Jenc.int x.ssrIodAtmo) + , ("stec_sat_list", makeArrayEncoder encodeSTECSatElementIntegrity x.stecSatList) + , ("tile_id", Jenc.int x.tileID) + , ("tile_set_id", Jenc.int x.tileSetID) + , ("tropo_bound_mu", Jenc.int x.tropoBoundMu) + , ("tropo_bound_sig", Jenc.int x.tropoBoundSig) + , ("tropo_delay_correction", encodeTroposphericDelayCorrection x.tropoDelayCorrection) + , ("tropo_qi", Jenc.int x.tropoQi) + ] + +stecSatElementIntegrity : Jdec.Decoder STECSatElementIntegrity +stecSatElementIntegrity = + Jpipe.decode STECSatElementIntegrity + |> Jpipe.required "stec_bound_mu" Jdec.int + |> Jpipe.required "stec_bound_mu_dot" Jdec.int + |> Jpipe.required "stec_bound_sig" Jdec.int + |> Jpipe.required "stec_bound_sig_dot" Jdec.int + |> Jpipe.required "stec_residual" stecResidual + +encodeSTECSatElementIntegrity : STECSatElementIntegrity -> Jenc.Value +encodeSTECSatElementIntegrity x = + Jenc.object + [ ("stec_bound_mu", Jenc.int x.stecBoundMu) + , ("stec_bound_mu_dot", Jenc.int x.stecBoundMuDot) + , ("stec_bound_sig", Jenc.int x.stecBoundSig) + , ("stec_bound_sig_dot", Jenc.int x.stecBoundSigDot) + , ("stec_residual", encodeSTECResidual x.stecResidual) + ] + msgSsrOrbitClock : Jdec.Decoder MsgSsrOrbitClock msgSsrOrbitClock = Jpipe.decode MsgSsrOrbitClock @@ -6418,37 +6504,22 @@ encodeSatelliteAPC x = msgSsrStecCorrection : Jdec.Decoder MsgSsrStecCorrection msgSsrStecCorrection = Jpipe.decode MsgSsrStecCorrection - |> Jpipe.required "header" stecHeader + |> Jpipe.required "header" boundsHeader + |> Jpipe.required "n_sats" Jdec.int + |> Jpipe.required "ssr_iod_atmo" Jdec.int |> Jpipe.required "stec_sat_list" (Jdec.array stecSatElement) + |> Jpipe.required "tile_id" Jdec.int + |> Jpipe.required "tile_set_id" Jdec.int encodeMsgSsrStecCorrection : MsgSsrStecCorrection -> Jenc.Value encodeMsgSsrStecCorrection x = Jenc.object - [ ("header", encodeSTECHeader x.header) + [ ("header", encodeBoundsHeader x.header) + , ("n_sats", Jenc.int x.nSats) + , ("ssr_iod_atmo", Jenc.int x.ssrIodAtmo) , ("stec_sat_list", makeArrayEncoder encodeSTECSatElement x.stecSatList) - ] - -stecHeader : Jdec.Decoder STECHeader -stecHeader = - Jpipe.decode STECHeader - |> Jpipe.required "iod_atmo" Jdec.int - |> Jpipe.required "num_msgs" Jdec.int - |> Jpipe.required "seq_num" Jdec.int - |> Jpipe.required "tile_id" Jdec.int - |> Jpipe.required "tile_set_id" Jdec.int - |> Jpipe.required "time" gpsTimeSEC - |> Jpipe.required "update_interval" Jdec.int - -encodeSTECHeader : STECHeader -> Jenc.Value -encodeSTECHeader x = - Jenc.object - [ ("iod_atmo", Jenc.int x.iodAtmo) - , ("num_msgs", Jenc.int x.numMsgs) - , ("seq_num", Jenc.int x.seqNum) , ("tile_id", Jenc.int x.tileID) , ("tile_set_id", Jenc.int x.tileSetID) - , ("time", encodeGpsTimeSEC x.time) - , ("update_interval", Jenc.int x.updateInterval) ] stecSatElement : Jdec.Decoder STECSatElement @@ -6476,6 +6547,7 @@ msgSsrTileDefinition = |> Jpipe.required "rows" Jdec.int |> Jpipe.required "spacing_lat" Jdec.int |> Jpipe.required "spacing_lon" Jdec.int + |> Jpipe.required "ssr_sol_id" Jdec.int |> Jpipe.required "tile_id" Jdec.int |> Jpipe.required "tile_set_id" Jdec.int @@ -6489,6 +6561,7 @@ encodeMsgSsrTileDefinition x = , ("rows", Jenc.int x.rows) , ("spacing_lat", Jenc.int x.spacingLat) , ("spacing_lon", Jenc.int x.spacingLon) + , ("ssr_sol_id", Jenc.int x.ssrSolID) , ("tile_id", Jenc.int x.tileID) , ("tile_set_id", Jenc.int x.tileSetID) ] @@ -7153,6 +7226,29 @@ encodeOdoInputType x = [ ("flags", Jenc.int x.flags) ] +stecHeader : Jdec.Decoder STECHeader +stecHeader = + Jpipe.decode STECHeader + |> Jpipe.required "iod_atmo" Jdec.int + |> Jpipe.required "num_msgs" Jdec.int + |> Jpipe.required "seq_num" Jdec.int + |> Jpipe.required "tile_id" Jdec.int + |> Jpipe.required "tile_set_id" Jdec.int + |> Jpipe.required "time" gpsTimeSEC + |> Jpipe.required "update_interval" Jdec.int + +encodeSTECHeader : STECHeader -> Jenc.Value +encodeSTECHeader x = + Jenc.object + [ ("iod_atmo", Jenc.int x.iodAtmo) + , ("num_msgs", Jenc.int x.numMsgs) + , ("seq_num", Jenc.int x.seqNum) + , ("tile_id", Jenc.int x.tileID) + , ("tile_set_id", Jenc.int x.tileSetID) + , ("time", encodeGpsTimeSEC x.time) + , ("update_interval", Jenc.int x.updateInterval) + ] + --- encoder helpers makeArrayEncoder : (a -> Jenc.Value) -> Array a -> Jenc.Value diff --git a/sbpjson/javascript/SbpJson.js b/sbpjson/javascript/SbpJson.js index 59a78d276d..28ae6dc0fd 100644 --- a/sbpjson/javascript/SbpJson.js +++ b/sbpjson/javascript/SbpJson.js @@ -140,6 +140,7 @@ // const msgSsrCodeBiases = Convert.toMsgSsrCodeBiases(json); // const msgSsrCodePhaseBiasesBounds = Convert.toMsgSsrCodePhaseBiasesBounds(json); // const msgSsrGriddedCorrection = Convert.toMsgSsrGriddedCorrection(json); +// const msgSsrGriddedCorrectionBounds = Convert.toMsgSsrGriddedCorrectionBounds(json); // const msgSsrOrbitClock = Convert.toMsgSsrOrbitClock(json); // const msgSsrOrbitClockBounds = Convert.toMsgSsrOrbitClockBounds(json); // const msgSsrPhaseBiases = Convert.toMsgSsrPhaseBiases(json); @@ -184,6 +185,7 @@ // const sTECResidual = Convert.toSTECResidual(json); // const sTECResidualNoStd = Convert.toSTECResidualNoStd(json); // const sTECSatElement = Convert.toSTECSatElement(json); +// const sTECSatElementIntegrity = Convert.toSTECSatElementIntegrity(json); // const satelliteAPC = Convert.toSatelliteAPC(json); // const solutionInputType = Convert.toSolutionInputType(json); // const statusJournalItem = Convert.toStatusJournalItem(json); @@ -1305,6 +1307,14 @@ function msgSsrGriddedCorrectionToJson(value) { return JSON.stringify(uncast(value, r("MsgSsrGriddedCorrection")), null, 2); } +function toMsgSsrGriddedCorrectionBounds(json) { + return cast(JSON.parse(json), r("MsgSsrGriddedCorrectionBounds")); +} + +function msgSsrGriddedCorrectionBoundsToJson(value) { + return JSON.stringify(uncast(value, r("MsgSsrGriddedCorrectionBounds")), null, 2); +} + function toMsgSsrOrbitClock(json) { return cast(JSON.parse(json), r("MsgSsrOrbitClock")); } @@ -1657,6 +1667,14 @@ function sTECSatElementToJson(value) { return JSON.stringify(uncast(value, r("STECSatElement")), null, 2); } +function toSTECSatElementIntegrity(json) { + return cast(JSON.parse(json), r("STECSatElementIntegrity")); +} + +function sTECSatElementIntegrityToJson(value) { + return JSON.stringify(uncast(value, r("STECSatElementIntegrity")), null, 2); +} + function toSatelliteAPC(json) { return cast(JSON.parse(json), r("SatelliteAPC")); } @@ -2841,6 +2859,26 @@ const typeMap = { { json: "tropo_quality_indicator", js: "tropo_quality_indicator", typ: 0 }, { json: "update_interval", js: "update_interval", typ: 0 }, ], "any"), + "MsgSsrGriddedCorrectionBounds": o([ + { json: "grid_point_id", js: "grid_point_id", typ: 0 }, + { json: "header", js: "header", typ: r("BoundsHeader") }, + { json: "n_sats", js: "n_sats", typ: 0 }, + { json: "ssr_iod_atmo", js: "ssr_iod_atmo", typ: 0 }, + { json: "stec_sat_list", js: "stec_sat_list", typ: a(r("STECSatElementIntegrity")) }, + { json: "tile_id", js: "tile_id", typ: 0 }, + { json: "tile_set_id", js: "tile_set_id", typ: 0 }, + { json: "tropo_bound_mu", js: "tropo_bound_mu", typ: 0 }, + { json: "tropo_bound_sig", js: "tropo_bound_sig", typ: 0 }, + { json: "tropo_delay_correction", js: "tropo_delay_correction", typ: r("TroposphericDelayCorrection") }, + { json: "tropo_qi", js: "tropo_qi", typ: 0 }, + ], "any"), + "STECSatElementIntegrity": o([ + { json: "stec_bound_mu", js: "stec_bound_mu", typ: 0 }, + { json: "stec_bound_mu_dot", js: "stec_bound_mu_dot", typ: 0 }, + { json: "stec_bound_sig", js: "stec_bound_sig", typ: 0 }, + { json: "stec_bound_sig_dot", js: "stec_bound_sig_dot", typ: 0 }, + { json: "stec_residual", js: "stec_residual", typ: r("STECResidual") }, + ], "any"), "MsgSsrOrbitClock": o([ { json: "along", js: "along", typ: 0 }, { json: "c0", js: "c0", typ: 0 }, @@ -2904,17 +2942,12 @@ const typeMap = { { json: "svn", js: "svn", typ: 0 }, ], "any"), "MsgSsrStecCorrection": o([ - { json: "header", js: "header", typ: r("STECHeader") }, + { json: "header", js: "header", typ: r("BoundsHeader") }, + { json: "n_sats", js: "n_sats", typ: 0 }, + { json: "ssr_iod_atmo", js: "ssr_iod_atmo", typ: 0 }, { json: "stec_sat_list", js: "stec_sat_list", typ: a(r("STECSatElement")) }, - ], "any"), - "STECHeader": o([ - { json: "iod_atmo", js: "iod_atmo", typ: 0 }, - { json: "num_msgs", js: "num_msgs", typ: 0 }, - { json: "seq_num", js: "seq_num", typ: 0 }, { json: "tile_id", js: "tile_id", typ: 0 }, { json: "tile_set_id", js: "tile_set_id", typ: 0 }, - { json: "time", js: "time", typ: r("GpsTimeSEC") }, - { json: "update_interval", js: "update_interval", typ: 0 }, ], "any"), "STECSatElement": o([ { json: "stec_coeff", js: "stec_coeff", typ: a(0) }, @@ -2929,6 +2962,7 @@ const typeMap = { { json: "rows", js: "rows", typ: 0 }, { json: "spacing_lat", js: "spacing_lat", typ: 0 }, { json: "spacing_lon", js: "spacing_lon", typ: 0 }, + { json: "ssr_sol_id", js: "ssr_sol_id", typ: 0 }, { json: "tile_id", js: "tile_id", typ: 0 }, { json: "tile_set_id", js: "tile_set_id", typ: 0 }, ], "any"), @@ -3177,6 +3211,15 @@ const typeMap = { "OdoInputType": o([ { json: "flags", js: "flags", typ: 0 }, ], "any"), + "STECHeader": o([ + { json: "iod_atmo", js: "iod_atmo", typ: 0 }, + { json: "num_msgs", js: "num_msgs", typ: 0 }, + { json: "seq_num", js: "seq_num", typ: 0 }, + { json: "tile_id", js: "tile_id", typ: 0 }, + { json: "tile_set_id", js: "tile_set_id", typ: 0 }, + { json: "time", js: "time", typ: r("GpsTimeSEC") }, + { json: "update_interval", js: "update_interval", typ: 0 }, + ], "any"), }; module.exports = { @@ -3456,6 +3499,8 @@ module.exports = { "toMsgSsrCodePhaseBiasesBounds": toMsgSsrCodePhaseBiasesBounds, "msgSsrGriddedCorrectionToJson": msgSsrGriddedCorrectionToJson, "toMsgSsrGriddedCorrection": toMsgSsrGriddedCorrection, + "msgSsrGriddedCorrectionBoundsToJson": msgSsrGriddedCorrectionBoundsToJson, + "toMsgSsrGriddedCorrectionBounds": toMsgSsrGriddedCorrectionBounds, "msgSsrOrbitClockToJson": msgSsrOrbitClockToJson, "toMsgSsrOrbitClock": toMsgSsrOrbitClock, "msgSsrOrbitClockBoundsToJson": msgSsrOrbitClockBoundsToJson, @@ -3544,6 +3589,8 @@ module.exports = { "toSTECResidualNoStd": toSTECResidualNoStd, "sTECSatElementToJson": sTECSatElementToJson, "toSTECSatElement": toSTECSatElement, + "sTECSatElementIntegrityToJson": sTECSatElementIntegrityToJson, + "toSTECSatElementIntegrity": toSTECSatElementIntegrity, "satelliteAPCToJson": satelliteAPCToJson, "toSatelliteAPC": toSatelliteAPC, "solutionInputTypeToJson": solutionInputTypeToJson, diff --git a/sbpjson/typescript/SbpJson.ts b/sbpjson/typescript/SbpJson.ts index d0f59f1b96..55dee1b441 100644 --- a/sbpjson/typescript/SbpJson.ts +++ b/sbpjson/typescript/SbpJson.ts @@ -1,6 +1,6 @@ // To parse this data: // -// import { Convert, AcqSvProfile, AlmanacCommonContent, BoundsHeader, CarrierPhase, CodeBiasesContent, CodePhaseBiasesSatSig, Doppler, EphemerisCommonContent, EstimatedHorizontalErrorEllipse, GNSSInputType, GnssCapb, GnssSignal, GpsTime, GpsTimeSEC, GridElement, GridElementNoStd, GriddedCorrectionHeader, IMUInputType, Latency, MeasurementState, MsgAcqResult, MsgAcqSvProfile, MsgAgeCorrections, MsgAlmanacGPS, MsgAlmanacGlo, MsgAngularRate, MsgBasePosECEF, MsgBasePosLLH, MsgBaselineECEF, MsgBaselineHeading, MsgBaselineNED, MsgBootloaderHandshakeResp, MsgBootloaderJumpToApp, MsgCellModemStatus, MsgCommandOutput, MsgCommandReq, MsgCommandResp, MsgCsacTelemetry, MsgCsacTelemetryLabels, MsgDeviceMonitor, MsgDgnssStatus, MsgDops, MsgEphemerisBds, MsgEphemerisGPS, MsgEphemerisGal, MsgEphemerisGlo, MsgEphemerisQzss, MsgEphemerisSbas, MsgEXTEvent, MsgFileioConfigReq, MsgFileioConfigResp, MsgFileioReadDirReq, MsgFileioReadDirResp, MsgFileioReadReq, MsgFileioReadResp, MsgFileioRemove, MsgFileioWriteReq, MsgFileioWriteResp, MsgFlashDone, MsgFlashErase, MsgFlashProgram, MsgFlashReadReq, MsgFlashReadResp, MsgFrontEndGain, MsgFwd, MsgGPSTime, MsgGPSTimeGnss, MsgGloBiases, MsgGnssCapb, MsgGnssTimeOffset, MsgGroupDelay, MsgGroupMeta, MsgHeartbeat, MsgIarState, MsgImuAux, MsgImuRaw, MsgInsStatus, MsgInsUpdates, MsgIono, MsgLinuxCPUState, MsgLinuxMemState, MsgLinuxProcessFdCount, MsgLinuxProcessFdSummary, MsgLinuxProcessSocketCounts, MsgLinuxProcessSocketQueues, MsgLinuxSocketUsage, MsgLinuxSysState, MsgLog, MsgM25FlashWriteStatus, MsgMagRaw, MsgMaskSatellite, MsgMeasurementState, MsgNapDeviceDnaResp, MsgNdbEvent, MsgNetworkBandwidthUsage, MsgNetworkStateResp, MsgObs, MsgOdometry, MsgOrientEuler, MsgOrientQuat, MsgOsr, MsgPosECEF, MsgPosECEFCov, MsgPosECEFCovGnss, MsgPosECEFGnss, MsgPosLLH, MsgPosLLHAcc, MsgPosLLHCov, MsgPosLLHCovGnss, MsgPosLLHGnss, MsgPpsTime, MsgProtectionLevel, MsgReset, MsgResetFilters, MsgSbasRaw, MsgSensorAidEvent, MsgSettingsReadByIndexReq, MsgSettingsReadByIndexResp, MsgSettingsReadReq, MsgSettingsReadResp, MsgSettingsRegister, MsgSettingsRegisterResp, MsgSettingsWrite, MsgSettingsWriteResp, MsgSolnMeta, MsgSpecan, MsgSsrCodeBiases, MsgSsrCodePhaseBiasesBounds, MsgSsrGriddedCorrection, MsgSsrOrbitClock, MsgSsrOrbitClockBounds, MsgSsrPhaseBiases, MsgSsrSatelliteApc, MsgSsrStecCorrection, MsgSsrTileDefinition, MsgStartup, MsgStatusJournal, MsgStatusReport, MsgStmFlashLockSector, MsgStmFlashUnlockSector, MsgStmUniqueIDResp, MsgSvAzEl, MsgThreadState, MsgTrackingIq, MsgTrackingState, MsgUARTState, MsgUserData, MsgUTCTime, MsgUTCTimeGnss, MsgVelBody, MsgVelCog, MsgVelECEF, MsgVelECEFCov, MsgVelECEFCovGnss, MsgVelECEFGnss, MsgVelNED, MsgVelNEDCov, MsgVelNEDCovGnss, MsgVelNEDGnss, MsgWheeltick, NetworkUsage, ObservationHeader, OdoInputType, OrbitClockBound, PackedObsContent, PackedOsrContent, Period, PhaseBiasesContent, STECHeader, STECResidual, STECResidualNoStd, STECSatElement, SatelliteAPC, SolutionInputType, StatusJournalItem, SubSystemReport, SvAzEl, SvID, TrackingChannelCorrelation, TrackingChannelState, TroposphericDelayCorrection, TroposphericDelayCorrectionNoStd, UARTChannel } from "./file"; +// import { Convert, AcqSvProfile, AlmanacCommonContent, BoundsHeader, CarrierPhase, CodeBiasesContent, CodePhaseBiasesSatSig, Doppler, EphemerisCommonContent, EstimatedHorizontalErrorEllipse, GNSSInputType, GnssCapb, GnssSignal, GpsTime, GpsTimeSEC, GridElement, GridElementNoStd, GriddedCorrectionHeader, IMUInputType, Latency, MeasurementState, MsgAcqResult, MsgAcqSvProfile, MsgAgeCorrections, MsgAlmanacGPS, MsgAlmanacGlo, MsgAngularRate, MsgBasePosECEF, MsgBasePosLLH, MsgBaselineECEF, MsgBaselineHeading, MsgBaselineNED, MsgBootloaderHandshakeResp, MsgBootloaderJumpToApp, MsgCellModemStatus, MsgCommandOutput, MsgCommandReq, MsgCommandResp, MsgCsacTelemetry, MsgCsacTelemetryLabels, MsgDeviceMonitor, MsgDgnssStatus, MsgDops, MsgEphemerisBds, MsgEphemerisGPS, MsgEphemerisGal, MsgEphemerisGlo, MsgEphemerisQzss, MsgEphemerisSbas, MsgEXTEvent, MsgFileioConfigReq, MsgFileioConfigResp, MsgFileioReadDirReq, MsgFileioReadDirResp, MsgFileioReadReq, MsgFileioReadResp, MsgFileioRemove, MsgFileioWriteReq, MsgFileioWriteResp, MsgFlashDone, MsgFlashErase, MsgFlashProgram, MsgFlashReadReq, MsgFlashReadResp, MsgFrontEndGain, MsgFwd, MsgGPSTime, MsgGPSTimeGnss, MsgGloBiases, MsgGnssCapb, MsgGnssTimeOffset, MsgGroupDelay, MsgGroupMeta, MsgHeartbeat, MsgIarState, MsgImuAux, MsgImuRaw, MsgInsStatus, MsgInsUpdates, MsgIono, MsgLinuxCPUState, MsgLinuxMemState, MsgLinuxProcessFdCount, MsgLinuxProcessFdSummary, MsgLinuxProcessSocketCounts, MsgLinuxProcessSocketQueues, MsgLinuxSocketUsage, MsgLinuxSysState, MsgLog, MsgM25FlashWriteStatus, MsgMagRaw, MsgMaskSatellite, MsgMeasurementState, MsgNapDeviceDnaResp, MsgNdbEvent, MsgNetworkBandwidthUsage, MsgNetworkStateResp, MsgObs, MsgOdometry, MsgOrientEuler, MsgOrientQuat, MsgOsr, MsgPosECEF, MsgPosECEFCov, MsgPosECEFCovGnss, MsgPosECEFGnss, MsgPosLLH, MsgPosLLHAcc, MsgPosLLHCov, MsgPosLLHCovGnss, MsgPosLLHGnss, MsgPpsTime, MsgProtectionLevel, MsgReset, MsgResetFilters, MsgSbasRaw, MsgSensorAidEvent, MsgSettingsReadByIndexReq, MsgSettingsReadByIndexResp, MsgSettingsReadReq, MsgSettingsReadResp, MsgSettingsRegister, MsgSettingsRegisterResp, MsgSettingsWrite, MsgSettingsWriteResp, MsgSolnMeta, MsgSpecan, MsgSsrCodeBiases, MsgSsrCodePhaseBiasesBounds, MsgSsrGriddedCorrection, MsgSsrGriddedCorrectionBounds, MsgSsrOrbitClock, MsgSsrOrbitClockBounds, MsgSsrPhaseBiases, MsgSsrSatelliteApc, MsgSsrStecCorrection, MsgSsrTileDefinition, MsgStartup, MsgStatusJournal, MsgStatusReport, MsgStmFlashLockSector, MsgStmFlashUnlockSector, MsgStmUniqueIDResp, MsgSvAzEl, MsgThreadState, MsgTrackingIq, MsgTrackingState, MsgUARTState, MsgUserData, MsgUTCTime, MsgUTCTimeGnss, MsgVelBody, MsgVelCog, MsgVelECEF, MsgVelECEFCov, MsgVelECEFCovGnss, MsgVelECEFGnss, MsgVelNED, MsgVelNEDCov, MsgVelNEDCovGnss, MsgVelNEDGnss, MsgWheeltick, NetworkUsage, ObservationHeader, OdoInputType, OrbitClockBound, PackedObsContent, PackedOsrContent, Period, PhaseBiasesContent, STECHeader, STECResidual, STECResidualNoStd, STECSatElement, STECSatElementIntegrity, SatelliteAPC, SolutionInputType, StatusJournalItem, SubSystemReport, SvAzEl, SvID, TrackingChannelCorrelation, TrackingChannelState, TroposphericDelayCorrection, TroposphericDelayCorrectionNoStd, UARTChannel } from "./file"; // // const acqSvProfile = Convert.toAcqSvProfile(json); // const almanacCommonContent = Convert.toAlmanacCommonContent(json); @@ -140,6 +140,7 @@ // const msgSsrCodeBiases = Convert.toMsgSsrCodeBiases(json); // const msgSsrCodePhaseBiasesBounds = Convert.toMsgSsrCodePhaseBiasesBounds(json); // const msgSsrGriddedCorrection = Convert.toMsgSsrGriddedCorrection(json); +// const msgSsrGriddedCorrectionBounds = Convert.toMsgSsrGriddedCorrectionBounds(json); // const msgSsrOrbitClock = Convert.toMsgSsrOrbitClock(json); // const msgSsrOrbitClockBounds = Convert.toMsgSsrOrbitClockBounds(json); // const msgSsrPhaseBiases = Convert.toMsgSsrPhaseBiases(json); @@ -184,6 +185,7 @@ // const sTECResidual = Convert.toSTECResidual(json); // const sTECResidualNoStd = Convert.toSTECResidualNoStd(json); // const sTECSatElement = Convert.toSTECSatElement(json); +// const sTECSatElementIntegrity = Convert.toSTECSatElementIntegrity(json); // const satelliteAPC = Convert.toSatelliteAPC(json); // const solutionInputType = Convert.toSolutionInputType(json); // const statusJournalItem = Convert.toStatusJournalItem(json); @@ -2014,6 +2016,31 @@ export interface GriddedCorrectionHeader { update_interval: number; } +export interface MsgSsrGriddedCorrectionBounds { + grid_point_id: number; + header: BoundsHeader; + n_sats: number; + ssr_iod_atmo: number; + stec_sat_list: STECSatElementIntegrity[]; + tile_id: number; + tile_set_id: number; + tropo_bound_mu: number; + tropo_bound_sig: number; + tropo_delay_correction: TroposphericDelayCorrection; + tropo_qi: number; +} + +/** + * STEC polynomial and bounds for the given satellite. + */ +export interface STECSatElementIntegrity { + stec_bound_mu: number; + stec_bound_mu_dot: number; + stec_bound_sig: number; + stec_bound_sig_dot: number; + stec_residual: STECResidual; +} + /** * The precise orbit and clock correction message is to be applied as a delta correction to * broadcast ephemeris and is an equivalent to the 1060 /1066 RTCM message types. @@ -2103,30 +2130,13 @@ export interface SatelliteAPC { svn: number; } -/** - * The Slant Total Electron Content per space vehicle, given as polynomial approximation for - * a given tile. This should be combined with the MSG_SSR_GRIDDED_CORRECTION message to get - * the state space representation of the atmospheric delay., - * , - * It is typically equivalent to the QZSS CLAS Sub Type 8 messages. - */ export interface MsgSsrStecCorrection { - header: STECHeader; + header: BoundsHeader; + n_sats: number; + ssr_iod_atmo: number; stec_sat_list: STECSatElement[]; -} - -/** - * A full set of STEC information will likely span multiple SBP messages, since SBP message - * a limited to 255 bytes. The header is used to tie multiple SBP messages into a sequence. - */ -export interface STECHeader { - iod_atmo: number; - num_msgs: number; - seq_num: number; - tile_id: number; - tile_set_id: number; - time: GpsTimeSEC; - update_interval: number; + tile_id: number; + tile_set_id: number; } /** @@ -2154,6 +2164,7 @@ export interface MsgSsrTileDefinition { rows: number; spacing_lat: number; spacing_lon: number; + ssr_sol_id: number; tile_id: number; tile_set_id: number; } @@ -2618,6 +2629,20 @@ export interface OdoInputType { flags: number; } +/** + * A full set of STEC information will likely span multiple SBP messages, since SBP message + * a limited to 255 bytes. The header is used to tie multiple SBP messages into a sequence. + */ +export interface STECHeader { + iod_atmo: number; + num_msgs: number; + seq_num: number; + tile_id: number; + tile_set_id: number; + time: GpsTimeSEC; + update_interval: number; +} + // Converts JSON strings to/from your types // and asserts the results of JSON.parse at runtime export class Convert { @@ -3725,6 +3750,14 @@ export class Convert { return JSON.stringify(uncast(value, r("MsgSsrGriddedCorrection")), null, 2); } + public static toMsgSsrGriddedCorrectionBounds(json: string): MsgSsrGriddedCorrectionBounds { + return cast(JSON.parse(json), r("MsgSsrGriddedCorrectionBounds")); + } + + public static msgSsrGriddedCorrectionBoundsToJson(value: MsgSsrGriddedCorrectionBounds): string { + return JSON.stringify(uncast(value, r("MsgSsrGriddedCorrectionBounds")), null, 2); + } + public static toMsgSsrOrbitClock(json: string): MsgSsrOrbitClock { return cast(JSON.parse(json), r("MsgSsrOrbitClock")); } @@ -4077,6 +4110,14 @@ export class Convert { return JSON.stringify(uncast(value, r("STECSatElement")), null, 2); } + public static toSTECSatElementIntegrity(json: string): STECSatElementIntegrity { + return cast(JSON.parse(json), r("STECSatElementIntegrity")); + } + + public static sTECSatElementIntegrityToJson(value: STECSatElementIntegrity): string { + return JSON.stringify(uncast(value, r("STECSatElementIntegrity")), null, 2); + } + public static toSatelliteAPC(json: string): SatelliteAPC { return cast(JSON.parse(json), r("SatelliteAPC")); } @@ -5262,6 +5303,26 @@ const typeMap: any = { { json: "tropo_quality_indicator", js: "tropo_quality_indicator", typ: 0 }, { json: "update_interval", js: "update_interval", typ: 0 }, ], "any"), + "MsgSsrGriddedCorrectionBounds": o([ + { json: "grid_point_id", js: "grid_point_id", typ: 0 }, + { json: "header", js: "header", typ: r("BoundsHeader") }, + { json: "n_sats", js: "n_sats", typ: 0 }, + { json: "ssr_iod_atmo", js: "ssr_iod_atmo", typ: 0 }, + { json: "stec_sat_list", js: "stec_sat_list", typ: a(r("STECSatElementIntegrity")) }, + { json: "tile_id", js: "tile_id", typ: 0 }, + { json: "tile_set_id", js: "tile_set_id", typ: 0 }, + { json: "tropo_bound_mu", js: "tropo_bound_mu", typ: 0 }, + { json: "tropo_bound_sig", js: "tropo_bound_sig", typ: 0 }, + { json: "tropo_delay_correction", js: "tropo_delay_correction", typ: r("TroposphericDelayCorrection") }, + { json: "tropo_qi", js: "tropo_qi", typ: 0 }, + ], "any"), + "STECSatElementIntegrity": o([ + { json: "stec_bound_mu", js: "stec_bound_mu", typ: 0 }, + { json: "stec_bound_mu_dot", js: "stec_bound_mu_dot", typ: 0 }, + { json: "stec_bound_sig", js: "stec_bound_sig", typ: 0 }, + { json: "stec_bound_sig_dot", js: "stec_bound_sig_dot", typ: 0 }, + { json: "stec_residual", js: "stec_residual", typ: r("STECResidual") }, + ], "any"), "MsgSsrOrbitClock": o([ { json: "along", js: "along", typ: 0 }, { json: "c0", js: "c0", typ: 0 }, @@ -5325,17 +5386,12 @@ const typeMap: any = { { json: "svn", js: "svn", typ: 0 }, ], "any"), "MsgSsrStecCorrection": o([ - { json: "header", js: "header", typ: r("STECHeader") }, + { json: "header", js: "header", typ: r("BoundsHeader") }, + { json: "n_sats", js: "n_sats", typ: 0 }, + { json: "ssr_iod_atmo", js: "ssr_iod_atmo", typ: 0 }, { json: "stec_sat_list", js: "stec_sat_list", typ: a(r("STECSatElement")) }, - ], "any"), - "STECHeader": o([ - { json: "iod_atmo", js: "iod_atmo", typ: 0 }, - { json: "num_msgs", js: "num_msgs", typ: 0 }, - { json: "seq_num", js: "seq_num", typ: 0 }, { json: "tile_id", js: "tile_id", typ: 0 }, { json: "tile_set_id", js: "tile_set_id", typ: 0 }, - { json: "time", js: "time", typ: r("GpsTimeSEC") }, - { json: "update_interval", js: "update_interval", typ: 0 }, ], "any"), "STECSatElement": o([ { json: "stec_coeff", js: "stec_coeff", typ: a(0) }, @@ -5350,6 +5406,7 @@ const typeMap: any = { { json: "rows", js: "rows", typ: 0 }, { json: "spacing_lat", js: "spacing_lat", typ: 0 }, { json: "spacing_lon", js: "spacing_lon", typ: 0 }, + { json: "ssr_sol_id", js: "ssr_sol_id", typ: 0 }, { json: "tile_id", js: "tile_id", typ: 0 }, { json: "tile_set_id", js: "tile_set_id", typ: 0 }, ], "any"), @@ -5598,4 +5655,13 @@ const typeMap: any = { "OdoInputType": o([ { json: "flags", js: "flags", typ: 0 }, ], "any"), + "STECHeader": o([ + { json: "iod_atmo", js: "iod_atmo", typ: 0 }, + { json: "num_msgs", js: "num_msgs", typ: 0 }, + { json: "seq_num", js: "seq_num", typ: 0 }, + { json: "tile_id", js: "tile_id", typ: 0 }, + { json: "tile_set_id", js: "tile_set_id", typ: 0 }, + { json: "time", js: "time", typ: r("GpsTimeSEC") }, + { json: "update_interval", js: "update_interval", typ: 0 }, + ], "any"), }; diff --git a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml new file mode 100644 index 0000000000..bed08e07a2 --- /dev/null +++ b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml @@ -0,0 +1,67 @@ +description: Unit tests for swiftnav.sbp.ssr MsgSsrGriddedCorrectionBounds +generated_on: 2022-04-19 # manually generated +package: sbp.ssr +tests: + + - msg: + fields: + header: + time: + tow: 180 + wn: 3 + num_msgs: 1 + seq_num: 1 + update_interval: 10 + sol_id: 0 + ssr_iod_atmo: 15 + tile_set_id: 1 + tile_id: 10 + tropo_qi: 39 + grid_point_id: 1000 + tropo_delay_correction: + hydro: 500 + wet: 100 + stddev: 200 + tropo_bound_mu: 150 + tropo_bound_sig: 100 + n_sats: 2 + stec_sat_list: + - stec_residual: + sv_id: + satId: 5 + constellation: 10 + residual: 16 + stddev: 17 + stec_bound_mu: 18 + stec_bound_sig: 19 + stec_bound_mu_dot: 20 + stec_bound_sig_dot: 21 + - stec_residual: + sv_id: + satId: 6 + constellation: 10 + residual: 22 + stddev: 23 + stec_bound_mu: 24 + stec_bound_sig: 25 + stec_bound_mu_dot: 26 + stec_bound_sig_dot: 27 + module: sbp.ssr + name: MsgSsrGriddedCorrectionBounds + msg_type: '1534' + raw_json: '{"header": {"time": {"tow": 180, "wn": 3}, "num_msgs": 1, "seq_num": 1, "update_interval": 10, "sol_id": 0}, + "ssr_iod_atmo": 15, "tile_set_id": 1, "tile_id": 10, "tropo_qi": 39, "grid_point_id": 1000, "tropo_delay_correction": + {"hydro": 500, "wet": 100, "stddev": 200}, "tropo_bound_mu": 150, "tropo_bound_sig": 100, "n_sats": 2, "stec_sat_list": + [{"stec_residual": {"sv_id": {"satId": 5, "constellation": 10}, "residual": 16, "stddev": 17}, "stec_bound_mu": 18, + "stec_bound_sig": 19, "stec_bound_mu_dot": 20, "stec_bound_sig_dot": 21}, {"stec_residual": {"sv_id": {"satId": 6, + "constellation": 10}, "residual": 22, "stddev": 23}, "stec_bound_mu": 24, "stec_bound_sig": 25, "stec_bound_mu_dot": 26, + "stec_bound_sig_dot": 27}], "preamble": 85, "msg_type": 1534, "sender": 66, "length": 43, + "payload": "tAAAAAMAAQEKAA8BAAoAJ+gD9AFkyJZkAgUKEAAREhMUFQYKFgAXGBkaGw==", "crc": 37232}' + raw_packet: Vf4FQgArtAAAAAMAAQEKAA8BAAoAJ+gD9AFkyJZkAgUKEAAREhMUFQYKFgAXGBkaG3CR + sbp: + preamble: '0x55' + msg_type: '0x05FE' + sender: '0x0042' + length: 43 + payload: tAAAAAMAAQEKAA8BAAoAJ+gD9AFkyJZkAgUKEAAREhMUFQYKFgAXGBkaGw== + crc: '0x9170' diff --git a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrection.yaml b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrection.yaml new file mode 100644 index 0000000000..a0f9a7a3af --- /dev/null +++ b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrection.yaml @@ -0,0 +1,45 @@ +description: Unit tests for swiftnav.sbp.ssr MsgSsrStecCorrection +generated_on: 2022-04-19 # manually generated +package: sbp.ssr +tests: + + - msg: + fields: + header: + time: + tow: 180 + wn: 3 + num_msgs: 1 + seq_num: 1 + update_interval: 10 + sol_id: 0 + ssr_iod_atmo: 15 + tile_set_id: 1 + tile_id: 10 + n_sats: 2 + stec_sat_list: + - sv_id: + satId: 1 + constellation: 1 + stec_quality_indicator: 1 + stec_coeff: [63,62,61,60] + - sv_id: + satId: 31 + constellation: 15 + stec_quality_indicator: 5 + stec_coeff: [63,64,65,66] + module: sbp.ssr + name: MsgSsrStecCorrection + msg_type: '1533' + raw_json: '{"header": {"time": {"tow": 180, "wn": 3}, "num_msgs": 1, "seq_num": 1, "update_interval": 10, "sol_id": 0}, + "ssr_iod_atmo": 15, "tile_set_id": 1, "tile_id": 10, "n_sats": 2, "stec_sat_list": [{"sv_id": {"satId": 1, "constellation": 1}, + "stec_quality_indicator": 1, "stec_coeff": [63, 62, 61, 60]}, {"sv_id": {"satId": 31, "constellation": 15}, "stec_quality_indicator": 5, "stec_coeff": [63, 64, 65, 66]}], + "preamble": 85, "msg_type": 1533, "sender": 66, "length": 38, "payload": "tAAAAAMAAQEKAA8BAAoAAgEBAT8APgA9ADwAHw8FPwBAAEEAQgA=", "crc": 12919}' + raw_packet: Vf0FQgAmtAAAAAMAAQEKAA8BAAoAAgEBAT8APgA9ADwAHw8FPwBAAEEAQgB3Mg== + sbp: + preamble: '0x55' + msg_type: '0x05FD' + sender: '0x0042' + length: 38 + payload: tAAAAAMAAQEKAA8BAAoAAgEBAT8APgA9ADwAHw8FPwBAAEEAQgA= + crc: '0x3277' diff --git a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinition.yaml b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinition.yaml new file mode 100644 index 0000000000..0d3c1846b5 --- /dev/null +++ b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinition.yaml @@ -0,0 +1,31 @@ +description: Unit tests for swiftnav.sbp.ssr MsgSsrTileDefinition +generated_on: 2022-04-20 # manually generated +package: sbp.ssr +tests: + + - msg: + fields: + ssr_sol_id: 31 + tile_set_id: 256 + tile_id: 512 + corner_nw_lat: 1024 + corner_nw_lon: 2048 + spacing_lat: 4096 + spacing_lon: 8192 + rows: 16384 + cols: 32768 + bitmask: 1234567890 + module: sbp.ssr + name: MsgSsrTileDefinition + msg_type: '1527' + raw_json: '{"ssr_sol_id": 31, "tile_set_id": 256, "tile_id": 512, "corner_nw_lat": 1024, "corner_nw_lon": 2048, + "spacing_lat": 4096, "spacing_lon": 8192, "rows": 16384, "cols": 32768, "bitmask": 1234567890, "preamble": 85, + "msg_type": 1527, "sender": 66, "length": 25, "payload": "HwABAAIABAAIABAAIABAAIDSApZJAAAAAA==", "crc": 18390}' + raw_packet: VfcFQgAZHwABAAIABAAIABAAIABAAIDSApZJAAAAANZH + sbp: + preamble: '0x55' + msg_type: '0x05F7' + sender: '0x0042' + length: 25 + payload: HwABAAIABAAIABAAIABAAIDSApZJAAAAAA== + crc: '0x47D6' diff --git a/spec/yaml/swiftnav/sbp/ssr.yaml b/spec/yaml/swiftnav/sbp/ssr.yaml index a5d07f51be..7e5278c370 100644 --- a/spec/yaml/swiftnav/sbp/ssr.yaml +++ b/spec/yaml/swiftnav/sbp/ssr.yaml @@ -359,7 +359,7 @@ definitions: Phase biases corrections for a satellite being tracked. - - MSG_SSR_STEC_CORRECTION: + - MSG_SSR_STEC_CORRECTION_DEP: id: 0x05FB short_desc: STEC correction polynomial coefficients desc: > @@ -370,6 +370,8 @@ definitions: It is typically equivalent to the QZSS CLAS Sub Type 8 messages. + replaced_by: + - MSG_SSR_STEC_CORRECTION fields: - header: type: STECHeader @@ -379,6 +381,53 @@ definitions: fill: STECSatElement desc: Array of STEC polynomial coefficients for each space vehicle. + - BoundsHeader: + short_desc: Header for the Bounds messages + fields: + - time: + type: GPSTimeSec + desc: GNSS reference time of the bound + - num_msgs: + type: u8 + desc: Number of messages in the dataset + - seq_num: + type: u8 + desc: Position of this message in the dataset + - update_interval: + type: u8 + desc: > + Update interval between consecutive bounds. Similar to + RTCM DF391. + - sol_id: + type: u8 + desc: SSR Solution ID. + + - MSG_SSR_STEC_CORRECTION: + id: 0x05FD + short_desc: STEC correction polynomial coefficients + public: False + fields: + - header: + type: BoundsHeader + desc: Header of a STEC correction with bounds message. + - ssr_iod_atmo: + type: u8 + desc: IOD of the SSR atmospheric correction + - tile_set_id: + type: u16 + desc: Tile set ID + - tile_id: + type: u16 + desc: Tile ID + - n_sats: + type: u8 + desc: Number of satellites. + - stec_sat_list: + type: array + fill: STECSatElement + size_fn: n_sats + desc: Array of STEC polynomial coefficients for each space vehicle. + - MSG_SSR_GRIDDED_CORRECTION: id: 0x05FC short_desc: Gridded troposphere and STEC correction residuals @@ -402,19 +451,94 @@ definitions: fill: STECResidual desc: STEC residuals for each satellite (mean, stddev). - - MSG_SSR_TILE_DEFINITION: + - STECSatElementIntegrity: + desc: STEC polynomial and bounds for the given satellite. + fields: + - stec_residual: + type: STECResidual + desc: STEC residuals (mean, stddev) + - stec_bound_mu: + type: u8 + units: m + desc: > + STEC Error Bound Mean (range 0-17.5) + i<= 200, mean = 0.01i + 200230, mean=5+0.5(i-230) + - stec_bound_sig: + type: u8 + units: m + desc: > + STEC Error Bound Standard Deviation (range 0-17.5) + i<= 200, mean = 0.01i + 200230, mean=5+0.5(i-230) + - stec_bound_mu_dot: + type: u8 + units: 0.00005 m/s + desc: STEC Error Bound Mean First derivative degradation parameter(range 0-0.01275) + - stec_bound_sig_dot: + type: u8 + units: 0.00005 m/s + desc: STEC Error Bound Standard Deviation First derivative degradation parameter (range 0-0.01275) + + - MSG_SSR_GRIDDED_CORRECTION_BOUNDS: + id: 0x05FE + short_desc: Gridded troposhere and STEC correction residuals bounds + fields: + - header: + type: BoundsHeader + desc: Header of a bounds message. + - ssr_iod_atmo: + type: u8 + desc: IOD of the SSR atmospheric correction. + - tile_set_id: + type: u16 + desc: Unique identifier of the set this tile belongs to. + - tile_id: + type: u16 + desc: Unique identifier of this tile in the tile set. + - tropo_qi: + type: u8 + desc: Tropo Quality Indicator. Similar to RTCM DF389. + - grid_point_id: + type: u16 + desc: Index of the Grid Point. + - tropo_delay_correction: + type: TroposphericDelayCorrection + desc: Tropospheric delay at grid point. + - tropo_bound_mu: + type: u8 + units: 0.005 m + desc: Troposphere Error Bound Mean (range 0-1.275). + - tropo_bound_sig: + type: u8 + units: 0.005 m + desc: Troposphere Error Bound Standard Deviation (range 0-1.275) + - n_sats: + type: u8 + desc: Number of satellites. + - stec_sat_list: + type: array + fill: STECSatElementIntegrity + size_fn: n_sats + desc: Array of STEC polynomial coefficients and its bounds for each space vehicle. + + - MSG_SSR_TILE_DEFINITION_DEP: id: 0x05F6 short_desc: > Definition of a SSR atmospheric correction tile. desc: > Provides the correction point coordinates for the atmospheric correction - values in the MSG_SSR_STEC_CORRECTION and MSG_SSR_GRIDDED_CORRECTION + values in the MSG_SSR_STEC_CORRECTION_DEP and MSG_SSR_GRIDDED_CORRECTION messages. Based on ETSI TS 137 355 V16.1.0 (LTE Positioning Protocol) information element GNSS-SSR-CorrectionPoints. SBP only supports gridded arrays of correction points, not lists of points. + replaced_by: + - MSG_SSR_TILE_DEFINITION fields: - tile_set_id: type: u16 @@ -508,6 +632,115 @@ definitions: See GNSS-SSR-ArrayOfCorrectionPoints field bitmaskOfGrids but note the definition of the bits is inverted. + - MSG_SSR_TILE_DEFINITION: + id: 0x05F7 + short_desc: > + Definition of a SSR atmospheric correction tile. + desc: > + Provides the correction point coordinates for the atmospheric correction + values in the MSG_SSR_STEC_CORRECTION and MSG_SSR_GRIDDED_CORRECTION + messages. + + + Based on ETSI TS 137 355 V16.1.0 (LTE Positioning Protocol) information + element GNSS-SSR-CorrectionPoints. SBP only supports gridded arrays of + correction points, not lists of points. + fields: + - ssr_sol_id: + type: u8 + desc: SSR Solution ID. + - tile_set_id: + type: u16 + desc: Unique identifier of the tile set this tile belongs to. + - tile_id: + type: u16 + desc: > + Unique identifier of this tile in the tile set. + + See GNSS-SSR-ArrayOfCorrectionPoints field correctionPointSetID. + - corner_nw_lat: + type: s16 + units: encoded degrees + desc: > + North-West corner correction point latitude. + + + The relation between the latitude X in the range [-90, 90] and + the coded number N is: + + + N = floor((X / 90) * 2^14) + + + See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLatitude. + - corner_nw_lon: + type: s16 + units: encoded degrees + desc: > + North-West corner correction point longitude. + + + The relation between the longitude X in the range [-180, 180] + and the coded number N is: + + + N = floor((X / 180) * 2^15) + + + See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLongitude. + - spacing_lat: + type: u16 + units: 0.01 degrees + desc: > + Spacing of the correction points in the latitude direction. + + + See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLatitude. + - spacing_lon: + type: u16 + units: 0.01 degrees + desc: > + Spacing of the correction points in the longitude direction. + + + See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLongitude. + - rows: + type: u16 + desc: > + Number of steps in the latitude direction. + + + See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLatitude. + - cols: + type: u16 + desc: > + Number of steps in the longitude direction. + + + See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLongitude. + - bitmask: + type: u64 + desc: > + Specifies the availability of correction data at the + correction points in the array. + + + If a specific bit is enabled (set to 1), the correction is not + available. Only the first rows * cols bits are used, the remainder + are set to 0. If there are more then 64 correction points the + remaining corrections are always available. + + + Starting with the northwest corner of the array (top left on a + north oriented map) the correction points are enumerated with row + precedence - first row west to east, second row west to east, + until last row west to east - ending with the southeast corner of + the array. + + + See GNSS-SSR-ArrayOfCorrectionPoints field bitmaskOfGrids but + note the definition of the bits is inverted. + - SatelliteAPC: short_desc: Antenna phase center correction desc: > @@ -789,7 +1022,7 @@ definitions: short_desc: Deprecated public: False replaced_by: - - MSG_SSR_TILE_DEFINITION + - MSG_SSR_TILE_DEFINITION_DEP fields: - header: type: GridDefinitionHeaderDepA @@ -803,27 +1036,6 @@ definitions: essentially the index of the quadrants that contain transitions between valid and invalid (and vice versa) are encoded as u8 integers. - - BoundsHeader: - short_desc: Header for the Bounds messages - fields: - - time: - type: GPSTimeSec - desc: GNSS reference time of the bound - - num_msgs: - type: u8 - desc: Number of messages in the dataset - - seq_num: - type: u8 - desc: Position of this message in the dataset - - update_interval: - type: u8 - desc: > - Update interval between consecutive bounds. Similar to - RTCM DF391. - - sol_id: - type: u8 - desc: SSR Solution ID. - - OrbitClockBound: desc: Orbit and clock bound. fields: