From 1128089a1cb832e5af7efba22ccfa5edb369efd9 Mon Sep 17 00:00:00 2001 From: fpezzinosn Date: Wed, 4 May 2022 17:47:03 -0400 Subject: [PATCH 1/3] Add Atmospheric Corrections and Bounds [OTA-120] --- python/tests/sbp/test_table.py | 2 +- .../test_MsgSsrGriddedCorrectionBounds.yaml | 67 +++++ .../sbp/ssr/test_MsgSsrStecCorrectionNew.yaml | 45 ++++ .../sbp/ssr/test_MsgSsrTileDefinitionNew.yaml | 31 +++ spec/yaml/swiftnav/sbp/ssr.yaml | 250 ++++++++++++++++-- 5 files changed, 373 insertions(+), 22 deletions(-) create mode 100644 spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml create mode 100644 spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrectionNew.yaml create mode 100644 spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinitionNew.yaml 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/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_MsgSsrStecCorrectionNew.yaml b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrectionNew.yaml new file mode 100644 index 0000000000..07100aeb0f --- /dev/null +++ b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrectionNew.yaml @@ -0,0 +1,45 @@ +description: Unit tests for swiftnav.sbp.ssr MsgSsrStecCorrectionNew +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: MsgSsrStecCorrectionNew + 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_MsgSsrTileDefinitionNew.yaml b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinitionNew.yaml new file mode 100644 index 0000000000..b0cdd606a7 --- /dev/null +++ b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinitionNew.yaml @@ -0,0 +1,31 @@ +description: Unit tests for swiftnav.sbp.ssr MsgSsrTileDefinitionNew +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: MsgSsrTileDefinitionNew + 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..3902f3c618 100644 --- a/spec/yaml/swiftnav/sbp/ssr.yaml +++ b/spec/yaml/swiftnav/sbp/ssr.yaml @@ -379,6 +379,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_NEW: + 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,6 +449,79 @@ definitions: fill: STECResidual desc: STEC residuals for each satellite (mean, stddev). + - 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: id: 0x05F6 short_desc: > @@ -508,6 +628,115 @@ definitions: See GNSS-SSR-ArrayOfCorrectionPoints field bitmaskOfGrids but note the definition of the bits is inverted. + - MSG_SSR_TILE_DEFINITION_NEW: + 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: > @@ -803,27 +1032,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: From 508ad83509eef2c8accb1739c0072003f198d2d4 Mon Sep 17 00:00:00 2001 From: fpezzinosn Date: Thu, 5 May 2022 16:51:27 -0400 Subject: [PATCH 2/3] renamed messages --- ...onNew.yaml => test_MsgSsrStecCorrection.yaml} | 4 ++-- ...onNew.yaml => test_MsgSsrTileDefinition.yaml} | 4 ++-- spec/yaml/swiftnav/sbp/ssr.yaml | 16 ++++++++++------ 3 files changed, 14 insertions(+), 10 deletions(-) rename spec/tests/yaml/swiftnav/sbp/ssr/{test_MsgSsrStecCorrectionNew.yaml => test_MsgSsrStecCorrection.yaml} (97%) rename spec/tests/yaml/swiftnav/sbp/ssr/{test_MsgSsrTileDefinitionNew.yaml => test_MsgSsrTileDefinition.yaml} (96%) diff --git a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrectionNew.yaml b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrection.yaml similarity index 97% rename from spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrectionNew.yaml rename to spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrection.yaml index 07100aeb0f..a0f9a7a3af 100644 --- a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrectionNew.yaml +++ b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrection.yaml @@ -1,4 +1,4 @@ -description: Unit tests for swiftnav.sbp.ssr MsgSsrStecCorrectionNew +description: Unit tests for swiftnav.sbp.ssr MsgSsrStecCorrection generated_on: 2022-04-19 # manually generated package: sbp.ssr tests: @@ -29,7 +29,7 @@ tests: stec_quality_indicator: 5 stec_coeff: [63,64,65,66] module: sbp.ssr - name: MsgSsrStecCorrectionNew + 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}, diff --git a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinitionNew.yaml b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinition.yaml similarity index 96% rename from spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinitionNew.yaml rename to spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinition.yaml index b0cdd606a7..0d3c1846b5 100644 --- a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinitionNew.yaml +++ b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinition.yaml @@ -1,4 +1,4 @@ -description: Unit tests for swiftnav.sbp.ssr MsgSsrTileDefinitionNew +description: Unit tests for swiftnav.sbp.ssr MsgSsrTileDefinition generated_on: 2022-04-20 # manually generated package: sbp.ssr tests: @@ -16,7 +16,7 @@ tests: cols: 32768 bitmask: 1234567890 module: sbp.ssr - name: MsgSsrTileDefinitionNew + 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, diff --git a/spec/yaml/swiftnav/sbp/ssr.yaml b/spec/yaml/swiftnav/sbp/ssr.yaml index 3902f3c618..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 @@ -400,7 +402,7 @@ definitions: type: u8 desc: SSR Solution ID. - - MSG_SSR_STEC_CORRECTION_NEW: + - MSG_SSR_STEC_CORRECTION: id: 0x05FD short_desc: STEC correction polynomial coefficients public: False @@ -522,19 +524,21 @@ definitions: size_fn: n_sats desc: Array of STEC polynomial coefficients and its bounds for each space vehicle. - - MSG_SSR_TILE_DEFINITION: + - 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 @@ -628,7 +632,7 @@ definitions: See GNSS-SSR-ArrayOfCorrectionPoints field bitmaskOfGrids but note the definition of the bits is inverted. - - MSG_SSR_TILE_DEFINITION_NEW: + - MSG_SSR_TILE_DEFINITION: id: 0x05F7 short_desc: > Definition of a SSR atmospheric correction tile. @@ -1018,7 +1022,7 @@ definitions: short_desc: Deprecated public: False replaced_by: - - MSG_SSR_TILE_DEFINITION + - MSG_SSR_TILE_DEFINITION_DEP fields: - header: type: GridDefinitionHeaderDepA From 73f5220a0570323c5614bc6cceb3927e9c1ee87a Mon Sep 17 00:00:00 2001 From: fpezzinosn Date: Thu, 5 May 2022 17:38:26 -0400 Subject: [PATCH 3/3] make all --- c/include/libsbp/cpp/message_traits.h | 113 +++ c/include/libsbp/legacy/cpp/message_traits.h | 22 +- c/include/libsbp/legacy/ssr.h | 153 ++- c/include/libsbp/sbp_msg_type.h | 3 + c/include/libsbp/ssr_macros.h | 81 +- c/include/libsbp/v4/sbp_msg.h | 39 + c/include/libsbp/v4/ssr.h | 4 + .../ssr/MSG_SSR_GRIDDED_CORRECTION_BOUNDS.h | 241 +++++ .../libsbp/v4/ssr/MSG_SSR_STEC_CORRECTION.h | 47 +- .../v4/ssr/MSG_SSR_STEC_CORRECTION_DEP.h | 206 ++++ .../libsbp/v4/ssr/MSG_SSR_TILE_DEFINITION.h | 5 + .../v4/ssr/MSG_SSR_TILE_DEFINITION_DEP.h | 266 +++++ .../libsbp/v4/ssr/STECSatElementIntegrity.h | 187 ++++ c/src/include/libsbp/internal/v4/ssr.h | 120 ++- c/src/v4/ssr.c | 958 ++++++++++++++---- ...ck_sbp_ssr_MsgSsrGriddedCorrectionBounds.c | 466 +++++++++ .../auto_check_sbp_ssr_MsgSsrStecCorrection.c | 345 +++++++ .../auto_check_sbp_ssr_MsgSsrTileDefinition.c | 219 ++++ c/test/check_main.c | 4 + c/test/check_main_legacy.c | 4 + c/test/check_suites.h | 3 + c/test/check_suites_legacy.h | 3 + ...k_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc | 256 +++++ ...auto_check_sbp_ssr_MsgSsrStecCorrection.cc | 217 ++++ ...auto_check_sbp_ssr_MsgSsrTileDefinition.cc | 137 +++ ...ck_sbp_ssr_MsgSsrGriddedCorrectionBounds.c | 375 +++++++ .../auto_check_sbp_ssr_MsgSsrStecCorrection.c | 357 +++++++ .../auto_check_sbp_ssr_MsgSsrTileDefinition.c | 245 +++++ ...k_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc | 256 +++++ ...auto_check_sbp_ssr_MsgSsrStecCorrection.cc | 251 +++++ ...auto_check_sbp_ssr_MsgSsrTileDefinition.cc | 141 +++ docs/sbp.pdf | Bin 467422 -> 473183 bytes haskell/src/SwiftNav/SBP/Msg.hs | 18 + haskell/src/SwiftNav/SBP/Ssr.hs | 322 +++++- .../com/swiftnav/sbp/client/MessageTable.java | 9 + .../ssr/MsgSsrGriddedCorrectionBounds.java | 119 +++ .../sbp/ssr/MsgSsrStecCorrection.java | 44 +- .../sbp/ssr/MsgSsrStecCorrectionDep.java | 77 ++ .../sbp/ssr/MsgSsrTileDefinition.java | 10 +- .../sbp/ssr/MsgSsrTileDefinitionDep.java | 168 +++ .../sbp/ssr/STECSatElementIntegrity.java | 81 ++ ...ssr_MsgSsrGriddedCorrectionBoundsTest.java | 386 +++++++ ...heck_sbp_ssr_MsgSsrStecCorrectionTest.java | 284 ++++++ ...heck_sbp_ssr_MsgSsrTileDefinitionTest.java | 165 +++ javascript/sbp.bundle.js | 2 +- javascript/sbp/ssr.js | 317 +++++- jsonschema/MsgSsrGriddedCorrectionBounds.json | 44 + jsonschema/MsgSsrStecCorrection.json | 12 +- jsonschema/MsgSsrTileDefinition.json | 2 + jsonschema/STECSatElementIntegrity.json | 32 + proto/ssr.proto | 88 +- python/sbp/ssr.py | 603 +++++++++-- rust/sbp/src/messages/mod.rs | 96 +- rust/sbp/src/messages/ssr.rs | 512 +++++++++- ...p_ssr_msg_ssr_gridded_correction_bounds.rs | 193 ++++ ...o_check_sbp_ssr_msg_ssr_stec_correction.rs | 163 +++ ...o_check_sbp_ssr_msg_ssr_tile_definition.rs | 101 ++ rust/sbp/tests/integration/main.rs | 3 + sbpjson/elm/SbpJson.elm | 180 +++- sbpjson/javascript/SbpJson.js | 63 +- sbpjson/typescript/SbpJson.ts | 128 ++- 61 files changed, 9408 insertions(+), 538 deletions(-) create mode 100644 c/include/libsbp/v4/ssr/MSG_SSR_GRIDDED_CORRECTION_BOUNDS.h create mode 100644 c/include/libsbp/v4/ssr/MSG_SSR_STEC_CORRECTION_DEP.h create mode 100644 c/include/libsbp/v4/ssr/MSG_SSR_TILE_DEFINITION_DEP.h create mode 100644 c/include/libsbp/v4/ssr/STECSatElementIntegrity.h create mode 100644 c/test/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.c create mode 100644 c/test/auto_check_sbp_ssr_MsgSsrStecCorrection.c create mode 100644 c/test/auto_check_sbp_ssr_MsgSsrTileDefinition.c create mode 100644 c/test/cpp/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc create mode 100644 c/test/cpp/auto_check_sbp_ssr_MsgSsrStecCorrection.cc create mode 100644 c/test/cpp/auto_check_sbp_ssr_MsgSsrTileDefinition.cc create mode 100644 c/test/legacy/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.c create mode 100644 c/test/legacy/auto_check_sbp_ssr_MsgSsrStecCorrection.c create mode 100644 c/test/legacy/auto_check_sbp_ssr_MsgSsrTileDefinition.c create mode 100644 c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc create mode 100644 c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrStecCorrection.cc create mode 100644 c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrTileDefinition.cc create mode 100644 java/src/com/swiftnav/sbp/ssr/MsgSsrGriddedCorrectionBounds.java create mode 100644 java/src/com/swiftnav/sbp/ssr/MsgSsrStecCorrectionDep.java create mode 100644 java/src/com/swiftnav/sbp/ssr/MsgSsrTileDefinitionDep.java create mode 100644 java/src/com/swiftnav/sbp/ssr/STECSatElementIntegrity.java create mode 100644 java/test/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBoundsTest.java create mode 100644 java/test/auto_check_sbp_ssr_MsgSsrStecCorrectionTest.java create mode 100644 java/test/auto_check_sbp_ssr_MsgSsrTileDefinitionTest.java create mode 100644 jsonschema/MsgSsrGriddedCorrectionBounds.json create mode 100644 jsonschema/STECSatElementIntegrity.json create mode 100644 rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_gridded_correction_bounds.rs create mode 100644 rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_stec_correction.rs create mode 100644 rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_tile_definition.rs 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 b84bf78676b72429e7553ad04c38168aa6134ecd..b42d4273fa7497ad10cc23dd144bac353cc047b3 100644 GIT binary patch delta 134306 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

%<^VNZwE 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 z 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 GA^l&|C9-M& delta 128886 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 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/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"), };