From 86c07dabba081b644081ea84ef97bf9c16cda3f8 Mon Sep 17 00:00:00 2001 From: fpezzinosn <79222190+fpezzinosn@users.noreply.github.com> Date: Tue, 3 May 2022 18:55:51 -0400 Subject: [PATCH 01/10] Add support for SSR_ORBIT_CLOCK_BOUNDS message [OTA-65] (#1108) --- c/include/libsbp/v4/ssr/BoundsHeader.h | 176 +++++++++++++++ c/include/libsbp/v4/ssr/OrbitClockBound.h | 208 ++++++++++++++++++ .../resources/rust/sbp_messages_mod.rs | 2 + .../com/swiftnav/sbp/ssr/BoundsHeader.java | 73 ++++++ .../com/swiftnav/sbp/ssr/OrbitClockBound.java | 124 +++++++++++ jsonschema/BoundsHeader.json | 32 +++ jsonschema/OrbitClockBound.json | 40 ++++ .../sbp/ssr/test_MsgSsrOrbitClockBounds.yaml | 68 ++++-- spec/yaml/swiftnav/sbp/ssr.yaml | 168 +++++++++----- 9 files changed, 816 insertions(+), 75 deletions(-) create mode 100644 c/include/libsbp/v4/ssr/BoundsHeader.h create mode 100644 c/include/libsbp/v4/ssr/OrbitClockBound.h create mode 100644 java/src/com/swiftnav/sbp/ssr/BoundsHeader.java create mode 100644 java/src/com/swiftnav/sbp/ssr/OrbitClockBound.java create mode 100644 jsonschema/BoundsHeader.json create mode 100644 jsonschema/OrbitClockBound.json diff --git a/c/include/libsbp/v4/ssr/BoundsHeader.h b/c/include/libsbp/v4/ssr/BoundsHeader.h new file mode 100644 index 0000000000..da9790258d --- /dev/null +++ b/c/include/libsbp/v4/ssr/BoundsHeader.h @@ -0,0 +1,176 @@ +/* + * 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_BOUNDSHEADER_H +#define LIBSBP_V4_SSR_BOUNDSHEADER_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * + * SBP_BOUNDSHEADER + * + *****************************************************************************/ +typedef struct { + /** + * GNSS reference time of the bound + */ + sbp_gps_time_sec_t time; + + /** + * Number of messages in the dataset + */ + u8 num_msgs; + + /** + * Position of this message in the dataset + */ + u8 seq_num; + + /** + * Update interval between consecutive bounds. Similar to RTCM DF391. + */ + u8 update_interval; + + /** + * SSR Solution ID. + */ + u8 sol_id; +} sbp_bounds_header_t; + +/** + * Get encoded size of an instance of sbp_bounds_header_t + * + * @param msg sbp_bounds_header_t instance + * @return Length of on-wire representation + */ +static inline size_t sbp_bounds_header_encoded_len( + const sbp_bounds_header_t *msg) { + (void)msg; + return SBP_BOUNDS_HEADER_ENCODED_LEN; +} + +/** + * Encode an instance of sbp_bounds_header_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_bounds_header_t to encode + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 sbp_bounds_header_encode(uint8_t *buf, uint8_t len, + uint8_t *n_written, + const sbp_bounds_header_t *msg); + +/** + * Decode an instance of sbp_bounds_header_t from wire representation + * + * This function decodes the wire representation of a sbp_bounds_header_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_bounds_header_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_bounds_header_decode(const uint8_t *buf, uint8_t len, + uint8_t *n_read, + sbp_bounds_header_t *msg); + +/** + * Compare two instances of sbp_bounds_header_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_bounds_header_t instance + * @param b sbp_bounds_header_t instance + * @return 0, <0, >0 + */ +SBP_EXPORT int sbp_bounds_header_cmp(const sbp_bounds_header_t *a, + const sbp_bounds_header_t *b); + +#ifdef __cplusplus +} + +static inline bool operator==(const sbp_bounds_header_t &lhs, + const sbp_bounds_header_t &rhs) { + return sbp_bounds_header_cmp(&lhs, &rhs) == 0; +} + +static inline bool operator!=(const sbp_bounds_header_t &lhs, + const sbp_bounds_header_t &rhs) { + return sbp_bounds_header_cmp(&lhs, &rhs) != 0; +} + +static inline bool operator<(const sbp_bounds_header_t &lhs, + const sbp_bounds_header_t &rhs) { + return sbp_bounds_header_cmp(&lhs, &rhs) < 0; +} + +static inline bool operator<=(const sbp_bounds_header_t &lhs, + const sbp_bounds_header_t &rhs) { + return sbp_bounds_header_cmp(&lhs, &rhs) <= 0; +} + +static inline bool operator>(const sbp_bounds_header_t &lhs, + const sbp_bounds_header_t &rhs) { + return sbp_bounds_header_cmp(&lhs, &rhs) > 0; +} + +static inline bool operator>=(const sbp_bounds_header_t &lhs, + const sbp_bounds_header_t &rhs) { + return sbp_bounds_header_cmp(&lhs, &rhs) >= 0; +} + +#endif // ifdef __cplusplus + +#endif /* LIBSBP_V4_SSR_BOUNDSHEADER_H */ diff --git a/c/include/libsbp/v4/ssr/OrbitClockBound.h b/c/include/libsbp/v4/ssr/OrbitClockBound.h new file mode 100644 index 0000000000..8212490cf3 --- /dev/null +++ b/c/include/libsbp/v4/ssr/OrbitClockBound.h @@ -0,0 +1,208 @@ +/* + * 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_ORBITCLOCKBOUND_H +#define LIBSBP_V4_SSR_ORBITCLOCKBOUND_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * + * SBP_ORBITCLOCKBOUND + * + *****************************************************************************/ +/** None + * + * Orbit and clock bound. + */ +typedef struct { + /** + * Satellite ID. Similar to either RTCM DF068 (GPS), DF252 (Galileo), or DF488 + * (BDS) depending on the constellation. + */ + u8 sat_id; + + /** + * Mean Radial (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) [m] + */ + u8 orb_radial_bound_mu; + + /** + * Mean Along-Track (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) [m] + */ + u8 orb_along_bound_mu; + + /** + * Mean Cross-Track (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) [m] + */ + u8 orb_cross_bound_mu; + + /** + * Standard Deviation Radial (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) [m] + */ + u8 orb_radial_bound_sig; + + /** + * Standard Deviation Along-Track (range 0-55) i<=200, mean=0.0251i + * 200240, mean=25+2(i-240) [m] + */ + u8 orb_along_bound_sig; + + /** + * Standard Deviation Cross-Track (range 0-55) i<=200, mean=0.0251i + * 200240, mean=25+2(i-240) [m] + */ + u8 orb_cross_bound_sig; + + /** + * Clock Bound Mean (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) [m] + */ + u8 clock_bound_mu; + + /** + * Clock Bound Standard Deviation (range 0-55) i<=200, mean=0.0251i + * 200240, mean=25+2(i-240) [m] + */ + u8 clock_bound_sig; +} sbp_orbit_clock_bound_t; + +/** + * Get encoded size of an instance of sbp_orbit_clock_bound_t + * + * @param msg sbp_orbit_clock_bound_t instance + * @return Length of on-wire representation + */ +static inline size_t sbp_orbit_clock_bound_encoded_len( + const sbp_orbit_clock_bound_t *msg) { + (void)msg; + return SBP_ORBIT_CLOCK_BOUND_ENCODED_LEN; +} + +/** + * Encode an instance of sbp_orbit_clock_bound_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_orbit_clock_bound_t to encode + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 sbp_orbit_clock_bound_encode(uint8_t *buf, uint8_t len, + uint8_t *n_written, + const sbp_orbit_clock_bound_t *msg); + +/** + * Decode an instance of sbp_orbit_clock_bound_t from wire representation + * + * This function decodes the wire representation of a sbp_orbit_clock_bound_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_orbit_clock_bound_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_orbit_clock_bound_decode(const uint8_t *buf, uint8_t len, + uint8_t *n_read, + sbp_orbit_clock_bound_t *msg); + +/** + * Compare two instances of sbp_orbit_clock_bound_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_orbit_clock_bound_t instance + * @param b sbp_orbit_clock_bound_t instance + * @return 0, <0, >0 + */ +SBP_EXPORT int sbp_orbit_clock_bound_cmp(const sbp_orbit_clock_bound_t *a, + const sbp_orbit_clock_bound_t *b); + +#ifdef __cplusplus +} + +static inline bool operator==(const sbp_orbit_clock_bound_t &lhs, + const sbp_orbit_clock_bound_t &rhs) { + return sbp_orbit_clock_bound_cmp(&lhs, &rhs) == 0; +} + +static inline bool operator!=(const sbp_orbit_clock_bound_t &lhs, + const sbp_orbit_clock_bound_t &rhs) { + return sbp_orbit_clock_bound_cmp(&lhs, &rhs) != 0; +} + +static inline bool operator<(const sbp_orbit_clock_bound_t &lhs, + const sbp_orbit_clock_bound_t &rhs) { + return sbp_orbit_clock_bound_cmp(&lhs, &rhs) < 0; +} + +static inline bool operator<=(const sbp_orbit_clock_bound_t &lhs, + const sbp_orbit_clock_bound_t &rhs) { + return sbp_orbit_clock_bound_cmp(&lhs, &rhs) <= 0; +} + +static inline bool operator>(const sbp_orbit_clock_bound_t &lhs, + const sbp_orbit_clock_bound_t &rhs) { + return sbp_orbit_clock_bound_cmp(&lhs, &rhs) > 0; +} + +static inline bool operator>=(const sbp_orbit_clock_bound_t &lhs, + const sbp_orbit_clock_bound_t &rhs) { + return sbp_orbit_clock_bound_cmp(&lhs, &rhs) >= 0; +} + +#endif // ifdef __cplusplus + +#endif /* LIBSBP_V4_SSR_ORBITCLOCKBOUND_H */ diff --git a/generator/sbpg/targets/resources/rust/sbp_messages_mod.rs b/generator/sbpg/targets/resources/rust/sbp_messages_mod.rs index 7d7fa7f286..d5e1d6bb6d 100644 --- a/generator/sbpg/targets/resources/rust/sbp_messages_mod.rs +++ b/generator/sbpg/targets/resources/rust/sbp_messages_mod.rs @@ -111,7 +111,9 @@ impl std::error::Error for TryFromSbpError {} #[non_exhaustive] pub enum Sbp { ((*- for m in msgs *)) + ((*- if m.short_desc *)) /// (((m.short_desc | commentify(indent=2) ))) + ((*- endif *)) (((m.msg_name)))( (((m.msg_name))) ), ((*- endfor *)) /// Unknown message type diff --git a/java/src/com/swiftnav/sbp/ssr/BoundsHeader.java b/java/src/com/swiftnav/sbp/ssr/BoundsHeader.java new file mode 100644 index 0000000000..8a2ca814da --- /dev/null +++ b/java/src/com/swiftnav/sbp/ssr/BoundsHeader.java @@ -0,0 +1,73 @@ +/* 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 BoundsHeader extends SBPStruct { + + /** GNSS reference time of the bound */ + public GPSTimeSec time; + + /** Number of messages in the dataset */ + public int num_msgs; + + /** Position of this message in the dataset */ + public int seq_num; + + /** Update interval between consecutive bounds. Similar to RTCM DF391. */ + public int update_interval; + + /** SSR Solution ID. */ + public int sol_id; + + public BoundsHeader() {} + + @Override + public BoundsHeader parse(SBPMessage.Parser parser) throws SBPBinaryException { + /* Parse fields from binary */ + time = new GPSTimeSec().parse(parser); + num_msgs = parser.getU8(); + seq_num = parser.getU8(); + update_interval = parser.getU8(); + sol_id = parser.getU8(); + return this; + } + + @Override + public void build(SBPMessage.Builder builder) { + /* Build fields into binary */ + time.build(builder); + builder.putU8(num_msgs); + builder.putU8(seq_num); + builder.putU8(update_interval); + builder.putU8(sol_id); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("time", time.toJSON()); + obj.put("num_msgs", num_msgs); + obj.put("seq_num", seq_num); + obj.put("update_interval", update_interval); + obj.put("sol_id", sol_id); + return obj; + } +} diff --git a/java/src/com/swiftnav/sbp/ssr/OrbitClockBound.java b/java/src/com/swiftnav/sbp/ssr/OrbitClockBound.java new file mode 100644 index 0000000000..abc46e468c --- /dev/null +++ b/java/src/com/swiftnav/sbp/ssr/OrbitClockBound.java @@ -0,0 +1,124 @@ +/* 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 OrbitClockBound extends SBPStruct { + + /** + * Satellite ID. Similar to either RTCM DF068 (GPS), DF252 (Galileo), or DF488 (BDS) depending + * on the constellation. + */ + public int sat_id; + + /** + * Mean Radial (range 0-55) i<=200, mean=0.0251i 200240, + * mean=25+2(i-240) + */ + public int orb_radial_bound_mu; + + /** + * Mean Along-Track (range 0-55) i<=200, mean=0.0251i 200240, + * mean=25+2(i-240) + */ + public int orb_along_bound_mu; + + /** + * Mean Cross-Track (range 0-55) i<=200, mean=0.0251i 200240, + * mean=25+2(i-240) + */ + public int orb_cross_bound_mu; + + /** + * Standard Deviation Radial (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) + */ + public int orb_radial_bound_sig; + + /** + * Standard Deviation Along-Track (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) + */ + public int orb_along_bound_sig; + + /** + * Standard Deviation Cross-Track (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) + */ + public int orb_cross_bound_sig; + + /** + * Clock Bound Mean (range 0-55) i<=200, mean=0.0251i 200240, + * mean=25+2(i-240) + */ + public int clock_bound_mu; + + /** + * Clock Bound Standard Deviation (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) + */ + public int clock_bound_sig; + + public OrbitClockBound() {} + + @Override + public OrbitClockBound parse(SBPMessage.Parser parser) throws SBPBinaryException { + /* Parse fields from binary */ + sat_id = parser.getU8(); + orb_radial_bound_mu = parser.getU8(); + orb_along_bound_mu = parser.getU8(); + orb_cross_bound_mu = parser.getU8(); + orb_radial_bound_sig = parser.getU8(); + orb_along_bound_sig = parser.getU8(); + orb_cross_bound_sig = parser.getU8(); + clock_bound_mu = parser.getU8(); + clock_bound_sig = parser.getU8(); + return this; + } + + @Override + public void build(SBPMessage.Builder builder) { + /* Build fields into binary */ + builder.putU8(sat_id); + builder.putU8(orb_radial_bound_mu); + builder.putU8(orb_along_bound_mu); + builder.putU8(orb_cross_bound_mu); + builder.putU8(orb_radial_bound_sig); + builder.putU8(orb_along_bound_sig); + builder.putU8(orb_cross_bound_sig); + builder.putU8(clock_bound_mu); + builder.putU8(clock_bound_sig); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("sat_id", sat_id); + obj.put("orb_radial_bound_mu", orb_radial_bound_mu); + obj.put("orb_along_bound_mu", orb_along_bound_mu); + obj.put("orb_cross_bound_mu", orb_cross_bound_mu); + obj.put("orb_radial_bound_sig", orb_radial_bound_sig); + obj.put("orb_along_bound_sig", orb_along_bound_sig); + obj.put("orb_cross_bound_sig", orb_cross_bound_sig); + obj.put("clock_bound_mu", clock_bound_mu); + obj.put("clock_bound_sig", clock_bound_sig); + return obj; + } +} diff --git a/jsonschema/BoundsHeader.json b/jsonschema/BoundsHeader.json new file mode 100644 index 0000000000..e8fe615426 --- /dev/null +++ b/jsonschema/BoundsHeader.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": "#BoundsHeader", + "title":"BoundsHeader", + "description":"", + "type": "object", + "properties": { + "time": {"$ref": "GpsTimeSec.json"}, + "num_msgs": {"type": "integer"}, + "seq_num": {"type": "integer"}, + "update_interval": {"type": "integer"}, + "sol_id": {"type": "integer"} + }, + "required": [ + "time", + "num_msgs", + "seq_num", + "update_interval", + "sol_id" + ] +} \ No newline at end of file diff --git a/jsonschema/OrbitClockBound.json b/jsonschema/OrbitClockBound.json new file mode 100644 index 0000000000..67aab59704 --- /dev/null +++ b/jsonschema/OrbitClockBound.json @@ -0,0 +1,40 @@ +{ + "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": "#OrbitClockBound", + "title":"OrbitClockBound", + "description":"Orbit and clock bound.\n", + "type": "object", + "properties": { + "sat_id": {"type": "integer"}, + "orb_radial_bound_mu": {"type": "integer"}, + "orb_along_bound_mu": {"type": "integer"}, + "orb_cross_bound_mu": {"type": "integer"}, + "orb_radial_bound_sig": {"type": "integer"}, + "orb_along_bound_sig": {"type": "integer"}, + "orb_cross_bound_sig": {"type": "integer"}, + "clock_bound_mu": {"type": "integer"}, + "clock_bound_sig": {"type": "integer"} + }, + "required": [ + "sat_id", + "orb_radial_bound_mu", + "orb_along_bound_mu", + "orb_cross_bound_mu", + "orb_radial_bound_sig", + "orb_along_bound_sig", + "orb_cross_bound_sig", + "clock_bound_mu", + "clock_bound_sig" + ] +} \ No newline at end of file diff --git a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrOrbitClockBounds.yaml b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrOrbitClockBounds.yaml index 531f9d4a99..dc63445ebc 100644 --- a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrOrbitClockBounds.yaml +++ b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrOrbitClockBounds.yaml @@ -3,21 +3,53 @@ generated_on: 2022-04-08 # manually generated package: sbp.ssr tests: - - msg: - fields: - stub: [180,0,0,0,3,0,1,2,3,48,15,1,2,24,39,38,37,1,2,3,39,1,3,39,38,37,1,2,3,39,1] - c_decoded_fields: - n_stub: 31 - module: sbp.ssr - name: MsgSsrOrbitClockBounds - msg_type: '1502' - raw_json: '{"stub": [180,0,0,0,3,0,1,2,3,48,15,1,2,24,39,38,37,1,2,3,39,1,3,39,38,37,1,2,3,39,1], "preamble": 85, - "msg_type": 1502, "sender": 66, "length": 31, "payload": "tAAAAAMAAQIDMA8BAhgnJiUBAgMnAQMnJiUBAgMnAQ==", "crc": 21781}' - raw_packet: Vd4FQgAftAAAAAMAAQIDMA8BAhgnJiUBAgMnAQMnJiUBAgMnARVV - sbp: - preamble: '0x55' - msg_type: '0x05DE' - sender: '0x0042' - length: 31 - payload: tAAAAAMAAQIDMA8BAhgnJiUBAgMnAQMnJiUBAgMnAQ== - crc: '0x5515' +- msg: + fields: + header: + time: + tow: 180 + wn: 3 + num_msgs: 1 + seq_num: 2 + update_interval: 3 + sol_id: 48 + ssr_iod: 15 + const_id: 1 + n_sats: 2 + orbit_clock_bounds: + - sat_id: 24 + orb_radial_bound_mu: 39 + orb_along_bound_mu: 38 + orb_cross_bound_mu: 37 + orb_radial_bound_sig: 1 + orb_along_bound_sig: 2 + orb_cross_bound_sig: 3 + clock_bound_mu: 39 + clock_bound_sig: 1 + - sat_id: 3 + orb_radial_bound_mu: 39 + orb_along_bound_mu: 38 + orb_cross_bound_mu: 37 + orb_radial_bound_sig: 1 + orb_along_bound_sig: 2 + orb_cross_bound_sig: 3 + clock_bound_mu: 39 + clock_bound_sig: 1 + module: sbp.ssr + name: MsgSsrOrbitClockBounds + msg_type: '1502' + raw_json: '{"header": {"time": {"tow": 180, "wn": 3}, "num_msgs": 1, "seq_num": 2, "update_interval": 3, "sol_id": 48}, + "ssr_iod": 15, "const_id": 1, "n_sats": 2, "orbit_clock_bounds": [{"sat_id": 24, "orb_radial_bound_mu": 39, + "orb_along_bound_mu": 38, "orb_cross_bound_mu": 37, "orb_radial_bound_sig": 1, "orb_along_bound_sig": 2, + "orb_cross_bound_sig": 3, "clock_bound_mu": 39, "clock_bound_sig": 1}, {"sat_id": 3, "orb_radial_bound_mu": 39, + "orb_along_bound_mu": 38, "orb_cross_bound_mu": 37, "orb_radial_bound_sig": 1, "orb_along_bound_sig": 2, + "orb_cross_bound_sig": 3, "clock_bound_mu": 39, "clock_bound_sig": 1}], "preamble": 85, "msg_type": 1502, + "sender": 66, "length": 31, "payload": "tAAAAAMAAQIDMA8BAhgnJiUBAgMnAQMnJiUBAgMnAQ==", "crc": 21781}' + raw_packet: Vd4FQgAftAAAAAMAAQIDMA8BAhgnJiUBAgMnAQMnJiUBAgMnARVV + sbp: + preamble: '0x55' + msg_type: '0x05DE' + sender: '0x0042' + length: 31 + payload: tAAAAAMAAQIDMA8BAhgnJiUBAgMnAQMnJiUBAgMnAQ== + crc: '0x5515' diff --git a/spec/yaml/swiftnav/sbp/ssr.yaml b/spec/yaml/swiftnav/sbp/ssr.yaml index fe5a8837aa..e10970501d 100644 --- a/spec/yaml/swiftnav/sbp/ssr.yaml +++ b/spec/yaml/swiftnav/sbp/ssr.yaml @@ -381,15 +381,6 @@ definitions: fill: STECSatElement desc: Array of STEC polynomial coefficients for each space vehicle. - - MSG_SSR_STEC_CORRECTION: - id: 0x05FD - short_desc: STEC correction polynomial coefficients - public: False - fields: - - stub: - type: array - fill: u8 - - MSG_SSR_GRIDDED_CORRECTION: id: 0x05FC short_desc: Gridded troposphere and STEC correction residuals @@ -413,16 +404,7 @@ definitions: fill: STECResidual desc: STEC residuals for each satellite (mean, stddev). - - MSG_SSR_GRIDDED_CORRECTION_BOUNDS: - id: 0x05FE - short_desc: Gridded troposhere and STEC correction residuals bounds - public: False - fields: - - stub: - type: array - fill: u8 - - - MSG_SSR_TILE_DEFINITION_DEP: + - MSG_SSR_TILE_DEFINITION: id: 0x05F6 short_desc: > Definition of a SSR atmospheric correction tile. @@ -530,25 +512,6 @@ definitions: See GNSS-SSR-ArrayOfCorrectionPoints field bitmaskOfGrids but note the definition of the bits is inverted. - - MSG_SSR_TILE_DEFINITION: - id: 0x05F7 - short_desc: > - Definition of a SSR atmospheric correction tile. - desc: > - Provides the correction point coordinates for the atmospheric correction - values in the MSG_SSR_STEC_CORRECTION and MSG_SSR_GRIDDED_CORRECTION - messages. - - - Based on ETSI TS 137 355 V16.1.0 (LTE Positioning Protocol) information - element GNSS-SSR-CorrectionPoints. SBP only supports gridded arrays of - correction points, not lists of points. - public: False - fields: - - stub: - type: array - fill: u8 - - SatelliteAPC: short_desc: Antenna phase center correction desc: > @@ -844,29 +807,120 @@ definitions: essentially the index of the quadrants that contain transitions between valid and invalid (and vice versa) are encoded as u8 integers. - - MSG_SSR_ORBIT_CLOCK_BOUNDS: - id: 0x05DE - short_desc: Stubbed version of Combined Orbit and Clock Bound - public: False + - BoundsHeader: + short_desc: Header for the Bounds messages fields: - - stub: - type: array - fill: u8 + - 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_CODE_PHASE_BIASES_BOUNDS: - id: 0x05EC - short_desc: Stubbed version of Combined Code and Phase Biases Bounds - public: False + - OrbitClockBound: + desc: Orbit and clock bound. fields: - - stub: - type: array - fill: u8 + - sat_id: + type: u8 + desc: > + Satellite ID. Similar to either RTCM DF068 (GPS), DF252 (Galileo), + or DF488 (BDS) depending on the constellation. + - orb_radial_bound_mu: + type: u8 + units: m + desc: > + Mean Radial (range 0-55) + i<=200, mean=0.0251i + 200240, mean=25+2(i-240) + - orb_along_bound_mu: + type: u8 + units: m + desc: > + Mean Along-Track (range 0-55) + i<=200, mean=0.0251i + 200240, mean=25+2(i-240) + - orb_cross_bound_mu: + type: u8 + units: m + desc: > + Mean Cross-Track (range 0-55) + i<=200, mean=0.0251i + 200240, mean=25+2(i-240) + - orb_radial_bound_sig: + type: u8 + units: m + desc: > + Standard Deviation Radial (range 0-55) + i<=200, mean=0.0251i + 200240, mean=25+2(i-240) + - orb_along_bound_sig: + type: u8 + units: m + desc: > + Standard Deviation Along-Track (range 0-55) + i<=200, mean=0.0251i + 200240, mean=25+2(i-240) + - orb_cross_bound_sig: + type: u8 + units: m + desc: > + Standard Deviation Cross-Track (range 0-55) + i<=200, mean=0.0251i + 200240, mean=25+2(i-240) + - clock_bound_mu: + type: u8 + units: m + desc: > + Clock Bound Mean (range 0-55) + i<=200, mean=0.0251i + 200240, mean=25+2(i-240) + - clock_bound_sig: + type: u8 + units: m + desc: > + Clock Bound Standard Deviation (range 0-55) + i<=200, mean=0.0251i + 200240, mean=25+2(i-240) - - MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION: - id: 0x05DF - short_desc: Combined Orbit and Clock Bound Degradation Parameter + - MSG_SSR_ORBIT_CLOCK_BOUNDS: + id: 0x05DE + short_desc: Combined Orbit and Clock Bound public: False fields: - - stub: + - header: + type: BoundsHeader + desc: Header of a bounds message. + - ssr_iod: + type: u8 + desc: IOD of the SSR bound. + - const_id: + type: u8 + desc: Constellation ID to which the SVs belong. + - n_sats: + type: u8 + desc: Number of satellites. + - orbit_clock_bounds: type: array - fill: u8 + fill: OrbitClockBound + size_fn: n_sats + map_by: sat_id + desc: Orbit and Clock Bounds per Satellite From 6cf3e7ca86fb205fa697259e611f804c1e4fe1a7 Mon Sep 17 00:00:00 2001 From: fpezzinosn <79222190+fpezzinosn@users.noreply.github.com> Date: Thu, 5 May 2022 09:24:44 -0400 Subject: [PATCH 02/10] Add support for MSG_SSR_CODE_PHASE_BIASES_BOUNDS message [OTA-119] (#1127) --- c/include/libsbp/legacy/ssr.h | 27 ++ c/include/libsbp/ssr_macros.h | 30 +++ c/include/libsbp/v4/ssr.h | 1 + .../libsbp/v4/ssr/CodePhaseBiasesSatSig.h | 185 +++++++++++++ c/src/include/libsbp/internal/v4/ssr.h | 40 +++ c/src/v4/ssr.c | 245 ++++++++++++++++++ .../sbp/ssr/CodePhaseBiasesSatSig.java | 85 ++++++ jsonschema/CodePhaseBiasesSatSig.json | 34 +++ .../ssr/test_MsgSsrCodePhaseBiasesBounds.yaml | 40 ++- spec/yaml/swiftnav/sbp/ssr.yaml | 54 ++++ 10 files changed, 737 insertions(+), 4 deletions(-) create mode 100644 c/include/libsbp/v4/ssr/CodePhaseBiasesSatSig.h create mode 100644 java/src/com/swiftnav/sbp/ssr/CodePhaseBiasesSatSig.java create mode 100644 jsonschema/CodePhaseBiasesSatSig.json diff --git a/c/include/libsbp/legacy/ssr.h b/c/include/libsbp/legacy/ssr.h index 285a30606c..9d512a71ea 100644 --- a/c/include/libsbp/legacy/ssr.h +++ b/c/include/libsbp/legacy/ssr.h @@ -556,6 +556,33 @@ typedef struct SBP_ATTR_PACKED { u8 stub[0]; } msg_ssr_orbit_clock_bounds_degradation_t; +typedef struct SBP_ATTR_PACKED { + u8 sat_id; /**< Satellite ID. Similar to either RTCM DF068 + (GPS), DF252 (Galileo), or DF488 (BDS) + depending on the constellation. */ + u8 signal_id; /**< Signal and Tracking Mode Identifier. + Similar to either RTCM DF380 (GPS), DF382 + (Galileo) or DF467 (BDS) depending on the + constellation. */ + u8 code_bias_bound_mu; /**< Code Bias Mean (range 0-1.275) [0.005 m] */ + u8 code_bias_bound_sig; /**< Code Bias Standard Deviation (range + 0-1.275) [0.005 m] */ + u8 phase_bias_bound_mu; /**< Phase Bias Mean (range 0-1.275) [0.005 m] */ + u8 phase_bias_bound_sig; /**< Phase Bias Standard Deviation (range + 0-1.275) [0.005 m] */ +} code_phase_biases_sat_sig_t; + +typedef struct SBP_ATTR_PACKED { + bounds_header_t header; /**< Header of a bounds message. */ + u8 ssr_iod; /**< IOD of the SSR bound. */ + u8 const_id; /**< Constellation ID to which the SVs belong. */ + u8 n_sats_signals; /**< Number of satellite-signal couples. */ + code_phase_biases_sat_sig_t satellites_signals[0]; /**< Code and Phase + Biases Bounds per + Satellite-Signal + couple. */ +} msg_ssr_code_phase_biases_bounds_t; + /** \} */ SBP_PACK_END diff --git a/c/include/libsbp/ssr_macros.h b/c/include/libsbp/ssr_macros.h index 172471b93f..813c1df67d 100644 --- a/c/include/libsbp/ssr_macros.h +++ b/c/include/libsbp/ssr_macros.h @@ -530,4 +530,34 @@ */ #define SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION_ENCODED_OVERHEAD 0u +/** + * Encoded length of sbp_code_phase_biases_sat_sig_t (V4 API) and + * code_phase_biases_sat_sig_t (legacy API) + */ +#define SBP_CODE_PHASE_BIASES_SAT_SIG_ENCODED_LEN 6u + +#define SBP_MSG_SSR_CODE_PHASE_BIASES_BOUNDS 0x05EC +/** + * The maximum number of items that can be stored in + * sbp_msg_ssr_code_phase_biases_bounds_t::satellites_signals (V4 API) or + * msg_ssr_code_phase_biases_bounds_t::satellites_signals (legacy API) before + * the maximum SBP message size is exceeded + */ +#define SBP_MSG_SSR_CODE_PHASE_BIASES_BOUNDS_SATELLITES_SIGNALS_MAX 40u + +/** + * Encoded length of sbp_msg_ssr_code_phase_biases_bounds_t (V4 API) and + * msg_ssr_code_phase_biases_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_code_phase_biases_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_CODE_PHASE_BIASES_BOUNDS_ENCODED_OVERHEAD 13u + #endif /* LIBSBP_SSR_MACROS_H */ diff --git a/c/include/libsbp/v4/ssr.h b/c/include/libsbp/v4/ssr.h index 37f0cc25e4..b3cf74741d 100644 --- a/c/include/libsbp/v4/ssr.h +++ b/c/include/libsbp/v4/ssr.h @@ -18,6 +18,7 @@ #ifndef LIBSBP_V4_SSR_MESSAGES_H #define LIBSBP_V4_SSR_MESSAGES_H #include +#include #include #include #include diff --git a/c/include/libsbp/v4/ssr/CodePhaseBiasesSatSig.h b/c/include/libsbp/v4/ssr/CodePhaseBiasesSatSig.h new file mode 100644 index 0000000000..b32efd0fe1 --- /dev/null +++ b/c/include/libsbp/v4/ssr/CodePhaseBiasesSatSig.h @@ -0,0 +1,185 @@ +/* + * 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_CODEPHASEBIASESSATSIG_H +#define LIBSBP_V4_SSR_CODEPHASEBIASESSATSIG_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * + * SBP_CODEPHASEBIASESSATSIG + * + *****************************************************************************/ +typedef struct { + /** + * Satellite ID. Similar to either RTCM DF068 (GPS), DF252 (Galileo), or DF488 + * (BDS) depending on the constellation. + */ + u8 sat_id; + + /** + * Signal and Tracking Mode Identifier. Similar to either RTCM DF380 (GPS), + * DF382 (Galileo) or DF467 (BDS) depending on the constellation. + */ + u8 signal_id; + + /** + * Code Bias Mean (range 0-1.275) [0.005 m] + */ + u8 code_bias_bound_mu; + + /** + * Code Bias Standard Deviation (range 0-1.275) [0.005 m] + */ + u8 code_bias_bound_sig; + + /** + * Phase Bias Mean (range 0-1.275) [0.005 m] + */ + u8 phase_bias_bound_mu; + + /** + * Phase Bias Standard Deviation (range 0-1.275) [0.005 m] + */ + u8 phase_bias_bound_sig; +} sbp_code_phase_biases_sat_sig_t; + +/** + * Get encoded size of an instance of sbp_code_phase_biases_sat_sig_t + * + * @param msg sbp_code_phase_biases_sat_sig_t instance + * @return Length of on-wire representation + */ +static inline size_t sbp_code_phase_biases_sat_sig_encoded_len( + const sbp_code_phase_biases_sat_sig_t *msg) { + (void)msg; + return SBP_CODE_PHASE_BIASES_SAT_SIG_ENCODED_LEN; +} + +/** + * Encode an instance of sbp_code_phase_biases_sat_sig_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_code_phase_biases_sat_sig_t to encode + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 sbp_code_phase_biases_sat_sig_encode( + uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_code_phase_biases_sat_sig_t *msg); + +/** + * Decode an instance of sbp_code_phase_biases_sat_sig_t from wire + * representation + * + * This function decodes the wire representation of a + * sbp_code_phase_biases_sat_sig_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_code_phase_biases_sat_sig_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_code_phase_biases_sat_sig_decode( + const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_code_phase_biases_sat_sig_t *msg); + +/** + * Compare two instances of sbp_code_phase_biases_sat_sig_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_code_phase_biases_sat_sig_t instance + * @param b sbp_code_phase_biases_sat_sig_t instance + * @return 0, <0, >0 + */ +SBP_EXPORT int sbp_code_phase_biases_sat_sig_cmp( + const sbp_code_phase_biases_sat_sig_t *a, + const sbp_code_phase_biases_sat_sig_t *b); + +#ifdef __cplusplus +} + +static inline bool operator==(const sbp_code_phase_biases_sat_sig_t &lhs, + const sbp_code_phase_biases_sat_sig_t &rhs) { + return sbp_code_phase_biases_sat_sig_cmp(&lhs, &rhs) == 0; +} + +static inline bool operator!=(const sbp_code_phase_biases_sat_sig_t &lhs, + const sbp_code_phase_biases_sat_sig_t &rhs) { + return sbp_code_phase_biases_sat_sig_cmp(&lhs, &rhs) != 0; +} + +static inline bool operator<(const sbp_code_phase_biases_sat_sig_t &lhs, + const sbp_code_phase_biases_sat_sig_t &rhs) { + return sbp_code_phase_biases_sat_sig_cmp(&lhs, &rhs) < 0; +} + +static inline bool operator<=(const sbp_code_phase_biases_sat_sig_t &lhs, + const sbp_code_phase_biases_sat_sig_t &rhs) { + return sbp_code_phase_biases_sat_sig_cmp(&lhs, &rhs) <= 0; +} + +static inline bool operator>(const sbp_code_phase_biases_sat_sig_t &lhs, + const sbp_code_phase_biases_sat_sig_t &rhs) { + return sbp_code_phase_biases_sat_sig_cmp(&lhs, &rhs) > 0; +} + +static inline bool operator>=(const sbp_code_phase_biases_sat_sig_t &lhs, + const sbp_code_phase_biases_sat_sig_t &rhs) { + return sbp_code_phase_biases_sat_sig_cmp(&lhs, &rhs) >= 0; +} + +#endif // ifdef __cplusplus + +#endif /* LIBSBP_V4_SSR_CODEPHASEBIASESSATSIG_H */ diff --git a/c/src/include/libsbp/internal/v4/ssr.h b/c/src/include/libsbp/internal/v4/ssr.h index 03715a82f1..4b05b126cd 100644 --- a/c/src/include/libsbp/internal/v4/ssr.h +++ b/c/src/include/libsbp/internal/v4/ssr.h @@ -651,6 +651,46 @@ bool sbp_msg_ssr_orbit_clock_bounds_degradation_encode_internal( bool sbp_msg_ssr_orbit_clock_bounds_degradation_decode_internal( sbp_decode_ctx_t *ctx, sbp_msg_ssr_orbit_clock_bounds_degradation_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_code_phase_biases_sat_sig_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_code_phase_biases_sat_sig_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_code_phase_biases_sat_sig_decode_internal( + sbp_decode_ctx_t *ctx, sbp_code_phase_biases_sat_sig_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_code_phase_biases_bounds_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_msg_ssr_code_phase_biases_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_code_phase_biases_bounds_decode_internal( + sbp_decode_ctx_t *ctx, sbp_msg_ssr_code_phase_biases_bounds_t *msg); + #ifdef __cplusplus } #endif diff --git a/c/src/v4/ssr.c b/c/src/v4/ssr.c index 389665af84..ab30564a0e 100644 --- a/c/src/v4/ssr.c +++ b/c/src/v4/ssr.c @@ -3388,3 +3388,248 @@ int sbp_msg_ssr_orbit_clock_bounds_degradation_cmp( } return ret; } + +bool sbp_code_phase_biases_sat_sig_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_code_phase_biases_sat_sig_t *msg) { + if (!sbp_u8_encode(ctx, &msg->sat_id)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->signal_id)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->code_bias_bound_mu)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->code_bias_bound_sig)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->phase_bias_bound_mu)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->phase_bias_bound_sig)) { + return false; + } + return true; +} + +s8 sbp_code_phase_biases_sat_sig_encode( + uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_code_phase_biases_sat_sig_t *msg) { + sbp_encode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_code_phase_biases_sat_sig_encode_internal(&ctx, msg)) { + return SBP_ENCODE_ERROR; + } + if (n_written != NULL) { + *n_written = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +bool sbp_code_phase_biases_sat_sig_decode_internal( + sbp_decode_ctx_t *ctx, sbp_code_phase_biases_sat_sig_t *msg) { + if (!sbp_u8_decode(ctx, &msg->sat_id)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->signal_id)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->code_bias_bound_mu)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->code_bias_bound_sig)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->phase_bias_bound_mu)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->phase_bias_bound_sig)) { + return false; + } + return true; +} + +s8 sbp_code_phase_biases_sat_sig_decode(const uint8_t *buf, uint8_t len, + uint8_t *n_read, + sbp_code_phase_biases_sat_sig_t *msg) { + sbp_decode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_code_phase_biases_sat_sig_decode_internal(&ctx, msg)) { + return SBP_DECODE_ERROR; + } + if (n_read != NULL) { + *n_read = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +int sbp_code_phase_biases_sat_sig_cmp( + const sbp_code_phase_biases_sat_sig_t *a, + const sbp_code_phase_biases_sat_sig_t *b) { + int ret = 0; + + ret = sbp_u8_cmp(&a->sat_id, &b->sat_id); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->signal_id, &b->signal_id); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->code_bias_bound_mu, &b->code_bias_bound_mu); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->code_bias_bound_sig, &b->code_bias_bound_sig); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->phase_bias_bound_mu, &b->phase_bias_bound_mu); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->phase_bias_bound_sig, &b->phase_bias_bound_sig); + if (ret != 0) { + return ret; + } + return ret; +} + +bool sbp_msg_ssr_code_phase_biases_bounds_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_msg_ssr_code_phase_biases_bounds_t *msg) { + if (!sbp_bounds_header_encode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->ssr_iod)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->const_id)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->n_sats_signals)) { + return false; + } + for (size_t i = 0; i < msg->n_sats_signals; i++) { + if (!sbp_code_phase_biases_sat_sig_encode_internal( + ctx, &msg->satellites_signals[i])) { + return false; + } + } + return true; +} + +s8 sbp_msg_ssr_code_phase_biases_bounds_encode( + uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_msg_ssr_code_phase_biases_bounds_t *msg) { + sbp_encode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_msg_ssr_code_phase_biases_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_code_phase_biases_bounds_decode_internal( + sbp_decode_ctx_t *ctx, sbp_msg_ssr_code_phase_biases_bounds_t *msg) { + if (!sbp_bounds_header_decode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->ssr_iod)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->const_id)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->n_sats_signals)) { + return false; + } + msg->n_sats_signals = (uint8_t)((ctx->buf_len - ctx->offset) / + SBP_CODE_PHASE_BIASES_SAT_SIG_ENCODED_LEN); + for (uint8_t i = 0; i < msg->n_sats_signals; i++) { + if (!sbp_code_phase_biases_sat_sig_decode_internal( + ctx, &msg->satellites_signals[i])) { + return false; + } + } + return true; +} + +s8 sbp_msg_ssr_code_phase_biases_bounds_decode( + const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_msg_ssr_code_phase_biases_bounds_t *msg) { + sbp_decode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_msg_ssr_code_phase_biases_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_code_phase_biases_bounds_send( + sbp_state_t *s, u16 sender_id, + const sbp_msg_ssr_code_phase_biases_bounds_t *msg, sbp_write_fn_t write) { + uint8_t payload[SBP_MAX_PAYLOAD_LEN]; + uint8_t payload_len; + s8 ret = sbp_msg_ssr_code_phase_biases_bounds_encode(payload, sizeof(payload), + &payload_len, msg); + if (ret != SBP_OK) { + return ret; + } + return sbp_payload_send(s, SBP_MSG_SSR_CODE_PHASE_BIASES_BOUNDS, sender_id, + payload_len, payload, write); +} + +int sbp_msg_ssr_code_phase_biases_bounds_cmp( + const sbp_msg_ssr_code_phase_biases_bounds_t *a, + const sbp_msg_ssr_code_phase_biases_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, &b->ssr_iod); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->const_id, &b->const_id); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->n_sats_signals, &b->n_sats_signals); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->n_sats_signals, &b->n_sats_signals); + for (uint8_t i = 0; ret == 0 && i < a->n_sats_signals; i++) { + ret = sbp_code_phase_biases_sat_sig_cmp(&a->satellites_signals[i], + &b->satellites_signals[i]); + } + if (ret != 0) { + return ret; + } + return ret; +} diff --git a/java/src/com/swiftnav/sbp/ssr/CodePhaseBiasesSatSig.java b/java/src/com/swiftnav/sbp/ssr/CodePhaseBiasesSatSig.java new file mode 100644 index 0000000000..3209186c0d --- /dev/null +++ b/java/src/com/swiftnav/sbp/ssr/CodePhaseBiasesSatSig.java @@ -0,0 +1,85 @@ +/* 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 CodePhaseBiasesSatSig extends SBPStruct { + + /** + * Satellite ID. Similar to either RTCM DF068 (GPS), DF252 (Galileo), or DF488 (BDS) depending + * on the constellation. + */ + public int sat_id; + + /** + * Signal and Tracking Mode Identifier. Similar to either RTCM DF380 (GPS), DF382 (Galileo) or + * DF467 (BDS) depending on the constellation. + */ + public int signal_id; + + /** Code Bias Mean (range 0-1.275) */ + public int code_bias_bound_mu; + + /** Code Bias Standard Deviation (range 0-1.275) */ + public int code_bias_bound_sig; + + /** Phase Bias Mean (range 0-1.275) */ + public int phase_bias_bound_mu; + + /** Phase Bias Standard Deviation (range 0-1.275) */ + public int phase_bias_bound_sig; + + public CodePhaseBiasesSatSig() {} + + @Override + public CodePhaseBiasesSatSig parse(SBPMessage.Parser parser) throws SBPBinaryException { + /* Parse fields from binary */ + sat_id = parser.getU8(); + signal_id = parser.getU8(); + code_bias_bound_mu = parser.getU8(); + code_bias_bound_sig = parser.getU8(); + phase_bias_bound_mu = parser.getU8(); + phase_bias_bound_sig = parser.getU8(); + return this; + } + + @Override + public void build(SBPMessage.Builder builder) { + /* Build fields into binary */ + builder.putU8(sat_id); + builder.putU8(signal_id); + builder.putU8(code_bias_bound_mu); + builder.putU8(code_bias_bound_sig); + builder.putU8(phase_bias_bound_mu); + builder.putU8(phase_bias_bound_sig); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("sat_id", sat_id); + obj.put("signal_id", signal_id); + obj.put("code_bias_bound_mu", code_bias_bound_mu); + obj.put("code_bias_bound_sig", code_bias_bound_sig); + obj.put("phase_bias_bound_mu", phase_bias_bound_mu); + obj.put("phase_bias_bound_sig", phase_bias_bound_sig); + return obj; + } +} diff --git a/jsonschema/CodePhaseBiasesSatSig.json b/jsonschema/CodePhaseBiasesSatSig.json new file mode 100644 index 0000000000..c370752778 --- /dev/null +++ b/jsonschema/CodePhaseBiasesSatSig.json @@ -0,0 +1,34 @@ +{ + "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": "#CodePhaseBiasesSatSig", + "title":"CodePhaseBiasesSatSig", + "description":"", + "type": "object", + "properties": { + "sat_id": {"type": "integer"}, + "signal_id": {"type": "integer"}, + "code_bias_bound_mu": {"type": "integer"}, + "code_bias_bound_sig": {"type": "integer"}, + "phase_bias_bound_mu": {"type": "integer"}, + "phase_bias_bound_sig": {"type": "integer"} + }, + "required": [ + "sat_id", + "signal_id", + "code_bias_bound_mu", + "code_bias_bound_sig", + "phase_bias_bound_mu", + "phase_bias_bound_sig" + ] +} \ No newline at end of file diff --git a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrCodePhaseBiasesBounds.yaml b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrCodePhaseBiasesBounds.yaml index 533ae6664e..47cd493044 100644 --- a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrCodePhaseBiasesBounds.yaml +++ b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrCodePhaseBiasesBounds.yaml @@ -5,13 +5,45 @@ tests: - msg: fields: - stub: [180,0,0,0,3,0,1,2,1,14,15,1,3,0,3,39,1,39,1,1,3,39,1,39,1,1,1,39,1,39,1] - c_decoded_fields: - n_stub: 31 + header: + time: + tow: 180 + wn: 3 + num_msgs: 1 + seq_num: 2 + update_interval: 1 + sol_id: 14 + ssr_iod: 15 + const_id: 1 + n_sats_signals: 3 + satellites_signals: + - sat_id: 0 + signal_id: 3 + code_bias_bound_mu: 39 + code_bias_bound_sig: 1 + phase_bias_bound_mu: 39 + phase_bias_bound_sig: 1 + - sat_id: 1 + signal_id: 3 + code_bias_bound_mu: 39 + code_bias_bound_sig: 1 + phase_bias_bound_mu: 39 + phase_bias_bound_sig: 1 + - sat_id: 1 + signal_id: 1 + code_bias_bound_mu: 39 + code_bias_bound_sig: 1 + phase_bias_bound_mu: 39 + phase_bias_bound_sig: 1 module: sbp.ssr name: MsgSsrCodePhaseBiasesBounds msg_type: '1516' - raw_json: '{"stub": [180,0,0,0,3,0,1,2,1,14,15,1,3,0,3,39,1,39,1,1,3,39,1,39,1,1,1,39,1,39,1], "preamble": 85, + raw_json: '{"header": {"time": {"tow": 180, "wn": 3}, "num_msgs": 1, "seq_num": 2, "update_interval": 1, + "sol_id": 14}, "ssr_iod": 15, "const_id": 1, "n_sats_signals": 3, "satellites_signals": [{ + "sat_id": 0, "signal_id": 3, "code_bias_bound_mu": 39, "code_bias_bound_sig": 1, "phase_bias_bound_mu": 39, + "phase_bias_bound_sig": 1}, {"sat_id": 1, "signal_id": 3, "code_bias_bound_mu": 39, "code_bias_bound_sig": 1, + "phase_bias_bound_mu": 39, "phase_bias_bound_sig": 1}, {"sat_id": 1, "signal_id": 1, "code_bias_bound_mu": 39, + "code_bias_bound_sig": 1, "phase_bias_bound_mu": 39, "phase_bias_bound_sig": 1}], "preamble": 85, "msg_type": 1516, "sender": 66, "length": 31, "payload": "tAAAAAMAAQIBDg8BAwADJwEnAQEDJwEnAQEBJwEnAQ==", "crc": 28951}' raw_packet: VewFQgAftAAAAAMAAQIBDg8BAwADJwEnAQEDJwEnAQEBJwEnARdx sbp: diff --git a/spec/yaml/swiftnav/sbp/ssr.yaml b/spec/yaml/swiftnav/sbp/ssr.yaml index e10970501d..4acfb100ad 100644 --- a/spec/yaml/swiftnav/sbp/ssr.yaml +++ b/spec/yaml/swiftnav/sbp/ssr.yaml @@ -924,3 +924,57 @@ definitions: size_fn: n_sats map_by: sat_id desc: Orbit and Clock Bounds per Satellite + + - CodePhaseBiasesSatSig: + short_desc: Code and Phase Biases Bounds per Satellite-Signal couple + fields: + - sat_id: + type: u8 + desc: > + Satellite ID. Similar to either RTCM DF068 (GPS), DF252 (Galileo), + or DF488 (BDS) depending on the constellation. + - signal_id: + type: u8 + desc: > + Signal and Tracking Mode Identifier. Similar to either RTCM DF380 (GPS), + DF382 (Galileo) or DF467 (BDS) depending on the constellation. + - code_bias_bound_mu: + type: u8 + units: 0.005 m + desc: Code Bias Mean (range 0-1.275) + - code_bias_bound_sig: + type: u8 + units: 0.005 m + desc: Code Bias Standard Deviation (range 0-1.275) + - phase_bias_bound_mu: + type: u8 + units: 0.005 m + desc: Phase Bias Mean (range 0-1.275) + - phase_bias_bound_sig: + type: u8 + units: 0.005 m + desc: Phase Bias Standard Deviation (range 0-1.275) + + - MSG_SSR_CODE_PHASE_BIASES_BOUNDS: + id: 0x05EC + short_desc: Combined Code and Phase Biases Bounds + public: False + fields: + - header: + type: BoundsHeader + desc: Header of a bounds message. + - ssr_iod: + type: u8 + desc: IOD of the SSR bound. + - const_id: + type: u8 + desc: Constellation ID to which the SVs belong. + - n_sats_signals: + type: u8 + desc: Number of satellite-signal couples. + - satellites_signals: + type: array + fill: CodePhaseBiasesSatSig + size_fn: n_sats_signals + map_by: sat_id + desc: Code and Phase Biases Bounds per Satellite-Signal couple. From fe24a8334b16ea2c800becaca282bd4aceea87aa Mon Sep 17 00:00:00 2001 From: fpezzinosn <79222190+fpezzinosn@users.noreply.github.com> Date: Fri, 6 May 2022 16:01:43 -0400 Subject: [PATCH 03/10] Add Atmospheric Corrections and Bounds [OTA-120] (#1131) Co-authored-by: Jason Mobarak --- .../libsbp/v4/ssr/STECSatElementIntegrity.h | 187 +++++++++++++ .../sbp/ssr/STECSatElementIntegrity.java | 81 ++++++ jsonschema/STECSatElementIntegrity.json | 32 +++ .../test_MsgSsrGriddedCorrectionBounds.yaml | 53 +++- .../sbp/ssr/test_MsgSsrStecCorrection.yaml | 30 ++- .../sbp/ssr/test_MsgSsrTileDefinition.yaml | 16 +- spec/yaml/swiftnav/sbp/ssr.yaml | 252 ++++++++++++++++-- 7 files changed, 616 insertions(+), 35 deletions(-) create mode 100644 c/include/libsbp/v4/ssr/STECSatElementIntegrity.h create mode 100644 java/src/com/swiftnav/sbp/ssr/STECSatElementIntegrity.java create mode 100644 jsonschema/STECSatElementIntegrity.json 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/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/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/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml index 4fa9c7da8a..bed08e07a2 100644 --- a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml +++ b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml @@ -5,14 +5,57 @@ tests: - msg: fields: - stub: [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] - c_decoded_fields: - n_stub: 43 + 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: '{"stub": [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], - "preamble": 85, "msg_type": 1534, "sender": 66, "length": 43, + 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: diff --git a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrection.yaml b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrection.yaml index f6f5fdcf77..a0f9a7a3af 100644 --- a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrection.yaml +++ b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrStecCorrection.yaml @@ -5,13 +5,35 @@ tests: - msg: fields: - stub: [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] - c_decoded_fields: - n_stub: 38 + header: + time: + tow: 180 + wn: 3 + num_msgs: 1 + seq_num: 1 + update_interval: 10 + sol_id: 0 + ssr_iod_atmo: 15 + tile_set_id: 1 + tile_id: 10 + n_sats: 2 + stec_sat_list: + - sv_id: + satId: 1 + constellation: 1 + stec_quality_indicator: 1 + stec_coeff: [63,62,61,60] + - sv_id: + satId: 31 + constellation: 15 + stec_quality_indicator: 5 + stec_coeff: [63,64,65,66] module: sbp.ssr name: MsgSsrStecCorrection msg_type: '1533' - raw_json: '{"stub": [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], + 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: diff --git a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinition.yaml b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinition.yaml index ef5a15493f..0d3c1846b5 100644 --- a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinition.yaml +++ b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrTileDefinition.yaml @@ -5,13 +5,21 @@ tests: - msg: fields: - stub: [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] - c_decoded_fields: - n_stub: 25 + ssr_sol_id: 31 + tile_set_id: 256 + tile_id: 512 + corner_nw_lat: 1024 + corner_nw_lon: 2048 + spacing_lat: 4096 + spacing_lon: 8192 + rows: 16384 + cols: 32768 + bitmask: 1234567890 module: sbp.ssr name: MsgSsrTileDefinition msg_type: '1527' - raw_json: '{"stub": [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], "preamble": 85, + 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: diff --git a/spec/yaml/swiftnav/sbp/ssr.yaml b/spec/yaml/swiftnav/sbp/ssr.yaml index 4acfb100ad..7e5278c370 100644 --- a/spec/yaml/swiftnav/sbp/ssr.yaml +++ b/spec/yaml/swiftnav/sbp/ssr.yaml @@ -381,6 +381,53 @@ definitions: fill: STECSatElement desc: Array of STEC polynomial coefficients for each space vehicle. + - BoundsHeader: + short_desc: Header for the Bounds messages + fields: + - time: + type: GPSTimeSec + desc: GNSS reference time of the bound + - num_msgs: + type: u8 + desc: Number of messages in the dataset + - seq_num: + type: u8 + desc: Position of this message in the dataset + - update_interval: + type: u8 + desc: > + Update interval between consecutive bounds. Similar to + RTCM DF391. + - sol_id: + type: u8 + desc: SSR Solution ID. + + - MSG_SSR_STEC_CORRECTION: + id: 0x05FD + short_desc: STEC correction polynomial coefficients + public: False + fields: + - header: + type: BoundsHeader + desc: Header of a STEC correction with bounds message. + - ssr_iod_atmo: + type: u8 + desc: IOD of the SSR atmospheric correction + - tile_set_id: + type: u16 + desc: Tile set ID + - tile_id: + type: u16 + desc: Tile ID + - n_sats: + type: u8 + desc: Number of satellites. + - stec_sat_list: + type: array + fill: STECSatElement + size_fn: n_sats + desc: Array of STEC polynomial coefficients for each space vehicle. + - MSG_SSR_GRIDDED_CORRECTION: id: 0x05FC short_desc: Gridded troposphere and STEC correction residuals @@ -404,7 +451,80 @@ definitions: fill: STECResidual desc: STEC residuals for each satellite (mean, stddev). - - MSG_SSR_TILE_DEFINITION: + - STECSatElementIntegrity: + desc: STEC polynomial and bounds for the given satellite. + fields: + - stec_residual: + type: STECResidual + desc: STEC residuals (mean, stddev) + - stec_bound_mu: + type: u8 + units: m + desc: > + STEC Error Bound Mean (range 0-17.5) + i<= 200, mean = 0.01i + 200230, mean=5+0.5(i-230) + - stec_bound_sig: + type: u8 + units: m + desc: > + STEC Error Bound Standard Deviation (range 0-17.5) + i<= 200, mean = 0.01i + 200230, mean=5+0.5(i-230) + - stec_bound_mu_dot: + type: u8 + units: 0.00005 m/s + desc: STEC Error Bound Mean First derivative degradation parameter(range 0-0.01275) + - stec_bound_sig_dot: + type: u8 + units: 0.00005 m/s + desc: STEC Error Bound Standard Deviation First derivative degradation parameter (range 0-0.01275) + + - MSG_SSR_GRIDDED_CORRECTION_BOUNDS: + id: 0x05FE + short_desc: Gridded troposhere and STEC correction residuals bounds + fields: + - header: + type: BoundsHeader + desc: Header of a bounds message. + - ssr_iod_atmo: + type: u8 + desc: IOD of the SSR atmospheric correction. + - tile_set_id: + type: u16 + desc: Unique identifier of the set this tile belongs to. + - tile_id: + type: u16 + desc: Unique identifier of this tile in the tile set. + - tropo_qi: + type: u8 + desc: Tropo Quality Indicator. Similar to RTCM DF389. + - grid_point_id: + type: u16 + desc: Index of the Grid Point. + - tropo_delay_correction: + type: TroposphericDelayCorrection + desc: Tropospheric delay at grid point. + - tropo_bound_mu: + type: u8 + units: 0.005 m + desc: Troposphere Error Bound Mean (range 0-1.275). + - tropo_bound_sig: + type: u8 + units: 0.005 m + desc: Troposphere Error Bound Standard Deviation (range 0-1.275) + - n_sats: + type: u8 + desc: Number of satellites. + - stec_sat_list: + type: array + fill: STECSatElementIntegrity + size_fn: n_sats + desc: Array of STEC polynomial coefficients and its bounds for each space vehicle. + + - MSG_SSR_TILE_DEFINITION_DEP: id: 0x05F6 short_desc: > Definition of a SSR atmospheric correction tile. @@ -512,6 +632,115 @@ definitions: See GNSS-SSR-ArrayOfCorrectionPoints field bitmaskOfGrids but note the definition of the bits is inverted. + - MSG_SSR_TILE_DEFINITION: + id: 0x05F7 + short_desc: > + Definition of a SSR atmospheric correction tile. + desc: > + Provides the correction point coordinates for the atmospheric correction + values in the MSG_SSR_STEC_CORRECTION and MSG_SSR_GRIDDED_CORRECTION + messages. + + + Based on ETSI TS 137 355 V16.1.0 (LTE Positioning Protocol) information + element GNSS-SSR-CorrectionPoints. SBP only supports gridded arrays of + correction points, not lists of points. + fields: + - ssr_sol_id: + type: u8 + desc: SSR Solution ID. + - tile_set_id: + type: u16 + desc: Unique identifier of the tile set this tile belongs to. + - tile_id: + type: u16 + desc: > + Unique identifier of this tile in the tile set. + + See GNSS-SSR-ArrayOfCorrectionPoints field correctionPointSetID. + - corner_nw_lat: + type: s16 + units: encoded degrees + desc: > + North-West corner correction point latitude. + + + The relation between the latitude X in the range [-90, 90] and + the coded number N is: + + + N = floor((X / 90) * 2^14) + + + See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLatitude. + - corner_nw_lon: + type: s16 + units: encoded degrees + desc: > + North-West corner correction point longitude. + + + The relation between the longitude X in the range [-180, 180] + and the coded number N is: + + + N = floor((X / 180) * 2^15) + + + See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLongitude. + - spacing_lat: + type: u16 + units: 0.01 degrees + desc: > + Spacing of the correction points in the latitude direction. + + + See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLatitude. + - spacing_lon: + type: u16 + units: 0.01 degrees + desc: > + Spacing of the correction points in the longitude direction. + + + See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLongitude. + - rows: + type: u16 + desc: > + Number of steps in the latitude direction. + + + See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLatitude. + - cols: + type: u16 + desc: > + Number of steps in the longitude direction. + + + See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLongitude. + - bitmask: + type: u64 + desc: > + Specifies the availability of correction data at the + correction points in the array. + + + If a specific bit is enabled (set to 1), the correction is not + available. Only the first rows * cols bits are used, the remainder + are set to 0. If there are more then 64 correction points the + remaining corrections are always available. + + + Starting with the northwest corner of the array (top left on a + north oriented map) the correction points are enumerated with row + precedence - first row west to east, second row west to east, + until last row west to east - ending with the southeast corner of + the array. + + + See GNSS-SSR-ArrayOfCorrectionPoints field bitmaskOfGrids but + note the definition of the bits is inverted. + - SatelliteAPC: short_desc: Antenna phase center correction desc: > @@ -807,27 +1036,6 @@ definitions: essentially the index of the quadrants that contain transitions between valid and invalid (and vice versa) are encoded as u8 integers. - - BoundsHeader: - short_desc: Header for the Bounds messages - fields: - - time: - type: GPSTimeSec - desc: GNSS reference time of the bound - - num_msgs: - type: u8 - desc: Number of messages in the dataset - - seq_num: - type: u8 - desc: Position of this message in the dataset - - update_interval: - type: u8 - desc: > - Update interval between consecutive bounds. Similar to - RTCM DF391. - - sol_id: - type: u8 - desc: SSR Solution ID. - - OrbitClockBound: desc: Orbit and clock bound. fields: From 75159a272a199159bdfd608413e054673dae16c3 Mon Sep 17 00:00:00 2001 From: fpezzinosn <79222190+fpezzinosn@users.noreply.github.com> Date: Fri, 6 May 2022 17:18:50 -0400 Subject: [PATCH 04/10] Add support for MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION message [OTA-133] (#1137) --- c/include/libsbp/legacy/ssr.h | 52 ++++ c/include/libsbp/ssr_macros.h | 13 + .../v4/ssr/OrbitClockBoundDegradation.h | 206 ++++++++++++++ c/src/include/libsbp/internal/v4/ssr.h | 41 +++ c/src/v4/ssr.c | 260 ++++++++++++++++++ .../sbp/ssr/OrbitClockBoundDegradation.java | 99 +++++++ jsonschema/OrbitClockBoundDegradation.json | 38 +++ ...est_MsgSsrOrbitClockBoundsDegradation.yaml | 30 +- spec/yaml/swiftnav/sbp/ssr.yaml | 75 +++++ 9 files changed, 809 insertions(+), 5 deletions(-) create mode 100644 c/include/libsbp/v4/ssr/OrbitClockBoundDegradation.h create mode 100644 java/src/com/swiftnav/sbp/ssr/OrbitClockBoundDegradation.java create mode 100644 jsonschema/OrbitClockBoundDegradation.json diff --git a/c/include/libsbp/legacy/ssr.h b/c/include/libsbp/legacy/ssr.h index 9d512a71ea..7cfca3bcbe 100644 --- a/c/include/libsbp/legacy/ssr.h +++ b/c/include/libsbp/legacy/ssr.h @@ -583,6 +583,58 @@ typedef struct SBP_ATTR_PACKED { couple. */ } msg_ssr_code_phase_biases_bounds_t; +/** None + * + * Orbit and clock bound degradation. + */ + +typedef struct SBP_ATTR_PACKED { + u8 orb_radial_bound_mu_dot; /**< Orbit Bound Mean Radial First + derivative degradation parameter (range + 0-0.255) [0.001 m/s] */ + u8 orb_along_bound_mu_dot; /**< Orbit Bound Mean Along-Track First + derivative degradation parameter (range + 0-0.255) [0.001 m/s] */ + u8 orb_cross_bound_mu_dot; /**< Orbit Bound Mean Cross-Track First + derivative degradation parameter (range + 0-0.255) [0.001 m/s] */ + u8 orb_radial_bound_sig_dot; /**< Orbit Bound Standard Deviation Radial + First derivative degradation parameter + (range 0-0.255) [0.001 m/s] */ + u8 orb_along_bound_sig_dot; /**< Orbit Bound Standard Deviation Along- + Track First derivative degradation + parameter (range 0-0.255) [0.001 m/s] */ + u8 orb_cross_bound_sig_dot; /**< Orbit Bound Standard Deviation Cross- + Track First derivative degradation + parameter (range 0-0.255) [0.001 m/s] */ + u8 clock_bound_mu_dot; /**< Clock Bound Mean First derivative + degradation parameter (range 0-0.255) [0.001 m/s] + */ + u8 clock_bound_sig_dot; /**< Clock Bound Standard Deviation First + derivative degradation parameter (range + 0-0.255) [0.001 m/s] */ +} orbit_clock_bound_degradation_t; + +typedef struct SBP_ATTR_PACKED { + bounds_header_t header; /**< Header of a bounds + message. */ + u8 ssr_iod; /**< IOD of the SSR bound degradation + parameter. */ + u8 const_id; /**< Constellation ID to which the SVs + belong. */ + u64 sat_bitmask; /**< Satellite Bit Mask. Put 1 for + each satellite where the + following degradation parameters + are applicable, 0 otherwise. */ + orbit_clock_bound_degradation_t + orbit_clock_bounds_degradation; /**< Orbit + and + Clock + Bounds + Degradation + Parameters */ +} msg_ssr_orbit_clock_bounds_degradation_t; + /** \} */ SBP_PACK_END diff --git a/c/include/libsbp/ssr_macros.h b/c/include/libsbp/ssr_macros.h index 813c1df67d..a0f97fa347 100644 --- a/c/include/libsbp/ssr_macros.h +++ b/c/include/libsbp/ssr_macros.h @@ -560,4 +560,17 @@ */ #define SBP_MSG_SSR_CODE_PHASE_BIASES_BOUNDS_ENCODED_OVERHEAD 13u +/** + * Encoded length of sbp_orbit_clock_bound_degradation_t (V4 API) and + * orbit_clock_bound_degradation_t (legacy API) + */ +#define SBP_ORBIT_CLOCK_BOUND_DEGRADATION_ENCODED_LEN 8u + +#define SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION 0x05DF +/** + * Encoded length of sbp_msg_ssr_orbit_clock_bounds_degradation_t (V4 API) and + * msg_ssr_orbit_clock_bounds_degradation_t (legacy API) + */ +#define SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION_ENCODED_LEN 28u + #endif /* LIBSBP_SSR_MACROS_H */ diff --git a/c/include/libsbp/v4/ssr/OrbitClockBoundDegradation.h b/c/include/libsbp/v4/ssr/OrbitClockBoundDegradation.h new file mode 100644 index 0000000000..41e460d813 --- /dev/null +++ b/c/include/libsbp/v4/ssr/OrbitClockBoundDegradation.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_ORBITCLOCKBOUNDDEGRADATION_H +#define LIBSBP_V4_SSR_ORBITCLOCKBOUNDDEGRADATION_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * + * SBP_ORBITCLOCKBOUNDDEGRADATION + * + *****************************************************************************/ +/** None + * + * Orbit and clock bound degradation. + */ +typedef struct { + /** + * Orbit Bound Mean Radial First derivative degradation parameter (range + * 0-0.255) [0.001 m/s] + */ + u8 orb_radial_bound_mu_dot; + + /** + * Orbit Bound Mean Along-Track First derivative degradation parameter (range + * 0-0.255) [0.001 m/s] + */ + u8 orb_along_bound_mu_dot; + + /** + * Orbit Bound Mean Cross-Track First derivative degradation parameter (range + * 0-0.255) [0.001 m/s] + */ + u8 orb_cross_bound_mu_dot; + + /** + * Orbit Bound Standard Deviation Radial First derivative degradation + * parameter (range 0-0.255) [0.001 m/s] + */ + u8 orb_radial_bound_sig_dot; + + /** + * Orbit Bound Standard Deviation Along-Track First derivative degradation + * parameter (range 0-0.255) [0.001 m/s] + */ + u8 orb_along_bound_sig_dot; + + /** + * Orbit Bound Standard Deviation Cross-Track First derivative degradation + * parameter (range 0-0.255) [0.001 m/s] + */ + u8 orb_cross_bound_sig_dot; + + /** + * Clock Bound Mean First derivative degradation parameter (range 0-0.255) + * [0.001 m/s] + */ + u8 clock_bound_mu_dot; + + /** + * Clock Bound Standard Deviation First derivative degradation parameter + * (range 0-0.255) [0.001 m/s] + */ + u8 clock_bound_sig_dot; +} sbp_orbit_clock_bound_degradation_t; + +/** + * Get encoded size of an instance of sbp_orbit_clock_bound_degradation_t + * + * @param msg sbp_orbit_clock_bound_degradation_t instance + * @return Length of on-wire representation + */ +static inline size_t sbp_orbit_clock_bound_degradation_encoded_len( + const sbp_orbit_clock_bound_degradation_t *msg) { + (void)msg; + return SBP_ORBIT_CLOCK_BOUND_DEGRADATION_ENCODED_LEN; +} + +/** + * Encode an instance of sbp_orbit_clock_bound_degradation_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_orbit_clock_bound_degradation_t to encode + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 sbp_orbit_clock_bound_degradation_encode( + uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_orbit_clock_bound_degradation_t *msg); + +/** + * Decode an instance of sbp_orbit_clock_bound_degradation_t from wire + * representation + * + * This function decodes the wire representation of a + * sbp_orbit_clock_bound_degradation_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_orbit_clock_bound_degradation_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_orbit_clock_bound_degradation_decode( + const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_orbit_clock_bound_degradation_t *msg); + +/** + * Compare two instances of sbp_orbit_clock_bound_degradation_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_orbit_clock_bound_degradation_t instance + * @param b sbp_orbit_clock_bound_degradation_t instance + * @return 0, <0, >0 + */ +SBP_EXPORT int sbp_orbit_clock_bound_degradation_cmp( + const sbp_orbit_clock_bound_degradation_t *a, + const sbp_orbit_clock_bound_degradation_t *b); + +#ifdef __cplusplus +} + +static inline bool operator==(const sbp_orbit_clock_bound_degradation_t &lhs, + const sbp_orbit_clock_bound_degradation_t &rhs) { + return sbp_orbit_clock_bound_degradation_cmp(&lhs, &rhs) == 0; +} + +static inline bool operator!=(const sbp_orbit_clock_bound_degradation_t &lhs, + const sbp_orbit_clock_bound_degradation_t &rhs) { + return sbp_orbit_clock_bound_degradation_cmp(&lhs, &rhs) != 0; +} + +static inline bool operator<(const sbp_orbit_clock_bound_degradation_t &lhs, + const sbp_orbit_clock_bound_degradation_t &rhs) { + return sbp_orbit_clock_bound_degradation_cmp(&lhs, &rhs) < 0; +} + +static inline bool operator<=(const sbp_orbit_clock_bound_degradation_t &lhs, + const sbp_orbit_clock_bound_degradation_t &rhs) { + return sbp_orbit_clock_bound_degradation_cmp(&lhs, &rhs) <= 0; +} + +static inline bool operator>(const sbp_orbit_clock_bound_degradation_t &lhs, + const sbp_orbit_clock_bound_degradation_t &rhs) { + return sbp_orbit_clock_bound_degradation_cmp(&lhs, &rhs) > 0; +} + +static inline bool operator>=(const sbp_orbit_clock_bound_degradation_t &lhs, + const sbp_orbit_clock_bound_degradation_t &rhs) { + return sbp_orbit_clock_bound_degradation_cmp(&lhs, &rhs) >= 0; +} + +#endif // ifdef __cplusplus + +#endif /* LIBSBP_V4_SSR_ORBITCLOCKBOUNDDEGRADATION_H */ diff --git a/c/src/include/libsbp/internal/v4/ssr.h b/c/src/include/libsbp/internal/v4/ssr.h index 4b05b126cd..1922c71f6d 100644 --- a/c/src/include/libsbp/internal/v4/ssr.h +++ b/c/src/include/libsbp/internal/v4/ssr.h @@ -691,6 +691,47 @@ bool sbp_msg_ssr_code_phase_biases_bounds_encode_internal( bool sbp_msg_ssr_code_phase_biases_bounds_decode_internal( sbp_decode_ctx_t *ctx, sbp_msg_ssr_code_phase_biases_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_orbit_clock_bound_degradation_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_orbit_clock_bound_degradation_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_orbit_clock_bound_degradation_decode_internal( + sbp_decode_ctx_t *ctx, sbp_orbit_clock_bound_degradation_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_orbit_clock_bounds_degradation_encode_internal( + sbp_encode_ctx_t *ctx, + const sbp_msg_ssr_orbit_clock_bounds_degradation_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_orbit_clock_bounds_degradation_decode_internal( + sbp_decode_ctx_t *ctx, sbp_msg_ssr_orbit_clock_bounds_degradation_t *msg); + #ifdef __cplusplus } #endif diff --git a/c/src/v4/ssr.c b/c/src/v4/ssr.c index ab30564a0e..7a7ee2c0c0 100644 --- a/c/src/v4/ssr.c +++ b/c/src/v4/ssr.c @@ -3633,3 +3633,263 @@ int sbp_msg_ssr_code_phase_biases_bounds_cmp( } return ret; } + +bool sbp_orbit_clock_bound_degradation_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_orbit_clock_bound_degradation_t *msg) { + if (!sbp_u8_encode(ctx, &msg->orb_radial_bound_mu_dot)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->orb_along_bound_mu_dot)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->orb_cross_bound_mu_dot)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->orb_radial_bound_sig_dot)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->orb_along_bound_sig_dot)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->orb_cross_bound_sig_dot)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->clock_bound_mu_dot)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->clock_bound_sig_dot)) { + return false; + } + return true; +} + +s8 sbp_orbit_clock_bound_degradation_encode( + uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_orbit_clock_bound_degradation_t *msg) { + sbp_encode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_orbit_clock_bound_degradation_encode_internal(&ctx, msg)) { + return SBP_ENCODE_ERROR; + } + if (n_written != NULL) { + *n_written = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +bool sbp_orbit_clock_bound_degradation_decode_internal( + sbp_decode_ctx_t *ctx, sbp_orbit_clock_bound_degradation_t *msg) { + if (!sbp_u8_decode(ctx, &msg->orb_radial_bound_mu_dot)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->orb_along_bound_mu_dot)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->orb_cross_bound_mu_dot)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->orb_radial_bound_sig_dot)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->orb_along_bound_sig_dot)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->orb_cross_bound_sig_dot)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->clock_bound_mu_dot)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->clock_bound_sig_dot)) { + return false; + } + return true; +} + +s8 sbp_orbit_clock_bound_degradation_decode( + const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_orbit_clock_bound_degradation_t *msg) { + sbp_decode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_orbit_clock_bound_degradation_decode_internal(&ctx, msg)) { + return SBP_DECODE_ERROR; + } + if (n_read != NULL) { + *n_read = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +int sbp_orbit_clock_bound_degradation_cmp( + const sbp_orbit_clock_bound_degradation_t *a, + const sbp_orbit_clock_bound_degradation_t *b) { + int ret = 0; + + ret = sbp_u8_cmp(&a->orb_radial_bound_mu_dot, &b->orb_radial_bound_mu_dot); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->orb_along_bound_mu_dot, &b->orb_along_bound_mu_dot); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->orb_cross_bound_mu_dot, &b->orb_cross_bound_mu_dot); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->orb_radial_bound_sig_dot, &b->orb_radial_bound_sig_dot); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->orb_along_bound_sig_dot, &b->orb_along_bound_sig_dot); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->orb_cross_bound_sig_dot, &b->orb_cross_bound_sig_dot); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->clock_bound_mu_dot, &b->clock_bound_mu_dot); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->clock_bound_sig_dot, &b->clock_bound_sig_dot); + if (ret != 0) { + return ret; + } + return ret; +} + +bool sbp_msg_ssr_orbit_clock_bounds_degradation_encode_internal( + sbp_encode_ctx_t *ctx, + const sbp_msg_ssr_orbit_clock_bounds_degradation_t *msg) { + if (!sbp_bounds_header_encode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->ssr_iod)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->const_id)) { + return false; + } + if (!sbp_u64_encode(ctx, &msg->sat_bitmask)) { + return false; + } + if (!sbp_orbit_clock_bound_degradation_encode_internal( + ctx, &msg->orbit_clock_bounds_degradation)) { + return false; + } + return true; +} + +s8 sbp_msg_ssr_orbit_clock_bounds_degradation_encode( + uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_msg_ssr_orbit_clock_bounds_degradation_t *msg) { + sbp_encode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_msg_ssr_orbit_clock_bounds_degradation_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_orbit_clock_bounds_degradation_decode_internal( + sbp_decode_ctx_t *ctx, sbp_msg_ssr_orbit_clock_bounds_degradation_t *msg) { + if (!sbp_bounds_header_decode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->ssr_iod)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->const_id)) { + return false; + } + if (!sbp_u64_decode(ctx, &msg->sat_bitmask)) { + return false; + } + if (!sbp_orbit_clock_bound_degradation_decode_internal( + ctx, &msg->orbit_clock_bounds_degradation)) { + return false; + } + return true; +} + +s8 sbp_msg_ssr_orbit_clock_bounds_degradation_decode( + const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_msg_ssr_orbit_clock_bounds_degradation_t *msg) { + sbp_decode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_msg_ssr_orbit_clock_bounds_degradation_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_orbit_clock_bounds_degradation_send( + sbp_state_t *s, u16 sender_id, + const sbp_msg_ssr_orbit_clock_bounds_degradation_t *msg, + sbp_write_fn_t write) { + uint8_t payload[SBP_MAX_PAYLOAD_LEN]; + uint8_t payload_len; + s8 ret = sbp_msg_ssr_orbit_clock_bounds_degradation_encode( + payload, sizeof(payload), &payload_len, msg); + if (ret != SBP_OK) { + return ret; + } + return sbp_payload_send(s, SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION, + sender_id, payload_len, payload, write); +} + +int sbp_msg_ssr_orbit_clock_bounds_degradation_cmp( + const sbp_msg_ssr_orbit_clock_bounds_degradation_t *a, + const sbp_msg_ssr_orbit_clock_bounds_degradation_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, &b->ssr_iod); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->const_id, &b->const_id); + if (ret != 0) { + return ret; + } + + ret = sbp_u64_cmp(&a->sat_bitmask, &b->sat_bitmask); + if (ret != 0) { + return ret; + } + + ret = sbp_orbit_clock_bound_degradation_cmp( + &a->orbit_clock_bounds_degradation, &b->orbit_clock_bounds_degradation); + if (ret != 0) { + return ret; + } + return ret; +} diff --git a/java/src/com/swiftnav/sbp/ssr/OrbitClockBoundDegradation.java b/java/src/com/swiftnav/sbp/ssr/OrbitClockBoundDegradation.java new file mode 100644 index 0000000000..7c79f1ed70 --- /dev/null +++ b/java/src/com/swiftnav/sbp/ssr/OrbitClockBoundDegradation.java @@ -0,0 +1,99 @@ +/* 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 OrbitClockBoundDegradation extends SBPStruct { + + /** Orbit Bound Mean Radial First derivative degradation parameter (range 0-0.255) */ + public int orb_radial_bound_mu_dot; + + /** Orbit Bound Mean Along-Track First derivative degradation parameter (range 0-0.255) */ + public int orb_along_bound_mu_dot; + + /** Orbit Bound Mean Cross-Track First derivative degradation parameter (range 0-0.255) */ + public int orb_cross_bound_mu_dot; + + /** + * Orbit Bound Standard Deviation Radial First derivative degradation parameter (range 0-0.255) + */ + public int orb_radial_bound_sig_dot; + + /** + * Orbit Bound Standard Deviation Along-Track First derivative degradation parameter (range + * 0-0.255) + */ + public int orb_along_bound_sig_dot; + + /** + * Orbit Bound Standard Deviation Cross-Track First derivative degradation parameter (range + * 0-0.255) + */ + public int orb_cross_bound_sig_dot; + + /** Clock Bound Mean First derivative degradation parameter (range 0-0.255) */ + public int clock_bound_mu_dot; + + /** Clock Bound Standard Deviation First derivative degradation parameter (range 0-0.255) */ + public int clock_bound_sig_dot; + + public OrbitClockBoundDegradation() {} + + @Override + public OrbitClockBoundDegradation parse(SBPMessage.Parser parser) throws SBPBinaryException { + /* Parse fields from binary */ + orb_radial_bound_mu_dot = parser.getU8(); + orb_along_bound_mu_dot = parser.getU8(); + orb_cross_bound_mu_dot = parser.getU8(); + orb_radial_bound_sig_dot = parser.getU8(); + orb_along_bound_sig_dot = parser.getU8(); + orb_cross_bound_sig_dot = parser.getU8(); + clock_bound_mu_dot = parser.getU8(); + clock_bound_sig_dot = parser.getU8(); + return this; + } + + @Override + public void build(SBPMessage.Builder builder) { + /* Build fields into binary */ + builder.putU8(orb_radial_bound_mu_dot); + builder.putU8(orb_along_bound_mu_dot); + builder.putU8(orb_cross_bound_mu_dot); + builder.putU8(orb_radial_bound_sig_dot); + builder.putU8(orb_along_bound_sig_dot); + builder.putU8(orb_cross_bound_sig_dot); + builder.putU8(clock_bound_mu_dot); + builder.putU8(clock_bound_sig_dot); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("orb_radial_bound_mu_dot", orb_radial_bound_mu_dot); + obj.put("orb_along_bound_mu_dot", orb_along_bound_mu_dot); + obj.put("orb_cross_bound_mu_dot", orb_cross_bound_mu_dot); + obj.put("orb_radial_bound_sig_dot", orb_radial_bound_sig_dot); + obj.put("orb_along_bound_sig_dot", orb_along_bound_sig_dot); + obj.put("orb_cross_bound_sig_dot", orb_cross_bound_sig_dot); + obj.put("clock_bound_mu_dot", clock_bound_mu_dot); + obj.put("clock_bound_sig_dot", clock_bound_sig_dot); + return obj; + } +} diff --git a/jsonschema/OrbitClockBoundDegradation.json b/jsonschema/OrbitClockBoundDegradation.json new file mode 100644 index 0000000000..8bb5a37f31 --- /dev/null +++ b/jsonschema/OrbitClockBoundDegradation.json @@ -0,0 +1,38 @@ +{ + "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": "#OrbitClockBoundDegradation", + "title":"OrbitClockBoundDegradation", + "description":"Orbit and clock bound degradation.\n", + "type": "object", + "properties": { + "orb_radial_bound_mu_dot": {"type": "integer"}, + "orb_along_bound_mu_dot": {"type": "integer"}, + "orb_cross_bound_mu_dot": {"type": "integer"}, + "orb_radial_bound_sig_dot": {"type": "integer"}, + "orb_along_bound_sig_dot": {"type": "integer"}, + "orb_cross_bound_sig_dot": {"type": "integer"}, + "clock_bound_mu_dot": {"type": "integer"}, + "clock_bound_sig_dot": {"type": "integer"} + }, + "required": [ + "orb_radial_bound_mu_dot", + "orb_along_bound_mu_dot", + "orb_cross_bound_mu_dot", + "orb_radial_bound_sig_dot", + "orb_along_bound_sig_dot", + "orb_cross_bound_sig_dot", + "clock_bound_mu_dot", + "clock_bound_sig_dot" + ] +} \ No newline at end of file diff --git a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrOrbitClockBoundsDegradation.yaml b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrOrbitClockBoundsDegradation.yaml index 420f64fecd..89e0766fcd 100644 --- a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrOrbitClockBoundsDegradation.yaml +++ b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrOrbitClockBoundsDegradation.yaml @@ -6,14 +6,34 @@ tests: - msg: fields: - stub: [180,0,0,0,3,0,1,2,3,48,15,1,10,0,0,0,0,0,0,0,200,199,198,197,196,195,194,193] - c_decoded_fields: - n_stub: 28 + header: + time: + tow: 180 + wn: 3 + num_msgs: 1 + seq_num: 2 + update_interval: 3 + sol_id: 48 + ssr_iod: 15 + const_id: 1 + sat_bitmask: 10 + orbit_clock_bounds_degradation: + orb_radial_bound_mu_dot: 200 + orb_along_bound_mu_dot: 199 + orb_cross_bound_mu_dot: 198 + orb_radial_bound_sig_dot: 197 + orb_along_bound_sig_dot: 196 + orb_cross_bound_sig_dot: 195 + clock_bound_mu_dot: 194 + clock_bound_sig_dot: 193 module: sbp.ssr name: MsgSsrOrbitClockBoundsDegradation msg_type: '1503' - raw_json: '{"stub": [180,0,0,0,3,0,1,2,3,48,15,1,10,0,0,0,0,0,0,0,200,199,198,197,196,195,194,193], - "preamble": 85, "msg_type": 1503, "sender": 66, "length": 28, + raw_json: '{"header": {"time": {"tow": 180, "wn": 3}, "num_msgs": 1, "seq_num": 2, "update_interval": 3, "sol_id": 48}, + "ssr_iod": 15, "const_id": 1, "sat_bitmask": 10, "orbit_clock_bounds_degradation": {"orb_radial_bound_mu_dot": 200, + "orb_along_bound_mu_dot": 199, "orb_cross_bound_mu_dot": 199, "orb_cross_bound_mu_dot": 198, + "orb_radial_bound_sig_dot": 197, "orb_along_bound_sig_dot": 196, "orb_cross_bound_sig_dot": 195, + "clock_bound_mu_dot": 194, "clock_bound_sig_dot": 193}, "preamble": 85, "msg_type": 1503, "sender": 66, "length": 28, "payload": "tAAAAAMAAQIDMA8BCgAAAAAAAADIx8bFxMPCwQ==", "crc": 30152}' raw_packet: Vd8FQgActAAAAAMAAQIDMA8BCgAAAAAAAADIx8bFxMPCwch1 sbp: diff --git a/spec/yaml/swiftnav/sbp/ssr.yaml b/spec/yaml/swiftnav/sbp/ssr.yaml index 7e5278c370..a7b5bc1ca5 100644 --- a/spec/yaml/swiftnav/sbp/ssr.yaml +++ b/spec/yaml/swiftnav/sbp/ssr.yaml @@ -1186,3 +1186,78 @@ definitions: size_fn: n_sats_signals map_by: sat_id desc: Code and Phase Biases Bounds per Satellite-Signal couple. + + - OrbitClockBoundDegradation: + desc: Orbit and clock bound degradation. + fields: + - orb_radial_bound_mu_dot: + type: u8 + units: 0.001 m/s + desc: > + Orbit Bound Mean Radial First derivative degradation parameter + (range 0-0.255) + - orb_along_bound_mu_dot: + type: u8 + units: 0.001 m/s + desc: > + Orbit Bound Mean Along-Track First derivative degradation parameter + (range 0-0.255) + - orb_cross_bound_mu_dot: + type: u8 + units: 0.001 m/s + desc: > + Orbit Bound Mean Cross-Track First derivative degradation parameter + (range 0-0.255) + - orb_radial_bound_sig_dot: + type: u8 + units: 0.001 m/s + desc: > + Orbit Bound Standard Deviation Radial First derivative degradation parameter + (range 0-0.255) + - orb_along_bound_sig_dot: + type: u8 + units: 0.001 m/s + desc: > + Orbit Bound Standard Deviation Along-Track First derivative degradation parameter + (range 0-0.255) + - orb_cross_bound_sig_dot: + type: u8 + units: 0.001 m/s + desc: > + Orbit Bound Standard Deviation Cross-Track First derivative degradation parameter + (range 0-0.255) + - clock_bound_mu_dot: + type: u8 + units: 0.001 m/s + desc: > + Clock Bound Mean First derivative degradation parameter + (range 0-0.255) + - clock_bound_sig_dot: + type: u8 + units: 0.001 m/s + desc: > + Clock Bound Standard Deviation First derivative degradation parameter + (range 0-0.255) + + - MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION: + id: 0x05DF + short_desc: Combined Orbit and Clock Bound Degradation Parameter + public: False + fields: + - header: + type: BoundsHeader + desc: Header of a bounds message. + - ssr_iod: + type: u8 + desc: IOD of the SSR bound degradation parameter. + - const_id: + type: u8 + desc: Constellation ID to which the SVs belong. + - sat_bitmask: + type: u64 + desc: > + Satellite Bit Mask. Put 1 for each satellite where the following + degradation parameters are applicable, 0 otherwise. + - orbit_clock_bounds_degradation: + type: OrbitClockBoundDegradation + desc: Orbit and Clock Bounds Degradation Parameters From c3ee3d31e0f4a380b8753fc5874192a7c292efd8 Mon Sep 17 00:00:00 2001 From: fpezzinosn <79222190+fpezzinosn@users.noreply.github.com> Date: Wed, 11 May 2022 13:18:22 -0400 Subject: [PATCH 05/10] Add Integrity Flags messages [OTA-121] (#1132) --- .../libsbp/v4/integrity/IntegritySSRHeader.h | 186 ++++++++++++++++++ .../sbp/integrity/IntegritySSRHeader.java | 85 ++++++++ jsonschema/IntegritySSRHeader.json | 36 ++++ sbpjson/javascript/SbpJson.js | 66 +++++++ .../integrity/test_MsgSsrFlagHighLevel.yaml | 57 ++++-- .../test_MsgSsrFlagIonoGridPointSatLos.yaml | 50 +++-- .../test_MsgSsrFlagIonoGridPoints.yaml | 47 +++-- .../test_MsgSsrFlagIonoTileSatLos.yaml | 49 +++-- .../integrity/test_MsgSsrFlagSatellites.yaml | 42 ++-- .../test_MsgSsrFlagTropoGridPoints.yaml | 47 +++-- spec/yaml/swiftnav/sbp/integrity.yaml | 144 +++++++++++++- 11 files changed, 697 insertions(+), 112 deletions(-) create mode 100644 c/include/libsbp/v4/integrity/IntegritySSRHeader.h create mode 100644 java/src/com/swiftnav/sbp/integrity/IntegritySSRHeader.java create mode 100644 jsonschema/IntegritySSRHeader.json diff --git a/c/include/libsbp/v4/integrity/IntegritySSRHeader.h b/c/include/libsbp/v4/integrity/IntegritySSRHeader.h new file mode 100644 index 0000000000..d09417b649 --- /dev/null +++ b/c/include/libsbp/v4/integrity/IntegritySSRHeader.h @@ -0,0 +1,186 @@ +/* + * 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/integrity.yaml + * with generate.py. Please do not hand edit! + *****************************************************************************/ + +#ifndef LIBSBP_V4_INTEGRITY_INTEGRITYSSRHEADER_H +#define LIBSBP_V4_INTEGRITY_INTEGRITYSSRHEADER_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * + * SBP_INTEGRITYSSRHEADER + * + *****************************************************************************/ +typedef struct { + /** + * GNSS reference time of the observation used to generate the flag. + */ + sbp_gps_time_sec_t obs_time; + + /** + * Number of messages in the dataset + */ + u8 num_msgs; + + /** + * Position of this message in the dataset + */ + u8 seq_num; + + /** + * SSR Solution ID. + */ + u8 ssr_sol_id; + + /** + * 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; + + /** + * Chain and type of flag. + */ + u8 chain_id; +} sbp_integrity_ssr_header_t; + +/** + * Get encoded size of an instance of sbp_integrity_ssr_header_t + * + * @param msg sbp_integrity_ssr_header_t instance + * @return Length of on-wire representation + */ +static inline size_t sbp_integrity_ssr_header_encoded_len( + const sbp_integrity_ssr_header_t *msg) { + (void)msg; + return SBP_INTEGRITY_SSR_HEADER_ENCODED_LEN; +} + +/** + * Encode an instance of sbp_integrity_ssr_header_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_integrity_ssr_header_t to encode + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 +sbp_integrity_ssr_header_encode(uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_integrity_ssr_header_t *msg); + +/** + * Decode an instance of sbp_integrity_ssr_header_t from wire representation + * + * This function decodes the wire representation of a sbp_integrity_ssr_header_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_integrity_ssr_header_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_integrity_ssr_header_decode(const uint8_t *buf, uint8_t len, + uint8_t *n_read, + sbp_integrity_ssr_header_t *msg); + +/** + * Compare two instances of sbp_integrity_ssr_header_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_integrity_ssr_header_t instance + * @param b sbp_integrity_ssr_header_t instance + * @return 0, <0, >0 + */ +SBP_EXPORT int sbp_integrity_ssr_header_cmp( + const sbp_integrity_ssr_header_t *a, const sbp_integrity_ssr_header_t *b); + +#ifdef __cplusplus +} + +static inline bool operator==(const sbp_integrity_ssr_header_t &lhs, + const sbp_integrity_ssr_header_t &rhs) { + return sbp_integrity_ssr_header_cmp(&lhs, &rhs) == 0; +} + +static inline bool operator!=(const sbp_integrity_ssr_header_t &lhs, + const sbp_integrity_ssr_header_t &rhs) { + return sbp_integrity_ssr_header_cmp(&lhs, &rhs) != 0; +} + +static inline bool operator<(const sbp_integrity_ssr_header_t &lhs, + const sbp_integrity_ssr_header_t &rhs) { + return sbp_integrity_ssr_header_cmp(&lhs, &rhs) < 0; +} + +static inline bool operator<=(const sbp_integrity_ssr_header_t &lhs, + const sbp_integrity_ssr_header_t &rhs) { + return sbp_integrity_ssr_header_cmp(&lhs, &rhs) <= 0; +} + +static inline bool operator>(const sbp_integrity_ssr_header_t &lhs, + const sbp_integrity_ssr_header_t &rhs) { + return sbp_integrity_ssr_header_cmp(&lhs, &rhs) > 0; +} + +static inline bool operator>=(const sbp_integrity_ssr_header_t &lhs, + const sbp_integrity_ssr_header_t &rhs) { + return sbp_integrity_ssr_header_cmp(&lhs, &rhs) >= 0; +} + +#endif // ifdef __cplusplus + +#endif /* LIBSBP_V4_INTEGRITY_INTEGRITYSSRHEADER_H */ diff --git a/java/src/com/swiftnav/sbp/integrity/IntegritySSRHeader.java b/java/src/com/swiftnav/sbp/integrity/IntegritySSRHeader.java new file mode 100644 index 0000000000..3302594081 --- /dev/null +++ b/java/src/com/swiftnav/sbp/integrity/IntegritySSRHeader.java @@ -0,0 +1,85 @@ +/* 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.integrity; + +// This file was auto-generated from yaml/swiftnav/sbp/integrity.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 IntegritySSRHeader extends SBPStruct { + + /** GNSS reference time of the observation used to generate the flag. */ + public GPSTimeSec obs_time; + + /** Number of messages in the dataset */ + public int num_msgs; + + /** Position of this message in the dataset */ + public int seq_num; + + /** SSR Solution ID. */ + public int ssr_sol_id; + + /** 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; + + /** Chain and type of flag. */ + public int chain_id; + + public IntegritySSRHeader() {} + + @Override + public IntegritySSRHeader parse(SBPMessage.Parser parser) throws SBPBinaryException { + /* Parse fields from binary */ + obs_time = new GPSTimeSec().parse(parser); + num_msgs = parser.getU8(); + seq_num = parser.getU8(); + ssr_sol_id = parser.getU8(); + tile_set_id = parser.getU16(); + tile_id = parser.getU16(); + chain_id = parser.getU8(); + return this; + } + + @Override + public void build(SBPMessage.Builder builder) { + /* Build fields into binary */ + obs_time.build(builder); + builder.putU8(num_msgs); + builder.putU8(seq_num); + builder.putU8(ssr_sol_id); + builder.putU16(tile_set_id); + builder.putU16(tile_id); + builder.putU8(chain_id); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("obs_time", obs_time.toJSON()); + obj.put("num_msgs", num_msgs); + obj.put("seq_num", seq_num); + obj.put("ssr_sol_id", ssr_sol_id); + obj.put("tile_set_id", tile_set_id); + obj.put("tile_id", tile_id); + obj.put("chain_id", chain_id); + return obj; + } +} diff --git a/jsonschema/IntegritySSRHeader.json b/jsonschema/IntegritySSRHeader.json new file mode 100644 index 0000000000..fd1e88859d --- /dev/null +++ b/jsonschema/IntegritySSRHeader.json @@ -0,0 +1,36 @@ +{ + "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": "#IntegritySSRHeader", + "title":"IntegritySSRHeader", + "description":"", + "type": "object", + "properties": { + "obs_time": {"$ref": "GpsTimeSec.json"}, + "num_msgs": {"type": "integer"}, + "seq_num": {"type": "integer"}, + "ssr_sol_id": {"type": "integer"}, + "tile_set_id": {"type": "integer"}, + "tile_id": {"type": "integer"}, + "chain_id": {"type": "integer"} + }, + "required": [ + "obs_time", + "num_msgs", + "seq_num", + "ssr_sol_id", + "tile_set_id", + "tile_id", + "chain_id" + ] +} \ No newline at end of file diff --git a/sbpjson/javascript/SbpJson.js b/sbpjson/javascript/SbpJson.js index 7b4c53cce4..a42d712dad 100644 --- a/sbpjson/javascript/SbpJson.js +++ b/sbpjson/javascript/SbpJson.js @@ -18,6 +18,7 @@ // const gridElementNoStd = Convert.toGridElementNoStd(json); // const griddedCorrectionHeader = Convert.toGriddedCorrectionHeader(json); // const iMUInputType = Convert.toIMUInputType(json); +// const integritySSRHeader = Convert.toIntegritySSRHeader(json); // const latency = Convert.toLatency(json); // const measurementState = Convert.toMeasurementState(json); // const msgAcqResult = Convert.toMsgAcqResult(json); @@ -336,6 +337,14 @@ function iMUInputTypeToJson(value) { return JSON.stringify(uncast(value, r("IMUInputType")), null, 2); } +function toIntegritySSRHeader(json) { + return cast(JSON.parse(json), r("IntegritySSRHeader")); +} + +function integritySSRHeaderToJson(value) { + return JSON.stringify(uncast(value, r("IntegritySSRHeader")), null, 2); +} + function toLatency(json) { return cast(JSON.parse(json), r("Latency")); } @@ -2890,6 +2899,61 @@ const typeMap = { "MsgSsrFlagTropoGridPoints": o([ { json: "stub", js: "stub", typ: a(0) }, ], "any"), + "MsgSsrFlagHighLevel": o([ + { json: "chain_id", js: "chain_id", typ: 0 }, + { json: "corr_time", js: "corr_time", typ: r("GpsTimeSEC") }, + { json: "obs_time", js: "obs_time", typ: r("GpsTimeSEC") }, + { 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 }, + { json: "use_bds_sat", js: "use_bds_sat", typ: 0 }, + { json: "use_gal_sat", js: "use_gal_sat", typ: 0 }, + { json: "use_gps_sat", js: "use_gps_sat", typ: 0 }, + { json: "use_iono_grid_point_sat_los", js: "use_iono_grid_point_sat_los", typ: 0 }, + { json: "use_iono_grid_points", js: "use_iono_grid_points", typ: 0 }, + { json: "use_iono_tile_sat_los", js: "use_iono_tile_sat_los", typ: 0 }, + { json: "use_tropo_grid_points", js: "use_tropo_grid_points", typ: 0 }, + ], "any"), + "MsgSsrFlagIonoGridPointSatLos": o([ + { json: "faulty_los", js: "faulty_los", typ: a(r("SvID")) }, + { json: "grid_point_id", js: "grid_point_id", typ: 0 }, + { json: "header", js: "header", typ: r("IntegritySSRHeader") }, + { json: "n_faulty_los", js: "n_faulty_los", typ: 0 }, + ], "any"), + "IntegritySSRHeader": o([ + { json: "chain_id", js: "chain_id", typ: 0 }, + { json: "num_msgs", js: "num_msgs", typ: 0 }, + { json: "obs_time", js: "obs_time", typ: r("GpsTimeSEC") }, + { json: "seq_num", js: "seq_num", 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"), + "MsgSsrFlagIonoGridPoints": o([ + { json: "faulty_points", js: "faulty_points", typ: a(0) }, + { json: "header", js: "header", typ: r("IntegritySSRHeader") }, + { json: "n_faulty_points", js: "n_faulty_points", typ: 0 }, + ], "any"), + "MsgSsrFlagIonoTileSatLos": o([ + { json: "faulty_los", js: "faulty_los", typ: a(r("SvID")) }, + { json: "header", js: "header", typ: r("IntegritySSRHeader") }, + { json: "n_faulty_los", js: "n_faulty_los", typ: 0 }, + ], "any"), + "MsgSsrFlagSatellites": o([ + { json: "chain_id", js: "chain_id", typ: 0 }, + { json: "const_id", js: "const_id", typ: 0 }, + { json: "faulty_sats", js: "faulty_sats", typ: a(0) }, + { json: "n_faulty_sats", js: "n_faulty_sats", typ: 0 }, + { json: "num_msgs", js: "num_msgs", typ: 0 }, + { json: "obs_time", js: "obs_time", typ: r("GpsTimeSEC") }, + { json: "seq_num", js: "seq_num", typ: 0 }, + { json: "ssr_sol_id", js: "ssr_sol_id", typ: 0 }, + ], "any"), + "MsgSsrFlagTropoGridPoints": o([ + { json: "faulty_points", js: "faulty_points", typ: a(0) }, + { json: "header", js: "header", typ: r("IntegritySSRHeader") }, + { json: "n_faulty_points", js: "n_faulty_points", typ: 0 }, + ], "any"), "MsgSsrGriddedCorrection": o([ { json: "header", js: "header", typ: r("GriddedCorrectionHeader") }, { json: "index", js: "index", typ: 0 }, @@ -3262,6 +3326,8 @@ module.exports = { "toGriddedCorrectionHeader": toGriddedCorrectionHeader, "iMUInputTypeToJson": iMUInputTypeToJson, "toIMUInputType": toIMUInputType, + "integritySSRHeaderToJson": integritySSRHeaderToJson, + "toIntegritySSRHeader": toIntegritySSRHeader, "latencyToJson": latencyToJson, "toLatency": toLatency, "measurementStateToJson": measurementStateToJson, diff --git a/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagHighLevel.yaml b/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagHighLevel.yaml index f72c38f4d4..8c232940fc 100644 --- a/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagHighLevel.yaml +++ b/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagHighLevel.yaml @@ -3,21 +3,44 @@ generated_on: 2022-04-21 # manually generated package: sbp.integrity tests: - - msg: - fields: - stub: [180,0,0,0,3,0,104,1,0,0,6,0,10,20,0,30,0,40,1,2,3,0,0,0,0,0,0,4,5,6,7] - c_decoded_fields: - n_stub: 31 - module: sbp.integrity - name: MsgSsrFlagHighLevel - msg_type: '3001' - raw_json: '{"stub": [180,0,0,0,3,0,104,1,0,0,6,0,10,20,0,30,0,40,1,2,3,0,0,0,0,0,0,4,5,6,7], +- msg: + fields: + obs_time: + tow: 180 + wn: 3 + corr_time: + tow: 360 + wn: 6 + ssr_sol_id: 10 + tile_set_id: 20 + tile_id: 30 + chain_id: 40 + use_gps_sat: 1 + use_gal_sat: 2 + use_bds_sat: 3 + reserved: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + use_tropo_grid_points: 4 + use_iono_grid_points: 5 + use_iono_tile_sat_los: 6 + use_iono_grid_point_sat_los: 7 + module: sbp.integrity + name: MsgSsrFlagHighLevel + msg_type: '3001' + raw_json: '{"obs_time": {"tow": 180, "wn": 3}, "corr_time": {"tow": 360, "wn": 6}, "ssr_sol_id": 10, "tile_set_id": 20, + "tile_id": 30, "chain_id": 40, "use_gps_sat": 1, "use_gal_sat": 2, "use_bds_sat": 3, "reserved": [0,0,0,0,0,0], + "use_tropo_grid_points": 4, "use_iono_grid_points": 5, "use_iono_tile_sat_los": 6, "use_iono_grid_point_sat_los": 7, "preamble": 85, "msg_type": 3001, "sender": 66, "length": 31, "payload": "tAAAAAMAaAEAAAYAChQAHgAoAQIDAAAAAAAABAUGBw==", "crc": 17254}' - raw_packet: VbkLQgAftAAAAAMAaAEAAAYAChQAHgAoAQIDAAAAAAAABAUGB2ZD - sbp: - preamble: '0x55' - msg_type: '0x0BB9' - sender: '0x0042' - length: 31 - payload: tAAAAAMAaAEAAAYAChQAHgAoAQIDAAAAAAAABAUGBw== - crc: '0x4366' + raw_packet: VbkLQgAftAAAAAMAaAEAAAYAChQAHgAoAQIDAAAAAAAABAUGB2ZD + sbp: + preamble: '0x55' + msg_type: '0x0BB9' + sender: '0x0042' + length: 31 + payload: tAAAAAMAaAEAAAYAChQAHgAoAQIDAAAAAAAABAUGBw== + crc: '0x4366' diff --git a/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagIonoGridPointSatLos.yaml b/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagIonoGridPointSatLos.yaml index a909b4ebb8..736b3464bb 100644 --- a/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagIonoGridPointSatLos.yaml +++ b/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagIonoGridPointSatLos.yaml @@ -3,21 +3,37 @@ generated_on: 2022-04-22 # manually generated package: sbp.integrity tests: - - msg: - fields: - stub: [180,0,0,0,3,0,1,2,3,4,0,5,0,6,30,0,2,10,11,15,14] - c_decoded_fields: - n_stub: 21 - module: sbp.integrity - name: MsgSsrFlagIonoGridPointSatLos - msg_type: '3025' - raw_json: '{"stub": [180,0,0,0,3,0,1,2,3,4,0,5,0,6,30,0,2,10,11,15,14], "preamble": 85, "msg_type": 3025, "sender": 66, "length": 21, +- msg: + fields: + header: + obs_time: + tow: 180 + wn: 3 + num_msgs: 1 + seq_num: 2 + ssr_sol_id: 3 + tile_set_id: 4 + tile_id: 5 + chain_id: 6 + grid_point_id: 30 + n_faulty_los: 2 + faulty_los: + - satId: 10 + constellation: 11 + - satId: 15 + constellation: 14 + module: sbp.integrity + name: MsgSsrFlagIonoGridPointSatLos + msg_type: '3025' + raw_json: '{"header": {"obs_time": {"tow": 180, "wn": 3}, "num_msgs": 1, "seq_num": 2, "ssr_sol_id": 3, "tile_set_id": 4, + "tile_id": 5, "chain_id": 6}, "grid_point_id": 30, "n_faulty_los": 2, "faulty_los": [{"satId": 10, + "constellation": 11}, {"satId": 15, "constellation": 14}], "preamble": 85, "msg_type": 3025, "sender": 66, "length": 21, "payload": "tAAAAAMAAQIDBAAFAAYeAAIKCw8O", "crc": 37986}' - raw_packet: VdELQgAVtAAAAAMAAQIDBAAFAAYeAAIKCw8OYpQ= - sbp: - preamble: '0x55' - msg_type: '0x0BD1' - sender: '0x0042' - length: 21 - payload: tAAAAAMAAQIDBAAFAAYeAAIKCw8O - crc: '0x9462' + raw_packet: VdELQgAVtAAAAAMAAQIDBAAFAAYeAAIKCw8OYpQ= + sbp: + preamble: '0x55' + msg_type: '0x0BD1' + sender: '0x0042' + length: 21 + payload: tAAAAAMAAQIDBAAFAAYeAAIKCw8O + crc: '0x9462' diff --git a/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagIonoGridPoints.yaml b/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagIonoGridPoints.yaml index 0edc51ee50..81f568ba6f 100644 --- a/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagIonoGridPoints.yaml +++ b/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagIonoGridPoints.yaml @@ -3,21 +3,34 @@ generated_on: 2022-04-22 # manually generated package: sbp.integrity tests: - - msg: - fields: - stub: [180,0,0,0,3,0,1,2,3,4,0,5,0,6,3,10,0,11,0,12,0] - c_decoded_fields: - n_stub: 21 - module: sbp.integrity - name: MsgSsrFlagIonoGridPoints - msg_type: '3015' - raw_json: '{"stub": [180,0,0,0,3,0,1,2,3,4,0,5,0,6,3,10,0,11,0,12,0], "preamble": 85, "msg_type": 3015, +- msg: + fields: + header: + obs_time: + tow: 180 + wn: 3 + num_msgs: 1 + seq_num: 2 + ssr_sol_id: 3 + tile_set_id: 4 + tile_id: 5 + chain_id: 6 + n_faulty_points: 3 + faulty_points: + - 10 + - 11 + - 12 + module: sbp.integrity + name: MsgSsrFlagIonoGridPoints + msg_type: '3015' + raw_json: '{"header": {"obs_time": {"tow": 180, "wn": 3}, "num_msgs": 1, "seq_num": 2, "ssr_sol_id": 3, "tile_set_id": 4, + "tile_id": 5, "chain_id": 6}, "n_faulty_points": 3, "faulty_points": [10, 11, 12], "preamble": 85, "msg_type": 3015, "sender": 66, "length": 21, "payload": "tAAAAAMAAQIDBAAFAAYDCgALAAwA", "crc": 1845}' - raw_packet: VccLQgAVtAAAAAMAAQIDBAAFAAYDCgALAAwANQc= - sbp: - preamble: '0x55' - msg_type: '0x0BC7' - sender: '0x0042' - length: 21 - payload: tAAAAAMAAQIDBAAFAAYDCgALAAwA - crc: '0x0735' + raw_packet: VccLQgAVtAAAAAMAAQIDBAAFAAYDCgALAAwANQc= + sbp: + preamble: '0x55' + msg_type: '0x0BC7' + sender: '0x0042' + length: 21 + payload: tAAAAAMAAQIDBAAFAAYDCgALAAwA + crc: '0x0735' diff --git a/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagIonoTileSatLos.yaml b/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagIonoTileSatLos.yaml index faacd14279..9ad0471f1b 100644 --- a/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagIonoTileSatLos.yaml +++ b/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagIonoTileSatLos.yaml @@ -3,21 +3,36 @@ generated_on: 2022-04-22 # manually generated package: sbp.integrity tests: - - msg: - fields: - stub: [180,0,0,0,3,0,1,2,3,4,0,5,0,6,2,10,11,15,14] - c_decoded_fields: - n_stub: 19 - module: sbp.integrity - name: MsgSsrFlagIonoTileSatLos - msg_type: '3021' - raw_json: '{"stub": [180,0,0,0,3,0,1,2,3,4,0,5,0,6,2,10,11,15,14], "preamble": 85, "msg_type": 3021, "sender": 66, "length": 19, +- msg: + fields: + header: + obs_time: + tow: 180 + wn: 3 + num_msgs: 1 + seq_num: 2 + ssr_sol_id: 3 + tile_set_id: 4 + tile_id: 5 + chain_id: 6 + n_faulty_los: 2 + faulty_los: + - satId: 10 + constellation: 11 + - satId: 15 + constellation: 14 + module: sbp.integrity + name: MsgSsrFlagIonoTileSatLos + msg_type: '3021' + raw_json: '{"header": {"obs_time": {"tow": 180, "wn": 3}, "num_msgs": 1, "seq_num": 2, "ssr_sol_id": 3, "tile_set_id": 4, + "tile_id": 5, "chain_id": 6}, "n_faulty_los": 2, "faulty_los": [{"satId": 10, "constellation": 11}, {"satId": 15, + "constellation": 14}], "preamble": 85, "msg_type": 3021, "sender": 66, "length": 19, "payload": "tAAAAAMAAQIDBAAFAAYCCgsPDg==", "crc": 60399}' - raw_packet: Vc0LQgATtAAAAAMAAQIDBAAFAAYCCgsPDu/r - sbp: - preamble: '0x55' - msg_type: '0x0BCD' - sender: '0x0042' - length: 19 - payload: tAAAAAMAAQIDBAAFAAYCCgsPDg== - crc: '0xEBEF' + raw_packet: Vc0LQgATtAAAAAMAAQIDBAAFAAYCCgsPDu/r + sbp: + preamble: '0x55' + msg_type: '0x0BCD' + sender: '0x0042' + length: 19 + payload: tAAAAAMAAQIDBAAFAAYCCgsPDg== + crc: '0xEBEF' diff --git a/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagSatellites.yaml b/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagSatellites.yaml index 435812c468..f06693fd24 100644 --- a/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagSatellites.yaml +++ b/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagSatellites.yaml @@ -3,21 +3,29 @@ generated_on: 2022-04-22 # manually generated package: sbp.integrity tests: - - msg: - fields: - stub: [180,0,0,0,3,0,1,2,3,4,5,3,10,11,12] - c_decoded_fields: - n_stub: 15 - module: sbp.integrity - name: MsgSsrFlagSatellites - msg_type: '3005' - raw_json: '{"stub": [180,0,0,0,3,0,1,2,3,4,5,3,10,11,12], "preamble": 85, "msg_type": 3005, "sender": 66, "length": 15, +- msg: + fields: + obs_time: + tow: 180 + wn: 3 + num_msgs: 1 + seq_num: 2 + ssr_sol_id: 3 + chain_id: 4 + const_id: 5 + n_faulty_sats: 3 + faulty_sats: [10,11,12] + module: sbp.integrity + name: MsgSsrFlagSatellites + msg_type: '3005' + raw_json: '{"obs_time": {"tow": 180, "wn": 3}, "num_msgs": 1, "seq_num": 2, "ssr_sol_id": 3, "chain_id": 4, "const_id": 5, + "n_faulty_sats": 3, "faulty_sats": [10, 11, 12], "preamble": 85, "msg_type": 3005, "sender": 66, "length": 15, "payload": "tAAAAAMAAQIDBAUDCgsM", "crc": 42350}' - raw_packet: Vb0LQgAPtAAAAAMAAQIDBAUDCgsMbqU= - sbp: - preamble: '0x55' - msg_type: '0x0BBD' - sender: '0x0042' - length: 15 - payload: tAAAAAMAAQIDBAUDCgsM - crc: '0xA56E' + raw_packet: Vb0LQgAPtAAAAAMAAQIDBAUDCgsMbqU= + sbp: + preamble: '0x55' + msg_type: '0x0BBD' + sender: '0x0042' + length: 15 + payload: tAAAAAMAAQIDBAUDCgsM + crc: '0xA56E' diff --git a/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagTropoGridPoints.yaml b/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagTropoGridPoints.yaml index 07db470a9c..44d096845c 100644 --- a/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagTropoGridPoints.yaml +++ b/spec/tests/yaml/swiftnav/sbp/integrity/test_MsgSsrFlagTropoGridPoints.yaml @@ -3,21 +3,34 @@ generated_on: 2022-04-22 # manually generated package: sbp.integrity tests: - - msg: - fields: - stub: [180,0,0,0,3,0,1,2,3,4,0,5,0,6,3,10,0,11,0,12,0] - c_decoded_fields: - n_stub: 21 - module: sbp.integrity - name: MsgSsrFlagTropoGridPoints - msg_type: '3011' - raw_json: '{"stub": [180,0,0,0,3,0,1,2,3,4,0,5,0,6,3,10,0,11,0,12,0], "preamble": 85, "msg_type": 3011, +- msg: + fields: + header: + obs_time: + tow: 180 + wn: 3 + num_msgs: 1 + seq_num: 2 + ssr_sol_id: 3 + tile_set_id: 4 + tile_id: 5 + chain_id: 6 + n_faulty_points: 3 + faulty_points: + - 10 + - 11 + - 12 + module: sbp.integrity + name: MsgSsrFlagTropoGridPoints + msg_type: '3011' + raw_json: '{"header": {"obs_time": {"tow": 180, "wn": 3}, "num_msgs": 1, "seq_num": 2, "ssr_sol_id": 3, "tile_set_id": 4, + "tile_id": 5, "chain_id": 6}, "n_faulty_points": 3, "faulty_points": [10, 11, 12], "preamble": 85, "msg_type": 3011, "sender": 66, "length": 21, "payload": "tAAAAAMAAQIDBAAFAAYDCgALAAwA", "crc": 38643}' - raw_packet: VcMLQgAVtAAAAAMAAQIDBAAFAAYDCgALAAwA85Y= - sbp: - preamble: '0x55' - msg_type: '0x0BC3' - sender: '0x0042' - length: 21 - payload: tAAAAAMAAQIDBAAFAAYDCgALAAwA - crc: '0x96F3' + raw_packet: VcMLQgAVtAAAAAMAAQIDBAAFAAYDCgALAAwA85Y= + sbp: + preamble: '0x55' + msg_type: '0x0BC3' + sender: '0x0042' + length: 21 + payload: tAAAAAMAAQIDBAAFAAYDCgALAAwA + crc: '0x96F3' diff --git a/spec/yaml/swiftnav/sbp/integrity.yaml b/spec/yaml/swiftnav/sbp/integrity.yaml index 6a1cab30c9..f6f7b7e246 100644 --- a/spec/yaml/swiftnav/sbp/integrity.yaml +++ b/spec/yaml/swiftnav/sbp/integrity.yaml @@ -16,56 +16,180 @@ include: - types.yaml - gnss.yaml definitions: + - IntegritySSRHeader: + short_desc: Common fields for SSR integrity messages + fields: + - obs_time: + type: GPSTimeSec + desc: GNSS reference time of the observation used to generate the flag. + - num_msgs: + type: u8 + desc: Number of messages in the dataset + - seq_num: + type: u8 + desc: Position of this message in the dataset + - ssr_sol_id: + type: u8 + desc: SSR Solution ID. + - 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. + - chain_id: + type: u8 + desc: Chain and type of flag. + - MSG_SSR_FLAG_HIGH_LEVEL: id: 0x0BB9 short_desc: High level integrity flags public: False fields: - - stub: + - obs_time: + type: GPSTimeSec + desc: GNSS reference time of the observation used to generate the flag. + - corr_time: + type: GPSTimeSec + desc: GNSS reference time of the correction associated to the flag. + - ssr_sol_id: + type: u8 + desc: SSR Solution ID. + - 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. + - chain_id: + type: u8 + desc: Chain and type of flag. + - use_gps_sat: + type: u8 + desc: Use GPS satellites. + - use_gal_sat: + type: u8 + desc: Use GAL satellites. + - use_bds_sat: + type: u8 + desc: Use BDS satellites. + - reserved: type: array + size: 6 fill: u8 + desc: Reserved + - use_tropo_grid_points: + type: u8 + desc: Use tropo grid points. + - use_iono_grid_points: + type: u8 + desc: Use iono grid points. + - use_iono_tile_sat_los: + type: u8 + desc: Use iono tile satellite LoS. + - use_iono_grid_point_sat_los: + type: u8 + desc: Use iono grid point satellite LoS. - MSG_SSR_FLAG_SATELLITES: id: 0x0BBD short_desc: List of satellites which are faulty, per constellation public: False fields: - - stub: + - obs_time: + type: GPSTimeSec + desc: GNSS reference time of the observation used to generate the flag. + - num_msgs: + type: u8 + desc: Number of messages in the dataset + - seq_num: + type: u8 + desc: Position of this message in the dataset + - ssr_sol_id: + type: u8 + desc: SSR Solution ID. + - chain_id: + type: u8 + desc: Chain and type of flag. + - const_id: + type: u8 + desc: Constellation ID. + - n_faulty_sats: + type: u8 + desc: Number of faulty satellites. + - faulty_sats: type: array fill: u8 + size_fn: n_faulty_sats + desc: List of faulty satellites. - MSG_SSR_FLAG_TROPO_GRID_POINTS: id: 0x0BC3 short_desc: List of grid points which are faulty public: False fields: - - stub: + - header: + type: IntegritySSRHeader + desc: Header of an integrity message. + - n_faulty_points: + type: u8 + desc: Number of faulty grid points. + - faulty_points: type: array - fill: u8 + fill: u16 + size_fn: n_faulty_points + desc: List of faulty grid points. - MSG_SSR_FLAG_IONO_GRID_POINTS: id: 0x0BC7 short_desc: List of grid points which are faulty public: False fields: - - stub: + - header: + type: IntegritySSRHeader + desc: Header of an integrity message. + - n_faulty_points: + type: u8 + desc: Number of faulty grid points. + - faulty_points: type: array - fill: u8 + fill: u16 + size_fn: n_faulty_points + desc: List of faulty grid points. - MSG_SSR_FLAG_IONO_TILE_SAT_LOS: id: 0x0BCD short_desc: List of all the LOS which are faulty public: False fields: - - stub: + - header: + type: IntegritySSRHeader + desc: Header of an integrity message. + - n_faulty_los: + type: u8 + desc: Number of faulty LOS. + - faulty_los: type: array - fill: u8 + fill: SvId + size_fn: n_faulty_los + desc: List of faulty LOS - MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS: id: 0x0BD1 short_desc: List of all the grid points to satellite which are faulty public: False fields: - - stub: + - header: + type: IntegritySSRHeader + desc: Header of an integrity message. + - grid_point_id: + type: u16 + desc: Index of the grid point. + - n_faulty_los: + type: u8 + desc: Number of faulty LOS. + - faulty_los: type: array - fill: u8 + fill: SvId + size_fn: n_faulty_los + desc: List of faulty LOS From a08faf8b08165bc8b6d42793c28c94feb9e7480c Mon Sep 17 00:00:00 2001 From: fpezzinosn <79222190+fpezzinosn@users.noreply.github.com> Date: Thu, 12 May 2022 13:53:31 -0400 Subject: [PATCH 06/10] Add transformation parameter message [OTA-149] (#1144) --- c/include/libsbp/cpp/message_traits.h | 30 ++ c/include/libsbp/sbp_msg_type.h | 1 + c/include/libsbp/v4/navigation.h | 1 + c/include/libsbp/v4/navigation/MSG_ITRF.h | 277 ++++++++++++++ c/include/libsbp/v4/sbp_msg.h | 9 + c/test/auto_check_sbp_navigation_MsgItrf.c | 333 ++++++++++++++++ c/test/check_main.c | 1 + c/test/check_main_legacy.c | 1 + c/test/check_suites.h | 1 + c/test/check_suites_legacy.h | 1 + .../cpp/auto_check_sbp_navigation_MsgItrf.cc | 220 +++++++++++ .../auto_check_sbp_navigation_MsgItrf.c | 334 ++++++++++++++++ .../cpp/auto_check_sbp_navigation_MsgItrf.cc | 226 +++++++++++ haskell/src/SwiftNav/SBP/Msg.hs | 6 + .../com/swiftnav/sbp/navigation/MsgItrf.java | 186 +++++++++ ...auto_check_sbp_navigation_MsgItrfTest.java | 358 ++++++++++++++++++ jsonschema/MsgItrf.json | 66 ++++ rust/sbp/src/messages/navigation.rs | 216 +++++++++++ .../auto_check_sbp_navigation_msg_itrf.rs | Bin 0 -> 6716 bytes rust/sbp/tests/integration/main.rs | 1 + sbpjson/javascript/SbpJson.js | 35 ++ .../swiftnav/sbp/navigation/test_MsgItrf.yaml | 47 +++ spec/yaml/swiftnav/sbp/navigation.yaml | 103 ++++- spec/yaml/swiftnav/sbp/ssr.yaml | 2 + 24 files changed, 2438 insertions(+), 17 deletions(-) create mode 100644 c/include/libsbp/v4/navigation/MSG_ITRF.h create mode 100644 c/test/auto_check_sbp_navigation_MsgItrf.c create mode 100644 c/test/cpp/auto_check_sbp_navigation_MsgItrf.cc create mode 100644 c/test/legacy/auto_check_sbp_navigation_MsgItrf.c create mode 100644 c/test/legacy/cpp/auto_check_sbp_navigation_MsgItrf.cc create mode 100644 java/src/com/swiftnav/sbp/navigation/MsgItrf.java create mode 100644 java/test/auto_check_sbp_navigation_MsgItrfTest.java create mode 100644 jsonschema/MsgItrf.json create mode 100644 rust/sbp/tests/integration/auto_check_sbp_navigation_msg_itrf.rs create mode 100644 spec/tests/yaml/swiftnav/sbp/navigation/test_MsgItrf.yaml diff --git a/c/include/libsbp/cpp/message_traits.h b/c/include/libsbp/cpp/message_traits.h index 15cfc59fc4..b9c6258772 100644 --- a/c/include/libsbp/cpp/message_traits.h +++ b/c/include/libsbp/cpp/message_traits.h @@ -3199,6 +3199,36 @@ struct MessageTraits { } }; +template <> +struct MessageTraits { + static constexpr sbp_msg_type_t id = SbpMsgItrf; + static const sbp_msg_itrf_t &get(const sbp_msg_t &msg) { return msg.itrf; } + static sbp_msg_itrf_t &get(sbp_msg_t &msg) { return msg.itrf; } + static void to_sbp_msg(const sbp_msg_itrf_t &msg, sbp_msg_t *sbp_msg) { + sbp_msg->itrf = msg; + } + static sbp_msg_t to_sbp_msg(const sbp_msg_itrf_t &msg) { + sbp_msg_t sbp_msg; + sbp_msg.itrf = msg; + return sbp_msg; + } + static s8 send(sbp_state_t *state, u16 sender_id, const sbp_msg_itrf_t &msg, + sbp_write_fn_t write) { + return sbp_msg_itrf_send(state, sender_id, &msg, write); + } + static s8 encode(uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_msg_itrf_t &msg) { + return sbp_msg_itrf_encode(buf, len, n_written, &msg); + } + static s8 decode(const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_msg_itrf_t *msg) { + return sbp_msg_itrf_decode(buf, len, n_read, msg); + } + static size_t encoded_len(const sbp_msg_itrf_t &msg) { + return sbp_msg_itrf_encoded_len(&msg); + } +}; + template <> struct MessageTraits { static constexpr sbp_msg_type_t id = SbpMsgLinuxCpuStateDepA; diff --git a/c/include/libsbp/sbp_msg_type.h b/c/include/libsbp/sbp_msg_type.h index 9dda8899e0..2b54eaa026 100644 --- a/c/include/libsbp/sbp_msg_type.h +++ b/c/include/libsbp/sbp_msg_type.h @@ -142,6 +142,7 @@ typedef enum { SbpMsgInsStatus = SBP_MSG_INS_STATUS, SbpMsgInsUpdates = SBP_MSG_INS_UPDATES, SbpMsgIono = SBP_MSG_IONO, + SbpMsgItrf = SBP_MSG_ITRF, SbpMsgLinuxCpuStateDepA = SBP_MSG_LINUX_CPU_STATE_DEP_A, SbpMsgLinuxCpuState = SBP_MSG_LINUX_CPU_STATE, SbpMsgLinuxMemStateDepA = SBP_MSG_LINUX_MEM_STATE_DEP_A, diff --git a/c/include/libsbp/v4/navigation.h b/c/include/libsbp/v4/navigation.h index fc89dacc0c..f978968cb8 100644 --- a/c/include/libsbp/v4/navigation.h +++ b/c/include/libsbp/v4/navigation.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include diff --git a/c/include/libsbp/v4/navigation/MSG_ITRF.h b/c/include/libsbp/v4/navigation/MSG_ITRF.h new file mode 100644 index 0000000000..361db39f5c --- /dev/null +++ b/c/include/libsbp/v4/navigation/MSG_ITRF.h @@ -0,0 +1,277 @@ +/* + * 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/navigation.yaml + * with generate.py. Please do not hand edit! + *****************************************************************************/ + +#ifndef LIBSBP_V4_NAVIGATION_MSG_ITRF_H +#define LIBSBP_V4_NAVIGATION_MSG_ITRF_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * + * SBP_MSG_ITRF + * + *****************************************************************************/ +typedef struct { + /** + * SSR IOD parameter. + */ + u8 ssr_iod; + + /** + * Source-Name Counter N. + */ + u8 sn_counter_n; + + /** + * Source-Name + */ + char sn[SBP_MSG_ITRF_SN_MAX]; + + /** + * Target-Name Counter M. + */ + u8 tn_counter_m; + + /** + * Target-Name + */ + char tn[SBP_MSG_ITRF_TN_MAX]; + + /** + * System Identification Number. + */ + u8 sin; + + /** + * Utilized Transformation Message. + */ + u16 utn; + + /** + * Reference Epoch t0 for transformation parameter set given as Modified + * Julian Day (MDJ) Number minus 44244 days. [1 day] + */ + u16 re_t0; + + /** + * Translation in X for Reference Epoch t0. [0.001 m] + */ + s32 delta_X0; + + /** + * Translation in Y for Reference Epoch t0. [0.001 m] + */ + s32 delta_Y0; + + /** + * Translation in Z for Reference Epoch t0. [0.001 m] + */ + s32 delta_Z0; + + /** + * Rotation around the X-axis for Reference Epoch t0. [0.00002 "] + */ + s32 theta_01; + + /** + * Rotation around the Y-axis for Reference Epoch t0. [0.00002 "] + */ + s32 theta_02; + + /** + * Rotation around the Z-axis for Reference Epoch t0. [0.00002 "] + */ + s32 theta_03; + + /** + * Scale correction for Reference Epoch t0. [0.00001 ppm] + */ + s32 scale; + + /** + * Rate of change of translation in X. [0.00002 m/yr] + */ + s32 dot_delta_X0; + + /** + * Rate of change of translation in Y. [0.00002 m/yr] + */ + s32 dot_delta_Y0; + + /** + * Rate of change of translation in Z. [0.00002 m/yr] + */ + s32 dot_delta_Z0; + + /** + * Rate of change of rotation around the X-axis. [0.0000004 "/yr] + */ + s32 dot_theta_01; + + /** + * Rate of change of rotation around the Y-axis. [0.0000004 "/yr] + */ + s32 dot_theta_02; + + /** + * Rate of change of rotation around the Z-axis. [0.0000004 "/yr] + */ + s32 dot_theta_03; + + /** + * Rate of change of scale correction. [0.0000002 ppm/yr] + */ + s16 dot_scale; +} sbp_msg_itrf_t; + +/** + * Get encoded size of an instance of sbp_msg_itrf_t + * + * @param msg sbp_msg_itrf_t instance + * @return Length of on-wire representation + */ +static inline size_t sbp_msg_itrf_encoded_len(const sbp_msg_itrf_t *msg) { + (void)msg; + return SBP_MSG_ITRF_ENCODED_LEN; +} + +/** + * Encode an instance of sbp_msg_itrf_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_itrf_t to encode + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 sbp_msg_itrf_encode(uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_msg_itrf_t *msg); + +/** + * Decode an instance of sbp_msg_itrf_t from wire representation + * + * This function decodes the wire representation of a sbp_msg_itrf_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_itrf_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_itrf_decode(const uint8_t *buf, uint8_t len, + uint8_t *n_read, sbp_msg_itrf_t *msg); +/** + * Send an instance of sbp_msg_itrf_t with the given write function + * + * An equivalent of #sbp_message_send which operates specifically on + * sbp_msg_itrf_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_itrf_send(sbp_state_t *s, u16 sender_id, + const sbp_msg_itrf_t *msg, + sbp_write_fn_t write); + +/** + * Compare two instances of sbp_msg_itrf_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_itrf_t instance + * @param b sbp_msg_itrf_t instance + * @return 0, <0, >0 + */ +SBP_EXPORT int sbp_msg_itrf_cmp(const sbp_msg_itrf_t *a, + const sbp_msg_itrf_t *b); + +#ifdef __cplusplus +} + +static inline bool operator==(const sbp_msg_itrf_t &lhs, + const sbp_msg_itrf_t &rhs) { + return sbp_msg_itrf_cmp(&lhs, &rhs) == 0; +} + +static inline bool operator!=(const sbp_msg_itrf_t &lhs, + const sbp_msg_itrf_t &rhs) { + return sbp_msg_itrf_cmp(&lhs, &rhs) != 0; +} + +static inline bool operator<(const sbp_msg_itrf_t &lhs, + const sbp_msg_itrf_t &rhs) { + return sbp_msg_itrf_cmp(&lhs, &rhs) < 0; +} + +static inline bool operator<=(const sbp_msg_itrf_t &lhs, + const sbp_msg_itrf_t &rhs) { + return sbp_msg_itrf_cmp(&lhs, &rhs) <= 0; +} + +static inline bool operator>(const sbp_msg_itrf_t &lhs, + const sbp_msg_itrf_t &rhs) { + return sbp_msg_itrf_cmp(&lhs, &rhs) > 0; +} + +static inline bool operator>=(const sbp_msg_itrf_t &lhs, + const sbp_msg_itrf_t &rhs) { + return sbp_msg_itrf_cmp(&lhs, &rhs) >= 0; +} + +#endif // ifdef __cplusplus + +#endif /* LIBSBP_V4_NAVIGATION_MSG_ITRF_H */ diff --git a/c/include/libsbp/v4/sbp_msg.h b/c/include/libsbp/v4/sbp_msg.h index 340c230437..be3559f09d 100644 --- a/c/include/libsbp/v4/sbp_msg.h +++ b/c/include/libsbp/v4/sbp_msg.h @@ -148,6 +148,7 @@ typedef union { sbp_msg_ins_status_t ins_status; sbp_msg_ins_updates_t ins_updates; sbp_msg_iono_t iono; + sbp_msg_itrf_t itrf; sbp_msg_linux_cpu_state_dep_a_t linux_cpu_state_dep_a; sbp_msg_linux_cpu_state_t linux_cpu_state; sbp_msg_linux_mem_state_dep_a_t linux_mem_state_dep_a; @@ -544,6 +545,8 @@ static inline s8 sbp_message_encode(uint8_t *buf, uint8_t len, return sbp_msg_ins_updates_encode(buf, len, n_written, &msg->ins_updates); case SbpMsgIono: return sbp_msg_iono_encode(buf, len, n_written, &msg->iono); + case SbpMsgItrf: + return sbp_msg_itrf_encode(buf, len, n_written, &msg->itrf); case SbpMsgLinuxCpuStateDepA: return sbp_msg_linux_cpu_state_dep_a_encode(buf, len, n_written, &msg->linux_cpu_state_dep_a); @@ -1159,6 +1162,8 @@ static inline s8 sbp_message_decode(const uint8_t *buf, uint8_t len, return sbp_msg_ins_updates_decode(buf, len, n_read, &msg->ins_updates); case SbpMsgIono: return sbp_msg_iono_decode(buf, len, n_read, &msg->iono); + case SbpMsgItrf: + return sbp_msg_itrf_decode(buf, len, n_read, &msg->itrf); case SbpMsgLinuxCpuStateDepA: return sbp_msg_linux_cpu_state_dep_a_decode(buf, len, n_read, &msg->linux_cpu_state_dep_a); @@ -1711,6 +1716,8 @@ static inline size_t sbp_message_encoded_len(sbp_msg_type_t msg_type, return sbp_msg_ins_updates_encoded_len(&msg->ins_updates); case SbpMsgIono: return sbp_msg_iono_encoded_len(&msg->iono); + case SbpMsgItrf: + return sbp_msg_itrf_encoded_len(&msg->itrf); case SbpMsgLinuxCpuStateDepA: return sbp_msg_linux_cpu_state_dep_a_encoded_len( &msg->linux_cpu_state_dep_a); @@ -2249,6 +2256,8 @@ static inline int sbp_message_cmp(sbp_msg_type_t msg_type, const sbp_msg_t *a, return sbp_msg_ins_updates_cmp(&a->ins_updates, &b->ins_updates); case SbpMsgIono: return sbp_msg_iono_cmp(&a->iono, &b->iono); + case SbpMsgItrf: + return sbp_msg_itrf_cmp(&a->itrf, &b->itrf); case SbpMsgLinuxCpuStateDepA: return sbp_msg_linux_cpu_state_dep_a_cmp(&a->linux_cpu_state_dep_a, &b->linux_cpu_state_dep_a); diff --git a/c/test/auto_check_sbp_navigation_MsgItrf.c b/c/test/auto_check_sbp_navigation_MsgItrf.c new file mode 100644 index 0000000000..2d5528311b --- /dev/null +++ b/c/test/auto_check_sbp_navigation_MsgItrf.c @@ -0,0 +1,333 @@ +/* + * 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/navigation/test_MsgItrf.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_navigation_MsgItrf) { + 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, 580, &msg_callback, + &DUMMY_MEMORY_FOR_CALLBACKS, &n); + + u8 encoded_frame[] = { + 85, 68, 2, 66, 0, 124, 1, 2, 102, 111, 111, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 5, 0, 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, + 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, + 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, + 0, 18, 0, 0, 0, 19, 0, 0, 0, 20, 0, 66, 126, + }; + + dummy_reset(); + + sbp_msg_t test_msg; + memset(&test_msg, 0, sizeof(test_msg)); + + test_msg.itrf.delta_X0 = 7; + + test_msg.itrf.delta_Y0 = 8; + + test_msg.itrf.delta_Z0 = 9; + + test_msg.itrf.dot_delta_X0 = 14; + + test_msg.itrf.dot_delta_Y0 = 15; + + test_msg.itrf.dot_delta_Z0 = 16; + + test_msg.itrf.dot_scale = 20; + + test_msg.itrf.dot_theta_01 = 17; + + test_msg.itrf.dot_theta_02 = 18; + + test_msg.itrf.dot_theta_03 = 19; + + test_msg.itrf.re_t0 = 6; + + test_msg.itrf.scale = 13; + + test_msg.itrf.sin = 4; + + { + const char assign_string[] = { + (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0}; + memcpy(test_msg.itrf.sn, assign_string, sizeof(assign_string)); + } + + test_msg.itrf.sn_counter_n = 2; + + test_msg.itrf.ssr_iod = 1; + + test_msg.itrf.theta_01 = 10; + + test_msg.itrf.theta_02 = 11; + + test_msg.itrf.theta_03 = 12; + + { + const char assign_string[] = { + (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0}; + memcpy(test_msg.itrf.tn, assign_string, sizeof(assign_string)); + } + + test_msg.itrf.tn_counter_m = 3; + + test_msg.itrf.utn = 5; + + sbp_message_send(&sbp_state, SbpMsgItrf, 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(SbpMsgItrf, &last_msg.msg, &test_msg) == 0, + "Sent and received messages did not compare equal"); + + ck_assert_msg( + last_msg.msg.itrf.delta_X0 == 7, + "incorrect value for last_msg.msg.itrf.delta_X0, expected 7, is %d", + last_msg.msg.itrf.delta_X0); + + ck_assert_msg( + last_msg.msg.itrf.delta_Y0 == 8, + "incorrect value for last_msg.msg.itrf.delta_Y0, expected 8, is %d", + last_msg.msg.itrf.delta_Y0); + + ck_assert_msg( + last_msg.msg.itrf.delta_Z0 == 9, + "incorrect value for last_msg.msg.itrf.delta_Z0, expected 9, is %d", + last_msg.msg.itrf.delta_Z0); + + ck_assert_msg(last_msg.msg.itrf.dot_delta_X0 == 14, + "incorrect value for last_msg.msg.itrf.dot_delta_X0, " + "expected 14, is %d", + last_msg.msg.itrf.dot_delta_X0); + + ck_assert_msg(last_msg.msg.itrf.dot_delta_Y0 == 15, + "incorrect value for last_msg.msg.itrf.dot_delta_Y0, " + "expected 15, is %d", + last_msg.msg.itrf.dot_delta_Y0); + + ck_assert_msg(last_msg.msg.itrf.dot_delta_Z0 == 16, + "incorrect value for last_msg.msg.itrf.dot_delta_Z0, " + "expected 16, is %d", + last_msg.msg.itrf.dot_delta_Z0); + + ck_assert_msg( + last_msg.msg.itrf.dot_scale == 20, + "incorrect value for last_msg.msg.itrf.dot_scale, expected 20, is %d", + last_msg.msg.itrf.dot_scale); + + ck_assert_msg(last_msg.msg.itrf.dot_theta_01 == 17, + "incorrect value for last_msg.msg.itrf.dot_theta_01, " + "expected 17, is %d", + last_msg.msg.itrf.dot_theta_01); + + ck_assert_msg(last_msg.msg.itrf.dot_theta_02 == 18, + "incorrect value for last_msg.msg.itrf.dot_theta_02, " + "expected 18, is %d", + last_msg.msg.itrf.dot_theta_02); + + ck_assert_msg(last_msg.msg.itrf.dot_theta_03 == 19, + "incorrect value for last_msg.msg.itrf.dot_theta_03, " + "expected 19, is %d", + last_msg.msg.itrf.dot_theta_03); + + ck_assert_msg( + last_msg.msg.itrf.re_t0 == 6, + "incorrect value for last_msg.msg.itrf.re_t0, expected 6, is %d", + last_msg.msg.itrf.re_t0); + + ck_assert_msg( + last_msg.msg.itrf.scale == 13, + "incorrect value for last_msg.msg.itrf.scale, expected 13, is %d", + last_msg.msg.itrf.scale); + + ck_assert_msg( + last_msg.msg.itrf.sin == 4, + "incorrect value for last_msg.msg.itrf.sin, expected 4, is %d", + last_msg.msg.itrf.sin); + + { + const char check_string[] = { + (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0}; + ck_assert_msg(memcmp(&last_msg.msg.itrf.sn, check_string, + sizeof(check_string)) == 0, + "incorrect value for last_msg.msg.itrf.sn, expected string " + "'%s', is '%s'", + check_string, last_msg.msg.itrf.sn); + } + + ck_assert_msg( + last_msg.msg.itrf.sn_counter_n == 2, + "incorrect value for last_msg.msg.itrf.sn_counter_n, expected 2, is %d", + last_msg.msg.itrf.sn_counter_n); + + ck_assert_msg( + last_msg.msg.itrf.ssr_iod == 1, + "incorrect value for last_msg.msg.itrf.ssr_iod, expected 1, is %d", + last_msg.msg.itrf.ssr_iod); + + ck_assert_msg( + last_msg.msg.itrf.theta_01 == 10, + "incorrect value for last_msg.msg.itrf.theta_01, expected 10, is %d", + last_msg.msg.itrf.theta_01); + + ck_assert_msg( + last_msg.msg.itrf.theta_02 == 11, + "incorrect value for last_msg.msg.itrf.theta_02, expected 11, is %d", + last_msg.msg.itrf.theta_02); + + ck_assert_msg( + last_msg.msg.itrf.theta_03 == 12, + "incorrect value for last_msg.msg.itrf.theta_03, expected 12, is %d", + last_msg.msg.itrf.theta_03); + + { + const char check_string[] = { + (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0}; + ck_assert_msg(memcmp(&last_msg.msg.itrf.tn, check_string, + sizeof(check_string)) == 0, + "incorrect value for last_msg.msg.itrf.tn, expected string " + "'%s', is '%s'", + check_string, last_msg.msg.itrf.tn); + } + + ck_assert_msg( + last_msg.msg.itrf.tn_counter_m == 3, + "incorrect value for last_msg.msg.itrf.tn_counter_m, expected 3, is %d", + last_msg.msg.itrf.tn_counter_m); + + ck_assert_msg( + last_msg.msg.itrf.utn == 5, + "incorrect value for last_msg.msg.itrf.utn, expected 5, is %d", + last_msg.msg.itrf.utn); + } +} +END_TEST + +Suite *auto_check_sbp_navigation_MsgItrf_suite(void) { + Suite *s = suite_create( + "SBP generated test suite: auto_check_sbp_navigation_MsgItrf"); + TCase *tc_acq = + tcase_create("Automated_Suite_auto_check_sbp_navigation_MsgItrf"); + tcase_add_test(tc_acq, test_auto_check_sbp_navigation_MsgItrf); + 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 cd20bc9f4e..4575d88c75 100644 --- a/c/test/check_main.c +++ b/c/test/check_main.c @@ -57,6 +57,7 @@ int main(void) { srunner_add_suite(sr, auto_check_sbp_navigation_MsgGPSTime_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgGPSTimeDepA_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgGPSTimeGNSS_suite()); + srunner_add_suite(sr, auto_check_sbp_navigation_MsgItrf_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgPosECEF_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgPosECEFCov_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgPosECEFCovGNSS_suite()); diff --git a/c/test/check_main_legacy.c b/c/test/check_main_legacy.c index 1e78555d25..b1dc10e0d2 100644 --- a/c/test/check_main_legacy.c +++ b/c/test/check_main_legacy.c @@ -71,6 +71,7 @@ int main(void) { legacy_auto_check_sbp_navigation_MsgGPSTimeDepA_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_navigation_MsgGPSTimeGNSS_suite()); + srunner_add_suite(sr, legacy_auto_check_sbp_navigation_MsgItrf_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_navigation_MsgPosECEF_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_navigation_MsgPosECEFCov_suite()); srunner_add_suite(sr, diff --git a/c/test/check_suites.h b/c/test/check_suites.h index d2ce5933ce..2d8cc62947 100644 --- a/c/test/check_suites.h +++ b/c/test/check_suites.h @@ -45,6 +45,7 @@ Suite* auto_check_sbp_navigation_MsgDopsDepA_suite(void); Suite* auto_check_sbp_navigation_MsgGPSTime_suite(void); Suite* auto_check_sbp_navigation_MsgGPSTimeDepA_suite(void); Suite* auto_check_sbp_navigation_MsgGPSTimeGNSS_suite(void); +Suite* auto_check_sbp_navigation_MsgItrf_suite(void); Suite* auto_check_sbp_navigation_MsgPosECEF_suite(void); Suite* auto_check_sbp_navigation_MsgPosECEFCov_suite(void); Suite* auto_check_sbp_navigation_MsgPosECEFCovGNSS_suite(void); diff --git a/c/test/check_suites_legacy.h b/c/test/check_suites_legacy.h index 17e667e4c2..f7380f74c6 100644 --- a/c/test/check_suites_legacy.h +++ b/c/test/check_suites_legacy.h @@ -46,6 +46,7 @@ Suite* legacy_auto_check_sbp_navigation_MsgDopsDepA_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgGPSTime_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgGPSTimeDepA_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgGPSTimeGNSS_suite(void); +Suite* legacy_auto_check_sbp_navigation_MsgItrf_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgPosECEF_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgPosECEFCov_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgPosECEFCovGNSS_suite(void); diff --git a/c/test/cpp/auto_check_sbp_navigation_MsgItrf.cc b/c/test/cpp/auto_check_sbp_navigation_MsgItrf.cc new file mode 100644 index 0000000000..93feadcdcd --- /dev/null +++ b/c/test/cpp/auto_check_sbp_navigation_MsgItrf.cc @@ -0,0 +1,220 @@ +/* + * 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/navigation/test_MsgItrf.yaml by generate.py. Do +// not modify by hand! + +#include +#include +#include +#include +#include +class Test_auto_check_sbp_navigation_MsgItrf0 + : public ::testing::Test, + public sbp::State, + public sbp::IReader, + public sbp::IWriter, + sbp::MessageHandler { + public: + Test_auto_check_sbp_navigation_MsgItrf0() + : ::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_itrf_t &msg) override { + last_msg_ = msg; + last_sender_id_ = sender_id; + n_callbacks_logged_++; + } + + sbp_msg_itrf_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_navigation_MsgItrf0, Test) { + uint8_t encoded_frame[] = { + 85, 68, 2, 66, 0, 124, 1, 2, 102, 111, 111, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 5, 0, 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, + 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, + 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, + 0, 18, 0, 0, 0, 19, 0, 0, 0, 20, 0, 66, 126, + }; + + sbp_msg_itrf_t test_msg{}; + test_msg.delta_X0 = 7; + test_msg.delta_Y0 = 8; + test_msg.delta_Z0 = 9; + test_msg.dot_delta_X0 = 14; + test_msg.dot_delta_Y0 = 15; + test_msg.dot_delta_Z0 = 16; + test_msg.dot_scale = 20; + test_msg.dot_theta_01 = 17; + test_msg.dot_theta_02 = 18; + test_msg.dot_theta_03 = 19; + test_msg.re_t0 = 6; + test_msg.scale = 13; + test_msg.sin = 4; + { + const char assign_string[] = { + (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0}; + memcpy(test_msg.sn, assign_string, sizeof(assign_string)); + } + test_msg.sn_counter_n = 2; + test_msg.ssr_iod = 1; + test_msg.theta_01 = 10; + test_msg.theta_02 = 11; + test_msg.theta_03 = 12; + { + const char assign_string[] = { + (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0}; + memcpy(test_msg.tn, assign_string, sizeof(assign_string)); + } + test_msg.tn_counter_m = 3; + test_msg.utn = 5; + + 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_.delta_X0, 7) + << "incorrect value for last_msg_.delta_X0, expected 7, is " + << last_msg_.delta_X0; + EXPECT_EQ(last_msg_.delta_Y0, 8) + << "incorrect value for last_msg_.delta_Y0, expected 8, is " + << last_msg_.delta_Y0; + EXPECT_EQ(last_msg_.delta_Z0, 9) + << "incorrect value for last_msg_.delta_Z0, expected 9, is " + << last_msg_.delta_Z0; + EXPECT_EQ(last_msg_.dot_delta_X0, 14) + << "incorrect value for last_msg_.dot_delta_X0, expected 14, is " + << last_msg_.dot_delta_X0; + EXPECT_EQ(last_msg_.dot_delta_Y0, 15) + << "incorrect value for last_msg_.dot_delta_Y0, expected 15, is " + << last_msg_.dot_delta_Y0; + EXPECT_EQ(last_msg_.dot_delta_Z0, 16) + << "incorrect value for last_msg_.dot_delta_Z0, expected 16, is " + << last_msg_.dot_delta_Z0; + EXPECT_EQ(last_msg_.dot_scale, 20) + << "incorrect value for last_msg_.dot_scale, expected 20, is " + << last_msg_.dot_scale; + EXPECT_EQ(last_msg_.dot_theta_01, 17) + << "incorrect value for last_msg_.dot_theta_01, expected 17, is " + << last_msg_.dot_theta_01; + EXPECT_EQ(last_msg_.dot_theta_02, 18) + << "incorrect value for last_msg_.dot_theta_02, expected 18, is " + << last_msg_.dot_theta_02; + EXPECT_EQ(last_msg_.dot_theta_03, 19) + << "incorrect value for last_msg_.dot_theta_03, expected 19, is " + << last_msg_.dot_theta_03; + EXPECT_EQ(last_msg_.re_t0, 6) + << "incorrect value for last_msg_.re_t0, expected 6, is " + << last_msg_.re_t0; + EXPECT_EQ(last_msg_.scale, 13) + << "incorrect value for last_msg_.scale, expected 13, is " + << last_msg_.scale; + EXPECT_EQ(last_msg_.sin, 4) + << "incorrect value for last_msg_.sin, expected 4, is " << last_msg_.sin; + { + const char check_string[] = { + (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0}; + EXPECT_EQ(memcmp(last_msg_.sn, check_string, sizeof(check_string)), 0) + << "incorrect value for last_msg_.sn, expected string '" << check_string + << "', is '" << last_msg_.sn << "'"; + } + EXPECT_EQ(last_msg_.sn_counter_n, 2) + << "incorrect value for last_msg_.sn_counter_n, expected 2, is " + << last_msg_.sn_counter_n; + EXPECT_EQ(last_msg_.ssr_iod, 1) + << "incorrect value for last_msg_.ssr_iod, expected 1, is " + << last_msg_.ssr_iod; + EXPECT_EQ(last_msg_.theta_01, 10) + << "incorrect value for last_msg_.theta_01, expected 10, is " + << last_msg_.theta_01; + EXPECT_EQ(last_msg_.theta_02, 11) + << "incorrect value for last_msg_.theta_02, expected 11, is " + << last_msg_.theta_02; + EXPECT_EQ(last_msg_.theta_03, 12) + << "incorrect value for last_msg_.theta_03, expected 12, is " + << last_msg_.theta_03; + { + const char check_string[] = { + (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0}; + EXPECT_EQ(memcmp(last_msg_.tn, check_string, sizeof(check_string)), 0) + << "incorrect value for last_msg_.tn, expected string '" << check_string + << "', is '" << last_msg_.tn << "'"; + } + EXPECT_EQ(last_msg_.tn_counter_m, 3) + << "incorrect value for last_msg_.tn_counter_m, expected 3, is " + << last_msg_.tn_counter_m; + EXPECT_EQ(last_msg_.utn, 5) + << "incorrect value for last_msg_.utn, expected 5, is " << last_msg_.utn; +} diff --git a/c/test/legacy/auto_check_sbp_navigation_MsgItrf.c b/c/test/legacy/auto_check_sbp_navigation_MsgItrf.c new file mode 100644 index 0000000000..e2e98064fd --- /dev/null +++ b/c/test/legacy/auto_check_sbp_navigation_MsgItrf.c @@ -0,0 +1,334 @@ +/* + * 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/navigation/test_MsgItrf.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_navigation_MsgItrf) { + 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, 580, &msg_callback, + &DUMMY_MEMORY_FOR_CALLBACKS, &n); + sbp_frame_callback_register(&sbp_state, 580, &frame_callback, + &DUMMY_MEMORY_FOR_CALLBACKS, &n2); + + u8 encoded_frame[] = { + 85, 68, 2, 66, 0, 124, 1, 2, 102, 111, 111, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 5, 0, 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, + 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, + 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, + 0, 18, 0, 0, 0, 19, 0, 0, 0, 20, 0, 66, 126, + }; + + 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_itrf_t *test_msg = (msg_itrf_t *)test_msg_storage; + test_msg_len = sizeof(*test_msg); + test_msg->delta_X0 = 7; + test_msg->delta_Y0 = 8; + test_msg->delta_Z0 = 9; + test_msg->dot_delta_X0 = 14; + test_msg->dot_delta_Y0 = 15; + test_msg->dot_delta_Z0 = 16; + test_msg->dot_scale = 20; + test_msg->dot_theta_01 = 17; + test_msg->dot_theta_02 = 18; + test_msg->dot_theta_03 = 19; + test_msg->re_t0 = 6; + test_msg->scale = 13; + test_msg->sin = 4; + { + const char assign_string[] = { + (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0}; + memcpy(test_msg->sn, assign_string, sizeof(assign_string)); + if (sizeof(test_msg->sn) == 0) { + test_msg_len += sizeof(assign_string); + } + } + test_msg->sn_counter_n = 2; + test_msg->ssr_iod = 1; + test_msg->theta_01 = 10; + test_msg->theta_02 = 11; + test_msg->theta_03 = 12; + { + const char assign_string[] = { + (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0}; + memcpy(test_msg->tn, assign_string, sizeof(assign_string)); + if (sizeof(test_msg->tn) == 0) { + test_msg_len += sizeof(assign_string); + } + } + test_msg->tn_counter_m = 3; + test_msg->utn = 5; + sbp_payload_send(&sbp_state, 580, 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 == 580, + "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_itrf_t *check_msg = (msg_itrf_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->delta_X0 == 7, + "incorrect value for delta_X0, expected 7, is %d", + check_msg->delta_X0); + ck_assert_msg(check_msg->delta_Y0 == 8, + "incorrect value for delta_Y0, expected 8, is %d", + check_msg->delta_Y0); + ck_assert_msg(check_msg->delta_Z0 == 9, + "incorrect value for delta_Z0, expected 9, is %d", + check_msg->delta_Z0); + ck_assert_msg(check_msg->dot_delta_X0 == 14, + "incorrect value for dot_delta_X0, expected 14, is %d", + check_msg->dot_delta_X0); + ck_assert_msg(check_msg->dot_delta_Y0 == 15, + "incorrect value for dot_delta_Y0, expected 15, is %d", + check_msg->dot_delta_Y0); + ck_assert_msg(check_msg->dot_delta_Z0 == 16, + "incorrect value for dot_delta_Z0, expected 16, is %d", + check_msg->dot_delta_Z0); + ck_assert_msg(check_msg->dot_scale == 20, + "incorrect value for dot_scale, expected 20, is %d", + check_msg->dot_scale); + ck_assert_msg(check_msg->dot_theta_01 == 17, + "incorrect value for dot_theta_01, expected 17, is %d", + check_msg->dot_theta_01); + ck_assert_msg(check_msg->dot_theta_02 == 18, + "incorrect value for dot_theta_02, expected 18, is %d", + check_msg->dot_theta_02); + ck_assert_msg(check_msg->dot_theta_03 == 19, + "incorrect value for dot_theta_03, expected 19, is %d", + check_msg->dot_theta_03); + ck_assert_msg(check_msg->re_t0 == 6, + "incorrect value for re_t0, expected 6, is %d", + check_msg->re_t0); + ck_assert_msg(check_msg->scale == 13, + "incorrect value for scale, expected 13, is %d", + check_msg->scale); + ck_assert_msg(check_msg->sin == 4, + "incorrect value for sin, expected 4, is %d", check_msg->sin); + { + const char check_string[] = { + (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0}; + ck_assert_msg( + memcmp(check_msg->sn, check_string, sizeof(check_string)) == 0, + "incorrect value for check_msg->sn, expected string '%s', is '%s'", + check_string, check_msg->sn); + } + ck_assert_msg(check_msg->sn_counter_n == 2, + "incorrect value for sn_counter_n, expected 2, is %d", + check_msg->sn_counter_n); + ck_assert_msg(check_msg->ssr_iod == 1, + "incorrect value for ssr_iod, expected 1, is %d", + check_msg->ssr_iod); + ck_assert_msg(check_msg->theta_01 == 10, + "incorrect value for theta_01, expected 10, is %d", + check_msg->theta_01); + ck_assert_msg(check_msg->theta_02 == 11, + "incorrect value for theta_02, expected 11, is %d", + check_msg->theta_02); + ck_assert_msg(check_msg->theta_03 == 12, + "incorrect value for theta_03, expected 12, is %d", + check_msg->theta_03); + { + const char check_string[] = { + (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0}; + ck_assert_msg( + memcmp(check_msg->tn, check_string, sizeof(check_string)) == 0, + "incorrect value for check_msg->tn, expected string '%s', is '%s'", + check_string, check_msg->tn); + } + ck_assert_msg(check_msg->tn_counter_m == 3, + "incorrect value for tn_counter_m, expected 3, is %d", + check_msg->tn_counter_m); + ck_assert_msg(check_msg->utn == 5, + "incorrect value for utn, expected 5, is %d", check_msg->utn); + } +} +END_TEST + +Suite *legacy_auto_check_sbp_navigation_MsgItrf_suite(void) { + Suite *s = suite_create( + "SBP generated test suite: legacy_auto_check_sbp_navigation_MsgItrf"); + TCase *tc_acq = + tcase_create("Automated_Suite_legacy_auto_check_sbp_navigation_MsgItrf"); + tcase_add_test(tc_acq, test_legacy_auto_check_sbp_navigation_MsgItrf); + suite_add_tcase(s, tc_acq); + return s; +} \ No newline at end of file diff --git a/c/test/legacy/cpp/auto_check_sbp_navigation_MsgItrf.cc b/c/test/legacy/cpp/auto_check_sbp_navigation_MsgItrf.cc new file mode 100644 index 0000000000..584d12a706 --- /dev/null +++ b/c/test/legacy/cpp/auto_check_sbp_navigation_MsgItrf.cc @@ -0,0 +1,226 @@ +/* + * 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/navigation/test_MsgItrf.yaml by generate.py. Do +// not modify by hand! + +#include +#include +#include +#include +class Test_legacy_auto_check_sbp_navigation_MsgItrf0 + : public ::testing::Test, + public sbp::State, + public sbp::IReader, + public sbp::IWriter, + sbp::PayloadHandler { + public: + Test_legacy_auto_check_sbp_navigation_MsgItrf0() + : ::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_itrf_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_itrf_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_navigation_MsgItrf0, Test) { + uint8_t encoded_frame[] = { + 85, 68, 2, 66, 0, 124, 1, 2, 102, 111, 111, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 5, 0, 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, + 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, + 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, + 0, 18, 0, 0, 0, 19, 0, 0, 0, 20, 0, 66, 126, + }; + + uint8_t test_msg_storage[SBP_MAX_PAYLOAD_LEN]{}; + uint8_t test_msg_len = 0; + msg_itrf_t *test_msg = (msg_itrf_t *)test_msg_storage; + test_msg_len = (uint8_t)sizeof(*test_msg); + test_msg->delta_X0 = 7; + test_msg->delta_Y0 = 8; + test_msg->delta_Z0 = 9; + test_msg->dot_delta_X0 = 14; + test_msg->dot_delta_Y0 = 15; + test_msg->dot_delta_Z0 = 16; + test_msg->dot_scale = 20; + test_msg->dot_theta_01 = 17; + test_msg->dot_theta_02 = 18; + test_msg->dot_theta_03 = 19; + test_msg->re_t0 = 6; + test_msg->scale = 13; + test_msg->sin = 4; + { + const char assign_string[] = { + (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0}; + memcpy(test_msg->sn, assign_string, sizeof(assign_string)); + if (sizeof(test_msg->sn) == 0) { + test_msg_len = (uint8_t)(test_msg_len + sizeof(assign_string)); + } + } + test_msg->sn_counter_n = 2; + test_msg->ssr_iod = 1; + test_msg->theta_01 = 10; + test_msg->theta_02 = 11; + test_msg->theta_03 = 12; + { + const char assign_string[] = { + (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0}; + memcpy(test_msg->tn, assign_string, sizeof(assign_string)); + if (sizeof(test_msg->tn) == 0) { + test_msg_len = (uint8_t)(test_msg_len + sizeof(assign_string)); + } + } + test_msg->tn_counter_m = 3; + test_msg->utn = 5; + + EXPECT_EQ(send_message(580, 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_->delta_X0, 7) + << "incorrect value for delta_X0, expected 7, is " << last_msg_->delta_X0; + EXPECT_EQ(last_msg_->delta_Y0, 8) + << "incorrect value for delta_Y0, expected 8, is " << last_msg_->delta_Y0; + EXPECT_EQ(last_msg_->delta_Z0, 9) + << "incorrect value for delta_Z0, expected 9, is " << last_msg_->delta_Z0; + EXPECT_EQ(last_msg_->dot_delta_X0, 14) + << "incorrect value for dot_delta_X0, expected 14, is " + << last_msg_->dot_delta_X0; + EXPECT_EQ(last_msg_->dot_delta_Y0, 15) + << "incorrect value for dot_delta_Y0, expected 15, is " + << last_msg_->dot_delta_Y0; + EXPECT_EQ(last_msg_->dot_delta_Z0, 16) + << "incorrect value for dot_delta_Z0, expected 16, is " + << last_msg_->dot_delta_Z0; + EXPECT_EQ(last_msg_->dot_scale, 20) + << "incorrect value for dot_scale, expected 20, is " + << last_msg_->dot_scale; + EXPECT_EQ(last_msg_->dot_theta_01, 17) + << "incorrect value for dot_theta_01, expected 17, is " + << last_msg_->dot_theta_01; + EXPECT_EQ(last_msg_->dot_theta_02, 18) + << "incorrect value for dot_theta_02, expected 18, is " + << last_msg_->dot_theta_02; + EXPECT_EQ(last_msg_->dot_theta_03, 19) + << "incorrect value for dot_theta_03, expected 19, is " + << last_msg_->dot_theta_03; + EXPECT_EQ(last_msg_->re_t0, 6) + << "incorrect value for re_t0, expected 6, is " << last_msg_->re_t0; + EXPECT_EQ(last_msg_->scale, 13) + << "incorrect value for scale, expected 13, is " << last_msg_->scale; + EXPECT_EQ(last_msg_->sin, 4) + << "incorrect value for sin, expected 4, is " << last_msg_->sin; + { + const char check_string[] = { + (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0}; + EXPECT_EQ(memcmp(last_msg_->sn, check_string, sizeof(check_string)), 0) + << "incorrect value for last_msg_->sn, expected string '" + << check_string << "', is '" << last_msg_->sn << "'"; + } + EXPECT_EQ(last_msg_->sn_counter_n, 2) + << "incorrect value for sn_counter_n, expected 2, is " + << last_msg_->sn_counter_n; + EXPECT_EQ(last_msg_->ssr_iod, 1) + << "incorrect value for ssr_iod, expected 1, is " << last_msg_->ssr_iod; + EXPECT_EQ(last_msg_->theta_01, 10) + << "incorrect value for theta_01, expected 10, is " + << last_msg_->theta_01; + EXPECT_EQ(last_msg_->theta_02, 11) + << "incorrect value for theta_02, expected 11, is " + << last_msg_->theta_02; + EXPECT_EQ(last_msg_->theta_03, 12) + << "incorrect value for theta_03, expected 12, is " + << last_msg_->theta_03; + { + const char check_string[] = { + (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0}; + EXPECT_EQ(memcmp(last_msg_->tn, check_string, sizeof(check_string)), 0) + << "incorrect value for last_msg_->tn, expected string '" + << check_string << "', is '" << last_msg_->tn << "'"; + } + EXPECT_EQ(last_msg_->tn_counter_m, 3) + << "incorrect value for tn_counter_m, expected 3, is " + << last_msg_->tn_counter_m; + EXPECT_EQ(last_msg_->utn, 5) + << "incorrect value for utn, expected 5, is " << last_msg_->utn; +} diff --git a/haskell/src/SwiftNav/SBP/Msg.hs b/haskell/src/SwiftNav/SBP/Msg.hs index 487619c93b..ca6fe094e9 100644 --- a/haskell/src/SwiftNav/SBP/Msg.hs +++ b/haskell/src/SwiftNav/SBP/Msg.hs @@ -147,6 +147,7 @@ data SBPMsg = | SBPMsgInsStatus MsgInsStatus Msg | SBPMsgInsUpdates MsgInsUpdates Msg | SBPMsgIono MsgIono Msg + | SBPMsgItrf MsgItrf Msg | SBPMsgLinuxCpuState MsgLinuxCpuState Msg | SBPMsgLinuxCpuStateDepA MsgLinuxCpuStateDepA Msg | SBPMsgLinuxMemState MsgLinuxMemState Msg @@ -379,6 +380,7 @@ instance Binary SBPMsg where | _msgSBPType == msgInsStatus = SBPMsgInsStatus (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgInsUpdates = SBPMsgInsUpdates (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgIono = SBPMsgIono (decode (fromStrict (unBytes _msgSBPPayload))) m + | _msgSBPType == msgItrf = SBPMsgItrf (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgLinuxCpuState = SBPMsgLinuxCpuState (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgLinuxCpuStateDepA = SBPMsgLinuxCpuStateDepA (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgLinuxMemState = SBPMsgLinuxMemState (decode (fromStrict (unBytes _msgSBPPayload))) m @@ -603,6 +605,7 @@ instance Binary SBPMsg where encoder (SBPMsgInsStatus _ m) = put m encoder (SBPMsgInsUpdates _ m) = put m encoder (SBPMsgIono _ m) = put m + encoder (SBPMsgItrf _ m) = put m encoder (SBPMsgLinuxCpuState _ m) = put m encoder (SBPMsgLinuxCpuStateDepA _ m) = put m encoder (SBPMsgLinuxMemState _ m) = put m @@ -831,6 +834,7 @@ instance FromJSON SBPMsg where | msgType == msgInsStatus = SBPMsgInsStatus <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgInsUpdates = SBPMsgInsUpdates <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgIono = SBPMsgIono <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj + | msgType == msgItrf = SBPMsgItrf <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgLinuxCpuState = SBPMsgLinuxCpuState <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgLinuxCpuStateDepA = SBPMsgLinuxCpuStateDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgLinuxMemState = SBPMsgLinuxMemState <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj @@ -1060,6 +1064,7 @@ instance ToJSON SBPMsg where toJSON (SBPMsgInsStatus n m) = toJSON n <<>> toJSON m toJSON (SBPMsgInsUpdates n m) = toJSON n <<>> toJSON m toJSON (SBPMsgIono n m) = toJSON n <<>> toJSON m + toJSON (SBPMsgItrf n m) = toJSON n <<>> toJSON m toJSON (SBPMsgLinuxCpuState n m) = toJSON n <<>> toJSON m toJSON (SBPMsgLinuxCpuStateDepA n m) = toJSON n <<>> toJSON m toJSON (SBPMsgLinuxMemState n m) = toJSON n <<>> toJSON m @@ -1283,6 +1288,7 @@ instance HasMsg SBPMsg where msg f (SBPMsgInsStatus n m) = SBPMsgInsStatus n <$> f m msg f (SBPMsgInsUpdates n m) = SBPMsgInsUpdates n <$> f m msg f (SBPMsgIono n m) = SBPMsgIono n <$> f m + msg f (SBPMsgItrf n m) = SBPMsgItrf n <$> f m msg f (SBPMsgLinuxCpuState n m) = SBPMsgLinuxCpuState n <$> f m msg f (SBPMsgLinuxCpuStateDepA n m) = SBPMsgLinuxCpuStateDepA n <$> f m msg f (SBPMsgLinuxMemState n m) = SBPMsgLinuxMemState n <$> f m diff --git a/java/src/com/swiftnav/sbp/navigation/MsgItrf.java b/java/src/com/swiftnav/sbp/navigation/MsgItrf.java new file mode 100644 index 0000000000..967751a54f --- /dev/null +++ b/java/src/com/swiftnav/sbp/navigation/MsgItrf.java @@ -0,0 +1,186 @@ +/* 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.navigation; + +// This file was auto-generated from yaml/swiftnav/sbp/navigation.yaml by generate.py. +// Do not modify by hand! + + +import com.swiftnav.sbp.SBPBinaryException; +import com.swiftnav.sbp.SBPMessage; +import org.json.JSONObject; + +public class MsgItrf extends SBPMessage { + public static final int TYPE = 0x0244; + + /** SSR IOD parameter. */ + public int ssr_iod; + + /** Source-Name Counter N. */ + public int sn_counter_n; + + /** Source-Name */ + public String sn; + + /** Target-Name Counter M. */ + public int tn_counter_m; + + /** Target-Name */ + public String tn; + + /** System Identification Number. */ + public int sin; + + /** Utilized Transformation Message. */ + public int utn; + + /** + * Reference Epoch t0 for transformation parameter set given as Modified Julian Day (MDJ) Number + * minus 44244 days. + */ + public int re_t0; + + /** Translation in X for Reference Epoch t0. */ + public int delta_X0; + + /** Translation in Y for Reference Epoch t0. */ + public int delta_Y0; + + /** Translation in Z for Reference Epoch t0. */ + public int delta_Z0; + + /** Rotation around the X-axis for Reference Epoch t0. */ + public int theta_01; + + /** Rotation around the Y-axis for Reference Epoch t0. */ + public int theta_02; + + /** Rotation around the Z-axis for Reference Epoch t0. */ + public int theta_03; + + /** Scale correction for Reference Epoch t0. */ + public int scale; + + /** Rate of change of translation in X. */ + public int dot_delta_X0; + + /** Rate of change of translation in Y. */ + public int dot_delta_Y0; + + /** Rate of change of translation in Z. */ + public int dot_delta_Z0; + + /** Rate of change of rotation around the X-axis. */ + public int dot_theta_01; + + /** Rate of change of rotation around the Y-axis. */ + public int dot_theta_02; + + /** Rate of change of rotation around the Z-axis. */ + public int dot_theta_03; + + /** Rate of change of scale correction. */ + public int dot_scale; + + public MsgItrf(int sender) { + super(sender, TYPE); + } + + public MsgItrf() { + super(TYPE); + } + + public MsgItrf(SBPMessage msg) throws SBPBinaryException { + super(msg); + assert msg.type == TYPE; + } + + @Override + protected void parse(Parser parser) throws SBPBinaryException { + /* Parse fields from binary */ + ssr_iod = parser.getU8(); + sn_counter_n = parser.getU8(); + sn = parser.getString(31); + tn_counter_m = parser.getU8(); + tn = parser.getString(31); + sin = parser.getU8(); + utn = parser.getU16(); + re_t0 = parser.getU16(); + delta_X0 = parser.getS32(); + delta_Y0 = parser.getS32(); + delta_Z0 = parser.getS32(); + theta_01 = parser.getS32(); + theta_02 = parser.getS32(); + theta_03 = parser.getS32(); + scale = parser.getS32(); + dot_delta_X0 = parser.getS32(); + dot_delta_Y0 = parser.getS32(); + dot_delta_Z0 = parser.getS32(); + dot_theta_01 = parser.getS32(); + dot_theta_02 = parser.getS32(); + dot_theta_03 = parser.getS32(); + dot_scale = parser.getS16(); + } + + @Override + protected void build(Builder builder) { + builder.putU8(ssr_iod); + builder.putU8(sn_counter_n); + builder.putString(sn, 31); + builder.putU8(tn_counter_m); + builder.putString(tn, 31); + builder.putU8(sin); + builder.putU16(utn); + builder.putU16(re_t0); + builder.putS32(delta_X0); + builder.putS32(delta_Y0); + builder.putS32(delta_Z0); + builder.putS32(theta_01); + builder.putS32(theta_02); + builder.putS32(theta_03); + builder.putS32(scale); + builder.putS32(dot_delta_X0); + builder.putS32(dot_delta_Y0); + builder.putS32(dot_delta_Z0); + builder.putS32(dot_theta_01); + builder.putS32(dot_theta_02); + builder.putS32(dot_theta_03); + builder.putS16(dot_scale); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + obj.put("ssr_iod", ssr_iod); + obj.put("sn_counter_n", sn_counter_n); + obj.put("sn", sn); + obj.put("tn_counter_m", tn_counter_m); + obj.put("tn", tn); + obj.put("sin", sin); + obj.put("utn", utn); + obj.put("re_t0", re_t0); + obj.put("delta_X0", delta_X0); + obj.put("delta_Y0", delta_Y0); + obj.put("delta_Z0", delta_Z0); + obj.put("theta_01", theta_01); + obj.put("theta_02", theta_02); + obj.put("theta_03", theta_03); + obj.put("scale", scale); + obj.put("dot_delta_X0", dot_delta_X0); + obj.put("dot_delta_Y0", dot_delta_Y0); + obj.put("dot_delta_Z0", dot_delta_Z0); + obj.put("dot_theta_01", dot_theta_01); + obj.put("dot_theta_02", dot_theta_02); + obj.put("dot_theta_03", dot_theta_03); + obj.put("dot_scale", dot_scale); + return obj; + } +} diff --git a/java/test/auto_check_sbp_navigation_MsgItrfTest.java b/java/test/auto_check_sbp_navigation_MsgItrfTest.java new file mode 100644 index 0000000000..72810fc3b7 --- /dev/null +++ b/java/test/auto_check_sbp_navigation_MsgItrfTest.java @@ -0,0 +1,358 @@ +/* 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/navigation/test_MsgItrf.yaml by +// generate.py. Do not modify by hand! + + +import com.swiftnav.sbp.SBPMessage; +import com.swiftnav.sbp.navigation.MsgItrf; +import java.math.BigInteger; +import org.json.JSONObject; +import org.junit.Test; + +public class auto_check_sbp_navigation_MsgItrfTest { + + 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_navigation_MsgItrfTest.test1"); + byte[] payload = + new byte[] { + (byte) 1, + (byte) 2, + (byte) 102, + (byte) 111, + (byte) 111, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 3, + (byte) 98, + (byte) 97, + (byte) 114, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 4, + (byte) 5, + (byte) 0, + (byte) 6, + (byte) 0, + (byte) 7, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 8, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 9, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 10, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 11, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 12, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 13, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 14, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 15, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 16, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 17, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 18, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 19, + (byte) 0, + (byte) 0, + (byte) 0, + (byte) 20, + (byte) 0, + }; + SBPMessage sbp = new SBPMessage(0x0042, 0x0244, payload); + MsgItrf msg = new MsgItrf(sbp); + JSONObject json = msg.toJSON(); + Number value; + Number expected; + value = msg.delta_X0; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.delta_X0 + "' != '" + 7 + "'", value.equals(BigInteger.valueOf(7L))); + } else { + value = value.longValue(); + expected = 7L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.delta_Y0; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.delta_Y0 + "' != '" + 8 + "'", value.equals(BigInteger.valueOf(8L))); + } else { + value = value.longValue(); + expected = 8L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.delta_Z0; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.delta_Z0 + "' != '" + 9 + "'", value.equals(BigInteger.valueOf(9L))); + } else { + value = value.longValue(); + expected = 9L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.dot_delta_X0; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.dot_delta_X0 + "' != '" + 14 + "'", + value.equals(BigInteger.valueOf(14L))); + } else { + value = value.longValue(); + expected = 14L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.dot_delta_Y0; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.dot_delta_Y0 + "' != '" + 15 + "'", + value.equals(BigInteger.valueOf(15L))); + } else { + value = value.longValue(); + expected = 15L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.dot_delta_Z0; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.dot_delta_Z0 + "' != '" + 16 + "'", + value.equals(BigInteger.valueOf(16L))); + } else { + value = value.longValue(); + expected = 16L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.dot_scale; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.dot_scale + "' != '" + 20 + "'", + value.equals(BigInteger.valueOf(20L))); + } else { + value = value.longValue(); + expected = 20L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.dot_theta_01; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.dot_theta_01 + "' != '" + 17 + "'", + value.equals(BigInteger.valueOf(17L))); + } else { + value = value.longValue(); + expected = 17L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.dot_theta_02; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.dot_theta_02 + "' != '" + 18 + "'", + value.equals(BigInteger.valueOf(18L))); + } else { + value = value.longValue(); + expected = 18L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.dot_theta_03; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.dot_theta_03 + "' != '" + 19 + "'", + value.equals(BigInteger.valueOf(19L))); + } else { + value = value.longValue(); + expected = 19L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.re_t0; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.re_t0 + "' != '" + 6 + "'", value.equals(BigInteger.valueOf(6L))); + } else { + value = value.longValue(); + expected = 6L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.scale; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.scale + "' != '" + 13 + "'", value.equals(BigInteger.valueOf(13L))); + } else { + value = value.longValue(); + expected = 13L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.sin; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.sin + "' != '" + 4 + "'", value.equals(BigInteger.valueOf(4L))); + } else { + value = value.longValue(); + expected = 4L; + org.junit.Assert.assertEquals(value, expected); + } + org.junit.Assert.assertEquals(msg.sn, "foo"); + value = msg.sn_counter_n; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.sn_counter_n + "' != '" + 2 + "'", + value.equals(BigInteger.valueOf(2L))); + } else { + value = value.longValue(); + expected = 2L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.ssr_iod; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.ssr_iod + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + } else { + value = value.longValue(); + expected = 1L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.theta_01; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.theta_01 + "' != '" + 10 + "'", + value.equals(BigInteger.valueOf(10L))); + } else { + value = value.longValue(); + expected = 10L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.theta_02; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.theta_02 + "' != '" + 11 + "'", + value.equals(BigInteger.valueOf(11L))); + } else { + value = value.longValue(); + expected = 11L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.theta_03; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.theta_03 + "' != '" + 12 + "'", + value.equals(BigInteger.valueOf(12L))); + } else { + value = value.longValue(); + expected = 12L; + org.junit.Assert.assertEquals(value, expected); + } + org.junit.Assert.assertEquals(msg.tn, "bar"); + value = msg.tn_counter_m; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.tn_counter_m + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); + } else { + value = value.longValue(); + expected = 3L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.utn; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.utn + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); + } else { + value = value.longValue(); + expected = 5L; + org.junit.Assert.assertEquals(value, expected); + } + } +} diff --git a/jsonschema/MsgItrf.json b/jsonschema/MsgItrf.json new file mode 100644 index 0000000000..58c7d85a9a --- /dev/null +++ b/jsonschema/MsgItrf.json @@ -0,0 +1,66 @@ +{ + "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": "#MsgItrf", + "title":"MsgItrf", + "description":"", + "type": "object", + "properties": { + "ssr_iod": {"type": "integer"}, + "sn_counter_n": {"type": "integer"}, + "sn": {"type": "string"}, + "tn_counter_m": {"type": "integer"}, + "tn": {"type": "string"}, + "sin": {"type": "integer"}, + "utn": {"type": "integer"}, + "re_t0": {"type": "integer"}, + "delta_X0": {"type": "integer"}, + "delta_Y0": {"type": "integer"}, + "delta_Z0": {"type": "integer"}, + "theta_01": {"type": "integer"}, + "theta_02": {"type": "integer"}, + "theta_03": {"type": "integer"}, + "scale": {"type": "integer"}, + "dot_delta_X0": {"type": "integer"}, + "dot_delta_Y0": {"type": "integer"}, + "dot_delta_Z0": {"type": "integer"}, + "dot_theta_01": {"type": "integer"}, + "dot_theta_02": {"type": "integer"}, + "dot_theta_03": {"type": "integer"}, + "dot_scale": {"type": "integer"} + }, + "required": [ + "ssr_iod", + "sn_counter_n", + "sn", + "tn_counter_m", + "tn", + "sin", + "utn", + "re_t0", + "delta_X0", + "delta_Y0", + "delta_Z0", + "theta_01", + "theta_02", + "theta_03", + "scale", + "dot_delta_X0", + "dot_delta_Y0", + "dot_delta_Z0", + "dot_theta_01", + "dot_theta_02", + "dot_theta_03", + "dot_scale" + ] +} \ No newline at end of file diff --git a/rust/sbp/src/messages/navigation.rs b/rust/sbp/src/messages/navigation.rs index 7dd4025270..4d33388e7c 100644 --- a/rust/sbp/src/messages/navigation.rs +++ b/rust/sbp/src/messages/navigation.rs @@ -48,6 +48,7 @@ pub use msg_dops_dep_a::MsgDopsDepA; pub use msg_gps_time::MsgGpsTime; pub use msg_gps_time_dep_a::MsgGpsTimeDepA; pub use msg_gps_time_gnss::MsgGpsTimeGnss; +pub use msg_itrf::MsgItrf; pub use msg_pos_ecef::MsgPosEcef; pub use msg_pos_ecef_cov::MsgPosEcefCov; pub use msg_pos_ecef_cov_gnss::MsgPosEcefCovGnss; @@ -2139,6 +2140,221 @@ pub mod msg_gps_time_gnss { } } +pub mod msg_itrf { + #![allow(unused_imports)] + + use super::*; + use crate::messages::lib::*; + /// Reference Frame Transformation Parameter + #[cfg_attr(feature = "serde", derive(serde::Serialize))] + #[derive(Debug, Clone)] + pub struct MsgItrf { + /// The message sender_id + #[cfg_attr(feature = "serde", serde(skip_serializing))] + pub sender_id: Option, + /// SSR IOD parameter. + #[cfg_attr(feature = "serde", serde(rename(serialize = "ssr_iod")))] + pub ssr_iod: u8, + /// Source-Name Counter N. + #[cfg_attr(feature = "serde", serde(rename(serialize = "sn_counter_n")))] + pub sn_counter_n: u8, + /// Source-Name + #[cfg_attr(feature = "serde", serde(rename(serialize = "sn")))] + pub sn: SbpString<[u8; 31], Unterminated>, + /// Target-Name Counter M. + #[cfg_attr(feature = "serde", serde(rename(serialize = "tn_counter_m")))] + pub tn_counter_m: u8, + /// Target-Name + #[cfg_attr(feature = "serde", serde(rename(serialize = "tn")))] + pub tn: SbpString<[u8; 31], Unterminated>, + /// System Identification Number. + #[cfg_attr(feature = "serde", serde(rename(serialize = "sin")))] + pub sin: u8, + /// Utilized Transformation Message. + #[cfg_attr(feature = "serde", serde(rename(serialize = "utn")))] + pub utn: u16, + /// Reference Epoch t0 for transformation parameter set given as Modified + /// Julian Day (MDJ) Number minus 44244 days. + #[cfg_attr(feature = "serde", serde(rename(serialize = "re_t0")))] + pub re_t0: u16, + /// Translation in X for Reference Epoch t0. + #[cfg_attr(feature = "serde", serde(rename(serialize = "delta_X0")))] + pub delta_x0: i32, + /// Translation in Y for Reference Epoch t0. + #[cfg_attr(feature = "serde", serde(rename(serialize = "delta_Y0")))] + pub delta_y0: i32, + /// Translation in Z for Reference Epoch t0. + #[cfg_attr(feature = "serde", serde(rename(serialize = "delta_Z0")))] + pub delta_z0: i32, + /// Rotation around the X-axis for Reference Epoch t0. + #[cfg_attr(feature = "serde", serde(rename(serialize = "theta_01")))] + pub theta_01: i32, + /// Rotation around the Y-axis for Reference Epoch t0. + #[cfg_attr(feature = "serde", serde(rename(serialize = "theta_02")))] + pub theta_02: i32, + /// Rotation around the Z-axis for Reference Epoch t0. + #[cfg_attr(feature = "serde", serde(rename(serialize = "theta_03")))] + pub theta_03: i32, + /// Scale correction for Reference Epoch t0. + #[cfg_attr(feature = "serde", serde(rename(serialize = "scale")))] + pub scale: i32, + /// Rate of change of translation in X. + #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_delta_X0")))] + pub dot_delta_x0: i32, + /// Rate of change of translation in Y. + #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_delta_Y0")))] + pub dot_delta_y0: i32, + /// Rate of change of translation in Z. + #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_delta_Z0")))] + pub dot_delta_z0: i32, + /// Rate of change of rotation around the X-axis. + #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_theta_01")))] + pub dot_theta_01: i32, + /// Rate of change of rotation around the Y-axis. + #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_theta_02")))] + pub dot_theta_02: i32, + /// Rate of change of rotation around the Z-axis. + #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_theta_03")))] + pub dot_theta_03: i32, + /// Rate of change of scale correction. + #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_scale")))] + pub dot_scale: i16, + } + + impl ConcreteMessage for MsgItrf { + const MESSAGE_TYPE: u16 = 580; + const MESSAGE_NAME: &'static str = "MSG_ITRF"; + } + + impl SbpMessage for MsgItrf { + 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 MsgItrf { + type Error = TryFromSbpError; + fn try_from(msg: Sbp) -> Result { + match msg { + Sbp::MsgItrf(m) => Ok(m), + _ => Err(TryFromSbpError), + } + } + } + + impl WireFormat for MsgItrf { + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + as WireFormat>::MIN_LEN + + ::MIN_LEN + + as WireFormat>::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::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_iod) + + WireFormat::len(&self.sn_counter_n) + + WireFormat::len(&self.sn) + + WireFormat::len(&self.tn_counter_m) + + WireFormat::len(&self.tn) + + WireFormat::len(&self.sin) + + WireFormat::len(&self.utn) + + WireFormat::len(&self.re_t0) + + WireFormat::len(&self.delta_x0) + + WireFormat::len(&self.delta_y0) + + WireFormat::len(&self.delta_z0) + + WireFormat::len(&self.theta_01) + + WireFormat::len(&self.theta_02) + + WireFormat::len(&self.theta_03) + + WireFormat::len(&self.scale) + + WireFormat::len(&self.dot_delta_x0) + + WireFormat::len(&self.dot_delta_y0) + + WireFormat::len(&self.dot_delta_z0) + + WireFormat::len(&self.dot_theta_01) + + WireFormat::len(&self.dot_theta_02) + + WireFormat::len(&self.dot_theta_03) + + WireFormat::len(&self.dot_scale) + } + fn write(&self, buf: &mut B) { + WireFormat::write(&self.ssr_iod, buf); + WireFormat::write(&self.sn_counter_n, buf); + WireFormat::write(&self.sn, buf); + WireFormat::write(&self.tn_counter_m, buf); + WireFormat::write(&self.tn, buf); + WireFormat::write(&self.sin, buf); + WireFormat::write(&self.utn, buf); + WireFormat::write(&self.re_t0, buf); + WireFormat::write(&self.delta_x0, buf); + WireFormat::write(&self.delta_y0, buf); + WireFormat::write(&self.delta_z0, buf); + WireFormat::write(&self.theta_01, buf); + WireFormat::write(&self.theta_02, buf); + WireFormat::write(&self.theta_03, buf); + WireFormat::write(&self.scale, buf); + WireFormat::write(&self.dot_delta_x0, buf); + WireFormat::write(&self.dot_delta_y0, buf); + WireFormat::write(&self.dot_delta_z0, buf); + WireFormat::write(&self.dot_theta_01, buf); + WireFormat::write(&self.dot_theta_02, buf); + WireFormat::write(&self.dot_theta_03, buf); + WireFormat::write(&self.dot_scale, buf); + } + fn parse_unchecked(buf: &mut B) -> Self { + MsgItrf { + sender_id: None, + ssr_iod: WireFormat::parse_unchecked(buf), + sn_counter_n: WireFormat::parse_unchecked(buf), + sn: WireFormat::parse_unchecked(buf), + tn_counter_m: WireFormat::parse_unchecked(buf), + tn: WireFormat::parse_unchecked(buf), + sin: WireFormat::parse_unchecked(buf), + utn: WireFormat::parse_unchecked(buf), + re_t0: WireFormat::parse_unchecked(buf), + delta_x0: WireFormat::parse_unchecked(buf), + delta_y0: WireFormat::parse_unchecked(buf), + delta_z0: WireFormat::parse_unchecked(buf), + theta_01: WireFormat::parse_unchecked(buf), + theta_02: WireFormat::parse_unchecked(buf), + theta_03: WireFormat::parse_unchecked(buf), + scale: WireFormat::parse_unchecked(buf), + dot_delta_x0: WireFormat::parse_unchecked(buf), + dot_delta_y0: WireFormat::parse_unchecked(buf), + dot_delta_z0: WireFormat::parse_unchecked(buf), + dot_theta_01: WireFormat::parse_unchecked(buf), + dot_theta_02: WireFormat::parse_unchecked(buf), + dot_theta_03: WireFormat::parse_unchecked(buf), + dot_scale: WireFormat::parse_unchecked(buf), + } + } + } +} + pub mod msg_pos_ecef { #![allow(unused_imports)] diff --git a/rust/sbp/tests/integration/auto_check_sbp_navigation_msg_itrf.rs b/rust/sbp/tests/integration/auto_check_sbp_navigation_msg_itrf.rs new file mode 100644 index 0000000000000000000000000000000000000000..0a001b9642f550a4d0ebe3f91094ddf4e4baa84a GIT binary patch literal 6716 zcmcIpZExC05bkGw#e|a@bD{>5mnNKg5(VdCU4RJ4^{T3}9J7G$!1j69NobV+elvb2 z&|s%7ioo{nGxN;L&a5|$My1h!uH&vfYrYU5b!*USD(CN7&6Wb=dut|OVBA@ALs*Ut znr+GyMFLgs|9jXT+NRydL7P8Jpi?)aX`fUf-8f0!viI3N}b zmX^tE&S2*F_7p5TcsR3`3=Xfft~wa2hj72J%mu7`E=b-jqra)eg=gLRf=yA>oS`fa z?k%xE0f{~tI?E+E!B}7)2aj>)-LWZ|5wN?|#?T%1ROk$PpbajDqkdfhHRbv#Doa0FWa z`btxKb(G${y6I_yKj0(E7z`(HrS-K5&YBDXaq&zN6lu`ZG3n^5qwXat?0nR&G*pXR z8z}ign+#A5AZh5pb!Rlux;Iyy5nSJlu7_h)t^_8MLjsrH8ypN@IPd1nW}ZR5n|aO( zxXa9jU|jIV+E^_caTFW;)@@)kqwoh)^gf?!!kfu76K>ZK%aYx-3_S;IN5IONTC+8c zE)08mP^tJBVv{ts+rR!+sr>SVw0*72Fy45f6Di$XF!Ns>RqClqeZ}Xxh3cdlJXQcd z;Wu3^87lGxxW;xA8XmXoc`}`niBb>q4HGF%G7=Xj8jf)sv;_0?7318P zGcLW&q#){#)zdG{mu>bSq}s-F8k5-rE;=DqZ3iM*VGXRlFn4BPVWfJ8W_Y-wB47sc zlrmTu0;}fR*r-jD@M*gp+t6;0>9!v(Yzb-C;KT3FoIs=vj>S{x?7stP%ODy@q#Oy= z#oA?3Ee#Hh$Dfn4XBig{RI$N0o=5#5b_&UtF84KZKP$|gPziUeLixC_o8@x< zhAhqtb0<{79gAi@?%&Ge?g%}OC6?#oA_iAKA< zfemPC3AW(;mXw%J2_4D~?6_MlB5N`gXqP1$iA7yIza`~n7dMS1b_Co66f+~jCDEW= zL>?Og+?J|Wbb_FyVkq!+1j}lZwwi_N>IO71gZ4~$%!sxA1WRb=T&T*XmLN2>Bu}Z$ zK!1WIxPQf+=9b_Wmq+ASgr=6{DZHsAM_USCnOz>!1!i@T1s*{X>Nys604a-dv?`UO z0$zW}{rmW|i*h@QOq_wmZ(rrk zB1^M_<4cZ%Zx>3DH5Y>t_SnDnvJXLJ5szCKGB48nQ&`G9NAHheC9|hyS;X-Xjg3Z` z!}T$&WcJh`i)4O8W1~6dNc$L88v8so@Ye8ND1mQ&qy~!D*1#Xu9`Vv%bfkuan{T;Rt%4_f}=j%0pNkS6rTp} fI?&3T2nEo3d{!!3Ho`3%|79T6B7Z+so+|$XUgIpD literal 0 HcmV?d00001 diff --git a/rust/sbp/tests/integration/main.rs b/rust/sbp/tests/integration/main.rs index b0f8b2e455..9e29c402c8 100644 --- a/rust/sbp/tests/integration/main.rs +++ b/rust/sbp/tests/integration/main.rs @@ -37,6 +37,7 @@ mod auto_check_sbp_navigation_msg_dops_dep_a; mod auto_check_sbp_navigation_msg_gps_time; mod auto_check_sbp_navigation_msg_gps_time_dep_a; mod auto_check_sbp_navigation_msg_gps_time_gnss; +mod auto_check_sbp_navigation_msg_itrf; mod auto_check_sbp_navigation_msg_pos_ecef; mod auto_check_sbp_navigation_msg_pos_ecef_cov; mod auto_check_sbp_navigation_msg_pos_ecef_cov_gnss; diff --git a/sbpjson/javascript/SbpJson.js b/sbpjson/javascript/SbpJson.js index a42d712dad..9b90931b30 100644 --- a/sbpjson/javascript/SbpJson.js +++ b/sbpjson/javascript/SbpJson.js @@ -84,6 +84,7 @@ // const msgInsStatus = Convert.toMsgInsStatus(json); // const msgInsUpdates = Convert.toMsgInsUpdates(json); // const msgIono = Convert.toMsgIono(json); +// const msgItrf = Convert.toMsgItrf(json); // const msgLinuxCPUState = Convert.toMsgLinuxCPUState(json); // const msgLinuxMemState = Convert.toMsgLinuxMemState(json); // const msgLinuxProcessFdCount = Convert.toMsgLinuxProcessFdCount(json); @@ -865,6 +866,14 @@ function msgIonoToJson(value) { return JSON.stringify(uncast(value, r("MsgIono")), null, 2); } +function toMsgItrf(json) { + return cast(JSON.parse(json), r("MsgItrf")); +} + +function msgItrfToJson(value) { + return JSON.stringify(uncast(value, r("MsgItrf")), null, 2); +} + function toMsgLinuxCPUState(json) { return cast(JSON.parse(json), r("MsgLinuxCPUState")); } @@ -2461,6 +2470,30 @@ const typeMap = { { json: "b3", js: "b3", typ: 3.14 }, { json: "t_nmct", js: "t_nmct", typ: r("GpsTimeSEC") }, ], "any"), + "MsgItrf": o([ + { json: "delta_X0", js: "delta_X0", typ: 0 }, + { json: "delta_Y0", js: "delta_Y0", typ: 0 }, + { json: "delta_Z0", js: "delta_Z0", typ: 0 }, + { json: "dot_delta_X0", js: "dot_delta_X0", typ: 0 }, + { json: "dot_delta_Y0", js: "dot_delta_Y0", typ: 0 }, + { json: "dot_delta_Z0", js: "dot_delta_Z0", typ: 0 }, + { json: "dot_scale", js: "dot_scale", typ: 0 }, + { json: "dot_theta_01", js: "dot_theta_01", typ: 0 }, + { json: "dot_theta_02", js: "dot_theta_02", typ: 0 }, + { json: "dot_theta_03", js: "dot_theta_03", typ: 0 }, + { json: "re_t0", js: "re_t0", typ: 0 }, + { json: "scale", js: "scale", typ: 0 }, + { json: "sin", js: "sin", typ: 0 }, + { json: "sn", js: "sn", typ: "" }, + { json: "sn_counter_n", js: "sn_counter_n", typ: 0 }, + { json: "ssr_iod", js: "ssr_iod", typ: 0 }, + { json: "theta_01", js: "theta_01", typ: 0 }, + { json: "theta_02", js: "theta_02", typ: 0 }, + { json: "theta_03", js: "theta_03", typ: 0 }, + { json: "tn", js: "tn", typ: "" }, + { json: "tn_counter_m", js: "tn_counter_m", typ: 0 }, + { json: "utn", js: "utn", typ: 0 }, + ], "any"), "MsgLinuxCPUState": o([ { json: "cmdline", js: "cmdline", typ: "" }, { json: "flags", js: "flags", typ: 0 }, @@ -3458,6 +3491,8 @@ module.exports = { "toMsgInsUpdates": toMsgInsUpdates, "msgIonoToJson": msgIonoToJson, "toMsgIono": toMsgIono, + "msgItrfToJson": msgItrfToJson, + "toMsgItrf": toMsgItrf, "msgLinuxCPUStateToJson": msgLinuxCPUStateToJson, "toMsgLinuxCPUState": toMsgLinuxCPUState, "msgLinuxMemStateToJson": msgLinuxMemStateToJson, diff --git a/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgItrf.yaml b/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgItrf.yaml new file mode 100644 index 0000000000..04beccb51d --- /dev/null +++ b/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgItrf.yaml @@ -0,0 +1,47 @@ +description: Unit tests for swiftnav.sbp.navigation MsgItrf +generated_on: 2022-05-11 # manually generated +package: sbp.navigation +tests: + + - msg: + fields: + ssr_iod: 1 + sn_counter_n: 2 + sn: "foo\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + tn_counter_m: 3 + tn: "bar\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + sin: 4 + utn: 5 + re_t0: 6 + delta_X0: 7 + delta_Y0: 8 + delta_Z0: 9 + theta_01: 10 + theta_02: 11 + theta_03: 12 + scale: 13 + dot_delta_X0: 14 + dot_delta_Y0: 15 + dot_delta_Z0: 16 + dot_theta_01: 17 + dot_theta_02: 18 + dot_theta_03: 19 + dot_scale: 20 + module: sbp.navigation + name: MsgItrf + msg_type: '580' + raw_json: '{"ssr_iod": 1, "sn_counter_n": 2, "sn": "foo\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "tn_counter_m": 3, "tn": "bar\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "sin": 4, "utn": 5, "re_t0": 6, "delta_X0": 7, "delta_Y0": 8, "delta_Z0": 9, "theta_01": 10, "theta_02": 11, "theta_03": 12, "scale": 13, + "dot_delta_X0": 14, "dot_delta_Y0": 15, "dot_delta_Z0": 16, "dot_theta_01": 17, "dot_theta_02": 18, "dot_theta_03": 19, "dot_scale": 20, + "preamble": 85, "msg_type": 580, "sender": 66, "length": 124, + "payload": "AQJmb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JhcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBQAGAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAA==", + "crc": 32322}' + raw_packet: VUQCQgB8AQJmb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JhcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBQAGAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAEJ+ + sbp: + preamble: '0x55' + msg_type: '0x0244' + sender: '0x0042' + length: 124 + payload: AQJmb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JhcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBQAGAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAA== + crc: '0x7E42' diff --git a/spec/yaml/swiftnav/sbp/navigation.yaml b/spec/yaml/swiftnav/sbp/navigation.yaml index 31b22494ad..c92066132f 100644 --- a/spec/yaml/swiftnav/sbp/navigation.yaml +++ b/spec/yaml/swiftnav/sbp/navigation.yaml @@ -2428,24 +2428,93 @@ definitions: - 31: desc: Safe state ROPL - - MSG_UTC_LEAP_SECOND: - id: 0x023A - short_desc: > - Leap second SBP message. - desc: > - Emulates the GPS CNAV message, reserving bytes for future broadcast of - the drift model parameters. - public: False - fields: - - stub: - type: array - fill: u8 - - - MSG_REFERENCE_FRAME_PARAM: + - MSG_ITRF: id: 0x0244 short_desc: Reference Frame Transformation Parameter public: False fields: - - stub: - type: array - fill: u8 + - ssr_iod: + type: u8 + desc: SSR IOD parameter. + - sn_counter_n: + type: u8 + desc: Source-Name Counter N. + - sn: + type: string + size: 31 + desc: Source-Name + - tn_counter_m: + type: u8 + desc: Target-Name Counter M. + - tn: + type: string + size: 31 + desc: Target-Name + - sin: + type: u8 + desc: System Identification Number. + - utn: + type: u16 + desc: Utilized Transformation Message. + - re_t0: + type: u16 + units: 1 day + desc: > + Reference Epoch t0 for transformation parameter set given as + Modified Julian Day (MDJ) Number minus 44244 days. + - delta_X0: + type: s32 + units: 0.001 m + desc: Translation in X for Reference Epoch t0. + - delta_Y0: + type: s32 + units: 0.001 m + desc: Translation in Y for Reference Epoch t0. + - delta_Z0: + type: s32 + units: 0.001 m + desc: Translation in Z for Reference Epoch t0. + - theta_01: + type: s32 + units: 0.00002 " + desc: Rotation around the X-axis for Reference Epoch t0. + - theta_02: + type: s32 + units: 0.00002 " + desc: Rotation around the Y-axis for Reference Epoch t0. + - theta_03: + type: s32 + units: 0.00002 " + desc: Rotation around the Z-axis for Reference Epoch t0. + - scale: + type: s32 + units: 0.00001 ppm + desc: Scale correction for Reference Epoch t0. + - dot_delta_X0: + type: s32 + units: 0.00002 m/yr + desc: Rate of change of translation in X. + - dot_delta_Y0: + type: s32 + units: 0.00002 m/yr + desc: Rate of change of translation in Y. + - dot_delta_Z0: + type: s32 + units: 0.00002 m/yr + desc: Rate of change of translation in Z. + - dot_theta_01: + type: s32 + units: 0.0000004 "/yr + desc: Rate of change of rotation around the X-axis. + - dot_theta_02: + type: s32 + units: 0.0000004 "/yr + desc: Rate of change of rotation around the Y-axis. + - dot_theta_03: + type: s32 + units: 0.0000004 "/yr + desc: Rate of change of rotation around the Z-axis. + - dot_scale: + type: s16 + units: 0.0000002 ppm/yr + desc: Rate of change of scale correction. diff --git a/spec/yaml/swiftnav/sbp/ssr.yaml b/spec/yaml/swiftnav/sbp/ssr.yaml index a7b5bc1ca5..32a6c80959 100644 --- a/spec/yaml/swiftnav/sbp/ssr.yaml +++ b/spec/yaml/swiftnav/sbp/ssr.yaml @@ -485,6 +485,7 @@ definitions: - MSG_SSR_GRIDDED_CORRECTION_BOUNDS: id: 0x05FE short_desc: Gridded troposhere and STEC correction residuals bounds + public: False fields: - header: type: BoundsHeader @@ -645,6 +646,7 @@ definitions: 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: False fields: - ssr_sol_id: type: u8 From 0bbd6794a141d142f07cfe72bd56f81240b545ee Mon Sep 17 00:00:00 2001 From: fpezzinosn <79222190+fpezzinosn@users.noreply.github.com> Date: Fri, 13 May 2022 13:11:36 -0400 Subject: [PATCH 07/10] Add leap second message [OTA-148] (#1145) --- c/include/libsbp/cpp/message_traits.h | 35 +++ c/include/libsbp/sbp_msg_type.h | 1 + c/include/libsbp/v4/navigation.h | 1 + .../v4/navigation/MSG_GPS_LEAP_SECOND.h | 223 ++++++++++++++++ c/include/libsbp/v4/sbp_msg.h | 12 + ...to_check_sbp_navigation_MsgGPSLeapSecond.c | 205 +++++++++++++++ c/test/check_main.c | 1 + c/test/check_main_legacy.c | 2 + c/test/check_suites.h | 1 + c/test/check_suites_legacy.h | 1 + ...o_check_sbp_navigation_MsgGPSLeapSecond.cc | 131 ++++++++++ ...to_check_sbp_navigation_MsgGPSLeapSecond.c | 239 ++++++++++++++++++ ...o_check_sbp_navigation_MsgGPSLeapSecond.cc | 133 ++++++++++ haskell/src/SwiftNav/SBP/Msg.hs | 6 + .../sbp/navigation/MsgGPSLeapSecond.java | 117 +++++++++ ...k_sbp_navigation_MsgGPSLeapSecondTest.java | 130 ++++++++++ jsonschema/MsgGPSLeapSecond.json | 40 +++ rust/sbp/src/messages/navigation.rs | 133 ++++++++++ ...heck_sbp_navigation_msg_gps_leap_second.rs | 95 +++++++ rust/sbp/tests/integration/main.rs | 1 + sbpjson/javascript/SbpJson.js | 22 ++ .../sbp/navigation/test_MsgGPSLeapSecond.yaml | 30 +++ spec/yaml/swiftnav/sbp/navigation.yaml | 51 ++++ 23 files changed, 1610 insertions(+) create mode 100644 c/include/libsbp/v4/navigation/MSG_GPS_LEAP_SECOND.h create mode 100644 c/test/auto_check_sbp_navigation_MsgGPSLeapSecond.c create mode 100644 c/test/cpp/auto_check_sbp_navigation_MsgGPSLeapSecond.cc create mode 100644 c/test/legacy/auto_check_sbp_navigation_MsgGPSLeapSecond.c create mode 100644 c/test/legacy/cpp/auto_check_sbp_navigation_MsgGPSLeapSecond.cc create mode 100644 java/src/com/swiftnav/sbp/navigation/MsgGPSLeapSecond.java create mode 100644 java/test/auto_check_sbp_navigation_MsgGPSLeapSecondTest.java create mode 100644 jsonschema/MsgGPSLeapSecond.json create mode 100644 rust/sbp/tests/integration/auto_check_sbp_navigation_msg_gps_leap_second.rs create mode 100644 spec/tests/yaml/swiftnav/sbp/navigation/test_MsgGPSLeapSecond.yaml diff --git a/c/include/libsbp/cpp/message_traits.h b/c/include/libsbp/cpp/message_traits.h index b9c6258772..757d46be8a 100644 --- a/c/include/libsbp/cpp/message_traits.h +++ b/c/include/libsbp/cpp/message_traits.h @@ -2688,6 +2688,41 @@ struct MessageTraits { } }; +template <> +struct MessageTraits { + static constexpr sbp_msg_type_t id = SbpMsgGpsLeapSecond; + static const sbp_msg_gps_leap_second_t &get(const sbp_msg_t &msg) { + return msg.gps_leap_second; + } + static sbp_msg_gps_leap_second_t &get(sbp_msg_t &msg) { + return msg.gps_leap_second; + } + static void to_sbp_msg(const sbp_msg_gps_leap_second_t &msg, + sbp_msg_t *sbp_msg) { + sbp_msg->gps_leap_second = msg; + } + static sbp_msg_t to_sbp_msg(const sbp_msg_gps_leap_second_t &msg) { + sbp_msg_t sbp_msg; + sbp_msg.gps_leap_second = msg; + return sbp_msg; + } + static s8 send(sbp_state_t *state, u16 sender_id, + const sbp_msg_gps_leap_second_t &msg, sbp_write_fn_t write) { + return sbp_msg_gps_leap_second_send(state, sender_id, &msg, write); + } + static s8 encode(uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_msg_gps_leap_second_t &msg) { + return sbp_msg_gps_leap_second_encode(buf, len, n_written, &msg); + } + static s8 decode(const uint8_t *buf, uint8_t len, uint8_t *n_read, + sbp_msg_gps_leap_second_t *msg) { + return sbp_msg_gps_leap_second_decode(buf, len, n_read, msg); + } + static size_t encoded_len(const sbp_msg_gps_leap_second_t &msg) { + return sbp_msg_gps_leap_second_encoded_len(&msg); + } +}; + template <> struct MessageTraits { static constexpr sbp_msg_type_t id = SbpMsgGpsTimeDepA; diff --git a/c/include/libsbp/sbp_msg_type.h b/c/include/libsbp/sbp_msg_type.h index 2b54eaa026..ba3141b59a 100644 --- a/c/include/libsbp/sbp_msg_type.h +++ b/c/include/libsbp/sbp_msg_type.h @@ -127,6 +127,7 @@ typedef enum { SbpMsgGloBiases = SBP_MSG_GLO_BIASES, SbpMsgGnssCapb = SBP_MSG_GNSS_CAPB, SbpMsgGnssTimeOffset = SBP_MSG_GNSS_TIME_OFFSET, + SbpMsgGpsLeapSecond = SBP_MSG_GPS_LEAP_SECOND, SbpMsgGpsTimeDepA = SBP_MSG_GPS_TIME_DEP_A, SbpMsgGpsTimeGnss = SBP_MSG_GPS_TIME_GNSS, SbpMsgGpsTime = SBP_MSG_GPS_TIME, diff --git a/c/include/libsbp/v4/navigation.h b/c/include/libsbp/v4/navigation.h index f978968cb8..1dfb8061cf 100644 --- a/c/include/libsbp/v4/navigation.h +++ b/c/include/libsbp/v4/navigation.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include diff --git a/c/include/libsbp/v4/navigation/MSG_GPS_LEAP_SECOND.h b/c/include/libsbp/v4/navigation/MSG_GPS_LEAP_SECOND.h new file mode 100644 index 0000000000..35dc956dc3 --- /dev/null +++ b/c/include/libsbp/v4/navigation/MSG_GPS_LEAP_SECOND.h @@ -0,0 +1,223 @@ +/* + * 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/navigation.yaml + * with generate.py. Please do not hand edit! + *****************************************************************************/ + +#ifndef LIBSBP_V4_NAVIGATION_MSG_GPS_LEAP_SECOND_H +#define LIBSBP_V4_NAVIGATION_MSG_GPS_LEAP_SECOND_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * + * SBP_MSG_GPS_LEAP_SECOND + * + *****************************************************************************/ +/** Leap second SBP message. + + * +* Emulates the GPS CNAV message, reserving bytes for future broadcast of the +drift model parameters. + */ +typedef struct { + /** + * Reserved. Bias coefficient of GPS time scale with respect to UTC drift + * model. [2^-35 s] + */ + s16 bias_coeff; + + /** + * Reserved. Drift coefficient of GPS time scale with respect to UTC drift + * model. [2^-51 s/s] + */ + s16 drift_coeff; + + /** + * Reserved. Drift rate correction coefficient of GPS time scale with respect + * to UTC drift model. [2^-68 s/s^2] + */ + s8 drift_rate_coeff; + + /** + * Leap second count before insertion. [s] + */ + s8 count_before; + + /** + * Reserved. Drift model reference week second. [s] + */ + u16 tow_s; + + /** + * Reserved. Drift model reference week number. [weeks] + */ + u16 wn; + + /** + * Leap second reference week number. [weeks] + */ + u16 ref_wn; + + /** + * Leap second reference day number. [days] + */ + u8 ref_dn; + + /** + * Leap second count after insertion. [s] + */ + s8 count_after; +} sbp_msg_gps_leap_second_t; + +/** + * Get encoded size of an instance of sbp_msg_gps_leap_second_t + * + * @param msg sbp_msg_gps_leap_second_t instance + * @return Length of on-wire representation + */ +static inline size_t sbp_msg_gps_leap_second_encoded_len( + const sbp_msg_gps_leap_second_t *msg) { + (void)msg; + return SBP_MSG_GPS_LEAP_SECOND_ENCODED_LEN; +} + +/** + * Encode an instance of sbp_msg_gps_leap_second_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_gps_leap_second_t to encode + * @return SBP_OK on success, or other libsbp error code + */ +SBP_EXPORT s8 +sbp_msg_gps_leap_second_encode(uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_msg_gps_leap_second_t *msg); + +/** + * Decode an instance of sbp_msg_gps_leap_second_t from wire representation + * + * This function decodes the wire representation of a sbp_msg_gps_leap_second_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_gps_leap_second_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_gps_leap_second_decode(const uint8_t *buf, uint8_t len, + uint8_t *n_read, + sbp_msg_gps_leap_second_t *msg); +/** + * Send an instance of sbp_msg_gps_leap_second_t with the given write function + * + * An equivalent of #sbp_message_send which operates specifically on + * sbp_msg_gps_leap_second_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_gps_leap_second_send(sbp_state_t *s, u16 sender_id, + const sbp_msg_gps_leap_second_t *msg, + sbp_write_fn_t write); + +/** + * Compare two instances of sbp_msg_gps_leap_second_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_gps_leap_second_t instance + * @param b sbp_msg_gps_leap_second_t instance + * @return 0, <0, >0 + */ +SBP_EXPORT int sbp_msg_gps_leap_second_cmp(const sbp_msg_gps_leap_second_t *a, + const sbp_msg_gps_leap_second_t *b); + +#ifdef __cplusplus +} + +static inline bool operator==(const sbp_msg_gps_leap_second_t &lhs, + const sbp_msg_gps_leap_second_t &rhs) { + return sbp_msg_gps_leap_second_cmp(&lhs, &rhs) == 0; +} + +static inline bool operator!=(const sbp_msg_gps_leap_second_t &lhs, + const sbp_msg_gps_leap_second_t &rhs) { + return sbp_msg_gps_leap_second_cmp(&lhs, &rhs) != 0; +} + +static inline bool operator<(const sbp_msg_gps_leap_second_t &lhs, + const sbp_msg_gps_leap_second_t &rhs) { + return sbp_msg_gps_leap_second_cmp(&lhs, &rhs) < 0; +} + +static inline bool operator<=(const sbp_msg_gps_leap_second_t &lhs, + const sbp_msg_gps_leap_second_t &rhs) { + return sbp_msg_gps_leap_second_cmp(&lhs, &rhs) <= 0; +} + +static inline bool operator>(const sbp_msg_gps_leap_second_t &lhs, + const sbp_msg_gps_leap_second_t &rhs) { + return sbp_msg_gps_leap_second_cmp(&lhs, &rhs) > 0; +} + +static inline bool operator>=(const sbp_msg_gps_leap_second_t &lhs, + const sbp_msg_gps_leap_second_t &rhs) { + return sbp_msg_gps_leap_second_cmp(&lhs, &rhs) >= 0; +} + +#endif // ifdef __cplusplus + +#endif /* LIBSBP_V4_NAVIGATION_MSG_GPS_LEAP_SECOND_H */ diff --git a/c/include/libsbp/v4/sbp_msg.h b/c/include/libsbp/v4/sbp_msg.h index be3559f09d..0a809ee859 100644 --- a/c/include/libsbp/v4/sbp_msg.h +++ b/c/include/libsbp/v4/sbp_msg.h @@ -133,6 +133,7 @@ typedef union { sbp_msg_glo_biases_t glo_biases; sbp_msg_gnss_capb_t gnss_capb; sbp_msg_gnss_time_offset_t gnss_time_offset; + sbp_msg_gps_leap_second_t gps_leap_second; sbp_msg_gps_time_dep_a_t gps_time_dep_a; sbp_msg_gps_time_gnss_t gps_time_gnss; sbp_msg_gps_time_t gps_time; @@ -510,6 +511,9 @@ static inline s8 sbp_message_encode(uint8_t *buf, uint8_t len, case SbpMsgGnssTimeOffset: return sbp_msg_gnss_time_offset_encode(buf, len, n_written, &msg->gnss_time_offset); + case SbpMsgGpsLeapSecond: + return sbp_msg_gps_leap_second_encode(buf, len, n_written, + &msg->gps_leap_second); case SbpMsgGpsTimeDepA: return sbp_msg_gps_time_dep_a_encode(buf, len, n_written, &msg->gps_time_dep_a); @@ -1127,6 +1131,9 @@ static inline s8 sbp_message_decode(const uint8_t *buf, uint8_t len, case SbpMsgGnssTimeOffset: return sbp_msg_gnss_time_offset_decode(buf, len, n_read, &msg->gnss_time_offset); + case SbpMsgGpsLeapSecond: + return sbp_msg_gps_leap_second_decode(buf, len, n_read, + &msg->gps_leap_second); case SbpMsgGpsTimeDepA: return sbp_msg_gps_time_dep_a_decode(buf, len, n_read, &msg->gps_time_dep_a); @@ -1686,6 +1693,8 @@ static inline size_t sbp_message_encoded_len(sbp_msg_type_t msg_type, return sbp_msg_gnss_capb_encoded_len(&msg->gnss_capb); case SbpMsgGnssTimeOffset: return sbp_msg_gnss_time_offset_encoded_len(&msg->gnss_time_offset); + case SbpMsgGpsLeapSecond: + return sbp_msg_gps_leap_second_encoded_len(&msg->gps_leap_second); case SbpMsgGpsTimeDepA: return sbp_msg_gps_time_dep_a_encoded_len(&msg->gps_time_dep_a); case SbpMsgGpsTimeGnss: @@ -2224,6 +2233,9 @@ static inline int sbp_message_cmp(sbp_msg_type_t msg_type, const sbp_msg_t *a, case SbpMsgGnssTimeOffset: return sbp_msg_gnss_time_offset_cmp(&a->gnss_time_offset, &b->gnss_time_offset); + case SbpMsgGpsLeapSecond: + return sbp_msg_gps_leap_second_cmp(&a->gps_leap_second, + &b->gps_leap_second); case SbpMsgGpsTimeDepA: return sbp_msg_gps_time_dep_a_cmp(&a->gps_time_dep_a, &b->gps_time_dep_a); case SbpMsgGpsTimeGnss: diff --git a/c/test/auto_check_sbp_navigation_MsgGPSLeapSecond.c b/c/test/auto_check_sbp_navigation_MsgGPSLeapSecond.c new file mode 100644 index 0000000000..2d6903d252 --- /dev/null +++ b/c/test/auto_check_sbp_navigation_MsgGPSLeapSecond.c @@ -0,0 +1,205 @@ +/* + * 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/navigation/test_MsgGPSLeapSecond.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_navigation_MsgGPSLeapSecond) { + 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, 570, &msg_callback, + &DUMMY_MEMORY_FOR_CALLBACKS, &n); + + u8 encoded_frame[] = { + 85, 58, 2, 66, 0, 14, 1, 0, 2, 0, 3, 4, 5, 0, 6, 0, 7, 0, 8, 9, 50, 232, + }; + + dummy_reset(); + + sbp_msg_t test_msg; + memset(&test_msg, 0, sizeof(test_msg)); + + test_msg.gps_leap_second.bias_coeff = 1; + + test_msg.gps_leap_second.count_after = 9; + + test_msg.gps_leap_second.count_before = 4; + + test_msg.gps_leap_second.drift_coeff = 2; + + test_msg.gps_leap_second.drift_rate_coeff = 3; + + test_msg.gps_leap_second.ref_dn = 8; + + test_msg.gps_leap_second.ref_wn = 7; + + test_msg.gps_leap_second.tow_s = 5; + + test_msg.gps_leap_second.wn = 6; + + sbp_message_send(&sbp_state, SbpMsgGpsLeapSecond, 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(SbpMsgGpsLeapSecond, &last_msg.msg, &test_msg) == 0, + "Sent and received messages did not compare equal"); + + ck_assert_msg(last_msg.msg.gps_leap_second.bias_coeff == 1, + "incorrect value for " + "last_msg.msg.gps_leap_second.bias_coeff, expected 1, is %d", + last_msg.msg.gps_leap_second.bias_coeff); + + ck_assert_msg(last_msg.msg.gps_leap_second.count_after == 9, + "incorrect value for " + "last_msg.msg.gps_leap_second.count_after, expected 9, is %d", + last_msg.msg.gps_leap_second.count_after); + + ck_assert_msg( + last_msg.msg.gps_leap_second.count_before == 4, + "incorrect value for last_msg.msg.gps_leap_second.count_before, " + "expected 4, is %d", + last_msg.msg.gps_leap_second.count_before); + + ck_assert_msg(last_msg.msg.gps_leap_second.drift_coeff == 2, + "incorrect value for " + "last_msg.msg.gps_leap_second.drift_coeff, expected 2, is %d", + last_msg.msg.gps_leap_second.drift_coeff); + + ck_assert_msg( + last_msg.msg.gps_leap_second.drift_rate_coeff == 3, + "incorrect value for last_msg.msg.gps_leap_second.drift_rate_coeff, " + "expected 3, is %d", + last_msg.msg.gps_leap_second.drift_rate_coeff); + + ck_assert_msg(last_msg.msg.gps_leap_second.ref_dn == 8, + "incorrect value for last_msg.msg.gps_leap_second.ref_dn, " + "expected 8, is %d", + last_msg.msg.gps_leap_second.ref_dn); + + ck_assert_msg(last_msg.msg.gps_leap_second.ref_wn == 7, + "incorrect value for last_msg.msg.gps_leap_second.ref_wn, " + "expected 7, is %d", + last_msg.msg.gps_leap_second.ref_wn); + + ck_assert_msg(last_msg.msg.gps_leap_second.tow_s == 5, + "incorrect value for last_msg.msg.gps_leap_second.tow_s, " + "expected 5, is %d", + last_msg.msg.gps_leap_second.tow_s); + + ck_assert_msg(last_msg.msg.gps_leap_second.wn == 6, + "incorrect value for last_msg.msg.gps_leap_second.wn, " + "expected 6, is %d", + last_msg.msg.gps_leap_second.wn); + } +} +END_TEST + +Suite *auto_check_sbp_navigation_MsgGPSLeapSecond_suite(void) { + Suite *s = suite_create( + "SBP generated test suite: auto_check_sbp_navigation_MsgGPSLeapSecond"); + TCase *tc_acq = tcase_create( + "Automated_Suite_auto_check_sbp_navigation_MsgGPSLeapSecond"); + tcase_add_test(tc_acq, test_auto_check_sbp_navigation_MsgGPSLeapSecond); + 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 4575d88c75..e29ca90ca8 100644 --- a/c/test/check_main.c +++ b/c/test/check_main.c @@ -54,6 +54,7 @@ int main(void) { srunner_add_suite(sr, auto_check_sbp_navigation_MsgBaselineNEDDepA_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgDops_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgDopsDepA_suite()); + srunner_add_suite(sr, auto_check_sbp_navigation_MsgGPSLeapSecond_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgGPSTime_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgGPSTimeDepA_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgGPSTimeGNSS_suite()); diff --git a/c/test/check_main_legacy.c b/c/test/check_main_legacy.c index b1dc10e0d2..4f37f0e9ad 100644 --- a/c/test/check_main_legacy.c +++ b/c/test/check_main_legacy.c @@ -66,6 +66,8 @@ int main(void) { sr, legacy_auto_check_sbp_navigation_MsgBaselineNEDDepA_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_navigation_MsgDops_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_navigation_MsgDopsDepA_suite()); + srunner_add_suite(sr, + legacy_auto_check_sbp_navigation_MsgGPSLeapSecond_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_navigation_MsgGPSTime_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_navigation_MsgGPSTimeDepA_suite()); diff --git a/c/test/check_suites.h b/c/test/check_suites.h index 2d8cc62947..c2377ac197 100644 --- a/c/test/check_suites.h +++ b/c/test/check_suites.h @@ -42,6 +42,7 @@ Suite* auto_check_sbp_navigation_MsgBaselineNED_suite(void); Suite* auto_check_sbp_navigation_MsgBaselineNEDDepA_suite(void); Suite* auto_check_sbp_navigation_MsgDops_suite(void); Suite* auto_check_sbp_navigation_MsgDopsDepA_suite(void); +Suite* auto_check_sbp_navigation_MsgGPSLeapSecond_suite(void); Suite* auto_check_sbp_navigation_MsgGPSTime_suite(void); Suite* auto_check_sbp_navigation_MsgGPSTimeDepA_suite(void); Suite* auto_check_sbp_navigation_MsgGPSTimeGNSS_suite(void); diff --git a/c/test/check_suites_legacy.h b/c/test/check_suites_legacy.h index f7380f74c6..1ce7c4d5e0 100644 --- a/c/test/check_suites_legacy.h +++ b/c/test/check_suites_legacy.h @@ -43,6 +43,7 @@ Suite* legacy_auto_check_sbp_navigation_MsgBaselineNED_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgBaselineNEDDepA_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgDops_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgDopsDepA_suite(void); +Suite* legacy_auto_check_sbp_navigation_MsgGPSLeapSecond_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgGPSTime_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgGPSTimeDepA_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgGPSTimeGNSS_suite(void); diff --git a/c/test/cpp/auto_check_sbp_navigation_MsgGPSLeapSecond.cc b/c/test/cpp/auto_check_sbp_navigation_MsgGPSLeapSecond.cc new file mode 100644 index 0000000000..6a94c19a8c --- /dev/null +++ b/c/test/cpp/auto_check_sbp_navigation_MsgGPSLeapSecond.cc @@ -0,0 +1,131 @@ +/* + * 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/navigation/test_MsgGPSLeapSecond.yaml by +// generate.py. Do not modify by hand! + +#include +#include +#include +#include +#include +class Test_auto_check_sbp_navigation_MsgGPSLeapSecond0 + : public ::testing::Test, + public sbp::State, + public sbp::IReader, + public sbp::IWriter, + sbp::MessageHandler { + public: + Test_auto_check_sbp_navigation_MsgGPSLeapSecond0() + : ::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_gps_leap_second_t &msg) override { + last_msg_ = msg; + last_sender_id_ = sender_id; + n_callbacks_logged_++; + } + + sbp_msg_gps_leap_second_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_navigation_MsgGPSLeapSecond0, Test) { + uint8_t encoded_frame[] = { + 85, 58, 2, 66, 0, 14, 1, 0, 2, 0, 3, 4, 5, 0, 6, 0, 7, 0, 8, 9, 50, 232, + }; + + sbp_msg_gps_leap_second_t test_msg{}; + test_msg.bias_coeff = 1; + test_msg.count_after = 9; + test_msg.count_before = 4; + test_msg.drift_coeff = 2; + test_msg.drift_rate_coeff = 3; + test_msg.ref_dn = 8; + test_msg.ref_wn = 7; + test_msg.tow_s = 5; + test_msg.wn = 6; + + 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_.bias_coeff, 1) + << "incorrect value for last_msg_.bias_coeff, expected 1, is " + << last_msg_.bias_coeff; + EXPECT_EQ(last_msg_.count_after, 9) + << "incorrect value for last_msg_.count_after, expected 9, is " + << last_msg_.count_after; + EXPECT_EQ(last_msg_.count_before, 4) + << "incorrect value for last_msg_.count_before, expected 4, is " + << last_msg_.count_before; + EXPECT_EQ(last_msg_.drift_coeff, 2) + << "incorrect value for last_msg_.drift_coeff, expected 2, is " + << last_msg_.drift_coeff; + EXPECT_EQ(last_msg_.drift_rate_coeff, 3) + << "incorrect value for last_msg_.drift_rate_coeff, expected 3, is " + << last_msg_.drift_rate_coeff; + EXPECT_EQ(last_msg_.ref_dn, 8) + << "incorrect value for last_msg_.ref_dn, expected 8, is " + << last_msg_.ref_dn; + EXPECT_EQ(last_msg_.ref_wn, 7) + << "incorrect value for last_msg_.ref_wn, expected 7, is " + << last_msg_.ref_wn; + EXPECT_EQ(last_msg_.tow_s, 5) + << "incorrect value for last_msg_.tow_s, expected 5, is " + << last_msg_.tow_s; + EXPECT_EQ(last_msg_.wn, 6) + << "incorrect value for last_msg_.wn, expected 6, is " << last_msg_.wn; +} diff --git a/c/test/legacy/auto_check_sbp_navigation_MsgGPSLeapSecond.c b/c/test/legacy/auto_check_sbp_navigation_MsgGPSLeapSecond.c new file mode 100644 index 0000000000..d1c481b19e --- /dev/null +++ b/c/test/legacy/auto_check_sbp_navigation_MsgGPSLeapSecond.c @@ -0,0 +1,239 @@ +/* + * 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/navigation/test_MsgGPSLeapSecond.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_navigation_MsgGPSLeapSecond) { + 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, 570, &msg_callback, + &DUMMY_MEMORY_FOR_CALLBACKS, &n); + sbp_frame_callback_register(&sbp_state, 570, &frame_callback, + &DUMMY_MEMORY_FOR_CALLBACKS, &n2); + + u8 encoded_frame[] = { + 85, 58, 2, 66, 0, 14, 1, 0, 2, 0, 3, 4, 5, 0, 6, 0, 7, 0, 8, 9, 50, 232, + }; + + 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_gps_leap_second_t *test_msg = (msg_gps_leap_second_t *)test_msg_storage; + test_msg_len = sizeof(*test_msg); + test_msg->bias_coeff = 1; + test_msg->count_after = 9; + test_msg->count_before = 4; + test_msg->drift_coeff = 2; + test_msg->drift_rate_coeff = 3; + test_msg->ref_dn = 8; + test_msg->ref_wn = 7; + test_msg->tow_s = 5; + test_msg->wn = 6; + sbp_payload_send(&sbp_state, 570, 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 == 570, + "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_gps_leap_second_t *check_msg = + (msg_gps_leap_second_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->bias_coeff == 1, + "incorrect value for bias_coeff, expected 1, is %d", + check_msg->bias_coeff); + ck_assert_msg(check_msg->count_after == 9, + "incorrect value for count_after, expected 9, is %d", + check_msg->count_after); + ck_assert_msg(check_msg->count_before == 4, + "incorrect value for count_before, expected 4, is %d", + check_msg->count_before); + ck_assert_msg(check_msg->drift_coeff == 2, + "incorrect value for drift_coeff, expected 2, is %d", + check_msg->drift_coeff); + ck_assert_msg(check_msg->drift_rate_coeff == 3, + "incorrect value for drift_rate_coeff, expected 3, is %d", + check_msg->drift_rate_coeff); + ck_assert_msg(check_msg->ref_dn == 8, + "incorrect value for ref_dn, expected 8, is %d", + check_msg->ref_dn); + ck_assert_msg(check_msg->ref_wn == 7, + "incorrect value for ref_wn, expected 7, is %d", + check_msg->ref_wn); + ck_assert_msg(check_msg->tow_s == 5, + "incorrect value for tow_s, expected 5, is %d", + check_msg->tow_s); + ck_assert_msg(check_msg->wn == 6, + "incorrect value for wn, expected 6, is %d", check_msg->wn); + } +} +END_TEST + +Suite *legacy_auto_check_sbp_navigation_MsgGPSLeapSecond_suite(void) { + Suite *s = suite_create( + "SBP generated test suite: " + "legacy_auto_check_sbp_navigation_MsgGPSLeapSecond"); + TCase *tc_acq = tcase_create( + "Automated_Suite_legacy_auto_check_sbp_navigation_MsgGPSLeapSecond"); + tcase_add_test(tc_acq, + test_legacy_auto_check_sbp_navigation_MsgGPSLeapSecond); + suite_add_tcase(s, tc_acq); + return s; +} \ No newline at end of file diff --git a/c/test/legacy/cpp/auto_check_sbp_navigation_MsgGPSLeapSecond.cc b/c/test/legacy/cpp/auto_check_sbp_navigation_MsgGPSLeapSecond.cc new file mode 100644 index 0000000000..b11d6f0a23 --- /dev/null +++ b/c/test/legacy/cpp/auto_check_sbp_navigation_MsgGPSLeapSecond.cc @@ -0,0 +1,133 @@ +/* + * 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/navigation/test_MsgGPSLeapSecond.yaml by +// generate.py. Do not modify by hand! + +#include +#include +#include +#include +class Test_legacy_auto_check_sbp_navigation_MsgGPSLeapSecond0 + : public ::testing::Test, + public sbp::State, + public sbp::IReader, + public sbp::IWriter, + sbp::PayloadHandler { + public: + Test_legacy_auto_check_sbp_navigation_MsgGPSLeapSecond0() + : ::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_gps_leap_second_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_gps_leap_second_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_navigation_MsgGPSLeapSecond0, Test) { + uint8_t encoded_frame[] = { + 85, 58, 2, 66, 0, 14, 1, 0, 2, 0, 3, 4, 5, 0, 6, 0, 7, 0, 8, 9, 50, 232, + }; + + uint8_t test_msg_storage[SBP_MAX_PAYLOAD_LEN]{}; + uint8_t test_msg_len = 0; + msg_gps_leap_second_t *test_msg = (msg_gps_leap_second_t *)test_msg_storage; + test_msg_len = (uint8_t)sizeof(*test_msg); + test_msg->bias_coeff = 1; + test_msg->count_after = 9; + test_msg->count_before = 4; + test_msg->drift_coeff = 2; + test_msg->drift_rate_coeff = 3; + test_msg->ref_dn = 8; + test_msg->ref_wn = 7; + test_msg->tow_s = 5; + test_msg->wn = 6; + + EXPECT_EQ(send_message(570, 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_->bias_coeff, 1) + << "incorrect value for bias_coeff, expected 1, is " + << last_msg_->bias_coeff; + EXPECT_EQ(last_msg_->count_after, 9) + << "incorrect value for count_after, expected 9, is " + << last_msg_->count_after; + EXPECT_EQ(last_msg_->count_before, 4) + << "incorrect value for count_before, expected 4, is " + << last_msg_->count_before; + EXPECT_EQ(last_msg_->drift_coeff, 2) + << "incorrect value for drift_coeff, expected 2, is " + << last_msg_->drift_coeff; + EXPECT_EQ(last_msg_->drift_rate_coeff, 3) + << "incorrect value for drift_rate_coeff, expected 3, is " + << last_msg_->drift_rate_coeff; + EXPECT_EQ(last_msg_->ref_dn, 8) + << "incorrect value for ref_dn, expected 8, is " << last_msg_->ref_dn; + EXPECT_EQ(last_msg_->ref_wn, 7) + << "incorrect value for ref_wn, expected 7, is " << last_msg_->ref_wn; + EXPECT_EQ(last_msg_->tow_s, 5) + << "incorrect value for tow_s, expected 5, is " << last_msg_->tow_s; + EXPECT_EQ(last_msg_->wn, 6) + << "incorrect value for wn, expected 6, is " << last_msg_->wn; +} diff --git a/haskell/src/SwiftNav/SBP/Msg.hs b/haskell/src/SwiftNav/SBP/Msg.hs index ca6fe094e9..b45e2415b5 100644 --- a/haskell/src/SwiftNav/SBP/Msg.hs +++ b/haskell/src/SwiftNav/SBP/Msg.hs @@ -132,6 +132,7 @@ data SBPMsg = | SBPMsgGloBiases MsgGloBiases Msg | SBPMsgGnssCapb MsgGnssCapb Msg | SBPMsgGnssTimeOffset MsgGnssTimeOffset Msg + | SBPMsgGpsLeapSecond MsgGpsLeapSecond Msg | SBPMsgGpsTime MsgGpsTime Msg | SBPMsgGpsTimeDepA MsgGpsTimeDepA Msg | SBPMsgGpsTimeGnss MsgGpsTimeGnss Msg @@ -365,6 +366,7 @@ instance Binary SBPMsg where | _msgSBPType == msgGloBiases = SBPMsgGloBiases (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgGnssCapb = SBPMsgGnssCapb (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgGnssTimeOffset = SBPMsgGnssTimeOffset (decode (fromStrict (unBytes _msgSBPPayload))) m + | _msgSBPType == msgGpsLeapSecond = SBPMsgGpsLeapSecond (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgGpsTime = SBPMsgGpsTime (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgGpsTimeDepA = SBPMsgGpsTimeDepA (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgGpsTimeGnss = SBPMsgGpsTimeGnss (decode (fromStrict (unBytes _msgSBPPayload))) m @@ -590,6 +592,7 @@ instance Binary SBPMsg where encoder (SBPMsgGloBiases _ m) = put m encoder (SBPMsgGnssCapb _ m) = put m encoder (SBPMsgGnssTimeOffset _ m) = put m + encoder (SBPMsgGpsLeapSecond _ m) = put m encoder (SBPMsgGpsTime _ m) = put m encoder (SBPMsgGpsTimeDepA _ m) = put m encoder (SBPMsgGpsTimeGnss _ m) = put m @@ -819,6 +822,7 @@ instance FromJSON SBPMsg where | msgType == msgGloBiases = SBPMsgGloBiases <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgGnssCapb = SBPMsgGnssCapb <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgGnssTimeOffset = SBPMsgGnssTimeOffset <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj + | msgType == msgGpsLeapSecond = SBPMsgGpsLeapSecond <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgGpsTime = SBPMsgGpsTime <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgGpsTimeDepA = SBPMsgGpsTimeDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgGpsTimeGnss = SBPMsgGpsTimeGnss <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj @@ -1049,6 +1053,7 @@ instance ToJSON SBPMsg where toJSON (SBPMsgGloBiases n m) = toJSON n <<>> toJSON m toJSON (SBPMsgGnssCapb n m) = toJSON n <<>> toJSON m toJSON (SBPMsgGnssTimeOffset n m) = toJSON n <<>> toJSON m + toJSON (SBPMsgGpsLeapSecond n m) = toJSON n <<>> toJSON m toJSON (SBPMsgGpsTime n m) = toJSON n <<>> toJSON m toJSON (SBPMsgGpsTimeDepA n m) = toJSON n <<>> toJSON m toJSON (SBPMsgGpsTimeGnss n m) = toJSON n <<>> toJSON m @@ -1273,6 +1278,7 @@ instance HasMsg SBPMsg where msg f (SBPMsgGloBiases n m) = SBPMsgGloBiases n <$> f m msg f (SBPMsgGnssCapb n m) = SBPMsgGnssCapb n <$> f m msg f (SBPMsgGnssTimeOffset n m) = SBPMsgGnssTimeOffset n <$> f m + msg f (SBPMsgGpsLeapSecond n m) = SBPMsgGpsLeapSecond n <$> f m msg f (SBPMsgGpsTime n m) = SBPMsgGpsTime n <$> f m msg f (SBPMsgGpsTimeDepA n m) = SBPMsgGpsTimeDepA n <$> f m msg f (SBPMsgGpsTimeGnss n m) = SBPMsgGpsTimeGnss n <$> f m diff --git a/java/src/com/swiftnav/sbp/navigation/MsgGPSLeapSecond.java b/java/src/com/swiftnav/sbp/navigation/MsgGPSLeapSecond.java new file mode 100644 index 0000000000..fb942e107b --- /dev/null +++ b/java/src/com/swiftnav/sbp/navigation/MsgGPSLeapSecond.java @@ -0,0 +1,117 @@ +/* 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.navigation; + +// This file was auto-generated from yaml/swiftnav/sbp/navigation.yaml by generate.py. +// Do not modify by hand! + + +import com.swiftnav.sbp.SBPBinaryException; +import com.swiftnav.sbp.SBPMessage; +import org.json.JSONObject; + +/** + * SBP class for message MSG_GPS_LEAP_SECOND (0x023A). + * + *

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

Emulates the GPS CNAV message, reserving bytes for future broadcast of the drift model + * parameters. + */ +public class MsgGPSLeapSecond extends SBPMessage { + public static final int TYPE = 0x023A; + + /** Reserved. Bias coefficient of GPS time scale with respect to UTC drift model. */ + public int bias_coeff; + + /** Reserved. Drift coefficient of GPS time scale with respect to UTC drift model. */ + public int drift_coeff; + + /** + * Reserved. Drift rate correction coefficient of GPS time scale with respect to UTC drift + * model. + */ + public int drift_rate_coeff; + + /** Leap second count before insertion. */ + public int count_before; + + /** Reserved. Drift model reference week second. */ + public int tow_s; + + /** Reserved. Drift model reference week number. */ + public int wn; + + /** Leap second reference week number. */ + public int ref_wn; + + /** Leap second reference day number. */ + public int ref_dn; + + /** Leap second count after insertion. */ + public int count_after; + + public MsgGPSLeapSecond(int sender) { + super(sender, TYPE); + } + + public MsgGPSLeapSecond() { + super(TYPE); + } + + public MsgGPSLeapSecond(SBPMessage msg) throws SBPBinaryException { + super(msg); + assert msg.type == TYPE; + } + + @Override + protected void parse(Parser parser) throws SBPBinaryException { + /* Parse fields from binary */ + bias_coeff = parser.getS16(); + drift_coeff = parser.getS16(); + drift_rate_coeff = parser.getS8(); + count_before = parser.getS8(); + tow_s = parser.getU16(); + wn = parser.getU16(); + ref_wn = parser.getU16(); + ref_dn = parser.getU8(); + count_after = parser.getS8(); + } + + @Override + protected void build(Builder builder) { + builder.putS16(bias_coeff); + builder.putS16(drift_coeff); + builder.putS8(drift_rate_coeff); + builder.putS8(count_before); + builder.putU16(tow_s); + builder.putU16(wn); + builder.putU16(ref_wn); + builder.putU8(ref_dn); + builder.putS8(count_after); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + obj.put("bias_coeff", bias_coeff); + obj.put("drift_coeff", drift_coeff); + obj.put("drift_rate_coeff", drift_rate_coeff); + obj.put("count_before", count_before); + obj.put("tow_s", tow_s); + obj.put("wn", wn); + obj.put("ref_wn", ref_wn); + obj.put("ref_dn", ref_dn); + obj.put("count_after", count_after); + return obj; + } +} diff --git a/java/test/auto_check_sbp_navigation_MsgGPSLeapSecondTest.java b/java/test/auto_check_sbp_navigation_MsgGPSLeapSecondTest.java new file mode 100644 index 0000000000..89679f9942 --- /dev/null +++ b/java/test/auto_check_sbp_navigation_MsgGPSLeapSecondTest.java @@ -0,0 +1,130 @@ +/* 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/navigation/test_MsgGPSLeapSecond.yaml by generate.py. Do not modify +// by hand! + + +import com.swiftnav.sbp.SBPMessage; +import com.swiftnav.sbp.navigation.MsgGPSLeapSecond; +import java.math.BigInteger; +import org.json.JSONObject; +import org.junit.Test; + +public class auto_check_sbp_navigation_MsgGPSLeapSecondTest { + + 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_navigation_MsgGPSLeapSecondTest.test1"); + byte[] payload = + new byte[] { + (byte) 1, (byte) 0, (byte) 2, (byte) 0, (byte) 3, (byte) 4, (byte) 5, (byte) 0, + (byte) 6, (byte) 0, (byte) 7, (byte) 0, (byte) 8, (byte) 9, + }; + SBPMessage sbp = new SBPMessage(0x0042, 0x023A, payload); + MsgGPSLeapSecond msg = new MsgGPSLeapSecond(sbp); + JSONObject json = msg.toJSON(); + Number value; + Number expected; + value = msg.bias_coeff; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.bias_coeff + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); + } else { + value = value.longValue(); + expected = 1L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.count_after; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.count_after + "' != '" + 9 + "'", + value.equals(BigInteger.valueOf(9L))); + } else { + value = value.longValue(); + expected = 9L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.count_before; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.count_before + "' != '" + 4 + "'", + value.equals(BigInteger.valueOf(4L))); + } else { + value = value.longValue(); + expected = 4L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.drift_coeff; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.drift_coeff + "' != '" + 2 + "'", + value.equals(BigInteger.valueOf(2L))); + } else { + value = value.longValue(); + expected = 2L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.drift_rate_coeff; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.drift_rate_coeff + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); + } else { + value = value.longValue(); + expected = 3L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.ref_dn; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.ref_dn + "' != '" + 8 + "'", value.equals(BigInteger.valueOf(8L))); + } else { + value = value.longValue(); + expected = 8L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.ref_wn; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.ref_wn + "' != '" + 7 + "'", value.equals(BigInteger.valueOf(7L))); + } else { + value = value.longValue(); + expected = 7L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.tow_s; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.tow_s + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); + } else { + value = value.longValue(); + expected = 5L; + org.junit.Assert.assertEquals(value, expected); + } + value = msg.wn; + if (value instanceof BigInteger) { + org.junit.Assert.assertTrue( + "'" + msg.wn + "' != '" + 6 + "'", value.equals(BigInteger.valueOf(6L))); + } else { + value = value.longValue(); + expected = 6L; + org.junit.Assert.assertEquals(value, expected); + } + } +} diff --git a/jsonschema/MsgGPSLeapSecond.json b/jsonschema/MsgGPSLeapSecond.json new file mode 100644 index 0000000000..3aafff0ae3 --- /dev/null +++ b/jsonschema/MsgGPSLeapSecond.json @@ -0,0 +1,40 @@ +{ + "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": "#MsgGPSLeapSecond", + "title":"MsgGPSLeapSecond", + "description":"Emulates the GPS CNAV message, reserving bytes for future broadcast of the drift model parameters.\n", + "type": "object", + "properties": { + "bias_coeff": {"type": "integer"}, + "drift_coeff": {"type": "integer"}, + "drift_rate_coeff": {"type": "integer"}, + "count_before": {"type": "integer"}, + "tow_s": {"type": "integer"}, + "wn": {"type": "integer"}, + "ref_wn": {"type": "integer"}, + "ref_dn": {"type": "integer"}, + "count_after": {"type": "integer"} + }, + "required": [ + "bias_coeff", + "drift_coeff", + "drift_rate_coeff", + "count_before", + "tow_s", + "wn", + "ref_wn", + "ref_dn", + "count_after" + ] +} \ No newline at end of file diff --git a/rust/sbp/src/messages/navigation.rs b/rust/sbp/src/messages/navigation.rs index 4d33388e7c..a6d787430e 100644 --- a/rust/sbp/src/messages/navigation.rs +++ b/rust/sbp/src/messages/navigation.rs @@ -45,6 +45,7 @@ pub use msg_baseline_ned::MsgBaselineNed; pub use msg_baseline_ned_dep_a::MsgBaselineNedDepA; pub use msg_dops::MsgDops; pub use msg_dops_dep_a::MsgDopsDepA; +pub use msg_gps_leap_second::MsgGpsLeapSecond; pub use msg_gps_time::MsgGpsTime; pub use msg_gps_time_dep_a::MsgGpsTimeDepA; pub use msg_gps_time_gnss::MsgGpsTimeGnss; @@ -1687,6 +1688,138 @@ pub mod msg_dops_dep_a { } } +pub mod msg_gps_leap_second { + #![allow(unused_imports)] + + use super::*; + use crate::messages::lib::*; + + /// Leap second SBP message. + + /// + /// Emulates the GPS CNAV message, reserving bytes for future broadcast of the + /// drift model parameters. + /// + #[cfg_attr(feature = "serde", derive(serde::Serialize))] + #[derive(Debug, Clone)] + pub struct MsgGpsLeapSecond { + /// The message sender_id + #[cfg_attr(feature = "serde", serde(skip_serializing))] + pub sender_id: Option, + /// Reserved. Bias coefficient of GPS time scale with respect to UTC drift + /// model. + #[cfg_attr(feature = "serde", serde(rename(serialize = "bias_coeff")))] + pub bias_coeff: i16, + /// Reserved. Drift coefficient of GPS time scale with respect to UTC drift + /// model. + #[cfg_attr(feature = "serde", serde(rename(serialize = "drift_coeff")))] + pub drift_coeff: i16, + /// Reserved. Drift rate correction coefficient of GPS time scale with + /// respect to UTC drift model. + #[cfg_attr(feature = "serde", serde(rename(serialize = "drift_rate_coeff")))] + pub drift_rate_coeff: i8, + /// Leap second count before insertion. + #[cfg_attr(feature = "serde", serde(rename(serialize = "count_before")))] + pub count_before: i8, + /// Reserved. Drift model reference week second. + #[cfg_attr(feature = "serde", serde(rename(serialize = "tow_s")))] + pub tow_s: u16, + /// Reserved. Drift model reference week number. + #[cfg_attr(feature = "serde", serde(rename(serialize = "wn")))] + pub wn: u16, + /// Leap second reference week number. + #[cfg_attr(feature = "serde", serde(rename(serialize = "ref_wn")))] + pub ref_wn: u16, + /// Leap second reference day number. + #[cfg_attr(feature = "serde", serde(rename(serialize = "ref_dn")))] + pub ref_dn: u8, + /// Leap second count after insertion. + #[cfg_attr(feature = "serde", serde(rename(serialize = "count_after")))] + pub count_after: i8, + } + + impl ConcreteMessage for MsgGpsLeapSecond { + const MESSAGE_TYPE: u16 = 570; + const MESSAGE_NAME: &'static str = "MSG_GPS_LEAP_SECOND"; + } + + impl SbpMessage for MsgGpsLeapSecond { + 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 MsgGpsLeapSecond { + type Error = TryFromSbpError; + fn try_from(msg: Sbp) -> Result { + match msg { + Sbp::MsgGpsLeapSecond(m) => Ok(m), + _ => Err(TryFromSbpError), + } + } + } + + impl WireFormat for MsgGpsLeapSecond { + const MIN_LEN: usize = ::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.bias_coeff) + + WireFormat::len(&self.drift_coeff) + + WireFormat::len(&self.drift_rate_coeff) + + WireFormat::len(&self.count_before) + + WireFormat::len(&self.tow_s) + + WireFormat::len(&self.wn) + + WireFormat::len(&self.ref_wn) + + WireFormat::len(&self.ref_dn) + + WireFormat::len(&self.count_after) + } + fn write(&self, buf: &mut B) { + WireFormat::write(&self.bias_coeff, buf); + WireFormat::write(&self.drift_coeff, buf); + WireFormat::write(&self.drift_rate_coeff, buf); + WireFormat::write(&self.count_before, buf); + WireFormat::write(&self.tow_s, buf); + WireFormat::write(&self.wn, buf); + WireFormat::write(&self.ref_wn, buf); + WireFormat::write(&self.ref_dn, buf); + WireFormat::write(&self.count_after, buf); + } + fn parse_unchecked(buf: &mut B) -> Self { + MsgGpsLeapSecond { + sender_id: None, + bias_coeff: WireFormat::parse_unchecked(buf), + drift_coeff: WireFormat::parse_unchecked(buf), + drift_rate_coeff: WireFormat::parse_unchecked(buf), + count_before: WireFormat::parse_unchecked(buf), + tow_s: WireFormat::parse_unchecked(buf), + wn: WireFormat::parse_unchecked(buf), + ref_wn: WireFormat::parse_unchecked(buf), + ref_dn: WireFormat::parse_unchecked(buf), + count_after: WireFormat::parse_unchecked(buf), + } + } + } +} + pub mod msg_gps_time { #![allow(unused_imports)] diff --git a/rust/sbp/tests/integration/auto_check_sbp_navigation_msg_gps_leap_second.rs b/rust/sbp/tests/integration/auto_check_sbp_navigation_msg_gps_leap_second.rs new file mode 100644 index 0000000000..b8790f7f31 --- /dev/null +++ b/rust/sbp/tests/integration/auto_check_sbp_navigation_msg_gps_leap_second.rs @@ -0,0 +1,95 @@ +// +// 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/navigation/test_MsgGPSLeapSecond.yaml by generate.py. Do not modify by hand! + +use crate::*; + +#[test] +fn test_auto_check_sbp_navigation_msg_gps_leap_second() { + { + let mut payload = Cursor::new(vec![ + 85, 58, 2, 66, 0, 14, 1, 0, 2, 0, 3, 4, 5, 0, 6, 0, 7, 0, 8, 9, 50, 232, + ]); + + // 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::MsgGpsLeapSecond(msg) => { + assert_eq!( + msg.message_type(), + 570, + "Incorrect message type, expected 570, 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.bias_coeff, 1, + "incorrect value for bias_coeff, expected 1, is {}", + msg.bias_coeff + ); + assert_eq!( + msg.count_after, 9, + "incorrect value for count_after, expected 9, is {}", + msg.count_after + ); + assert_eq!( + msg.count_before, 4, + "incorrect value for count_before, expected 4, is {}", + msg.count_before + ); + assert_eq!( + msg.drift_coeff, 2, + "incorrect value for drift_coeff, expected 2, is {}", + msg.drift_coeff + ); + assert_eq!( + msg.drift_rate_coeff, 3, + "incorrect value for drift_rate_coeff, expected 3, is {}", + msg.drift_rate_coeff + ); + assert_eq!( + msg.ref_dn, 8, + "incorrect value for ref_dn, expected 8, is {}", + msg.ref_dn + ); + assert_eq!( + msg.ref_wn, 7, + "incorrect value for ref_wn, expected 7, is {}", + msg.ref_wn + ); + assert_eq!( + msg.tow_s, 5, + "incorrect value for tow_s, expected 5, is {}", + msg.tow_s + ); + assert_eq!( + msg.wn, 6, + "incorrect value for wn, expected 6, is {}", + msg.wn + ); + } + _ => panic!("Invalid message type! Expected a MsgGPSLeapSecond"), + }; + 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 9e29c402c8..3632945797 100644 --- a/rust/sbp/tests/integration/main.rs +++ b/rust/sbp/tests/integration/main.rs @@ -34,6 +34,7 @@ mod auto_check_sbp_navigation_msg_baseline_ned; mod auto_check_sbp_navigation_msg_baseline_ned_dep_a; mod auto_check_sbp_navigation_msg_dops; mod auto_check_sbp_navigation_msg_dops_dep_a; +mod auto_check_sbp_navigation_msg_gps_leap_second; mod auto_check_sbp_navigation_msg_gps_time; mod auto_check_sbp_navigation_msg_gps_time_dep_a; mod auto_check_sbp_navigation_msg_gps_time_gnss; diff --git a/sbpjson/javascript/SbpJson.js b/sbpjson/javascript/SbpJson.js index 9b90931b30..2c41070c1b 100644 --- a/sbpjson/javascript/SbpJson.js +++ b/sbpjson/javascript/SbpJson.js @@ -70,6 +70,7 @@ // const msgFlashReadResp = Convert.toMsgFlashReadResp(json); // const msgFrontEndGain = Convert.toMsgFrontEndGain(json); // const msgFwd = Convert.toMsgFwd(json); +// const msgGPSLeapSecond = Convert.toMsgGPSLeapSecond(json); // const msgGPSTime = Convert.toMsgGPSTime(json); // const msgGPSTimeGnss = Convert.toMsgGPSTimeGnss(json); // const msgGloBiases = Convert.toMsgGloBiases(json); @@ -754,6 +755,14 @@ function msgFwdToJson(value) { return JSON.stringify(uncast(value, r("MsgFwd")), null, 2); } +function toMsgGPSLeapSecond(json) { + return cast(JSON.parse(json), r("MsgGPSLeapSecond")); +} + +function msgGPSLeapSecondToJson(value) { + return JSON.stringify(uncast(value, r("MsgGPSLeapSecond")), null, 2); +} + function toMsgGPSTime(json) { return cast(JSON.parse(json), r("MsgGPSTime")); } @@ -2366,6 +2375,17 @@ const typeMap = { { json: "protocol", js: "protocol", typ: 0 }, { json: "source", js: "source", typ: 0 }, ], "any"), + "MsgGPSLeapSecond": o([ + { json: "bias_coeff", js: "bias_coeff", typ: 0 }, + { json: "count_after", js: "count_after", typ: 0 }, + { json: "count_before", js: "count_before", typ: 0 }, + { json: "drift_coeff", js: "drift_coeff", typ: 0 }, + { json: "drift_rate_coeff", js: "drift_rate_coeff", typ: 0 }, + { json: "ref_dn", js: "ref_dn", typ: 0 }, + { json: "ref_wn", js: "ref_wn", typ: 0 }, + { json: "tow_s", js: "tow_s", typ: 0 }, + { json: "wn", js: "wn", typ: 0 }, + ], "any"), "MsgGPSTime": o([ { json: "flags", js: "flags", typ: 0 }, { json: "ns_residual", js: "ns_residual", typ: 0 }, @@ -3463,6 +3483,8 @@ module.exports = { "toMsgFrontEndGain": toMsgFrontEndGain, "msgFwdToJson": msgFwdToJson, "toMsgFwd": toMsgFwd, + "msgGPSLeapSecondToJson": msgGPSLeapSecondToJson, + "toMsgGPSLeapSecond": toMsgGPSLeapSecond, "msgGPSTimeToJson": msgGPSTimeToJson, "toMsgGPSTime": toMsgGPSTime, "msgGPSTimeGnssToJson": msgGPSTimeGnssToJson, diff --git a/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgGPSLeapSecond.yaml b/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgGPSLeapSecond.yaml new file mode 100644 index 0000000000..f321f1d81b --- /dev/null +++ b/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgGPSLeapSecond.yaml @@ -0,0 +1,30 @@ +description: Unit tests for swiftnav.sbp.navigation MsgGPSLeapSecond +generated_on: 2022-05-11 # manually generated +package: sbp.navigation +tests: + + - msg: + fields: + bias_coeff: 1 + drift_coeff: 2 + drift_rate_coeff: 3 + count_before: 4 + tow_s: 5 + wn: 6 + ref_wn: 7 + ref_dn: 8 + count_after: 9 + module: sbp.navigation + name: MsgGPSLeapSecond + msg_type: '570' + raw_json: '{"bias_coeff": 1, "drift_coeff": 2, "drift_rate_coeff": 3, "count_before": 4, "tow_s": 5, "wn": 6, + "ref_wn": 7, "ref_dn": 8, "count_after": 9, "preamble": 85, "msg_type": 570, "sender": 66, "length": 14, + "payload": "AQACAAMEBQAGAAcACAk=", "crc": 59442}' + raw_packet: VToCQgAOAQACAAMEBQAGAAcACAky6A== + sbp: + preamble: '0x55' + msg_type: '0x023A' + sender: '0x0042' + length: 14 + payload: AQACAAMEBQAGAAcACAk= + crc: '0xE832' diff --git a/spec/yaml/swiftnav/sbp/navigation.yaml b/spec/yaml/swiftnav/sbp/navigation.yaml index c92066132f..f83c1277f1 100644 --- a/spec/yaml/swiftnav/sbp/navigation.yaml +++ b/spec/yaml/swiftnav/sbp/navigation.yaml @@ -2428,6 +2428,57 @@ definitions: - 31: desc: Safe state ROPL + - MSG_GPS_LEAP_SECOND: + id: 0x023A + short_desc: > + Leap second SBP message. + desc: > + Emulates the GPS CNAV message, reserving bytes for future broadcast of + the drift model parameters. + fields: + - bias_coeff: + type: s16 + units: 2^-35 s + desc: > + Reserved. Bias coefficient of GPS time scale with respect to UTC + drift model. + - drift_coeff: + type: s16 + units: 2^-51 s/s + desc: > + Reserved. Drift coefficient of GPS time scale with respect to UTC + drift model. + - drift_rate_coeff: + type: s8 + units: 2^-68 s/s^2 + desc: > + Reserved. Drift rate correction coefficient of GPS time scale with + respect to UTC drift model. + - count_before: + type: s8 + units: s + desc: Leap second count before insertion. + - tow_s: + type: u16 + units: s + desc: Reserved. Drift model reference week second. + - wn: + type: u16 + units: weeks + desc: Reserved. Drift model reference week number. + - ref_wn: + type: u16 + units: weeks + desc: Leap second reference week number. + - ref_dn: + type: u8 + units: days + desc: Leap second reference day number. + - count_after: + type: s8 + units: s + desc: Leap second count after insertion. + - MSG_ITRF: id: 0x0244 short_desc: Reference Frame Transformation Parameter From 5a5c79ffd88335c74020de160a1ee29da4c329e3 Mon Sep 17 00:00:00 2001 From: fpezzinosn <79222190+fpezzinosn@users.noreply.github.com> Date: Thu, 19 May 2022 18:01:49 -0400 Subject: [PATCH 08/10] Clean up the documentation for the new messages [OTA-150] (#1149) Co-authored-by: swiftnav-svc-jenkins <42622338+swiftnav-svc-jenkins@users.noreply.github.com> Co-authored-by: Jason Mobarak --- .../libsbp/v4/ssr/CodePhaseBiasesSatSig.h | 8 +- .../v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS.h | 5 + c/include/libsbp/v4/ssr/OrbitClockBound.h | 24 +-- .../v4/ssr/OrbitClockBoundDegradation.h | 30 ++-- c/include/libsbp/v4/ssr/STECResidual.h | 5 +- c/include/libsbp/v4/ssr/STECSatElement.h | 4 +- .../libsbp/v4/ssr/STECSatElementIntegrity.h | 12 +- .../v4/ssr/TroposphericDelayCorrection.h | 10 +- .../sbp/ssr/CodePhaseBiasesSatSig.java | 8 +- .../sbp/ssr/MsgSsrOrbitClockBounds.java | 9 + .../com/swiftnav/sbp/ssr/OrbitClockBound.java | 40 +---- .../sbp/ssr/OrbitClockBoundDegradation.java | 24 +-- .../com/swiftnav/sbp/ssr/STECResidual.java | 5 +- .../com/swiftnav/sbp/ssr/STECSatElement.java | 5 +- .../sbp/ssr/STECSatElementIntegrity.java | 16 +- .../sbp/ssr/TroposphericDelayCorrection.java | 9 +- jsonschema/MsgSsrGriddedCorrectionBounds.json | 2 +- jsonschema/MsgSsrOrbitClockBounds.json | 2 +- proto/ssr.proto | 6 +- sbpjson/elm/SbpJson.elm | 6 + sbpjson/typescript/SbpJson.ts | 8 + spec/yaml/swiftnav/sbp/integrity.yaml | 8 +- spec/yaml/swiftnav/sbp/navigation.yaml | 1 - spec/yaml/swiftnav/sbp/ssr.yaml | 170 +++++++++--------- 24 files changed, 199 insertions(+), 218 deletions(-) diff --git a/c/include/libsbp/v4/ssr/CodePhaseBiasesSatSig.h b/c/include/libsbp/v4/ssr/CodePhaseBiasesSatSig.h index b32efd0fe1..152bc9aef3 100644 --- a/c/include/libsbp/v4/ssr/CodePhaseBiasesSatSig.h +++ b/c/include/libsbp/v4/ssr/CodePhaseBiasesSatSig.h @@ -52,22 +52,22 @@ typedef struct { u8 signal_id; /** - * Code Bias Mean (range 0-1.275) [0.005 m] + * Code Bias Mean. Range: 0-1.275 m [0.005 m] */ u8 code_bias_bound_mu; /** - * Code Bias Standard Deviation (range 0-1.275) [0.005 m] + * Code Bias Standard Deviation. Range: 0-1.275 m [0.005 m] */ u8 code_bias_bound_sig; /** - * Phase Bias Mean (range 0-1.275) [0.005 m] + * Phase Bias Mean. Range: 0-1.275 m [0.005 m] */ u8 phase_bias_bound_mu; /** - * Phase Bias Standard Deviation (range 0-1.275) [0.005 m] + * Phase Bias Standard Deviation. Range: 0-1.275 m [0.005 m] */ u8 phase_bias_bound_sig; } sbp_code_phase_biases_sat_sig_t; diff --git a/c/include/libsbp/v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS.h b/c/include/libsbp/v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS.h index e0a10f8321..cb6b491831 100644 --- a/c/include/libsbp/v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS.h +++ b/c/include/libsbp/v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS.h @@ -38,6 +38,11 @@ extern "C" { * SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS * *****************************************************************************/ +/** Combined Orbit and Clock Bound + * + * Note 1: Range: 0-55 m. i<=200, mean=0.0251i; 200240, mean=25+2(i-240). + */ typedef struct { u8 stub[SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_STUB_MAX]; /** diff --git a/c/include/libsbp/v4/ssr/OrbitClockBound.h b/c/include/libsbp/v4/ssr/OrbitClockBound.h index 8212490cf3..782264889c 100644 --- a/c/include/libsbp/v4/ssr/OrbitClockBound.h +++ b/c/include/libsbp/v4/ssr/OrbitClockBound.h @@ -50,50 +50,42 @@ typedef struct { u8 sat_id; /** - * Mean Radial (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) [m] + * Mean Radial. See Note 1. [m] */ u8 orb_radial_bound_mu; /** - * Mean Along-Track (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) [m] + * Mean Along-Track. See Note 1. [m] */ u8 orb_along_bound_mu; /** - * Mean Cross-Track (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) [m] + * Mean Cross-Track. See Note 1. [m] */ u8 orb_cross_bound_mu; /** - * Standard Deviation Radial (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) [m] + * Standard Deviation Radial. See Note 1. [m] */ u8 orb_radial_bound_sig; /** - * Standard Deviation Along-Track (range 0-55) i<=200, mean=0.0251i - * 200240, mean=25+2(i-240) [m] + * Standard Deviation Along-Track. See Note 1. [m] */ u8 orb_along_bound_sig; /** - * Standard Deviation Cross-Track (range 0-55) i<=200, mean=0.0251i - * 200240, mean=25+2(i-240) [m] + * Standard Deviation Cross-Track. See Note 1. [m] */ u8 orb_cross_bound_sig; /** - * Clock Bound Mean (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) [m] + * Clock Bound Mean. See Note 1. [m] */ u8 clock_bound_mu; /** - * Clock Bound Standard Deviation (range 0-55) i<=200, mean=0.0251i - * 200240, mean=25+2(i-240) [m] + * Clock Bound Standard Deviation. See Note 1. [m] */ u8 clock_bound_sig; } sbp_orbit_clock_bound_t; diff --git a/c/include/libsbp/v4/ssr/OrbitClockBoundDegradation.h b/c/include/libsbp/v4/ssr/OrbitClockBoundDegradation.h index 41e460d813..97ea42a2a1 100644 --- a/c/include/libsbp/v4/ssr/OrbitClockBoundDegradation.h +++ b/c/include/libsbp/v4/ssr/OrbitClockBoundDegradation.h @@ -44,50 +44,48 @@ extern "C" { */ typedef struct { /** - * Orbit Bound Mean Radial First derivative degradation parameter (range - * 0-0.255) [0.001 m/s] + * Orbit Bound Mean Radial First derivative. Range: 0-0.255 m/s [0.001 m/s] */ u8 orb_radial_bound_mu_dot; /** - * Orbit Bound Mean Along-Track First derivative degradation parameter (range - * 0-0.255) [0.001 m/s] + * Orbit Bound Mean Along-Track First derivative. Range: 0-0.255 m/s [0.001 + * m/s] */ u8 orb_along_bound_mu_dot; /** - * Orbit Bound Mean Cross-Track First derivative degradation parameter (range - * 0-0.255) [0.001 m/s] + * Orbit Bound Mean Cross-Track First derivative. Range: 0-0.255 m/s [0.001 + * m/s] */ u8 orb_cross_bound_mu_dot; /** - * Orbit Bound Standard Deviation Radial First derivative degradation - * parameter (range 0-0.255) [0.001 m/s] + * Orbit Bound Standard Deviation Radial First derivative. Range: 0-0.255 m/s + * [0.001 m/s] */ u8 orb_radial_bound_sig_dot; /** - * Orbit Bound Standard Deviation Along-Track First derivative degradation - * parameter (range 0-0.255) [0.001 m/s] + * Orbit Bound Standard Deviation Along-Track First derivative. Range: 0-0.255 + * m/s [0.001 m/s] */ u8 orb_along_bound_sig_dot; /** - * Orbit Bound Standard Deviation Cross-Track First derivative degradation - * parameter (range 0-0.255) [0.001 m/s] + * Orbit Bound Standard Deviation Cross-Track First derivative. Range: 0-0.255 + * m/s [0.001 m/s] */ u8 orb_cross_bound_sig_dot; /** - * Clock Bound Mean First derivative degradation parameter (range 0-0.255) - * [0.001 m/s] + * Clock Bound Mean First derivative. Range: 0-0.255 m/s [0.001 m/s] */ u8 clock_bound_mu_dot; /** - * Clock Bound Standard Deviation First derivative degradation parameter - * (range 0-0.255) [0.001 m/s] + * Clock Bound Standard Deviation First derivative. Range: 0-0.255 m/s [0.001 + * m/s] */ u8 clock_bound_sig_dot; } sbp_orbit_clock_bound_degradation_t; diff --git a/c/include/libsbp/v4/ssr/STECResidual.h b/c/include/libsbp/v4/ssr/STECResidual.h index 190a1a3bda..e01a50c6e8 100644 --- a/c/include/libsbp/v4/ssr/STECResidual.h +++ b/c/include/libsbp/v4/ssr/STECResidual.h @@ -56,9 +56,8 @@ typedef struct { s16 residual; /** -* stddev [modified DF389 scale; class is upper 3 bits, value is lower 5 stddev -<= (3^class * (1 + value/16) - 1) * 10 TECU -] + * Modified DF389 scale. Class is upper 3 bits, value is lower 5. stddev <= + * (3^class * (1 + value/16) - 1) * 10 TECU */ u8 stddev; } sbp_stec_residual_t; diff --git a/c/include/libsbp/v4/ssr/STECSatElement.h b/c/include/libsbp/v4/ssr/STECSatElement.h index 63960a8b5a..6ec0a74d8f 100644 --- a/c/include/libsbp/v4/ssr/STECSatElement.h +++ b/c/include/libsbp/v4/ssr/STECSatElement.h @@ -56,8 +56,8 @@ typedef struct { u8 stec_quality_indicator; /** - * Coefficients of the STEC polynomial in the order of C00, C01, C10, C11 [C00 - * = 0.05 TECU, C01/C10 = 0.02 TECU/deg, C11 0.02 TECU/deg^2] + * Coefficients of the STEC polynomial in the order of C00, C01, C10, C11. C00 + * = 0.05 TECU, C01/C10 = 0.02 TECU/deg, C11 0.02 TECU/deg^2 */ s16 stec_coeff[SBP_STEC_SAT_ELEMENT_STEC_COEFF_MAX]; } sbp_stec_sat_element_t; diff --git a/c/include/libsbp/v4/ssr/STECSatElementIntegrity.h b/c/include/libsbp/v4/ssr/STECSatElementIntegrity.h index 3b9b0ed049..ccfaad2f3c 100644 --- a/c/include/libsbp/v4/ssr/STECSatElementIntegrity.h +++ b/c/include/libsbp/v4/ssr/STECSatElementIntegrity.h @@ -50,26 +50,22 @@ typedef struct { 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] + * Error Bound Mean. See Note 1. [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] + * Error Bound StDev. See Note 1. [m] */ u8 stec_bound_sig; /** - * STEC Error Bound Mean First derivative degradation parameter(range - * 0-0.01275) [0.00005 m/s] + * Error Bound Mean First derivative. Range: 0-0.01275 m/s [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] + * Error Bound StDev First derivative. Range: 0-0.01275 m/s [0.00005 m/s] */ u8 stec_bound_sig_dot; } sbp_stec_sat_element_integrity_t; diff --git a/c/include/libsbp/v4/ssr/TroposphericDelayCorrection.h b/c/include/libsbp/v4/ssr/TroposphericDelayCorrection.h index 0ad1655ca0..af92933038 100644 --- a/c/include/libsbp/v4/ssr/TroposphericDelayCorrection.h +++ b/c/include/libsbp/v4/ssr/TroposphericDelayCorrection.h @@ -44,20 +44,18 @@ extern "C" { */ typedef struct { /** - * Hydrostatic vertical delay [4 mm (add 2.3 m to get actual vertical hydro - * delay)] + * Hydrostatic vertical delay. Add 2.3 m to get actual value. [4 mm] */ s16 hydro; /** - * Wet vertical delay [4 mm (add 0.252 m to get actual vertical wet delay)] + * Wet vertical delay. Add 0.252 m to get actual value. [4 mm] */ s8 wet; /** -* stddev [modified DF389 scale; class is upper 3 bits, value is lower 5 stddev -<= (3^class * (1 + value/16) - 1) mm -] + * Modified DF389 scale. Class is upper 3 bits, value is lower 5. stddev <= + * (3^class * (1 + value/16) - 1) mm [mm] */ u8 stddev; } sbp_tropospheric_delay_correction_t; diff --git a/java/src/com/swiftnav/sbp/ssr/CodePhaseBiasesSatSig.java b/java/src/com/swiftnav/sbp/ssr/CodePhaseBiasesSatSig.java index 3209186c0d..d050ac6ab5 100644 --- a/java/src/com/swiftnav/sbp/ssr/CodePhaseBiasesSatSig.java +++ b/java/src/com/swiftnav/sbp/ssr/CodePhaseBiasesSatSig.java @@ -34,16 +34,16 @@ public class CodePhaseBiasesSatSig extends SBPStruct { */ public int signal_id; - /** Code Bias Mean (range 0-1.275) */ + /** Code Bias Mean. Range: 0-1.275 m */ public int code_bias_bound_mu; - /** Code Bias Standard Deviation (range 0-1.275) */ + /** Code Bias Standard Deviation. Range: 0-1.275 m */ public int code_bias_bound_sig; - /** Phase Bias Mean (range 0-1.275) */ + /** Phase Bias Mean. Range: 0-1.275 m */ public int phase_bias_bound_mu; - /** Phase Bias Standard Deviation (range 0-1.275) */ + /** Phase Bias Standard Deviation. Range: 0-1.275 m */ public int phase_bias_bound_sig; public CodePhaseBiasesSatSig() {} diff --git a/java/src/com/swiftnav/sbp/ssr/MsgSsrOrbitClockBounds.java b/java/src/com/swiftnav/sbp/ssr/MsgSsrOrbitClockBounds.java index 12eeab27a5..7582d2fb87 100644 --- a/java/src/com/swiftnav/sbp/ssr/MsgSsrOrbitClockBounds.java +++ b/java/src/com/swiftnav/sbp/ssr/MsgSsrOrbitClockBounds.java @@ -20,6 +20,15 @@ import org.json.JSONArray; import org.json.JSONObject; +/** + * SBP class for message MSG_SSR_ORBIT_CLOCK_BOUNDS (0x05DE). + * + *

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

Note 1: Range: 0-55 m. i<=200, mean=0.0251i; 200240, + * mean=25+2(i-240). + */ public class MsgSsrOrbitClockBounds extends SBPMessage { public static final int TYPE = 0x05DE; diff --git a/java/src/com/swiftnav/sbp/ssr/OrbitClockBound.java b/java/src/com/swiftnav/sbp/ssr/OrbitClockBound.java index abc46e468c..d9b8a8d195 100644 --- a/java/src/com/swiftnav/sbp/ssr/OrbitClockBound.java +++ b/java/src/com/swiftnav/sbp/ssr/OrbitClockBound.java @@ -28,52 +28,28 @@ public class OrbitClockBound extends SBPStruct { */ public int sat_id; - /** - * Mean Radial (range 0-55) i<=200, mean=0.0251i 200240, - * mean=25+2(i-240) - */ + /** Mean Radial. See Note 1. */ public int orb_radial_bound_mu; - /** - * Mean Along-Track (range 0-55) i<=200, mean=0.0251i 200240, - * mean=25+2(i-240) - */ + /** Mean Along-Track. See Note 1. */ public int orb_along_bound_mu; - /** - * Mean Cross-Track (range 0-55) i<=200, mean=0.0251i 200240, - * mean=25+2(i-240) - */ + /** Mean Cross-Track. See Note 1. */ public int orb_cross_bound_mu; - /** - * Standard Deviation Radial (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) - */ + /** Standard Deviation Radial. See Note 1. */ public int orb_radial_bound_sig; - /** - * Standard Deviation Along-Track (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) - */ + /** Standard Deviation Along-Track. See Note 1. */ public int orb_along_bound_sig; - /** - * Standard Deviation Cross-Track (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) - */ + /** Standard Deviation Cross-Track. See Note 1. */ public int orb_cross_bound_sig; - /** - * Clock Bound Mean (range 0-55) i<=200, mean=0.0251i 200240, - * mean=25+2(i-240) - */ + /** Clock Bound Mean. See Note 1. */ public int clock_bound_mu; - /** - * Clock Bound Standard Deviation (range 0-55) i<=200, mean=0.0251i 200240, mean=25+2(i-240) - */ + /** Clock Bound Standard Deviation. See Note 1. */ public int clock_bound_sig; public OrbitClockBound() {} diff --git a/java/src/com/swiftnav/sbp/ssr/OrbitClockBoundDegradation.java b/java/src/com/swiftnav/sbp/ssr/OrbitClockBoundDegradation.java index 7c79f1ed70..7f939666d3 100644 --- a/java/src/com/swiftnav/sbp/ssr/OrbitClockBoundDegradation.java +++ b/java/src/com/swiftnav/sbp/ssr/OrbitClockBoundDegradation.java @@ -22,36 +22,28 @@ public class OrbitClockBoundDegradation extends SBPStruct { - /** Orbit Bound Mean Radial First derivative degradation parameter (range 0-0.255) */ + /** Orbit Bound Mean Radial First derivative. Range: 0-0.255 m/s */ public int orb_radial_bound_mu_dot; - /** Orbit Bound Mean Along-Track First derivative degradation parameter (range 0-0.255) */ + /** Orbit Bound Mean Along-Track First derivative. Range: 0-0.255 m/s */ public int orb_along_bound_mu_dot; - /** Orbit Bound Mean Cross-Track First derivative degradation parameter (range 0-0.255) */ + /** Orbit Bound Mean Cross-Track First derivative. Range: 0-0.255 m/s */ public int orb_cross_bound_mu_dot; - /** - * Orbit Bound Standard Deviation Radial First derivative degradation parameter (range 0-0.255) - */ + /** Orbit Bound Standard Deviation Radial First derivative. Range: 0-0.255 m/s */ public int orb_radial_bound_sig_dot; - /** - * Orbit Bound Standard Deviation Along-Track First derivative degradation parameter (range - * 0-0.255) - */ + /** Orbit Bound Standard Deviation Along-Track First derivative. Range: 0-0.255 m/s */ public int orb_along_bound_sig_dot; - /** - * Orbit Bound Standard Deviation Cross-Track First derivative degradation parameter (range - * 0-0.255) - */ + /** Orbit Bound Standard Deviation Cross-Track First derivative. Range: 0-0.255 m/s */ public int orb_cross_bound_sig_dot; - /** Clock Bound Mean First derivative degradation parameter (range 0-0.255) */ + /** Clock Bound Mean First derivative. Range: 0-0.255 m/s */ public int clock_bound_mu_dot; - /** Clock Bound Standard Deviation First derivative degradation parameter (range 0-0.255) */ + /** Clock Bound Standard Deviation First derivative. Range: 0-0.255 m/s */ public int clock_bound_sig_dot; public OrbitClockBoundDegradation() {} diff --git a/java/src/com/swiftnav/sbp/ssr/STECResidual.java b/java/src/com/swiftnav/sbp/ssr/STECResidual.java index 7d1cbae5a3..10a8423ac3 100644 --- a/java/src/com/swiftnav/sbp/ssr/STECResidual.java +++ b/java/src/com/swiftnav/sbp/ssr/STECResidual.java @@ -28,7 +28,10 @@ public class STECResidual extends SBPStruct { /** STEC residual */ public int residual; - /** stddev */ + /** + * Modified DF389 scale. Class is upper 3 bits, value is lower 5. stddev <= (3^class * (1 + + * value/16) - 1) * 10 TECU + */ public int stddev; public STECResidual() {} diff --git a/java/src/com/swiftnav/sbp/ssr/STECSatElement.java b/java/src/com/swiftnav/sbp/ssr/STECSatElement.java index e09af7a7eb..9f0d0ce365 100644 --- a/java/src/com/swiftnav/sbp/ssr/STECSatElement.java +++ b/java/src/com/swiftnav/sbp/ssr/STECSatElement.java @@ -32,7 +32,10 @@ public class STECSatElement extends SBPStruct { */ public int stec_quality_indicator; - /** Coefficients of the STEC polynomial in the order of C00, C01, C10, C11 */ + /** + * Coefficients of the STEC polynomial in the order of C00, C01, C10, C11. C00 = 0.05 TECU, + * C01/C10 = 0.02 TECU/deg, C11 0.02 TECU/deg^2 + */ public int[] stec_coeff; public STECSatElement() {} diff --git a/java/src/com/swiftnav/sbp/ssr/STECSatElementIntegrity.java b/java/src/com/swiftnav/sbp/ssr/STECSatElementIntegrity.java index 5c2459dec4..1eb41b2eb6 100644 --- a/java/src/com/swiftnav/sbp/ssr/STECSatElementIntegrity.java +++ b/java/src/com/swiftnav/sbp/ssr/STECSatElementIntegrity.java @@ -25,24 +25,16 @@ 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) - */ + /** Error Bound Mean. See Note 1. */ 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) - */ + /** Error Bound StDev. See Note 1. */ public int stec_bound_sig; - /** STEC Error Bound Mean First derivative degradation parameter(range 0-0.01275) */ + /** Error Bound Mean First derivative. Range: 0-0.01275 m/s */ public int stec_bound_mu_dot; - /** - * STEC Error Bound Standard Deviation First derivative degradation parameter (range 0-0.01275) - */ + /** Error Bound StDev First derivative. Range: 0-0.01275 m/s */ public int stec_bound_sig_dot; public STECSatElementIntegrity() {} diff --git a/java/src/com/swiftnav/sbp/ssr/TroposphericDelayCorrection.java b/java/src/com/swiftnav/sbp/ssr/TroposphericDelayCorrection.java index 151008c05a..7cd32e9216 100644 --- a/java/src/com/swiftnav/sbp/ssr/TroposphericDelayCorrection.java +++ b/java/src/com/swiftnav/sbp/ssr/TroposphericDelayCorrection.java @@ -22,13 +22,16 @@ public class TroposphericDelayCorrection extends SBPStruct { - /** Hydrostatic vertical delay */ + /** Hydrostatic vertical delay. Add 2.3 m to get actual value. */ public int hydro; - /** Wet vertical delay */ + /** Wet vertical delay. Add 0.252 m to get actual value. */ public int wet; - /** stddev */ + /** + * Modified DF389 scale. Class is upper 3 bits, value is lower 5. stddev <= (3^class * (1 + + * value/16) - 1) mm + */ public int stddev; public TroposphericDelayCorrection() {} diff --git a/jsonschema/MsgSsrGriddedCorrectionBounds.json b/jsonschema/MsgSsrGriddedCorrectionBounds.json index db5f675c56..1ce6c50443 100644 --- a/jsonschema/MsgSsrGriddedCorrectionBounds.json +++ b/jsonschema/MsgSsrGriddedCorrectionBounds.json @@ -13,7 +13,7 @@ "$schema": "http://json-schema.org/draft-06/schema#", "$id": "#MsgSsrGriddedCorrectionBounds", "title":"MsgSsrGriddedCorrectionBounds", - "description":"", + "description":"Note 1: Range: 0-17.5 m. i<= 200, mean = 0.01i; 200230, mean=5+0.5(i-230).\n", "type": "object", "properties": { "stub": {"type": "array", "items": {"type": "integer"}} diff --git a/jsonschema/MsgSsrOrbitClockBounds.json b/jsonschema/MsgSsrOrbitClockBounds.json index 69de75f045..2f6e970226 100644 --- a/jsonschema/MsgSsrOrbitClockBounds.json +++ b/jsonschema/MsgSsrOrbitClockBounds.json @@ -13,7 +13,7 @@ "$schema": "http://json-schema.org/draft-06/schema#", "$id": "#MsgSsrOrbitClockBounds", "title":"MsgSsrOrbitClockBounds", - "description":"", + "description":"Note 1: Range: 0-55 m. i<=200, mean=0.0251i; 200240, mean=25+2(i-240).\n", "type": "object", "properties": { "stub": {"type": "array", "items": {"type": "integer"}} diff --git a/proto/ssr.proto b/proto/ssr.proto index d5266e9074..e24fb67088 100644 --- a/proto/ssr.proto +++ b/proto/ssr.proto @@ -205,7 +205,8 @@ message MsgSsrGriddedCorrection { /** Gridded troposhere and STEC correction residuals bounds * -None + * Note 1: Range: 0-17.5 m. i<= 200, mean = 0.01i; 200230, mean=5+0.5(i-230). */ message MsgSsrGriddedCorrectionBounds { repeated uint32 stub = 1; @@ -249,7 +250,8 @@ message MsgSsrSatelliteApc { /** Stubbed version of Combined Orbit and Clock Bound * -None + * Note 1: Range: 0-55 m. i<=200, mean=0.0251i; 200240, mean=25+2(i-240). */ message MsgSsrOrbitClockBounds { repeated uint32 stub = 1; diff --git a/sbpjson/elm/SbpJson.elm b/sbpjson/elm/SbpJson.elm index dc55b74d73..c2528de2cc 100644 --- a/sbpjson/elm/SbpJson.elm +++ b/sbpjson/elm/SbpJson.elm @@ -2510,6 +2510,9 @@ type alias GriddedCorrectionHeader = , updateInterval : Int } +{-| Note 1: Range: 0-17.5 m. i<= 200, mean = 0.01i; 200230, +mean=5+0.5(i-230). +-} type alias MsgSsrGriddedCorrectionBounds = { stub : Array Int } @@ -2534,6 +2537,9 @@ type alias MsgSsrOrbitClock = , updateInterval : Int } +{-| Note 1: Range: 0-55 m. i<=200, mean=0.0251i; 200240, +mean=25+2(i-240). +-} type alias MsgSsrOrbitClockBounds = { stub : Array Int } diff --git a/sbpjson/typescript/SbpJson.ts b/sbpjson/typescript/SbpJson.ts index bbe89ca7d0..7718afdc5f 100644 --- a/sbpjson/typescript/SbpJson.ts +++ b/sbpjson/typescript/SbpJson.ts @@ -2028,6 +2028,10 @@ export interface GriddedCorrectionHeader { update_interval: number; } +/** + * Note 1: Range: 0-17.5 m. i<= 200, mean = 0.01i; 200230, + * mean=5+0.5(i-230). + */ export interface MsgSsrGriddedCorrectionBounds { stub: number[]; } @@ -2053,6 +2057,10 @@ export interface MsgSsrOrbitClock { update_interval: number; } +/** + * Note 1: Range: 0-55 m. i<=200, mean=0.0251i; 200240, + * mean=25+2(i-240). + */ export interface MsgSsrOrbitClockBounds { stub: number[]; } diff --git a/spec/yaml/swiftnav/sbp/integrity.yaml b/spec/yaml/swiftnav/sbp/integrity.yaml index f6f7b7e246..58378ad4f4 100644 --- a/spec/yaml/swiftnav/sbp/integrity.yaml +++ b/spec/yaml/swiftnav/sbp/integrity.yaml @@ -11,7 +11,7 @@ package: swiftnav.sbp.integrity description: Integrity flag messages stable: False -public: False +public: True include: - types.yaml - gnss.yaml @@ -44,7 +44,6 @@ definitions: - MSG_SSR_FLAG_HIGH_LEVEL: id: 0x0BB9 short_desc: High level integrity flags - public: False fields: - obs_time: type: GPSTimeSec @@ -94,7 +93,6 @@ definitions: - MSG_SSR_FLAG_SATELLITES: id: 0x0BBD short_desc: List of satellites which are faulty, per constellation - public: False fields: - obs_time: type: GPSTimeSec @@ -126,7 +124,6 @@ definitions: - MSG_SSR_FLAG_TROPO_GRID_POINTS: id: 0x0BC3 short_desc: List of grid points which are faulty - public: False fields: - header: type: IntegritySSRHeader @@ -143,7 +140,6 @@ definitions: - MSG_SSR_FLAG_IONO_GRID_POINTS: id: 0x0BC7 short_desc: List of grid points which are faulty - public: False fields: - header: type: IntegritySSRHeader @@ -160,7 +156,6 @@ definitions: - MSG_SSR_FLAG_IONO_TILE_SAT_LOS: id: 0x0BCD short_desc: List of all the LOS which are faulty - public: False fields: - header: type: IntegritySSRHeader @@ -177,7 +172,6 @@ definitions: - MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS: id: 0x0BD1 short_desc: List of all the grid points to satellite which are faulty - public: False fields: - header: type: IntegritySSRHeader diff --git a/spec/yaml/swiftnav/sbp/navigation.yaml b/spec/yaml/swiftnav/sbp/navigation.yaml index f83c1277f1..38bf456caa 100644 --- a/spec/yaml/swiftnav/sbp/navigation.yaml +++ b/spec/yaml/swiftnav/sbp/navigation.yaml @@ -2482,7 +2482,6 @@ definitions: - MSG_ITRF: id: 0x0244 short_desc: Reference Frame Transformation Parameter - public: False fields: - ssr_iod: type: u8 diff --git a/spec/yaml/swiftnav/sbp/ssr.yaml b/spec/yaml/swiftnav/sbp/ssr.yaml index 32a6c80959..acc04a3cbb 100644 --- a/spec/yaml/swiftnav/sbp/ssr.yaml +++ b/spec/yaml/swiftnav/sbp/ssr.yaml @@ -142,9 +142,11 @@ definitions: type: array size: 4 fill: s16 - units: C00 = 0.05 TECU, C01/C10 = 0.02 TECU/deg, C11 0.02 TECU/deg^2 desc: > - Coefficients of the STEC polynomial in the order of C00, C01, C10, C11 + Coefficients of the STEC polynomial in the order of C00, C01, C10, C11. + C00 = 0.05 TECU, + C01/C10 = 0.02 TECU/deg, + C11 0.02 TECU/deg^2 - TroposphericDelayCorrectionNoStd: desc: > @@ -166,18 +168,23 @@ definitions: fields: - hydro: type: s16 - units: 4 mm (add 2.3 m to get actual vertical hydro delay) - desc: Hydrostatic vertical delay + units: 4 mm + desc: > + Hydrostatic vertical delay. + Add 2.3 m to get actual value. - wet: type: s8 - units: 4 mm (add 0.252 m to get actual vertical wet delay) - desc: Wet vertical delay + units: 4 mm + desc: > + Wet vertical delay. + Add 0.252 m to get actual value. - stddev: type: u8 - units: > - modified DF389 scale; class is upper 3 bits, value is lower 5 + units: mm + desc: > + Modified DF389 scale. + Class is upper 3 bits, value is lower 5. stddev <= (3^class * (1 + value/16) - 1) mm - desc: stddev - STECResidualNoStd: desc: STEC residual for the given satellite at the grid point. @@ -204,10 +211,9 @@ definitions: desc: STEC residual - stddev: type: u8 - units: > - modified DF389 scale; class is upper 3 bits, value is lower 5 + desc: > + Modified DF389 scale. Class is upper 3 bits, value is lower 5. stddev <= (3^class * (1 + value/16) - 1) * 10 TECU - desc: stddev - MSG_SSR_ORBIT_CLOCK: id: 0x05DD @@ -405,7 +411,6 @@ definitions: - MSG_SSR_STEC_CORRECTION: id: 0x05FD short_desc: STEC correction polynomial coefficients - public: False fields: - header: type: BoundsHeader @@ -461,31 +466,35 @@ definitions: 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) + Error Bound Mean. + See Note 1. - 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) + Error Bound StDev. + See Note 1. - stec_bound_mu_dot: type: u8 units: 0.00005 m/s - desc: STEC Error Bound Mean First derivative degradation parameter(range 0-0.01275) + desc: > + Error Bound Mean First derivative. + Range: 0-0.01275 m/s - 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) + desc: > + Error Bound StDev First derivative. + Range: 0-0.01275 m/s - MSG_SSR_GRIDDED_CORRECTION_BOUNDS: id: 0x05FE short_desc: Gridded troposhere and STEC correction residuals bounds - public: False + desc: > + Note 1: Range: 0-17.5 m. + i<= 200, mean = 0.01i; + 200230, mean=5+0.5(i-230). fields: - header: type: BoundsHeader @@ -511,11 +520,15 @@ definitions: - tropo_bound_mu: type: u8 units: 0.005 m - desc: Troposphere Error Bound Mean (range 0-1.275). + desc: > + Troposphere Error Bound Mean. + Range: 0-1.275 m - tropo_bound_sig: type: u8 units: 0.005 m - desc: Troposphere Error Bound Standard Deviation (range 0-1.275) + desc: > + Troposphere Error Bound StDev. + Range: 0-1.275 m - n_sats: type: u8 desc: Number of satellites. @@ -646,7 +659,6 @@ definitions: 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: False fields: - ssr_sol_id: type: u8 @@ -1050,71 +1062,59 @@ definitions: type: u8 units: m desc: > - Mean Radial (range 0-55) - i<=200, mean=0.0251i - 200240, mean=25+2(i-240) + Mean Radial. + See Note 1. - orb_along_bound_mu: type: u8 units: m desc: > - Mean Along-Track (range 0-55) - i<=200, mean=0.0251i - 200240, mean=25+2(i-240) + Mean Along-Track. + See Note 1. - orb_cross_bound_mu: type: u8 units: m desc: > - Mean Cross-Track (range 0-55) - i<=200, mean=0.0251i - 200240, mean=25+2(i-240) + Mean Cross-Track. + See Note 1. - orb_radial_bound_sig: type: u8 units: m desc: > - Standard Deviation Radial (range 0-55) - i<=200, mean=0.0251i - 200240, mean=25+2(i-240) + Standard Deviation Radial. + See Note 1. - orb_along_bound_sig: type: u8 units: m desc: > - Standard Deviation Along-Track (range 0-55) - i<=200, mean=0.0251i - 200240, mean=25+2(i-240) + Standard Deviation Along-Track. + See Note 1. - orb_cross_bound_sig: type: u8 units: m desc: > - Standard Deviation Cross-Track (range 0-55) - i<=200, mean=0.0251i - 200240, mean=25+2(i-240) + Standard Deviation Cross-Track. + See Note 1. - clock_bound_mu: type: u8 units: m desc: > - Clock Bound Mean (range 0-55) - i<=200, mean=0.0251i - 200240, mean=25+2(i-240) + Clock Bound Mean. + See Note 1. - clock_bound_sig: type: u8 units: m desc: > - Clock Bound Standard Deviation (range 0-55) - i<=200, mean=0.0251i - 200240, mean=25+2(i-240) + Clock Bound Standard Deviation. + See Note 1. - MSG_SSR_ORBIT_CLOCK_BOUNDS: id: 0x05DE short_desc: Combined Orbit and Clock Bound - public: False + desc: > + Note 1: Range: 0-55 m. + i<=200, mean=0.0251i; + 200240, mean=25+2(i-240). fields: - header: type: BoundsHeader @@ -1151,24 +1151,31 @@ definitions: - code_bias_bound_mu: type: u8 units: 0.005 m - desc: Code Bias Mean (range 0-1.275) + desc: > + Code Bias Mean. + Range: 0-1.275 m - code_bias_bound_sig: type: u8 units: 0.005 m - desc: Code Bias Standard Deviation (range 0-1.275) + desc: > + Code Bias Standard Deviation. + Range: 0-1.275 m - phase_bias_bound_mu: type: u8 units: 0.005 m - desc: Phase Bias Mean (range 0-1.275) + desc: > + Phase Bias Mean. + Range: 0-1.275 m - phase_bias_bound_sig: type: u8 units: 0.005 m - desc: Phase Bias Standard Deviation (range 0-1.275) + desc: > + Phase Bias Standard Deviation. + Range: 0-1.275 m - MSG_SSR_CODE_PHASE_BIASES_BOUNDS: id: 0x05EC short_desc: Combined Code and Phase Biases Bounds - public: False fields: - header: type: BoundsHeader @@ -1196,55 +1203,54 @@ definitions: type: u8 units: 0.001 m/s desc: > - Orbit Bound Mean Radial First derivative degradation parameter - (range 0-0.255) + Orbit Bound Mean Radial First derivative. + Range: 0-0.255 m/s - orb_along_bound_mu_dot: type: u8 units: 0.001 m/s desc: > - Orbit Bound Mean Along-Track First derivative degradation parameter - (range 0-0.255) + Orbit Bound Mean Along-Track First derivative. + Range: 0-0.255 m/s - orb_cross_bound_mu_dot: type: u8 units: 0.001 m/s desc: > - Orbit Bound Mean Cross-Track First derivative degradation parameter - (range 0-0.255) + Orbit Bound Mean Cross-Track First derivative. + Range: 0-0.255 m/s - orb_radial_bound_sig_dot: type: u8 units: 0.001 m/s desc: > - Orbit Bound Standard Deviation Radial First derivative degradation parameter - (range 0-0.255) + Orbit Bound Standard Deviation Radial First derivative. + Range: 0-0.255 m/s - orb_along_bound_sig_dot: type: u8 units: 0.001 m/s desc: > - Orbit Bound Standard Deviation Along-Track First derivative degradation parameter - (range 0-0.255) + Orbit Bound Standard Deviation Along-Track First derivative. + Range: 0-0.255 m/s - orb_cross_bound_sig_dot: type: u8 units: 0.001 m/s desc: > - Orbit Bound Standard Deviation Cross-Track First derivative degradation parameter - (range 0-0.255) + Orbit Bound Standard Deviation Cross-Track First derivative. + Range: 0-0.255 m/s - clock_bound_mu_dot: type: u8 units: 0.001 m/s desc: > - Clock Bound Mean First derivative degradation parameter - (range 0-0.255) + Clock Bound Mean First derivative. + Range: 0-0.255 m/s - clock_bound_sig_dot: type: u8 units: 0.001 m/s desc: > - Clock Bound Standard Deviation First derivative degradation parameter - (range 0-0.255) + Clock Bound Standard Deviation First derivative. + Range: 0-0.255 m/s - MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION: id: 0x05DF short_desc: Combined Orbit and Clock Bound Degradation Parameter - public: False fields: - header: type: BoundsHeader From 3db50485b138af8678bd4273da9e25d40d5b5853 Mon Sep 17 00:00:00 2001 From: fpezzinosn <79222190+fpezzinosn@users.noreply.github.com> Date: Thu, 9 Jun 2022 17:51:09 -0400 Subject: [PATCH 09/10] Updates messages to ICD v1.2 [OTA-161] (#1155) --- c/include/libsbp/cpp/message_traits.h | 65 ---- c/include/libsbp/sbp_msg_type.h | 2 - c/include/libsbp/v4/navigation.h | 2 - .../v4/navigation/MSG_GPS_LEAP_SECOND.h | 223 ----------- c/include/libsbp/v4/navigation/MSG_ITRF.h | 277 -------------- c/include/libsbp/v4/sbp_msg.h | 21 - .../v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS.h | 5 +- c/include/libsbp/v4/ssr/OrbitClockBound.h | 8 +- .../libsbp/v4/ssr/STECSatElementIntegrity.h | 4 +- ...to_check_sbp_navigation_MsgGPSLeapSecond.c | 205 ---------- c/test/auto_check_sbp_navigation_MsgItrf.c | 333 ---------------- c/test/check_main.c | 2 - c/test/check_main_legacy.c | 3 - c/test/check_suites.h | 2 - c/test/check_suites_legacy.h | 2 - ...o_check_sbp_navigation_MsgGPSLeapSecond.cc | 131 ------- .../cpp/auto_check_sbp_navigation_MsgItrf.cc | 220 ----------- ...to_check_sbp_navigation_MsgGPSLeapSecond.c | 239 ------------ .../auto_check_sbp_navigation_MsgItrf.c | 334 ---------------- ...o_check_sbp_navigation_MsgGPSLeapSecond.cc | 133 ------- .../cpp/auto_check_sbp_navigation_MsgItrf.cc | 226 ----------- haskell/src/SwiftNav/SBP/Msg.hs | 12 - .../sbp/navigation/MsgGPSLeapSecond.java | 117 ------ .../com/swiftnav/sbp/navigation/MsgItrf.java | 186 --------- .../sbp/ssr/MsgSsrOrbitClockBounds.java | 7 +- .../com/swiftnav/sbp/ssr/OrbitClockBound.java | 8 +- .../sbp/ssr/STECSatElementIntegrity.java | 4 +- ...k_sbp_navigation_MsgGPSLeapSecondTest.java | 130 ------- ...auto_check_sbp_navigation_MsgItrfTest.java | 358 ------------------ jsonschema/MsgGPSLeapSecond.json | 40 -- jsonschema/MsgItrf.json | 66 ---- jsonschema/MsgSsrOrbitClockBounds.json | 2 +- ...heck_sbp_navigation_msg_gps_leap_second.rs | 95 ----- .../auto_check_sbp_navigation_msg_itrf.rs | Bin 6716 -> 0 bytes rust/sbp/tests/integration/main.rs | 2 - .../sbp/navigation/test_MsgGPSLeapSecond.yaml | 30 -- .../swiftnav/sbp/navigation/test_MsgItrf.yaml | 47 --- .../test_MsgReferenceFrameParam.yaml | 48 ++- .../sbp/navigation/test_MsgUTCLeapSecond.yaml | 16 +- .../test_MsgSsrGriddedCorrectionBounds.yaml | 21 +- spec/yaml/swiftnav/sbp/navigation.yaml | 22 +- spec/yaml/swiftnav/sbp/ssr.yaml | 57 +-- 42 files changed, 115 insertions(+), 3590 deletions(-) delete mode 100644 c/include/libsbp/v4/navigation/MSG_GPS_LEAP_SECOND.h delete mode 100644 c/include/libsbp/v4/navigation/MSG_ITRF.h delete mode 100644 c/test/auto_check_sbp_navigation_MsgGPSLeapSecond.c delete mode 100644 c/test/auto_check_sbp_navigation_MsgItrf.c delete mode 100644 c/test/cpp/auto_check_sbp_navigation_MsgGPSLeapSecond.cc delete mode 100644 c/test/cpp/auto_check_sbp_navigation_MsgItrf.cc delete mode 100644 c/test/legacy/auto_check_sbp_navigation_MsgGPSLeapSecond.c delete mode 100644 c/test/legacy/auto_check_sbp_navigation_MsgItrf.c delete mode 100644 c/test/legacy/cpp/auto_check_sbp_navigation_MsgGPSLeapSecond.cc delete mode 100644 c/test/legacy/cpp/auto_check_sbp_navigation_MsgItrf.cc delete mode 100644 java/src/com/swiftnav/sbp/navigation/MsgGPSLeapSecond.java delete mode 100644 java/src/com/swiftnav/sbp/navigation/MsgItrf.java delete mode 100644 java/test/auto_check_sbp_navigation_MsgGPSLeapSecondTest.java delete mode 100644 java/test/auto_check_sbp_navigation_MsgItrfTest.java delete mode 100644 jsonschema/MsgGPSLeapSecond.json delete mode 100644 jsonschema/MsgItrf.json delete mode 100644 rust/sbp/tests/integration/auto_check_sbp_navigation_msg_gps_leap_second.rs delete mode 100644 rust/sbp/tests/integration/auto_check_sbp_navigation_msg_itrf.rs delete mode 100644 spec/tests/yaml/swiftnav/sbp/navigation/test_MsgGPSLeapSecond.yaml delete mode 100644 spec/tests/yaml/swiftnav/sbp/navigation/test_MsgItrf.yaml diff --git a/c/include/libsbp/cpp/message_traits.h b/c/include/libsbp/cpp/message_traits.h index 757d46be8a..15cfc59fc4 100644 --- a/c/include/libsbp/cpp/message_traits.h +++ b/c/include/libsbp/cpp/message_traits.h @@ -2688,41 +2688,6 @@ struct MessageTraits { } }; -template <> -struct MessageTraits { - static constexpr sbp_msg_type_t id = SbpMsgGpsLeapSecond; - static const sbp_msg_gps_leap_second_t &get(const sbp_msg_t &msg) { - return msg.gps_leap_second; - } - static sbp_msg_gps_leap_second_t &get(sbp_msg_t &msg) { - return msg.gps_leap_second; - } - static void to_sbp_msg(const sbp_msg_gps_leap_second_t &msg, - sbp_msg_t *sbp_msg) { - sbp_msg->gps_leap_second = msg; - } - static sbp_msg_t to_sbp_msg(const sbp_msg_gps_leap_second_t &msg) { - sbp_msg_t sbp_msg; - sbp_msg.gps_leap_second = msg; - return sbp_msg; - } - static s8 send(sbp_state_t *state, u16 sender_id, - const sbp_msg_gps_leap_second_t &msg, sbp_write_fn_t write) { - return sbp_msg_gps_leap_second_send(state, sender_id, &msg, write); - } - static s8 encode(uint8_t *buf, uint8_t len, uint8_t *n_written, - const sbp_msg_gps_leap_second_t &msg) { - return sbp_msg_gps_leap_second_encode(buf, len, n_written, &msg); - } - static s8 decode(const uint8_t *buf, uint8_t len, uint8_t *n_read, - sbp_msg_gps_leap_second_t *msg) { - return sbp_msg_gps_leap_second_decode(buf, len, n_read, msg); - } - static size_t encoded_len(const sbp_msg_gps_leap_second_t &msg) { - return sbp_msg_gps_leap_second_encoded_len(&msg); - } -}; - template <> struct MessageTraits { static constexpr sbp_msg_type_t id = SbpMsgGpsTimeDepA; @@ -3234,36 +3199,6 @@ struct MessageTraits { } }; -template <> -struct MessageTraits { - static constexpr sbp_msg_type_t id = SbpMsgItrf; - static const sbp_msg_itrf_t &get(const sbp_msg_t &msg) { return msg.itrf; } - static sbp_msg_itrf_t &get(sbp_msg_t &msg) { return msg.itrf; } - static void to_sbp_msg(const sbp_msg_itrf_t &msg, sbp_msg_t *sbp_msg) { - sbp_msg->itrf = msg; - } - static sbp_msg_t to_sbp_msg(const sbp_msg_itrf_t &msg) { - sbp_msg_t sbp_msg; - sbp_msg.itrf = msg; - return sbp_msg; - } - static s8 send(sbp_state_t *state, u16 sender_id, const sbp_msg_itrf_t &msg, - sbp_write_fn_t write) { - return sbp_msg_itrf_send(state, sender_id, &msg, write); - } - static s8 encode(uint8_t *buf, uint8_t len, uint8_t *n_written, - const sbp_msg_itrf_t &msg) { - return sbp_msg_itrf_encode(buf, len, n_written, &msg); - } - static s8 decode(const uint8_t *buf, uint8_t len, uint8_t *n_read, - sbp_msg_itrf_t *msg) { - return sbp_msg_itrf_decode(buf, len, n_read, msg); - } - static size_t encoded_len(const sbp_msg_itrf_t &msg) { - return sbp_msg_itrf_encoded_len(&msg); - } -}; - template <> struct MessageTraits { static constexpr sbp_msg_type_t id = SbpMsgLinuxCpuStateDepA; diff --git a/c/include/libsbp/sbp_msg_type.h b/c/include/libsbp/sbp_msg_type.h index ba3141b59a..9dda8899e0 100644 --- a/c/include/libsbp/sbp_msg_type.h +++ b/c/include/libsbp/sbp_msg_type.h @@ -127,7 +127,6 @@ typedef enum { SbpMsgGloBiases = SBP_MSG_GLO_BIASES, SbpMsgGnssCapb = SBP_MSG_GNSS_CAPB, SbpMsgGnssTimeOffset = SBP_MSG_GNSS_TIME_OFFSET, - SbpMsgGpsLeapSecond = SBP_MSG_GPS_LEAP_SECOND, SbpMsgGpsTimeDepA = SBP_MSG_GPS_TIME_DEP_A, SbpMsgGpsTimeGnss = SBP_MSG_GPS_TIME_GNSS, SbpMsgGpsTime = SBP_MSG_GPS_TIME, @@ -143,7 +142,6 @@ typedef enum { SbpMsgInsStatus = SBP_MSG_INS_STATUS, SbpMsgInsUpdates = SBP_MSG_INS_UPDATES, SbpMsgIono = SBP_MSG_IONO, - SbpMsgItrf = SBP_MSG_ITRF, SbpMsgLinuxCpuStateDepA = SBP_MSG_LINUX_CPU_STATE_DEP_A, SbpMsgLinuxCpuState = SBP_MSG_LINUX_CPU_STATE, SbpMsgLinuxMemStateDepA = SBP_MSG_LINUX_MEM_STATE_DEP_A, diff --git a/c/include/libsbp/v4/navigation.h b/c/include/libsbp/v4/navigation.h index 1dfb8061cf..fc89dacc0c 100644 --- a/c/include/libsbp/v4/navigation.h +++ b/c/include/libsbp/v4/navigation.h @@ -26,11 +26,9 @@ #include #include #include -#include #include #include #include -#include #include #include #include diff --git a/c/include/libsbp/v4/navigation/MSG_GPS_LEAP_SECOND.h b/c/include/libsbp/v4/navigation/MSG_GPS_LEAP_SECOND.h deleted file mode 100644 index 35dc956dc3..0000000000 --- a/c/include/libsbp/v4/navigation/MSG_GPS_LEAP_SECOND.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - * 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/navigation.yaml - * with generate.py. Please do not hand edit! - *****************************************************************************/ - -#ifndef LIBSBP_V4_NAVIGATION_MSG_GPS_LEAP_SECOND_H -#define LIBSBP_V4_NAVIGATION_MSG_GPS_LEAP_SECOND_H - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************************************** - * - * SBP_MSG_GPS_LEAP_SECOND - * - *****************************************************************************/ -/** Leap second SBP message. - - * -* Emulates the GPS CNAV message, reserving bytes for future broadcast of the -drift model parameters. - */ -typedef struct { - /** - * Reserved. Bias coefficient of GPS time scale with respect to UTC drift - * model. [2^-35 s] - */ - s16 bias_coeff; - - /** - * Reserved. Drift coefficient of GPS time scale with respect to UTC drift - * model. [2^-51 s/s] - */ - s16 drift_coeff; - - /** - * Reserved. Drift rate correction coefficient of GPS time scale with respect - * to UTC drift model. [2^-68 s/s^2] - */ - s8 drift_rate_coeff; - - /** - * Leap second count before insertion. [s] - */ - s8 count_before; - - /** - * Reserved. Drift model reference week second. [s] - */ - u16 tow_s; - - /** - * Reserved. Drift model reference week number. [weeks] - */ - u16 wn; - - /** - * Leap second reference week number. [weeks] - */ - u16 ref_wn; - - /** - * Leap second reference day number. [days] - */ - u8 ref_dn; - - /** - * Leap second count after insertion. [s] - */ - s8 count_after; -} sbp_msg_gps_leap_second_t; - -/** - * Get encoded size of an instance of sbp_msg_gps_leap_second_t - * - * @param msg sbp_msg_gps_leap_second_t instance - * @return Length of on-wire representation - */ -static inline size_t sbp_msg_gps_leap_second_encoded_len( - const sbp_msg_gps_leap_second_t *msg) { - (void)msg; - return SBP_MSG_GPS_LEAP_SECOND_ENCODED_LEN; -} - -/** - * Encode an instance of sbp_msg_gps_leap_second_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_gps_leap_second_t to encode - * @return SBP_OK on success, or other libsbp error code - */ -SBP_EXPORT s8 -sbp_msg_gps_leap_second_encode(uint8_t *buf, uint8_t len, uint8_t *n_written, - const sbp_msg_gps_leap_second_t *msg); - -/** - * Decode an instance of sbp_msg_gps_leap_second_t from wire representation - * - * This function decodes the wire representation of a sbp_msg_gps_leap_second_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_gps_leap_second_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_gps_leap_second_decode(const uint8_t *buf, uint8_t len, - uint8_t *n_read, - sbp_msg_gps_leap_second_t *msg); -/** - * Send an instance of sbp_msg_gps_leap_second_t with the given write function - * - * An equivalent of #sbp_message_send which operates specifically on - * sbp_msg_gps_leap_second_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_gps_leap_second_send(sbp_state_t *s, u16 sender_id, - const sbp_msg_gps_leap_second_t *msg, - sbp_write_fn_t write); - -/** - * Compare two instances of sbp_msg_gps_leap_second_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_gps_leap_second_t instance - * @param b sbp_msg_gps_leap_second_t instance - * @return 0, <0, >0 - */ -SBP_EXPORT int sbp_msg_gps_leap_second_cmp(const sbp_msg_gps_leap_second_t *a, - const sbp_msg_gps_leap_second_t *b); - -#ifdef __cplusplus -} - -static inline bool operator==(const sbp_msg_gps_leap_second_t &lhs, - const sbp_msg_gps_leap_second_t &rhs) { - return sbp_msg_gps_leap_second_cmp(&lhs, &rhs) == 0; -} - -static inline bool operator!=(const sbp_msg_gps_leap_second_t &lhs, - const sbp_msg_gps_leap_second_t &rhs) { - return sbp_msg_gps_leap_second_cmp(&lhs, &rhs) != 0; -} - -static inline bool operator<(const sbp_msg_gps_leap_second_t &lhs, - const sbp_msg_gps_leap_second_t &rhs) { - return sbp_msg_gps_leap_second_cmp(&lhs, &rhs) < 0; -} - -static inline bool operator<=(const sbp_msg_gps_leap_second_t &lhs, - const sbp_msg_gps_leap_second_t &rhs) { - return sbp_msg_gps_leap_second_cmp(&lhs, &rhs) <= 0; -} - -static inline bool operator>(const sbp_msg_gps_leap_second_t &lhs, - const sbp_msg_gps_leap_second_t &rhs) { - return sbp_msg_gps_leap_second_cmp(&lhs, &rhs) > 0; -} - -static inline bool operator>=(const sbp_msg_gps_leap_second_t &lhs, - const sbp_msg_gps_leap_second_t &rhs) { - return sbp_msg_gps_leap_second_cmp(&lhs, &rhs) >= 0; -} - -#endif // ifdef __cplusplus - -#endif /* LIBSBP_V4_NAVIGATION_MSG_GPS_LEAP_SECOND_H */ diff --git a/c/include/libsbp/v4/navigation/MSG_ITRF.h b/c/include/libsbp/v4/navigation/MSG_ITRF.h deleted file mode 100644 index 361db39f5c..0000000000 --- a/c/include/libsbp/v4/navigation/MSG_ITRF.h +++ /dev/null @@ -1,277 +0,0 @@ -/* - * 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/navigation.yaml - * with generate.py. Please do not hand edit! - *****************************************************************************/ - -#ifndef LIBSBP_V4_NAVIGATION_MSG_ITRF_H -#define LIBSBP_V4_NAVIGATION_MSG_ITRF_H - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************************************** - * - * SBP_MSG_ITRF - * - *****************************************************************************/ -typedef struct { - /** - * SSR IOD parameter. - */ - u8 ssr_iod; - - /** - * Source-Name Counter N. - */ - u8 sn_counter_n; - - /** - * Source-Name - */ - char sn[SBP_MSG_ITRF_SN_MAX]; - - /** - * Target-Name Counter M. - */ - u8 tn_counter_m; - - /** - * Target-Name - */ - char tn[SBP_MSG_ITRF_TN_MAX]; - - /** - * System Identification Number. - */ - u8 sin; - - /** - * Utilized Transformation Message. - */ - u16 utn; - - /** - * Reference Epoch t0 for transformation parameter set given as Modified - * Julian Day (MDJ) Number minus 44244 days. [1 day] - */ - u16 re_t0; - - /** - * Translation in X for Reference Epoch t0. [0.001 m] - */ - s32 delta_X0; - - /** - * Translation in Y for Reference Epoch t0. [0.001 m] - */ - s32 delta_Y0; - - /** - * Translation in Z for Reference Epoch t0. [0.001 m] - */ - s32 delta_Z0; - - /** - * Rotation around the X-axis for Reference Epoch t0. [0.00002 "] - */ - s32 theta_01; - - /** - * Rotation around the Y-axis for Reference Epoch t0. [0.00002 "] - */ - s32 theta_02; - - /** - * Rotation around the Z-axis for Reference Epoch t0. [0.00002 "] - */ - s32 theta_03; - - /** - * Scale correction for Reference Epoch t0. [0.00001 ppm] - */ - s32 scale; - - /** - * Rate of change of translation in X. [0.00002 m/yr] - */ - s32 dot_delta_X0; - - /** - * Rate of change of translation in Y. [0.00002 m/yr] - */ - s32 dot_delta_Y0; - - /** - * Rate of change of translation in Z. [0.00002 m/yr] - */ - s32 dot_delta_Z0; - - /** - * Rate of change of rotation around the X-axis. [0.0000004 "/yr] - */ - s32 dot_theta_01; - - /** - * Rate of change of rotation around the Y-axis. [0.0000004 "/yr] - */ - s32 dot_theta_02; - - /** - * Rate of change of rotation around the Z-axis. [0.0000004 "/yr] - */ - s32 dot_theta_03; - - /** - * Rate of change of scale correction. [0.0000002 ppm/yr] - */ - s16 dot_scale; -} sbp_msg_itrf_t; - -/** - * Get encoded size of an instance of sbp_msg_itrf_t - * - * @param msg sbp_msg_itrf_t instance - * @return Length of on-wire representation - */ -static inline size_t sbp_msg_itrf_encoded_len(const sbp_msg_itrf_t *msg) { - (void)msg; - return SBP_MSG_ITRF_ENCODED_LEN; -} - -/** - * Encode an instance of sbp_msg_itrf_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_itrf_t to encode - * @return SBP_OK on success, or other libsbp error code - */ -SBP_EXPORT s8 sbp_msg_itrf_encode(uint8_t *buf, uint8_t len, uint8_t *n_written, - const sbp_msg_itrf_t *msg); - -/** - * Decode an instance of sbp_msg_itrf_t from wire representation - * - * This function decodes the wire representation of a sbp_msg_itrf_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_itrf_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_itrf_decode(const uint8_t *buf, uint8_t len, - uint8_t *n_read, sbp_msg_itrf_t *msg); -/** - * Send an instance of sbp_msg_itrf_t with the given write function - * - * An equivalent of #sbp_message_send which operates specifically on - * sbp_msg_itrf_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_itrf_send(sbp_state_t *s, u16 sender_id, - const sbp_msg_itrf_t *msg, - sbp_write_fn_t write); - -/** - * Compare two instances of sbp_msg_itrf_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_itrf_t instance - * @param b sbp_msg_itrf_t instance - * @return 0, <0, >0 - */ -SBP_EXPORT int sbp_msg_itrf_cmp(const sbp_msg_itrf_t *a, - const sbp_msg_itrf_t *b); - -#ifdef __cplusplus -} - -static inline bool operator==(const sbp_msg_itrf_t &lhs, - const sbp_msg_itrf_t &rhs) { - return sbp_msg_itrf_cmp(&lhs, &rhs) == 0; -} - -static inline bool operator!=(const sbp_msg_itrf_t &lhs, - const sbp_msg_itrf_t &rhs) { - return sbp_msg_itrf_cmp(&lhs, &rhs) != 0; -} - -static inline bool operator<(const sbp_msg_itrf_t &lhs, - const sbp_msg_itrf_t &rhs) { - return sbp_msg_itrf_cmp(&lhs, &rhs) < 0; -} - -static inline bool operator<=(const sbp_msg_itrf_t &lhs, - const sbp_msg_itrf_t &rhs) { - return sbp_msg_itrf_cmp(&lhs, &rhs) <= 0; -} - -static inline bool operator>(const sbp_msg_itrf_t &lhs, - const sbp_msg_itrf_t &rhs) { - return sbp_msg_itrf_cmp(&lhs, &rhs) > 0; -} - -static inline bool operator>=(const sbp_msg_itrf_t &lhs, - const sbp_msg_itrf_t &rhs) { - return sbp_msg_itrf_cmp(&lhs, &rhs) >= 0; -} - -#endif // ifdef __cplusplus - -#endif /* LIBSBP_V4_NAVIGATION_MSG_ITRF_H */ diff --git a/c/include/libsbp/v4/sbp_msg.h b/c/include/libsbp/v4/sbp_msg.h index 0a809ee859..340c230437 100644 --- a/c/include/libsbp/v4/sbp_msg.h +++ b/c/include/libsbp/v4/sbp_msg.h @@ -133,7 +133,6 @@ typedef union { sbp_msg_glo_biases_t glo_biases; sbp_msg_gnss_capb_t gnss_capb; sbp_msg_gnss_time_offset_t gnss_time_offset; - sbp_msg_gps_leap_second_t gps_leap_second; sbp_msg_gps_time_dep_a_t gps_time_dep_a; sbp_msg_gps_time_gnss_t gps_time_gnss; sbp_msg_gps_time_t gps_time; @@ -149,7 +148,6 @@ typedef union { sbp_msg_ins_status_t ins_status; sbp_msg_ins_updates_t ins_updates; sbp_msg_iono_t iono; - sbp_msg_itrf_t itrf; sbp_msg_linux_cpu_state_dep_a_t linux_cpu_state_dep_a; sbp_msg_linux_cpu_state_t linux_cpu_state; sbp_msg_linux_mem_state_dep_a_t linux_mem_state_dep_a; @@ -511,9 +509,6 @@ static inline s8 sbp_message_encode(uint8_t *buf, uint8_t len, case SbpMsgGnssTimeOffset: return sbp_msg_gnss_time_offset_encode(buf, len, n_written, &msg->gnss_time_offset); - case SbpMsgGpsLeapSecond: - return sbp_msg_gps_leap_second_encode(buf, len, n_written, - &msg->gps_leap_second); case SbpMsgGpsTimeDepA: return sbp_msg_gps_time_dep_a_encode(buf, len, n_written, &msg->gps_time_dep_a); @@ -549,8 +544,6 @@ static inline s8 sbp_message_encode(uint8_t *buf, uint8_t len, return sbp_msg_ins_updates_encode(buf, len, n_written, &msg->ins_updates); case SbpMsgIono: return sbp_msg_iono_encode(buf, len, n_written, &msg->iono); - case SbpMsgItrf: - return sbp_msg_itrf_encode(buf, len, n_written, &msg->itrf); case SbpMsgLinuxCpuStateDepA: return sbp_msg_linux_cpu_state_dep_a_encode(buf, len, n_written, &msg->linux_cpu_state_dep_a); @@ -1131,9 +1124,6 @@ static inline s8 sbp_message_decode(const uint8_t *buf, uint8_t len, case SbpMsgGnssTimeOffset: return sbp_msg_gnss_time_offset_decode(buf, len, n_read, &msg->gnss_time_offset); - case SbpMsgGpsLeapSecond: - return sbp_msg_gps_leap_second_decode(buf, len, n_read, - &msg->gps_leap_second); case SbpMsgGpsTimeDepA: return sbp_msg_gps_time_dep_a_decode(buf, len, n_read, &msg->gps_time_dep_a); @@ -1169,8 +1159,6 @@ static inline s8 sbp_message_decode(const uint8_t *buf, uint8_t len, return sbp_msg_ins_updates_decode(buf, len, n_read, &msg->ins_updates); case SbpMsgIono: return sbp_msg_iono_decode(buf, len, n_read, &msg->iono); - case SbpMsgItrf: - return sbp_msg_itrf_decode(buf, len, n_read, &msg->itrf); case SbpMsgLinuxCpuStateDepA: return sbp_msg_linux_cpu_state_dep_a_decode(buf, len, n_read, &msg->linux_cpu_state_dep_a); @@ -1693,8 +1681,6 @@ static inline size_t sbp_message_encoded_len(sbp_msg_type_t msg_type, return sbp_msg_gnss_capb_encoded_len(&msg->gnss_capb); case SbpMsgGnssTimeOffset: return sbp_msg_gnss_time_offset_encoded_len(&msg->gnss_time_offset); - case SbpMsgGpsLeapSecond: - return sbp_msg_gps_leap_second_encoded_len(&msg->gps_leap_second); case SbpMsgGpsTimeDepA: return sbp_msg_gps_time_dep_a_encoded_len(&msg->gps_time_dep_a); case SbpMsgGpsTimeGnss: @@ -1725,8 +1711,6 @@ static inline size_t sbp_message_encoded_len(sbp_msg_type_t msg_type, return sbp_msg_ins_updates_encoded_len(&msg->ins_updates); case SbpMsgIono: return sbp_msg_iono_encoded_len(&msg->iono); - case SbpMsgItrf: - return sbp_msg_itrf_encoded_len(&msg->itrf); case SbpMsgLinuxCpuStateDepA: return sbp_msg_linux_cpu_state_dep_a_encoded_len( &msg->linux_cpu_state_dep_a); @@ -2233,9 +2217,6 @@ static inline int sbp_message_cmp(sbp_msg_type_t msg_type, const sbp_msg_t *a, case SbpMsgGnssTimeOffset: return sbp_msg_gnss_time_offset_cmp(&a->gnss_time_offset, &b->gnss_time_offset); - case SbpMsgGpsLeapSecond: - return sbp_msg_gps_leap_second_cmp(&a->gps_leap_second, - &b->gps_leap_second); case SbpMsgGpsTimeDepA: return sbp_msg_gps_time_dep_a_cmp(&a->gps_time_dep_a, &b->gps_time_dep_a); case SbpMsgGpsTimeGnss: @@ -2268,8 +2249,6 @@ static inline int sbp_message_cmp(sbp_msg_type_t msg_type, const sbp_msg_t *a, return sbp_msg_ins_updates_cmp(&a->ins_updates, &b->ins_updates); case SbpMsgIono: return sbp_msg_iono_cmp(&a->iono, &b->iono); - case SbpMsgItrf: - return sbp_msg_itrf_cmp(&a->itrf, &b->itrf); case SbpMsgLinuxCpuStateDepA: return sbp_msg_linux_cpu_state_dep_a_cmp(&a->linux_cpu_state_dep_a, &b->linux_cpu_state_dep_a); diff --git a/c/include/libsbp/v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS.h b/c/include/libsbp/v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS.h index cb6b491831..41a0d8e224 100644 --- a/c/include/libsbp/v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS.h +++ b/c/include/libsbp/v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS.h @@ -40,8 +40,9 @@ extern "C" { *****************************************************************************/ /** Combined Orbit and Clock Bound * - * Note 1: Range: 0-55 m. i<=200, mean=0.0251i; 200240, mean=25+2(i-240). + * Note 1: Range: 0-17.5 m. i<=200, mean=0.01i; 200230, mean=5+0.5(i-230). + * */ typedef struct { u8 stub[SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_STUB_MAX]; diff --git a/c/include/libsbp/v4/ssr/OrbitClockBound.h b/c/include/libsbp/v4/ssr/OrbitClockBound.h index 782264889c..b11222da54 100644 --- a/c/include/libsbp/v4/ssr/OrbitClockBound.h +++ b/c/include/libsbp/v4/ssr/OrbitClockBound.h @@ -65,17 +65,17 @@ typedef struct { u8 orb_cross_bound_mu; /** - * Standard Deviation Radial. See Note 1. [m] + * Standard Deviation Radial. See Note 2. [m] */ u8 orb_radial_bound_sig; /** - * Standard Deviation Along-Track. See Note 1. [m] + * Standard Deviation Along-Track. See Note 2. [m] */ u8 orb_along_bound_sig; /** - * Standard Deviation Cross-Track. See Note 1. [m] + * Standard Deviation Cross-Track. See Note 2. [m] */ u8 orb_cross_bound_sig; @@ -85,7 +85,7 @@ typedef struct { u8 clock_bound_mu; /** - * Clock Bound Standard Deviation. See Note 1. [m] + * Clock Bound Standard Deviation. See Note 2. [m] */ u8 clock_bound_sig; } sbp_orbit_clock_bound_t; diff --git a/c/include/libsbp/v4/ssr/STECSatElementIntegrity.h b/c/include/libsbp/v4/ssr/STECSatElementIntegrity.h index ccfaad2f3c..d157c571eb 100644 --- a/c/include/libsbp/v4/ssr/STECSatElementIntegrity.h +++ b/c/include/libsbp/v4/ssr/STECSatElementIntegrity.h @@ -60,12 +60,12 @@ typedef struct { u8 stec_bound_sig; /** - * Error Bound Mean First derivative. Range: 0-0.01275 m/s [0.00005 m/s] + * Error Bound Mean First derivative. [0.00005 m/s] */ u8 stec_bound_mu_dot; /** - * Error Bound StDev First derivative. Range: 0-0.01275 m/s [0.00005 m/s] + * Error Bound StDev First derivative. [0.00005 m/s] */ u8 stec_bound_sig_dot; } sbp_stec_sat_element_integrity_t; diff --git a/c/test/auto_check_sbp_navigation_MsgGPSLeapSecond.c b/c/test/auto_check_sbp_navigation_MsgGPSLeapSecond.c deleted file mode 100644 index 2d6903d252..0000000000 --- a/c/test/auto_check_sbp_navigation_MsgGPSLeapSecond.c +++ /dev/null @@ -1,205 +0,0 @@ -/* - * 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/navigation/test_MsgGPSLeapSecond.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_navigation_MsgGPSLeapSecond) { - 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, 570, &msg_callback, - &DUMMY_MEMORY_FOR_CALLBACKS, &n); - - u8 encoded_frame[] = { - 85, 58, 2, 66, 0, 14, 1, 0, 2, 0, 3, 4, 5, 0, 6, 0, 7, 0, 8, 9, 50, 232, - }; - - dummy_reset(); - - sbp_msg_t test_msg; - memset(&test_msg, 0, sizeof(test_msg)); - - test_msg.gps_leap_second.bias_coeff = 1; - - test_msg.gps_leap_second.count_after = 9; - - test_msg.gps_leap_second.count_before = 4; - - test_msg.gps_leap_second.drift_coeff = 2; - - test_msg.gps_leap_second.drift_rate_coeff = 3; - - test_msg.gps_leap_second.ref_dn = 8; - - test_msg.gps_leap_second.ref_wn = 7; - - test_msg.gps_leap_second.tow_s = 5; - - test_msg.gps_leap_second.wn = 6; - - sbp_message_send(&sbp_state, SbpMsgGpsLeapSecond, 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(SbpMsgGpsLeapSecond, &last_msg.msg, &test_msg) == 0, - "Sent and received messages did not compare equal"); - - ck_assert_msg(last_msg.msg.gps_leap_second.bias_coeff == 1, - "incorrect value for " - "last_msg.msg.gps_leap_second.bias_coeff, expected 1, is %d", - last_msg.msg.gps_leap_second.bias_coeff); - - ck_assert_msg(last_msg.msg.gps_leap_second.count_after == 9, - "incorrect value for " - "last_msg.msg.gps_leap_second.count_after, expected 9, is %d", - last_msg.msg.gps_leap_second.count_after); - - ck_assert_msg( - last_msg.msg.gps_leap_second.count_before == 4, - "incorrect value for last_msg.msg.gps_leap_second.count_before, " - "expected 4, is %d", - last_msg.msg.gps_leap_second.count_before); - - ck_assert_msg(last_msg.msg.gps_leap_second.drift_coeff == 2, - "incorrect value for " - "last_msg.msg.gps_leap_second.drift_coeff, expected 2, is %d", - last_msg.msg.gps_leap_second.drift_coeff); - - ck_assert_msg( - last_msg.msg.gps_leap_second.drift_rate_coeff == 3, - "incorrect value for last_msg.msg.gps_leap_second.drift_rate_coeff, " - "expected 3, is %d", - last_msg.msg.gps_leap_second.drift_rate_coeff); - - ck_assert_msg(last_msg.msg.gps_leap_second.ref_dn == 8, - "incorrect value for last_msg.msg.gps_leap_second.ref_dn, " - "expected 8, is %d", - last_msg.msg.gps_leap_second.ref_dn); - - ck_assert_msg(last_msg.msg.gps_leap_second.ref_wn == 7, - "incorrect value for last_msg.msg.gps_leap_second.ref_wn, " - "expected 7, is %d", - last_msg.msg.gps_leap_second.ref_wn); - - ck_assert_msg(last_msg.msg.gps_leap_second.tow_s == 5, - "incorrect value for last_msg.msg.gps_leap_second.tow_s, " - "expected 5, is %d", - last_msg.msg.gps_leap_second.tow_s); - - ck_assert_msg(last_msg.msg.gps_leap_second.wn == 6, - "incorrect value for last_msg.msg.gps_leap_second.wn, " - "expected 6, is %d", - last_msg.msg.gps_leap_second.wn); - } -} -END_TEST - -Suite *auto_check_sbp_navigation_MsgGPSLeapSecond_suite(void) { - Suite *s = suite_create( - "SBP generated test suite: auto_check_sbp_navigation_MsgGPSLeapSecond"); - TCase *tc_acq = tcase_create( - "Automated_Suite_auto_check_sbp_navigation_MsgGPSLeapSecond"); - tcase_add_test(tc_acq, test_auto_check_sbp_navigation_MsgGPSLeapSecond); - suite_add_tcase(s, tc_acq); - return s; -} \ No newline at end of file diff --git a/c/test/auto_check_sbp_navigation_MsgItrf.c b/c/test/auto_check_sbp_navigation_MsgItrf.c deleted file mode 100644 index 2d5528311b..0000000000 --- a/c/test/auto_check_sbp_navigation_MsgItrf.c +++ /dev/null @@ -1,333 +0,0 @@ -/* - * 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/navigation/test_MsgItrf.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_navigation_MsgItrf) { - 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, 580, &msg_callback, - &DUMMY_MEMORY_FOR_CALLBACKS, &n); - - u8 encoded_frame[] = { - 85, 68, 2, 66, 0, 124, 1, 2, 102, 111, 111, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 5, 0, 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, - 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, - 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, - 0, 18, 0, 0, 0, 19, 0, 0, 0, 20, 0, 66, 126, - }; - - dummy_reset(); - - sbp_msg_t test_msg; - memset(&test_msg, 0, sizeof(test_msg)); - - test_msg.itrf.delta_X0 = 7; - - test_msg.itrf.delta_Y0 = 8; - - test_msg.itrf.delta_Z0 = 9; - - test_msg.itrf.dot_delta_X0 = 14; - - test_msg.itrf.dot_delta_Y0 = 15; - - test_msg.itrf.dot_delta_Z0 = 16; - - test_msg.itrf.dot_scale = 20; - - test_msg.itrf.dot_theta_01 = 17; - - test_msg.itrf.dot_theta_02 = 18; - - test_msg.itrf.dot_theta_03 = 19; - - test_msg.itrf.re_t0 = 6; - - test_msg.itrf.scale = 13; - - test_msg.itrf.sin = 4; - - { - const char assign_string[] = { - (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0}; - memcpy(test_msg.itrf.sn, assign_string, sizeof(assign_string)); - } - - test_msg.itrf.sn_counter_n = 2; - - test_msg.itrf.ssr_iod = 1; - - test_msg.itrf.theta_01 = 10; - - test_msg.itrf.theta_02 = 11; - - test_msg.itrf.theta_03 = 12; - - { - const char assign_string[] = { - (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0}; - memcpy(test_msg.itrf.tn, assign_string, sizeof(assign_string)); - } - - test_msg.itrf.tn_counter_m = 3; - - test_msg.itrf.utn = 5; - - sbp_message_send(&sbp_state, SbpMsgItrf, 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(SbpMsgItrf, &last_msg.msg, &test_msg) == 0, - "Sent and received messages did not compare equal"); - - ck_assert_msg( - last_msg.msg.itrf.delta_X0 == 7, - "incorrect value for last_msg.msg.itrf.delta_X0, expected 7, is %d", - last_msg.msg.itrf.delta_X0); - - ck_assert_msg( - last_msg.msg.itrf.delta_Y0 == 8, - "incorrect value for last_msg.msg.itrf.delta_Y0, expected 8, is %d", - last_msg.msg.itrf.delta_Y0); - - ck_assert_msg( - last_msg.msg.itrf.delta_Z0 == 9, - "incorrect value for last_msg.msg.itrf.delta_Z0, expected 9, is %d", - last_msg.msg.itrf.delta_Z0); - - ck_assert_msg(last_msg.msg.itrf.dot_delta_X0 == 14, - "incorrect value for last_msg.msg.itrf.dot_delta_X0, " - "expected 14, is %d", - last_msg.msg.itrf.dot_delta_X0); - - ck_assert_msg(last_msg.msg.itrf.dot_delta_Y0 == 15, - "incorrect value for last_msg.msg.itrf.dot_delta_Y0, " - "expected 15, is %d", - last_msg.msg.itrf.dot_delta_Y0); - - ck_assert_msg(last_msg.msg.itrf.dot_delta_Z0 == 16, - "incorrect value for last_msg.msg.itrf.dot_delta_Z0, " - "expected 16, is %d", - last_msg.msg.itrf.dot_delta_Z0); - - ck_assert_msg( - last_msg.msg.itrf.dot_scale == 20, - "incorrect value for last_msg.msg.itrf.dot_scale, expected 20, is %d", - last_msg.msg.itrf.dot_scale); - - ck_assert_msg(last_msg.msg.itrf.dot_theta_01 == 17, - "incorrect value for last_msg.msg.itrf.dot_theta_01, " - "expected 17, is %d", - last_msg.msg.itrf.dot_theta_01); - - ck_assert_msg(last_msg.msg.itrf.dot_theta_02 == 18, - "incorrect value for last_msg.msg.itrf.dot_theta_02, " - "expected 18, is %d", - last_msg.msg.itrf.dot_theta_02); - - ck_assert_msg(last_msg.msg.itrf.dot_theta_03 == 19, - "incorrect value for last_msg.msg.itrf.dot_theta_03, " - "expected 19, is %d", - last_msg.msg.itrf.dot_theta_03); - - ck_assert_msg( - last_msg.msg.itrf.re_t0 == 6, - "incorrect value for last_msg.msg.itrf.re_t0, expected 6, is %d", - last_msg.msg.itrf.re_t0); - - ck_assert_msg( - last_msg.msg.itrf.scale == 13, - "incorrect value for last_msg.msg.itrf.scale, expected 13, is %d", - last_msg.msg.itrf.scale); - - ck_assert_msg( - last_msg.msg.itrf.sin == 4, - "incorrect value for last_msg.msg.itrf.sin, expected 4, is %d", - last_msg.msg.itrf.sin); - - { - const char check_string[] = { - (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0}; - ck_assert_msg(memcmp(&last_msg.msg.itrf.sn, check_string, - sizeof(check_string)) == 0, - "incorrect value for last_msg.msg.itrf.sn, expected string " - "'%s', is '%s'", - check_string, last_msg.msg.itrf.sn); - } - - ck_assert_msg( - last_msg.msg.itrf.sn_counter_n == 2, - "incorrect value for last_msg.msg.itrf.sn_counter_n, expected 2, is %d", - last_msg.msg.itrf.sn_counter_n); - - ck_assert_msg( - last_msg.msg.itrf.ssr_iod == 1, - "incorrect value for last_msg.msg.itrf.ssr_iod, expected 1, is %d", - last_msg.msg.itrf.ssr_iod); - - ck_assert_msg( - last_msg.msg.itrf.theta_01 == 10, - "incorrect value for last_msg.msg.itrf.theta_01, expected 10, is %d", - last_msg.msg.itrf.theta_01); - - ck_assert_msg( - last_msg.msg.itrf.theta_02 == 11, - "incorrect value for last_msg.msg.itrf.theta_02, expected 11, is %d", - last_msg.msg.itrf.theta_02); - - ck_assert_msg( - last_msg.msg.itrf.theta_03 == 12, - "incorrect value for last_msg.msg.itrf.theta_03, expected 12, is %d", - last_msg.msg.itrf.theta_03); - - { - const char check_string[] = { - (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0}; - ck_assert_msg(memcmp(&last_msg.msg.itrf.tn, check_string, - sizeof(check_string)) == 0, - "incorrect value for last_msg.msg.itrf.tn, expected string " - "'%s', is '%s'", - check_string, last_msg.msg.itrf.tn); - } - - ck_assert_msg( - last_msg.msg.itrf.tn_counter_m == 3, - "incorrect value for last_msg.msg.itrf.tn_counter_m, expected 3, is %d", - last_msg.msg.itrf.tn_counter_m); - - ck_assert_msg( - last_msg.msg.itrf.utn == 5, - "incorrect value for last_msg.msg.itrf.utn, expected 5, is %d", - last_msg.msg.itrf.utn); - } -} -END_TEST - -Suite *auto_check_sbp_navigation_MsgItrf_suite(void) { - Suite *s = suite_create( - "SBP generated test suite: auto_check_sbp_navigation_MsgItrf"); - TCase *tc_acq = - tcase_create("Automated_Suite_auto_check_sbp_navigation_MsgItrf"); - tcase_add_test(tc_acq, test_auto_check_sbp_navigation_MsgItrf); - 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 e29ca90ca8..cd20bc9f4e 100644 --- a/c/test/check_main.c +++ b/c/test/check_main.c @@ -54,11 +54,9 @@ int main(void) { srunner_add_suite(sr, auto_check_sbp_navigation_MsgBaselineNEDDepA_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgDops_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgDopsDepA_suite()); - srunner_add_suite(sr, auto_check_sbp_navigation_MsgGPSLeapSecond_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgGPSTime_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgGPSTimeDepA_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgGPSTimeGNSS_suite()); - srunner_add_suite(sr, auto_check_sbp_navigation_MsgItrf_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgPosECEF_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgPosECEFCov_suite()); srunner_add_suite(sr, auto_check_sbp_navigation_MsgPosECEFCovGNSS_suite()); diff --git a/c/test/check_main_legacy.c b/c/test/check_main_legacy.c index 4f37f0e9ad..1e78555d25 100644 --- a/c/test/check_main_legacy.c +++ b/c/test/check_main_legacy.c @@ -66,14 +66,11 @@ int main(void) { sr, legacy_auto_check_sbp_navigation_MsgBaselineNEDDepA_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_navigation_MsgDops_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_navigation_MsgDopsDepA_suite()); - srunner_add_suite(sr, - legacy_auto_check_sbp_navigation_MsgGPSLeapSecond_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_navigation_MsgGPSTime_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_navigation_MsgGPSTimeDepA_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_navigation_MsgGPSTimeGNSS_suite()); - srunner_add_suite(sr, legacy_auto_check_sbp_navigation_MsgItrf_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_navigation_MsgPosECEF_suite()); srunner_add_suite(sr, legacy_auto_check_sbp_navigation_MsgPosECEFCov_suite()); srunner_add_suite(sr, diff --git a/c/test/check_suites.h b/c/test/check_suites.h index c2377ac197..d2ce5933ce 100644 --- a/c/test/check_suites.h +++ b/c/test/check_suites.h @@ -42,11 +42,9 @@ Suite* auto_check_sbp_navigation_MsgBaselineNED_suite(void); Suite* auto_check_sbp_navigation_MsgBaselineNEDDepA_suite(void); Suite* auto_check_sbp_navigation_MsgDops_suite(void); Suite* auto_check_sbp_navigation_MsgDopsDepA_suite(void); -Suite* auto_check_sbp_navigation_MsgGPSLeapSecond_suite(void); Suite* auto_check_sbp_navigation_MsgGPSTime_suite(void); Suite* auto_check_sbp_navigation_MsgGPSTimeDepA_suite(void); Suite* auto_check_sbp_navigation_MsgGPSTimeGNSS_suite(void); -Suite* auto_check_sbp_navigation_MsgItrf_suite(void); Suite* auto_check_sbp_navigation_MsgPosECEF_suite(void); Suite* auto_check_sbp_navigation_MsgPosECEFCov_suite(void); Suite* auto_check_sbp_navigation_MsgPosECEFCovGNSS_suite(void); diff --git a/c/test/check_suites_legacy.h b/c/test/check_suites_legacy.h index 1ce7c4d5e0..17e667e4c2 100644 --- a/c/test/check_suites_legacy.h +++ b/c/test/check_suites_legacy.h @@ -43,11 +43,9 @@ Suite* legacy_auto_check_sbp_navigation_MsgBaselineNED_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgBaselineNEDDepA_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgDops_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgDopsDepA_suite(void); -Suite* legacy_auto_check_sbp_navigation_MsgGPSLeapSecond_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgGPSTime_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgGPSTimeDepA_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgGPSTimeGNSS_suite(void); -Suite* legacy_auto_check_sbp_navigation_MsgItrf_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgPosECEF_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgPosECEFCov_suite(void); Suite* legacy_auto_check_sbp_navigation_MsgPosECEFCovGNSS_suite(void); diff --git a/c/test/cpp/auto_check_sbp_navigation_MsgGPSLeapSecond.cc b/c/test/cpp/auto_check_sbp_navigation_MsgGPSLeapSecond.cc deleted file mode 100644 index 6a94c19a8c..0000000000 --- a/c/test/cpp/auto_check_sbp_navigation_MsgGPSLeapSecond.cc +++ /dev/null @@ -1,131 +0,0 @@ -/* - * 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/navigation/test_MsgGPSLeapSecond.yaml by -// generate.py. Do not modify by hand! - -#include -#include -#include -#include -#include -class Test_auto_check_sbp_navigation_MsgGPSLeapSecond0 - : public ::testing::Test, - public sbp::State, - public sbp::IReader, - public sbp::IWriter, - sbp::MessageHandler { - public: - Test_auto_check_sbp_navigation_MsgGPSLeapSecond0() - : ::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_gps_leap_second_t &msg) override { - last_msg_ = msg; - last_sender_id_ = sender_id; - n_callbacks_logged_++; - } - - sbp_msg_gps_leap_second_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_navigation_MsgGPSLeapSecond0, Test) { - uint8_t encoded_frame[] = { - 85, 58, 2, 66, 0, 14, 1, 0, 2, 0, 3, 4, 5, 0, 6, 0, 7, 0, 8, 9, 50, 232, - }; - - sbp_msg_gps_leap_second_t test_msg{}; - test_msg.bias_coeff = 1; - test_msg.count_after = 9; - test_msg.count_before = 4; - test_msg.drift_coeff = 2; - test_msg.drift_rate_coeff = 3; - test_msg.ref_dn = 8; - test_msg.ref_wn = 7; - test_msg.tow_s = 5; - test_msg.wn = 6; - - 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_.bias_coeff, 1) - << "incorrect value for last_msg_.bias_coeff, expected 1, is " - << last_msg_.bias_coeff; - EXPECT_EQ(last_msg_.count_after, 9) - << "incorrect value for last_msg_.count_after, expected 9, is " - << last_msg_.count_after; - EXPECT_EQ(last_msg_.count_before, 4) - << "incorrect value for last_msg_.count_before, expected 4, is " - << last_msg_.count_before; - EXPECT_EQ(last_msg_.drift_coeff, 2) - << "incorrect value for last_msg_.drift_coeff, expected 2, is " - << last_msg_.drift_coeff; - EXPECT_EQ(last_msg_.drift_rate_coeff, 3) - << "incorrect value for last_msg_.drift_rate_coeff, expected 3, is " - << last_msg_.drift_rate_coeff; - EXPECT_EQ(last_msg_.ref_dn, 8) - << "incorrect value for last_msg_.ref_dn, expected 8, is " - << last_msg_.ref_dn; - EXPECT_EQ(last_msg_.ref_wn, 7) - << "incorrect value for last_msg_.ref_wn, expected 7, is " - << last_msg_.ref_wn; - EXPECT_EQ(last_msg_.tow_s, 5) - << "incorrect value for last_msg_.tow_s, expected 5, is " - << last_msg_.tow_s; - EXPECT_EQ(last_msg_.wn, 6) - << "incorrect value for last_msg_.wn, expected 6, is " << last_msg_.wn; -} diff --git a/c/test/cpp/auto_check_sbp_navigation_MsgItrf.cc b/c/test/cpp/auto_check_sbp_navigation_MsgItrf.cc deleted file mode 100644 index 93feadcdcd..0000000000 --- a/c/test/cpp/auto_check_sbp_navigation_MsgItrf.cc +++ /dev/null @@ -1,220 +0,0 @@ -/* - * 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/navigation/test_MsgItrf.yaml by generate.py. Do -// not modify by hand! - -#include -#include -#include -#include -#include -class Test_auto_check_sbp_navigation_MsgItrf0 - : public ::testing::Test, - public sbp::State, - public sbp::IReader, - public sbp::IWriter, - sbp::MessageHandler { - public: - Test_auto_check_sbp_navigation_MsgItrf0() - : ::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_itrf_t &msg) override { - last_msg_ = msg; - last_sender_id_ = sender_id; - n_callbacks_logged_++; - } - - sbp_msg_itrf_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_navigation_MsgItrf0, Test) { - uint8_t encoded_frame[] = { - 85, 68, 2, 66, 0, 124, 1, 2, 102, 111, 111, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 5, 0, 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, - 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, - 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, - 0, 18, 0, 0, 0, 19, 0, 0, 0, 20, 0, 66, 126, - }; - - sbp_msg_itrf_t test_msg{}; - test_msg.delta_X0 = 7; - test_msg.delta_Y0 = 8; - test_msg.delta_Z0 = 9; - test_msg.dot_delta_X0 = 14; - test_msg.dot_delta_Y0 = 15; - test_msg.dot_delta_Z0 = 16; - test_msg.dot_scale = 20; - test_msg.dot_theta_01 = 17; - test_msg.dot_theta_02 = 18; - test_msg.dot_theta_03 = 19; - test_msg.re_t0 = 6; - test_msg.scale = 13; - test_msg.sin = 4; - { - const char assign_string[] = { - (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0}; - memcpy(test_msg.sn, assign_string, sizeof(assign_string)); - } - test_msg.sn_counter_n = 2; - test_msg.ssr_iod = 1; - test_msg.theta_01 = 10; - test_msg.theta_02 = 11; - test_msg.theta_03 = 12; - { - const char assign_string[] = { - (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0}; - memcpy(test_msg.tn, assign_string, sizeof(assign_string)); - } - test_msg.tn_counter_m = 3; - test_msg.utn = 5; - - 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_.delta_X0, 7) - << "incorrect value for last_msg_.delta_X0, expected 7, is " - << last_msg_.delta_X0; - EXPECT_EQ(last_msg_.delta_Y0, 8) - << "incorrect value for last_msg_.delta_Y0, expected 8, is " - << last_msg_.delta_Y0; - EXPECT_EQ(last_msg_.delta_Z0, 9) - << "incorrect value for last_msg_.delta_Z0, expected 9, is " - << last_msg_.delta_Z0; - EXPECT_EQ(last_msg_.dot_delta_X0, 14) - << "incorrect value for last_msg_.dot_delta_X0, expected 14, is " - << last_msg_.dot_delta_X0; - EXPECT_EQ(last_msg_.dot_delta_Y0, 15) - << "incorrect value for last_msg_.dot_delta_Y0, expected 15, is " - << last_msg_.dot_delta_Y0; - EXPECT_EQ(last_msg_.dot_delta_Z0, 16) - << "incorrect value for last_msg_.dot_delta_Z0, expected 16, is " - << last_msg_.dot_delta_Z0; - EXPECT_EQ(last_msg_.dot_scale, 20) - << "incorrect value for last_msg_.dot_scale, expected 20, is " - << last_msg_.dot_scale; - EXPECT_EQ(last_msg_.dot_theta_01, 17) - << "incorrect value for last_msg_.dot_theta_01, expected 17, is " - << last_msg_.dot_theta_01; - EXPECT_EQ(last_msg_.dot_theta_02, 18) - << "incorrect value for last_msg_.dot_theta_02, expected 18, is " - << last_msg_.dot_theta_02; - EXPECT_EQ(last_msg_.dot_theta_03, 19) - << "incorrect value for last_msg_.dot_theta_03, expected 19, is " - << last_msg_.dot_theta_03; - EXPECT_EQ(last_msg_.re_t0, 6) - << "incorrect value for last_msg_.re_t0, expected 6, is " - << last_msg_.re_t0; - EXPECT_EQ(last_msg_.scale, 13) - << "incorrect value for last_msg_.scale, expected 13, is " - << last_msg_.scale; - EXPECT_EQ(last_msg_.sin, 4) - << "incorrect value for last_msg_.sin, expected 4, is " << last_msg_.sin; - { - const char check_string[] = { - (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0}; - EXPECT_EQ(memcmp(last_msg_.sn, check_string, sizeof(check_string)), 0) - << "incorrect value for last_msg_.sn, expected string '" << check_string - << "', is '" << last_msg_.sn << "'"; - } - EXPECT_EQ(last_msg_.sn_counter_n, 2) - << "incorrect value for last_msg_.sn_counter_n, expected 2, is " - << last_msg_.sn_counter_n; - EXPECT_EQ(last_msg_.ssr_iod, 1) - << "incorrect value for last_msg_.ssr_iod, expected 1, is " - << last_msg_.ssr_iod; - EXPECT_EQ(last_msg_.theta_01, 10) - << "incorrect value for last_msg_.theta_01, expected 10, is " - << last_msg_.theta_01; - EXPECT_EQ(last_msg_.theta_02, 11) - << "incorrect value for last_msg_.theta_02, expected 11, is " - << last_msg_.theta_02; - EXPECT_EQ(last_msg_.theta_03, 12) - << "incorrect value for last_msg_.theta_03, expected 12, is " - << last_msg_.theta_03; - { - const char check_string[] = { - (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0}; - EXPECT_EQ(memcmp(last_msg_.tn, check_string, sizeof(check_string)), 0) - << "incorrect value for last_msg_.tn, expected string '" << check_string - << "', is '" << last_msg_.tn << "'"; - } - EXPECT_EQ(last_msg_.tn_counter_m, 3) - << "incorrect value for last_msg_.tn_counter_m, expected 3, is " - << last_msg_.tn_counter_m; - EXPECT_EQ(last_msg_.utn, 5) - << "incorrect value for last_msg_.utn, expected 5, is " << last_msg_.utn; -} diff --git a/c/test/legacy/auto_check_sbp_navigation_MsgGPSLeapSecond.c b/c/test/legacy/auto_check_sbp_navigation_MsgGPSLeapSecond.c deleted file mode 100644 index d1c481b19e..0000000000 --- a/c/test/legacy/auto_check_sbp_navigation_MsgGPSLeapSecond.c +++ /dev/null @@ -1,239 +0,0 @@ -/* - * 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/navigation/test_MsgGPSLeapSecond.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_navigation_MsgGPSLeapSecond) { - 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, 570, &msg_callback, - &DUMMY_MEMORY_FOR_CALLBACKS, &n); - sbp_frame_callback_register(&sbp_state, 570, &frame_callback, - &DUMMY_MEMORY_FOR_CALLBACKS, &n2); - - u8 encoded_frame[] = { - 85, 58, 2, 66, 0, 14, 1, 0, 2, 0, 3, 4, 5, 0, 6, 0, 7, 0, 8, 9, 50, 232, - }; - - 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_gps_leap_second_t *test_msg = (msg_gps_leap_second_t *)test_msg_storage; - test_msg_len = sizeof(*test_msg); - test_msg->bias_coeff = 1; - test_msg->count_after = 9; - test_msg->count_before = 4; - test_msg->drift_coeff = 2; - test_msg->drift_rate_coeff = 3; - test_msg->ref_dn = 8; - test_msg->ref_wn = 7; - test_msg->tow_s = 5; - test_msg->wn = 6; - sbp_payload_send(&sbp_state, 570, 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 == 570, - "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_gps_leap_second_t *check_msg = - (msg_gps_leap_second_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->bias_coeff == 1, - "incorrect value for bias_coeff, expected 1, is %d", - check_msg->bias_coeff); - ck_assert_msg(check_msg->count_after == 9, - "incorrect value for count_after, expected 9, is %d", - check_msg->count_after); - ck_assert_msg(check_msg->count_before == 4, - "incorrect value for count_before, expected 4, is %d", - check_msg->count_before); - ck_assert_msg(check_msg->drift_coeff == 2, - "incorrect value for drift_coeff, expected 2, is %d", - check_msg->drift_coeff); - ck_assert_msg(check_msg->drift_rate_coeff == 3, - "incorrect value for drift_rate_coeff, expected 3, is %d", - check_msg->drift_rate_coeff); - ck_assert_msg(check_msg->ref_dn == 8, - "incorrect value for ref_dn, expected 8, is %d", - check_msg->ref_dn); - ck_assert_msg(check_msg->ref_wn == 7, - "incorrect value for ref_wn, expected 7, is %d", - check_msg->ref_wn); - ck_assert_msg(check_msg->tow_s == 5, - "incorrect value for tow_s, expected 5, is %d", - check_msg->tow_s); - ck_assert_msg(check_msg->wn == 6, - "incorrect value for wn, expected 6, is %d", check_msg->wn); - } -} -END_TEST - -Suite *legacy_auto_check_sbp_navigation_MsgGPSLeapSecond_suite(void) { - Suite *s = suite_create( - "SBP generated test suite: " - "legacy_auto_check_sbp_navigation_MsgGPSLeapSecond"); - TCase *tc_acq = tcase_create( - "Automated_Suite_legacy_auto_check_sbp_navigation_MsgGPSLeapSecond"); - tcase_add_test(tc_acq, - test_legacy_auto_check_sbp_navigation_MsgGPSLeapSecond); - suite_add_tcase(s, tc_acq); - return s; -} \ No newline at end of file diff --git a/c/test/legacy/auto_check_sbp_navigation_MsgItrf.c b/c/test/legacy/auto_check_sbp_navigation_MsgItrf.c deleted file mode 100644 index e2e98064fd..0000000000 --- a/c/test/legacy/auto_check_sbp_navigation_MsgItrf.c +++ /dev/null @@ -1,334 +0,0 @@ -/* - * 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/navigation/test_MsgItrf.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_navigation_MsgItrf) { - 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, 580, &msg_callback, - &DUMMY_MEMORY_FOR_CALLBACKS, &n); - sbp_frame_callback_register(&sbp_state, 580, &frame_callback, - &DUMMY_MEMORY_FOR_CALLBACKS, &n2); - - u8 encoded_frame[] = { - 85, 68, 2, 66, 0, 124, 1, 2, 102, 111, 111, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 5, 0, 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, - 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, - 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, - 0, 18, 0, 0, 0, 19, 0, 0, 0, 20, 0, 66, 126, - }; - - 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_itrf_t *test_msg = (msg_itrf_t *)test_msg_storage; - test_msg_len = sizeof(*test_msg); - test_msg->delta_X0 = 7; - test_msg->delta_Y0 = 8; - test_msg->delta_Z0 = 9; - test_msg->dot_delta_X0 = 14; - test_msg->dot_delta_Y0 = 15; - test_msg->dot_delta_Z0 = 16; - test_msg->dot_scale = 20; - test_msg->dot_theta_01 = 17; - test_msg->dot_theta_02 = 18; - test_msg->dot_theta_03 = 19; - test_msg->re_t0 = 6; - test_msg->scale = 13; - test_msg->sin = 4; - { - const char assign_string[] = { - (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0}; - memcpy(test_msg->sn, assign_string, sizeof(assign_string)); - if (sizeof(test_msg->sn) == 0) { - test_msg_len += sizeof(assign_string); - } - } - test_msg->sn_counter_n = 2; - test_msg->ssr_iod = 1; - test_msg->theta_01 = 10; - test_msg->theta_02 = 11; - test_msg->theta_03 = 12; - { - const char assign_string[] = { - (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0}; - memcpy(test_msg->tn, assign_string, sizeof(assign_string)); - if (sizeof(test_msg->tn) == 0) { - test_msg_len += sizeof(assign_string); - } - } - test_msg->tn_counter_m = 3; - test_msg->utn = 5; - sbp_payload_send(&sbp_state, 580, 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 == 580, - "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_itrf_t *check_msg = (msg_itrf_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->delta_X0 == 7, - "incorrect value for delta_X0, expected 7, is %d", - check_msg->delta_X0); - ck_assert_msg(check_msg->delta_Y0 == 8, - "incorrect value for delta_Y0, expected 8, is %d", - check_msg->delta_Y0); - ck_assert_msg(check_msg->delta_Z0 == 9, - "incorrect value for delta_Z0, expected 9, is %d", - check_msg->delta_Z0); - ck_assert_msg(check_msg->dot_delta_X0 == 14, - "incorrect value for dot_delta_X0, expected 14, is %d", - check_msg->dot_delta_X0); - ck_assert_msg(check_msg->dot_delta_Y0 == 15, - "incorrect value for dot_delta_Y0, expected 15, is %d", - check_msg->dot_delta_Y0); - ck_assert_msg(check_msg->dot_delta_Z0 == 16, - "incorrect value for dot_delta_Z0, expected 16, is %d", - check_msg->dot_delta_Z0); - ck_assert_msg(check_msg->dot_scale == 20, - "incorrect value for dot_scale, expected 20, is %d", - check_msg->dot_scale); - ck_assert_msg(check_msg->dot_theta_01 == 17, - "incorrect value for dot_theta_01, expected 17, is %d", - check_msg->dot_theta_01); - ck_assert_msg(check_msg->dot_theta_02 == 18, - "incorrect value for dot_theta_02, expected 18, is %d", - check_msg->dot_theta_02); - ck_assert_msg(check_msg->dot_theta_03 == 19, - "incorrect value for dot_theta_03, expected 19, is %d", - check_msg->dot_theta_03); - ck_assert_msg(check_msg->re_t0 == 6, - "incorrect value for re_t0, expected 6, is %d", - check_msg->re_t0); - ck_assert_msg(check_msg->scale == 13, - "incorrect value for scale, expected 13, is %d", - check_msg->scale); - ck_assert_msg(check_msg->sin == 4, - "incorrect value for sin, expected 4, is %d", check_msg->sin); - { - const char check_string[] = { - (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0}; - ck_assert_msg( - memcmp(check_msg->sn, check_string, sizeof(check_string)) == 0, - "incorrect value for check_msg->sn, expected string '%s', is '%s'", - check_string, check_msg->sn); - } - ck_assert_msg(check_msg->sn_counter_n == 2, - "incorrect value for sn_counter_n, expected 2, is %d", - check_msg->sn_counter_n); - ck_assert_msg(check_msg->ssr_iod == 1, - "incorrect value for ssr_iod, expected 1, is %d", - check_msg->ssr_iod); - ck_assert_msg(check_msg->theta_01 == 10, - "incorrect value for theta_01, expected 10, is %d", - check_msg->theta_01); - ck_assert_msg(check_msg->theta_02 == 11, - "incorrect value for theta_02, expected 11, is %d", - check_msg->theta_02); - ck_assert_msg(check_msg->theta_03 == 12, - "incorrect value for theta_03, expected 12, is %d", - check_msg->theta_03); - { - const char check_string[] = { - (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0}; - ck_assert_msg( - memcmp(check_msg->tn, check_string, sizeof(check_string)) == 0, - "incorrect value for check_msg->tn, expected string '%s', is '%s'", - check_string, check_msg->tn); - } - ck_assert_msg(check_msg->tn_counter_m == 3, - "incorrect value for tn_counter_m, expected 3, is %d", - check_msg->tn_counter_m); - ck_assert_msg(check_msg->utn == 5, - "incorrect value for utn, expected 5, is %d", check_msg->utn); - } -} -END_TEST - -Suite *legacy_auto_check_sbp_navigation_MsgItrf_suite(void) { - Suite *s = suite_create( - "SBP generated test suite: legacy_auto_check_sbp_navigation_MsgItrf"); - TCase *tc_acq = - tcase_create("Automated_Suite_legacy_auto_check_sbp_navigation_MsgItrf"); - tcase_add_test(tc_acq, test_legacy_auto_check_sbp_navigation_MsgItrf); - suite_add_tcase(s, tc_acq); - return s; -} \ No newline at end of file diff --git a/c/test/legacy/cpp/auto_check_sbp_navigation_MsgGPSLeapSecond.cc b/c/test/legacy/cpp/auto_check_sbp_navigation_MsgGPSLeapSecond.cc deleted file mode 100644 index b11d6f0a23..0000000000 --- a/c/test/legacy/cpp/auto_check_sbp_navigation_MsgGPSLeapSecond.cc +++ /dev/null @@ -1,133 +0,0 @@ -/* - * 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/navigation/test_MsgGPSLeapSecond.yaml by -// generate.py. Do not modify by hand! - -#include -#include -#include -#include -class Test_legacy_auto_check_sbp_navigation_MsgGPSLeapSecond0 - : public ::testing::Test, - public sbp::State, - public sbp::IReader, - public sbp::IWriter, - sbp::PayloadHandler { - public: - Test_legacy_auto_check_sbp_navigation_MsgGPSLeapSecond0() - : ::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_gps_leap_second_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_gps_leap_second_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_navigation_MsgGPSLeapSecond0, Test) { - uint8_t encoded_frame[] = { - 85, 58, 2, 66, 0, 14, 1, 0, 2, 0, 3, 4, 5, 0, 6, 0, 7, 0, 8, 9, 50, 232, - }; - - uint8_t test_msg_storage[SBP_MAX_PAYLOAD_LEN]{}; - uint8_t test_msg_len = 0; - msg_gps_leap_second_t *test_msg = (msg_gps_leap_second_t *)test_msg_storage; - test_msg_len = (uint8_t)sizeof(*test_msg); - test_msg->bias_coeff = 1; - test_msg->count_after = 9; - test_msg->count_before = 4; - test_msg->drift_coeff = 2; - test_msg->drift_rate_coeff = 3; - test_msg->ref_dn = 8; - test_msg->ref_wn = 7; - test_msg->tow_s = 5; - test_msg->wn = 6; - - EXPECT_EQ(send_message(570, 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_->bias_coeff, 1) - << "incorrect value for bias_coeff, expected 1, is " - << last_msg_->bias_coeff; - EXPECT_EQ(last_msg_->count_after, 9) - << "incorrect value for count_after, expected 9, is " - << last_msg_->count_after; - EXPECT_EQ(last_msg_->count_before, 4) - << "incorrect value for count_before, expected 4, is " - << last_msg_->count_before; - EXPECT_EQ(last_msg_->drift_coeff, 2) - << "incorrect value for drift_coeff, expected 2, is " - << last_msg_->drift_coeff; - EXPECT_EQ(last_msg_->drift_rate_coeff, 3) - << "incorrect value for drift_rate_coeff, expected 3, is " - << last_msg_->drift_rate_coeff; - EXPECT_EQ(last_msg_->ref_dn, 8) - << "incorrect value for ref_dn, expected 8, is " << last_msg_->ref_dn; - EXPECT_EQ(last_msg_->ref_wn, 7) - << "incorrect value for ref_wn, expected 7, is " << last_msg_->ref_wn; - EXPECT_EQ(last_msg_->tow_s, 5) - << "incorrect value for tow_s, expected 5, is " << last_msg_->tow_s; - EXPECT_EQ(last_msg_->wn, 6) - << "incorrect value for wn, expected 6, is " << last_msg_->wn; -} diff --git a/c/test/legacy/cpp/auto_check_sbp_navigation_MsgItrf.cc b/c/test/legacy/cpp/auto_check_sbp_navigation_MsgItrf.cc deleted file mode 100644 index 584d12a706..0000000000 --- a/c/test/legacy/cpp/auto_check_sbp_navigation_MsgItrf.cc +++ /dev/null @@ -1,226 +0,0 @@ -/* - * 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/navigation/test_MsgItrf.yaml by generate.py. Do -// not modify by hand! - -#include -#include -#include -#include -class Test_legacy_auto_check_sbp_navigation_MsgItrf0 - : public ::testing::Test, - public sbp::State, - public sbp::IReader, - public sbp::IWriter, - sbp::PayloadHandler { - public: - Test_legacy_auto_check_sbp_navigation_MsgItrf0() - : ::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_itrf_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_itrf_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_navigation_MsgItrf0, Test) { - uint8_t encoded_frame[] = { - 85, 68, 2, 66, 0, 124, 1, 2, 102, 111, 111, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 5, 0, 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, - 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, - 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, - 0, 18, 0, 0, 0, 19, 0, 0, 0, 20, 0, 66, 126, - }; - - uint8_t test_msg_storage[SBP_MAX_PAYLOAD_LEN]{}; - uint8_t test_msg_len = 0; - msg_itrf_t *test_msg = (msg_itrf_t *)test_msg_storage; - test_msg_len = (uint8_t)sizeof(*test_msg); - test_msg->delta_X0 = 7; - test_msg->delta_Y0 = 8; - test_msg->delta_Z0 = 9; - test_msg->dot_delta_X0 = 14; - test_msg->dot_delta_Y0 = 15; - test_msg->dot_delta_Z0 = 16; - test_msg->dot_scale = 20; - test_msg->dot_theta_01 = 17; - test_msg->dot_theta_02 = 18; - test_msg->dot_theta_03 = 19; - test_msg->re_t0 = 6; - test_msg->scale = 13; - test_msg->sin = 4; - { - const char assign_string[] = { - (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0}; - memcpy(test_msg->sn, assign_string, sizeof(assign_string)); - if (sizeof(test_msg->sn) == 0) { - test_msg_len = (uint8_t)(test_msg_len + sizeof(assign_string)); - } - } - test_msg->sn_counter_n = 2; - test_msg->ssr_iod = 1; - test_msg->theta_01 = 10; - test_msg->theta_02 = 11; - test_msg->theta_03 = 12; - { - const char assign_string[] = { - (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0}; - memcpy(test_msg->tn, assign_string, sizeof(assign_string)); - if (sizeof(test_msg->tn) == 0) { - test_msg_len = (uint8_t)(test_msg_len + sizeof(assign_string)); - } - } - test_msg->tn_counter_m = 3; - test_msg->utn = 5; - - EXPECT_EQ(send_message(580, 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_->delta_X0, 7) - << "incorrect value for delta_X0, expected 7, is " << last_msg_->delta_X0; - EXPECT_EQ(last_msg_->delta_Y0, 8) - << "incorrect value for delta_Y0, expected 8, is " << last_msg_->delta_Y0; - EXPECT_EQ(last_msg_->delta_Z0, 9) - << "incorrect value for delta_Z0, expected 9, is " << last_msg_->delta_Z0; - EXPECT_EQ(last_msg_->dot_delta_X0, 14) - << "incorrect value for dot_delta_X0, expected 14, is " - << last_msg_->dot_delta_X0; - EXPECT_EQ(last_msg_->dot_delta_Y0, 15) - << "incorrect value for dot_delta_Y0, expected 15, is " - << last_msg_->dot_delta_Y0; - EXPECT_EQ(last_msg_->dot_delta_Z0, 16) - << "incorrect value for dot_delta_Z0, expected 16, is " - << last_msg_->dot_delta_Z0; - EXPECT_EQ(last_msg_->dot_scale, 20) - << "incorrect value for dot_scale, expected 20, is " - << last_msg_->dot_scale; - EXPECT_EQ(last_msg_->dot_theta_01, 17) - << "incorrect value for dot_theta_01, expected 17, is " - << last_msg_->dot_theta_01; - EXPECT_EQ(last_msg_->dot_theta_02, 18) - << "incorrect value for dot_theta_02, expected 18, is " - << last_msg_->dot_theta_02; - EXPECT_EQ(last_msg_->dot_theta_03, 19) - << "incorrect value for dot_theta_03, expected 19, is " - << last_msg_->dot_theta_03; - EXPECT_EQ(last_msg_->re_t0, 6) - << "incorrect value for re_t0, expected 6, is " << last_msg_->re_t0; - EXPECT_EQ(last_msg_->scale, 13) - << "incorrect value for scale, expected 13, is " << last_msg_->scale; - EXPECT_EQ(last_msg_->sin, 4) - << "incorrect value for sin, expected 4, is " << last_msg_->sin; - { - const char check_string[] = { - (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0}; - EXPECT_EQ(memcmp(last_msg_->sn, check_string, sizeof(check_string)), 0) - << "incorrect value for last_msg_->sn, expected string '" - << check_string << "', is '" << last_msg_->sn << "'"; - } - EXPECT_EQ(last_msg_->sn_counter_n, 2) - << "incorrect value for sn_counter_n, expected 2, is " - << last_msg_->sn_counter_n; - EXPECT_EQ(last_msg_->ssr_iod, 1) - << "incorrect value for ssr_iod, expected 1, is " << last_msg_->ssr_iod; - EXPECT_EQ(last_msg_->theta_01, 10) - << "incorrect value for theta_01, expected 10, is " - << last_msg_->theta_01; - EXPECT_EQ(last_msg_->theta_02, 11) - << "incorrect value for theta_02, expected 11, is " - << last_msg_->theta_02; - EXPECT_EQ(last_msg_->theta_03, 12) - << "incorrect value for theta_03, expected 12, is " - << last_msg_->theta_03; - { - const char check_string[] = { - (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, - (char)0, (char)0, (char)0}; - EXPECT_EQ(memcmp(last_msg_->tn, check_string, sizeof(check_string)), 0) - << "incorrect value for last_msg_->tn, expected string '" - << check_string << "', is '" << last_msg_->tn << "'"; - } - EXPECT_EQ(last_msg_->tn_counter_m, 3) - << "incorrect value for tn_counter_m, expected 3, is " - << last_msg_->tn_counter_m; - EXPECT_EQ(last_msg_->utn, 5) - << "incorrect value for utn, expected 5, is " << last_msg_->utn; -} diff --git a/haskell/src/SwiftNav/SBP/Msg.hs b/haskell/src/SwiftNav/SBP/Msg.hs index b45e2415b5..487619c93b 100644 --- a/haskell/src/SwiftNav/SBP/Msg.hs +++ b/haskell/src/SwiftNav/SBP/Msg.hs @@ -132,7 +132,6 @@ data SBPMsg = | SBPMsgGloBiases MsgGloBiases Msg | SBPMsgGnssCapb MsgGnssCapb Msg | SBPMsgGnssTimeOffset MsgGnssTimeOffset Msg - | SBPMsgGpsLeapSecond MsgGpsLeapSecond Msg | SBPMsgGpsTime MsgGpsTime Msg | SBPMsgGpsTimeDepA MsgGpsTimeDepA Msg | SBPMsgGpsTimeGnss MsgGpsTimeGnss Msg @@ -148,7 +147,6 @@ data SBPMsg = | SBPMsgInsStatus MsgInsStatus Msg | SBPMsgInsUpdates MsgInsUpdates Msg | SBPMsgIono MsgIono Msg - | SBPMsgItrf MsgItrf Msg | SBPMsgLinuxCpuState MsgLinuxCpuState Msg | SBPMsgLinuxCpuStateDepA MsgLinuxCpuStateDepA Msg | SBPMsgLinuxMemState MsgLinuxMemState Msg @@ -366,7 +364,6 @@ instance Binary SBPMsg where | _msgSBPType == msgGloBiases = SBPMsgGloBiases (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgGnssCapb = SBPMsgGnssCapb (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgGnssTimeOffset = SBPMsgGnssTimeOffset (decode (fromStrict (unBytes _msgSBPPayload))) m - | _msgSBPType == msgGpsLeapSecond = SBPMsgGpsLeapSecond (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgGpsTime = SBPMsgGpsTime (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgGpsTimeDepA = SBPMsgGpsTimeDepA (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgGpsTimeGnss = SBPMsgGpsTimeGnss (decode (fromStrict (unBytes _msgSBPPayload))) m @@ -382,7 +379,6 @@ instance Binary SBPMsg where | _msgSBPType == msgInsStatus = SBPMsgInsStatus (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgInsUpdates = SBPMsgInsUpdates (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgIono = SBPMsgIono (decode (fromStrict (unBytes _msgSBPPayload))) m - | _msgSBPType == msgItrf = SBPMsgItrf (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgLinuxCpuState = SBPMsgLinuxCpuState (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgLinuxCpuStateDepA = SBPMsgLinuxCpuStateDepA (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgLinuxMemState = SBPMsgLinuxMemState (decode (fromStrict (unBytes _msgSBPPayload))) m @@ -592,7 +588,6 @@ instance Binary SBPMsg where encoder (SBPMsgGloBiases _ m) = put m encoder (SBPMsgGnssCapb _ m) = put m encoder (SBPMsgGnssTimeOffset _ m) = put m - encoder (SBPMsgGpsLeapSecond _ m) = put m encoder (SBPMsgGpsTime _ m) = put m encoder (SBPMsgGpsTimeDepA _ m) = put m encoder (SBPMsgGpsTimeGnss _ m) = put m @@ -608,7 +603,6 @@ instance Binary SBPMsg where encoder (SBPMsgInsStatus _ m) = put m encoder (SBPMsgInsUpdates _ m) = put m encoder (SBPMsgIono _ m) = put m - encoder (SBPMsgItrf _ m) = put m encoder (SBPMsgLinuxCpuState _ m) = put m encoder (SBPMsgLinuxCpuStateDepA _ m) = put m encoder (SBPMsgLinuxMemState _ m) = put m @@ -822,7 +816,6 @@ instance FromJSON SBPMsg where | msgType == msgGloBiases = SBPMsgGloBiases <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgGnssCapb = SBPMsgGnssCapb <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgGnssTimeOffset = SBPMsgGnssTimeOffset <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj - | msgType == msgGpsLeapSecond = SBPMsgGpsLeapSecond <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgGpsTime = SBPMsgGpsTime <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgGpsTimeDepA = SBPMsgGpsTimeDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgGpsTimeGnss = SBPMsgGpsTimeGnss <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj @@ -838,7 +831,6 @@ instance FromJSON SBPMsg where | msgType == msgInsStatus = SBPMsgInsStatus <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgInsUpdates = SBPMsgInsUpdates <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgIono = SBPMsgIono <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj - | msgType == msgItrf = SBPMsgItrf <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgLinuxCpuState = SBPMsgLinuxCpuState <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgLinuxCpuStateDepA = SBPMsgLinuxCpuStateDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgLinuxMemState = SBPMsgLinuxMemState <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj @@ -1053,7 +1045,6 @@ instance ToJSON SBPMsg where toJSON (SBPMsgGloBiases n m) = toJSON n <<>> toJSON m toJSON (SBPMsgGnssCapb n m) = toJSON n <<>> toJSON m toJSON (SBPMsgGnssTimeOffset n m) = toJSON n <<>> toJSON m - toJSON (SBPMsgGpsLeapSecond n m) = toJSON n <<>> toJSON m toJSON (SBPMsgGpsTime n m) = toJSON n <<>> toJSON m toJSON (SBPMsgGpsTimeDepA n m) = toJSON n <<>> toJSON m toJSON (SBPMsgGpsTimeGnss n m) = toJSON n <<>> toJSON m @@ -1069,7 +1060,6 @@ instance ToJSON SBPMsg where toJSON (SBPMsgInsStatus n m) = toJSON n <<>> toJSON m toJSON (SBPMsgInsUpdates n m) = toJSON n <<>> toJSON m toJSON (SBPMsgIono n m) = toJSON n <<>> toJSON m - toJSON (SBPMsgItrf n m) = toJSON n <<>> toJSON m toJSON (SBPMsgLinuxCpuState n m) = toJSON n <<>> toJSON m toJSON (SBPMsgLinuxCpuStateDepA n m) = toJSON n <<>> toJSON m toJSON (SBPMsgLinuxMemState n m) = toJSON n <<>> toJSON m @@ -1278,7 +1268,6 @@ instance HasMsg SBPMsg where msg f (SBPMsgGloBiases n m) = SBPMsgGloBiases n <$> f m msg f (SBPMsgGnssCapb n m) = SBPMsgGnssCapb n <$> f m msg f (SBPMsgGnssTimeOffset n m) = SBPMsgGnssTimeOffset n <$> f m - msg f (SBPMsgGpsLeapSecond n m) = SBPMsgGpsLeapSecond n <$> f m msg f (SBPMsgGpsTime n m) = SBPMsgGpsTime n <$> f m msg f (SBPMsgGpsTimeDepA n m) = SBPMsgGpsTimeDepA n <$> f m msg f (SBPMsgGpsTimeGnss n m) = SBPMsgGpsTimeGnss n <$> f m @@ -1294,7 +1283,6 @@ instance HasMsg SBPMsg where msg f (SBPMsgInsStatus n m) = SBPMsgInsStatus n <$> f m msg f (SBPMsgInsUpdates n m) = SBPMsgInsUpdates n <$> f m msg f (SBPMsgIono n m) = SBPMsgIono n <$> f m - msg f (SBPMsgItrf n m) = SBPMsgItrf n <$> f m msg f (SBPMsgLinuxCpuState n m) = SBPMsgLinuxCpuState n <$> f m msg f (SBPMsgLinuxCpuStateDepA n m) = SBPMsgLinuxCpuStateDepA n <$> f m msg f (SBPMsgLinuxMemState n m) = SBPMsgLinuxMemState n <$> f m diff --git a/java/src/com/swiftnav/sbp/navigation/MsgGPSLeapSecond.java b/java/src/com/swiftnav/sbp/navigation/MsgGPSLeapSecond.java deleted file mode 100644 index fb942e107b..0000000000 --- a/java/src/com/swiftnav/sbp/navigation/MsgGPSLeapSecond.java +++ /dev/null @@ -1,117 +0,0 @@ -/* 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.navigation; - -// This file was auto-generated from yaml/swiftnav/sbp/navigation.yaml by generate.py. -// Do not modify by hand! - - -import com.swiftnav.sbp.SBPBinaryException; -import com.swiftnav.sbp.SBPMessage; -import org.json.JSONObject; - -/** - * SBP class for message MSG_GPS_LEAP_SECOND (0x023A). - * - *

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

Emulates the GPS CNAV message, reserving bytes for future broadcast of the drift model - * parameters. - */ -public class MsgGPSLeapSecond extends SBPMessage { - public static final int TYPE = 0x023A; - - /** Reserved. Bias coefficient of GPS time scale with respect to UTC drift model. */ - public int bias_coeff; - - /** Reserved. Drift coefficient of GPS time scale with respect to UTC drift model. */ - public int drift_coeff; - - /** - * Reserved. Drift rate correction coefficient of GPS time scale with respect to UTC drift - * model. - */ - public int drift_rate_coeff; - - /** Leap second count before insertion. */ - public int count_before; - - /** Reserved. Drift model reference week second. */ - public int tow_s; - - /** Reserved. Drift model reference week number. */ - public int wn; - - /** Leap second reference week number. */ - public int ref_wn; - - /** Leap second reference day number. */ - public int ref_dn; - - /** Leap second count after insertion. */ - public int count_after; - - public MsgGPSLeapSecond(int sender) { - super(sender, TYPE); - } - - public MsgGPSLeapSecond() { - super(TYPE); - } - - public MsgGPSLeapSecond(SBPMessage msg) throws SBPBinaryException { - super(msg); - assert msg.type == TYPE; - } - - @Override - protected void parse(Parser parser) throws SBPBinaryException { - /* Parse fields from binary */ - bias_coeff = parser.getS16(); - drift_coeff = parser.getS16(); - drift_rate_coeff = parser.getS8(); - count_before = parser.getS8(); - tow_s = parser.getU16(); - wn = parser.getU16(); - ref_wn = parser.getU16(); - ref_dn = parser.getU8(); - count_after = parser.getS8(); - } - - @Override - protected void build(Builder builder) { - builder.putS16(bias_coeff); - builder.putS16(drift_coeff); - builder.putS8(drift_rate_coeff); - builder.putS8(count_before); - builder.putU16(tow_s); - builder.putU16(wn); - builder.putU16(ref_wn); - builder.putU8(ref_dn); - builder.putS8(count_after); - } - - @Override - public JSONObject toJSON() { - JSONObject obj = super.toJSON(); - obj.put("bias_coeff", bias_coeff); - obj.put("drift_coeff", drift_coeff); - obj.put("drift_rate_coeff", drift_rate_coeff); - obj.put("count_before", count_before); - obj.put("tow_s", tow_s); - obj.put("wn", wn); - obj.put("ref_wn", ref_wn); - obj.put("ref_dn", ref_dn); - obj.put("count_after", count_after); - return obj; - } -} diff --git a/java/src/com/swiftnav/sbp/navigation/MsgItrf.java b/java/src/com/swiftnav/sbp/navigation/MsgItrf.java deleted file mode 100644 index 967751a54f..0000000000 --- a/java/src/com/swiftnav/sbp/navigation/MsgItrf.java +++ /dev/null @@ -1,186 +0,0 @@ -/* 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.navigation; - -// This file was auto-generated from yaml/swiftnav/sbp/navigation.yaml by generate.py. -// Do not modify by hand! - - -import com.swiftnav.sbp.SBPBinaryException; -import com.swiftnav.sbp.SBPMessage; -import org.json.JSONObject; - -public class MsgItrf extends SBPMessage { - public static final int TYPE = 0x0244; - - /** SSR IOD parameter. */ - public int ssr_iod; - - /** Source-Name Counter N. */ - public int sn_counter_n; - - /** Source-Name */ - public String sn; - - /** Target-Name Counter M. */ - public int tn_counter_m; - - /** Target-Name */ - public String tn; - - /** System Identification Number. */ - public int sin; - - /** Utilized Transformation Message. */ - public int utn; - - /** - * Reference Epoch t0 for transformation parameter set given as Modified Julian Day (MDJ) Number - * minus 44244 days. - */ - public int re_t0; - - /** Translation in X for Reference Epoch t0. */ - public int delta_X0; - - /** Translation in Y for Reference Epoch t0. */ - public int delta_Y0; - - /** Translation in Z for Reference Epoch t0. */ - public int delta_Z0; - - /** Rotation around the X-axis for Reference Epoch t0. */ - public int theta_01; - - /** Rotation around the Y-axis for Reference Epoch t0. */ - public int theta_02; - - /** Rotation around the Z-axis for Reference Epoch t0. */ - public int theta_03; - - /** Scale correction for Reference Epoch t0. */ - public int scale; - - /** Rate of change of translation in X. */ - public int dot_delta_X0; - - /** Rate of change of translation in Y. */ - public int dot_delta_Y0; - - /** Rate of change of translation in Z. */ - public int dot_delta_Z0; - - /** Rate of change of rotation around the X-axis. */ - public int dot_theta_01; - - /** Rate of change of rotation around the Y-axis. */ - public int dot_theta_02; - - /** Rate of change of rotation around the Z-axis. */ - public int dot_theta_03; - - /** Rate of change of scale correction. */ - public int dot_scale; - - public MsgItrf(int sender) { - super(sender, TYPE); - } - - public MsgItrf() { - super(TYPE); - } - - public MsgItrf(SBPMessage msg) throws SBPBinaryException { - super(msg); - assert msg.type == TYPE; - } - - @Override - protected void parse(Parser parser) throws SBPBinaryException { - /* Parse fields from binary */ - ssr_iod = parser.getU8(); - sn_counter_n = parser.getU8(); - sn = parser.getString(31); - tn_counter_m = parser.getU8(); - tn = parser.getString(31); - sin = parser.getU8(); - utn = parser.getU16(); - re_t0 = parser.getU16(); - delta_X0 = parser.getS32(); - delta_Y0 = parser.getS32(); - delta_Z0 = parser.getS32(); - theta_01 = parser.getS32(); - theta_02 = parser.getS32(); - theta_03 = parser.getS32(); - scale = parser.getS32(); - dot_delta_X0 = parser.getS32(); - dot_delta_Y0 = parser.getS32(); - dot_delta_Z0 = parser.getS32(); - dot_theta_01 = parser.getS32(); - dot_theta_02 = parser.getS32(); - dot_theta_03 = parser.getS32(); - dot_scale = parser.getS16(); - } - - @Override - protected void build(Builder builder) { - builder.putU8(ssr_iod); - builder.putU8(sn_counter_n); - builder.putString(sn, 31); - builder.putU8(tn_counter_m); - builder.putString(tn, 31); - builder.putU8(sin); - builder.putU16(utn); - builder.putU16(re_t0); - builder.putS32(delta_X0); - builder.putS32(delta_Y0); - builder.putS32(delta_Z0); - builder.putS32(theta_01); - builder.putS32(theta_02); - builder.putS32(theta_03); - builder.putS32(scale); - builder.putS32(dot_delta_X0); - builder.putS32(dot_delta_Y0); - builder.putS32(dot_delta_Z0); - builder.putS32(dot_theta_01); - builder.putS32(dot_theta_02); - builder.putS32(dot_theta_03); - builder.putS16(dot_scale); - } - - @Override - public JSONObject toJSON() { - JSONObject obj = super.toJSON(); - obj.put("ssr_iod", ssr_iod); - obj.put("sn_counter_n", sn_counter_n); - obj.put("sn", sn); - obj.put("tn_counter_m", tn_counter_m); - obj.put("tn", tn); - obj.put("sin", sin); - obj.put("utn", utn); - obj.put("re_t0", re_t0); - obj.put("delta_X0", delta_X0); - obj.put("delta_Y0", delta_Y0); - obj.put("delta_Z0", delta_Z0); - obj.put("theta_01", theta_01); - obj.put("theta_02", theta_02); - obj.put("theta_03", theta_03); - obj.put("scale", scale); - obj.put("dot_delta_X0", dot_delta_X0); - obj.put("dot_delta_Y0", dot_delta_Y0); - obj.put("dot_delta_Z0", dot_delta_Z0); - obj.put("dot_theta_01", dot_theta_01); - obj.put("dot_theta_02", dot_theta_02); - obj.put("dot_theta_03", dot_theta_03); - obj.put("dot_scale", dot_scale); - return obj; - } -} diff --git a/java/src/com/swiftnav/sbp/ssr/MsgSsrOrbitClockBounds.java b/java/src/com/swiftnav/sbp/ssr/MsgSsrOrbitClockBounds.java index 7582d2fb87..bc443760d9 100644 --- a/java/src/com/swiftnav/sbp/ssr/MsgSsrOrbitClockBounds.java +++ b/java/src/com/swiftnav/sbp/ssr/MsgSsrOrbitClockBounds.java @@ -26,8 +26,11 @@ *

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

Note 1: Range: 0-55 m. i<=200, mean=0.0251i; 200240, - * mean=25+2(i-240). + *

Note 1: Range: 0-17.5 m. i<=200, mean=0.01i; 200230, + * mean=5+0.5(i-230). + * + *

Note 2: Range: 0-17.5 m. i<=200, std=0.01i; 200230, + * std=5+0.5(i-230). */ public class MsgSsrOrbitClockBounds extends SBPMessage { public static final int TYPE = 0x05DE; diff --git a/java/src/com/swiftnav/sbp/ssr/OrbitClockBound.java b/java/src/com/swiftnav/sbp/ssr/OrbitClockBound.java index d9b8a8d195..09441878ca 100644 --- a/java/src/com/swiftnav/sbp/ssr/OrbitClockBound.java +++ b/java/src/com/swiftnav/sbp/ssr/OrbitClockBound.java @@ -37,19 +37,19 @@ public class OrbitClockBound extends SBPStruct { /** Mean Cross-Track. See Note 1. */ public int orb_cross_bound_mu; - /** Standard Deviation Radial. See Note 1. */ + /** Standard Deviation Radial. See Note 2. */ public int orb_radial_bound_sig; - /** Standard Deviation Along-Track. See Note 1. */ + /** Standard Deviation Along-Track. See Note 2. */ public int orb_along_bound_sig; - /** Standard Deviation Cross-Track. See Note 1. */ + /** Standard Deviation Cross-Track. See Note 2. */ public int orb_cross_bound_sig; /** Clock Bound Mean. See Note 1. */ public int clock_bound_mu; - /** Clock Bound Standard Deviation. See Note 1. */ + /** Clock Bound Standard Deviation. See Note 2. */ public int clock_bound_sig; public OrbitClockBound() {} diff --git a/java/src/com/swiftnav/sbp/ssr/STECSatElementIntegrity.java b/java/src/com/swiftnav/sbp/ssr/STECSatElementIntegrity.java index 1eb41b2eb6..d8ecbd928d 100644 --- a/java/src/com/swiftnav/sbp/ssr/STECSatElementIntegrity.java +++ b/java/src/com/swiftnav/sbp/ssr/STECSatElementIntegrity.java @@ -31,10 +31,10 @@ public class STECSatElementIntegrity extends SBPStruct { /** Error Bound StDev. See Note 1. */ public int stec_bound_sig; - /** Error Bound Mean First derivative. Range: 0-0.01275 m/s */ + /** Error Bound Mean First derivative. */ public int stec_bound_mu_dot; - /** Error Bound StDev First derivative. Range: 0-0.01275 m/s */ + /** Error Bound StDev First derivative. */ public int stec_bound_sig_dot; public STECSatElementIntegrity() {} diff --git a/java/test/auto_check_sbp_navigation_MsgGPSLeapSecondTest.java b/java/test/auto_check_sbp_navigation_MsgGPSLeapSecondTest.java deleted file mode 100644 index 89679f9942..0000000000 --- a/java/test/auto_check_sbp_navigation_MsgGPSLeapSecondTest.java +++ /dev/null @@ -1,130 +0,0 @@ -/* 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/navigation/test_MsgGPSLeapSecond.yaml by generate.py. Do not modify -// by hand! - - -import com.swiftnav.sbp.SBPMessage; -import com.swiftnav.sbp.navigation.MsgGPSLeapSecond; -import java.math.BigInteger; -import org.json.JSONObject; -import org.junit.Test; - -public class auto_check_sbp_navigation_MsgGPSLeapSecondTest { - - 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_navigation_MsgGPSLeapSecondTest.test1"); - byte[] payload = - new byte[] { - (byte) 1, (byte) 0, (byte) 2, (byte) 0, (byte) 3, (byte) 4, (byte) 5, (byte) 0, - (byte) 6, (byte) 0, (byte) 7, (byte) 0, (byte) 8, (byte) 9, - }; - SBPMessage sbp = new SBPMessage(0x0042, 0x023A, payload); - MsgGPSLeapSecond msg = new MsgGPSLeapSecond(sbp); - JSONObject json = msg.toJSON(); - Number value; - Number expected; - value = msg.bias_coeff; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.bias_coeff + "' != '" + 1 + "'", - value.equals(BigInteger.valueOf(1L))); - } else { - value = value.longValue(); - expected = 1L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.count_after; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.count_after + "' != '" + 9 + "'", - value.equals(BigInteger.valueOf(9L))); - } else { - value = value.longValue(); - expected = 9L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.count_before; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.count_before + "' != '" + 4 + "'", - value.equals(BigInteger.valueOf(4L))); - } else { - value = value.longValue(); - expected = 4L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.drift_coeff; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.drift_coeff + "' != '" + 2 + "'", - value.equals(BigInteger.valueOf(2L))); - } else { - value = value.longValue(); - expected = 2L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.drift_rate_coeff; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.drift_rate_coeff + "' != '" + 3 + "'", - value.equals(BigInteger.valueOf(3L))); - } else { - value = value.longValue(); - expected = 3L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.ref_dn; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.ref_dn + "' != '" + 8 + "'", value.equals(BigInteger.valueOf(8L))); - } else { - value = value.longValue(); - expected = 8L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.ref_wn; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.ref_wn + "' != '" + 7 + "'", value.equals(BigInteger.valueOf(7L))); - } else { - value = value.longValue(); - expected = 7L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.tow_s; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.tow_s + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); - } else { - value = value.longValue(); - expected = 5L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.wn; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.wn + "' != '" + 6 + "'", value.equals(BigInteger.valueOf(6L))); - } else { - value = value.longValue(); - expected = 6L; - org.junit.Assert.assertEquals(value, expected); - } - } -} diff --git a/java/test/auto_check_sbp_navigation_MsgItrfTest.java b/java/test/auto_check_sbp_navigation_MsgItrfTest.java deleted file mode 100644 index 72810fc3b7..0000000000 --- a/java/test/auto_check_sbp_navigation_MsgItrfTest.java +++ /dev/null @@ -1,358 +0,0 @@ -/* 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/navigation/test_MsgItrf.yaml by -// generate.py. Do not modify by hand! - - -import com.swiftnav.sbp.SBPMessage; -import com.swiftnav.sbp.navigation.MsgItrf; -import java.math.BigInteger; -import org.json.JSONObject; -import org.junit.Test; - -public class auto_check_sbp_navigation_MsgItrfTest { - - 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_navigation_MsgItrfTest.test1"); - byte[] payload = - new byte[] { - (byte) 1, - (byte) 2, - (byte) 102, - (byte) 111, - (byte) 111, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 3, - (byte) 98, - (byte) 97, - (byte) 114, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 4, - (byte) 5, - (byte) 0, - (byte) 6, - (byte) 0, - (byte) 7, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 8, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 9, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 10, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 11, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 12, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 13, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 14, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 15, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 16, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 17, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 18, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 19, - (byte) 0, - (byte) 0, - (byte) 0, - (byte) 20, - (byte) 0, - }; - SBPMessage sbp = new SBPMessage(0x0042, 0x0244, payload); - MsgItrf msg = new MsgItrf(sbp); - JSONObject json = msg.toJSON(); - Number value; - Number expected; - value = msg.delta_X0; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.delta_X0 + "' != '" + 7 + "'", value.equals(BigInteger.valueOf(7L))); - } else { - value = value.longValue(); - expected = 7L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.delta_Y0; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.delta_Y0 + "' != '" + 8 + "'", value.equals(BigInteger.valueOf(8L))); - } else { - value = value.longValue(); - expected = 8L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.delta_Z0; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.delta_Z0 + "' != '" + 9 + "'", value.equals(BigInteger.valueOf(9L))); - } else { - value = value.longValue(); - expected = 9L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.dot_delta_X0; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.dot_delta_X0 + "' != '" + 14 + "'", - value.equals(BigInteger.valueOf(14L))); - } else { - value = value.longValue(); - expected = 14L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.dot_delta_Y0; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.dot_delta_Y0 + "' != '" + 15 + "'", - value.equals(BigInteger.valueOf(15L))); - } else { - value = value.longValue(); - expected = 15L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.dot_delta_Z0; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.dot_delta_Z0 + "' != '" + 16 + "'", - value.equals(BigInteger.valueOf(16L))); - } else { - value = value.longValue(); - expected = 16L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.dot_scale; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.dot_scale + "' != '" + 20 + "'", - value.equals(BigInteger.valueOf(20L))); - } else { - value = value.longValue(); - expected = 20L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.dot_theta_01; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.dot_theta_01 + "' != '" + 17 + "'", - value.equals(BigInteger.valueOf(17L))); - } else { - value = value.longValue(); - expected = 17L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.dot_theta_02; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.dot_theta_02 + "' != '" + 18 + "'", - value.equals(BigInteger.valueOf(18L))); - } else { - value = value.longValue(); - expected = 18L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.dot_theta_03; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.dot_theta_03 + "' != '" + 19 + "'", - value.equals(BigInteger.valueOf(19L))); - } else { - value = value.longValue(); - expected = 19L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.re_t0; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.re_t0 + "' != '" + 6 + "'", value.equals(BigInteger.valueOf(6L))); - } else { - value = value.longValue(); - expected = 6L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.scale; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.scale + "' != '" + 13 + "'", value.equals(BigInteger.valueOf(13L))); - } else { - value = value.longValue(); - expected = 13L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.sin; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.sin + "' != '" + 4 + "'", value.equals(BigInteger.valueOf(4L))); - } else { - value = value.longValue(); - expected = 4L; - org.junit.Assert.assertEquals(value, expected); - } - org.junit.Assert.assertEquals(msg.sn, "foo"); - value = msg.sn_counter_n; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.sn_counter_n + "' != '" + 2 + "'", - value.equals(BigInteger.valueOf(2L))); - } else { - value = value.longValue(); - expected = 2L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.ssr_iod; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.ssr_iod + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); - } else { - value = value.longValue(); - expected = 1L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.theta_01; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.theta_01 + "' != '" + 10 + "'", - value.equals(BigInteger.valueOf(10L))); - } else { - value = value.longValue(); - expected = 10L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.theta_02; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.theta_02 + "' != '" + 11 + "'", - value.equals(BigInteger.valueOf(11L))); - } else { - value = value.longValue(); - expected = 11L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.theta_03; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.theta_03 + "' != '" + 12 + "'", - value.equals(BigInteger.valueOf(12L))); - } else { - value = value.longValue(); - expected = 12L; - org.junit.Assert.assertEquals(value, expected); - } - org.junit.Assert.assertEquals(msg.tn, "bar"); - value = msg.tn_counter_m; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.tn_counter_m + "' != '" + 3 + "'", - value.equals(BigInteger.valueOf(3L))); - } else { - value = value.longValue(); - expected = 3L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.utn; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.utn + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); - } else { - value = value.longValue(); - expected = 5L; - org.junit.Assert.assertEquals(value, expected); - } - } -} diff --git a/jsonschema/MsgGPSLeapSecond.json b/jsonschema/MsgGPSLeapSecond.json deleted file mode 100644 index 3aafff0ae3..0000000000 --- a/jsonschema/MsgGPSLeapSecond.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "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": "#MsgGPSLeapSecond", - "title":"MsgGPSLeapSecond", - "description":"Emulates the GPS CNAV message, reserving bytes for future broadcast of the drift model parameters.\n", - "type": "object", - "properties": { - "bias_coeff": {"type": "integer"}, - "drift_coeff": {"type": "integer"}, - "drift_rate_coeff": {"type": "integer"}, - "count_before": {"type": "integer"}, - "tow_s": {"type": "integer"}, - "wn": {"type": "integer"}, - "ref_wn": {"type": "integer"}, - "ref_dn": {"type": "integer"}, - "count_after": {"type": "integer"} - }, - "required": [ - "bias_coeff", - "drift_coeff", - "drift_rate_coeff", - "count_before", - "tow_s", - "wn", - "ref_wn", - "ref_dn", - "count_after" - ] -} \ No newline at end of file diff --git a/jsonschema/MsgItrf.json b/jsonschema/MsgItrf.json deleted file mode 100644 index 58c7d85a9a..0000000000 --- a/jsonschema/MsgItrf.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "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": "#MsgItrf", - "title":"MsgItrf", - "description":"", - "type": "object", - "properties": { - "ssr_iod": {"type": "integer"}, - "sn_counter_n": {"type": "integer"}, - "sn": {"type": "string"}, - "tn_counter_m": {"type": "integer"}, - "tn": {"type": "string"}, - "sin": {"type": "integer"}, - "utn": {"type": "integer"}, - "re_t0": {"type": "integer"}, - "delta_X0": {"type": "integer"}, - "delta_Y0": {"type": "integer"}, - "delta_Z0": {"type": "integer"}, - "theta_01": {"type": "integer"}, - "theta_02": {"type": "integer"}, - "theta_03": {"type": "integer"}, - "scale": {"type": "integer"}, - "dot_delta_X0": {"type": "integer"}, - "dot_delta_Y0": {"type": "integer"}, - "dot_delta_Z0": {"type": "integer"}, - "dot_theta_01": {"type": "integer"}, - "dot_theta_02": {"type": "integer"}, - "dot_theta_03": {"type": "integer"}, - "dot_scale": {"type": "integer"} - }, - "required": [ - "ssr_iod", - "sn_counter_n", - "sn", - "tn_counter_m", - "tn", - "sin", - "utn", - "re_t0", - "delta_X0", - "delta_Y0", - "delta_Z0", - "theta_01", - "theta_02", - "theta_03", - "scale", - "dot_delta_X0", - "dot_delta_Y0", - "dot_delta_Z0", - "dot_theta_01", - "dot_theta_02", - "dot_theta_03", - "dot_scale" - ] -} \ No newline at end of file diff --git a/jsonschema/MsgSsrOrbitClockBounds.json b/jsonschema/MsgSsrOrbitClockBounds.json index 2f6e970226..bcce16857d 100644 --- a/jsonschema/MsgSsrOrbitClockBounds.json +++ b/jsonschema/MsgSsrOrbitClockBounds.json @@ -13,7 +13,7 @@ "$schema": "http://json-schema.org/draft-06/schema#", "$id": "#MsgSsrOrbitClockBounds", "title":"MsgSsrOrbitClockBounds", - "description":"Note 1: Range: 0-55 m. i<=200, mean=0.0251i; 200240, mean=25+2(i-240).\n", + "description":"Note 1: Range: 0-17.5 m. i<=200, mean=0.01i; 200230, mean=5+0.5(i-230).,\n,\nNote 2: Range: 0-17.5 m. i<=200, std=0.01i; 200230, std=5+0.5(i-230).\n", "type": "object", "properties": { "stub": {"type": "array", "items": {"type": "integer"}} diff --git a/rust/sbp/tests/integration/auto_check_sbp_navigation_msg_gps_leap_second.rs b/rust/sbp/tests/integration/auto_check_sbp_navigation_msg_gps_leap_second.rs deleted file mode 100644 index b8790f7f31..0000000000 --- a/rust/sbp/tests/integration/auto_check_sbp_navigation_msg_gps_leap_second.rs +++ /dev/null @@ -1,95 +0,0 @@ -// -// 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/navigation/test_MsgGPSLeapSecond.yaml by generate.py. Do not modify by hand! - -use crate::*; - -#[test] -fn test_auto_check_sbp_navigation_msg_gps_leap_second() { - { - let mut payload = Cursor::new(vec![ - 85, 58, 2, 66, 0, 14, 1, 0, 2, 0, 3, 4, 5, 0, 6, 0, 7, 0, 8, 9, 50, 232, - ]); - - // 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::MsgGpsLeapSecond(msg) => { - assert_eq!( - msg.message_type(), - 570, - "Incorrect message type, expected 570, 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.bias_coeff, 1, - "incorrect value for bias_coeff, expected 1, is {}", - msg.bias_coeff - ); - assert_eq!( - msg.count_after, 9, - "incorrect value for count_after, expected 9, is {}", - msg.count_after - ); - assert_eq!( - msg.count_before, 4, - "incorrect value for count_before, expected 4, is {}", - msg.count_before - ); - assert_eq!( - msg.drift_coeff, 2, - "incorrect value for drift_coeff, expected 2, is {}", - msg.drift_coeff - ); - assert_eq!( - msg.drift_rate_coeff, 3, - "incorrect value for drift_rate_coeff, expected 3, is {}", - msg.drift_rate_coeff - ); - assert_eq!( - msg.ref_dn, 8, - "incorrect value for ref_dn, expected 8, is {}", - msg.ref_dn - ); - assert_eq!( - msg.ref_wn, 7, - "incorrect value for ref_wn, expected 7, is {}", - msg.ref_wn - ); - assert_eq!( - msg.tow_s, 5, - "incorrect value for tow_s, expected 5, is {}", - msg.tow_s - ); - assert_eq!( - msg.wn, 6, - "incorrect value for wn, expected 6, is {}", - msg.wn - ); - } - _ => panic!("Invalid message type! Expected a MsgGPSLeapSecond"), - }; - let frame = sbp::to_vec(&sbp_msg).unwrap(); - assert_eq!(frame, payload.into_inner()); - } -} diff --git a/rust/sbp/tests/integration/auto_check_sbp_navigation_msg_itrf.rs b/rust/sbp/tests/integration/auto_check_sbp_navigation_msg_itrf.rs deleted file mode 100644 index 0a001b9642f550a4d0ebe3f91094ddf4e4baa84a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6716 zcmcIpZExC05bkGw#e|a@bD{>5mnNKg5(VdCU4RJ4^{T3}9J7G$!1j69NobV+elvb2 z&|s%7ioo{nGxN;L&a5|$My1h!uH&vfYrYU5b!*USD(CN7&6Wb=dut|OVBA@ALs*Ut znr+GyMFLgs|9jXT+NRydL7P8Jpi?)aX`fUf-8f0!viI3N}b zmX^tE&S2*F_7p5TcsR3`3=Xfft~wa2hj72J%mu7`E=b-jqra)eg=gLRf=yA>oS`fa z?k%xE0f{~tI?E+E!B}7)2aj>)-LWZ|5wN?|#?T%1ROk$PpbajDqkdfhHRbv#Doa0FWa z`btxKb(G${y6I_yKj0(E7z`(HrS-K5&YBDXaq&zN6lu`ZG3n^5qwXat?0nR&G*pXR z8z}ign+#A5AZh5pb!Rlux;Iyy5nSJlu7_h)t^_8MLjsrH8ypN@IPd1nW}ZR5n|aO( zxXa9jU|jIV+E^_caTFW;)@@)kqwoh)^gf?!!kfu76K>ZK%aYx-3_S;IN5IONTC+8c zE)08mP^tJBVv{ts+rR!+sr>SVw0*72Fy45f6Di$XF!Ns>RqClqeZ}Xxh3cdlJXQcd z;Wu3^87lGxxW;xA8XmXoc`}`niBb>q4HGF%G7=Xj8jf)sv;_0?7318P zGcLW&q#){#)zdG{mu>bSq}s-F8k5-rE;=DqZ3iM*VGXRlFn4BPVWfJ8W_Y-wB47sc zlrmTu0;}fR*r-jD@M*gp+t6;0>9!v(Yzb-C;KT3FoIs=vj>S{x?7stP%ODy@q#Oy= z#oA?3Ee#Hh$Dfn4XBig{RI$N0o=5#5b_&UtF84KZKP$|gPziUeLixC_o8@x< zhAhqtb0<{79gAi@?%&Ge?g%}OC6?#oA_iAKA< zfemPC3AW(;mXw%J2_4D~?6_MlB5N`gXqP1$iA7yIza`~n7dMS1b_Co66f+~jCDEW= zL>?Og+?J|Wbb_FyVkq!+1j}lZwwi_N>IO71gZ4~$%!sxA1WRb=T&T*XmLN2>Bu}Z$ zK!1WIxPQf+=9b_Wmq+ASgr=6{DZHsAM_USCnOz>!1!i@T1s*{X>Nys604a-dv?`UO z0$zW}{rmW|i*h@QOq_wmZ(rrk zB1^M_<4cZ%Zx>3DH5Y>t_SnDnvJXLJ5szCKGB48nQ&`G9NAHheC9|hyS;X-Xjg3Z` z!}T$&WcJh`i)4O8W1~6dNc$L88v8so@Ye8ND1mQ&qy~!D*1#Xu9`Vv%bfkuan{T;Rt%4_f}=j%0pNkS6rTp} fI?&3T2nEo3d{!!3Ho`3%|79T6B7Z+so+|$XUgIpD diff --git a/rust/sbp/tests/integration/main.rs b/rust/sbp/tests/integration/main.rs index 3632945797..b0f8b2e455 100644 --- a/rust/sbp/tests/integration/main.rs +++ b/rust/sbp/tests/integration/main.rs @@ -34,11 +34,9 @@ mod auto_check_sbp_navigation_msg_baseline_ned; mod auto_check_sbp_navigation_msg_baseline_ned_dep_a; mod auto_check_sbp_navigation_msg_dops; mod auto_check_sbp_navigation_msg_dops_dep_a; -mod auto_check_sbp_navigation_msg_gps_leap_second; mod auto_check_sbp_navigation_msg_gps_time; mod auto_check_sbp_navigation_msg_gps_time_dep_a; mod auto_check_sbp_navigation_msg_gps_time_gnss; -mod auto_check_sbp_navigation_msg_itrf; mod auto_check_sbp_navigation_msg_pos_ecef; mod auto_check_sbp_navigation_msg_pos_ecef_cov; mod auto_check_sbp_navigation_msg_pos_ecef_cov_gnss; diff --git a/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgGPSLeapSecond.yaml b/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgGPSLeapSecond.yaml deleted file mode 100644 index f321f1d81b..0000000000 --- a/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgGPSLeapSecond.yaml +++ /dev/null @@ -1,30 +0,0 @@ -description: Unit tests for swiftnav.sbp.navigation MsgGPSLeapSecond -generated_on: 2022-05-11 # manually generated -package: sbp.navigation -tests: - - - msg: - fields: - bias_coeff: 1 - drift_coeff: 2 - drift_rate_coeff: 3 - count_before: 4 - tow_s: 5 - wn: 6 - ref_wn: 7 - ref_dn: 8 - count_after: 9 - module: sbp.navigation - name: MsgGPSLeapSecond - msg_type: '570' - raw_json: '{"bias_coeff": 1, "drift_coeff": 2, "drift_rate_coeff": 3, "count_before": 4, "tow_s": 5, "wn": 6, - "ref_wn": 7, "ref_dn": 8, "count_after": 9, "preamble": 85, "msg_type": 570, "sender": 66, "length": 14, - "payload": "AQACAAMEBQAGAAcACAk=", "crc": 59442}' - raw_packet: VToCQgAOAQACAAMEBQAGAAcACAky6A== - sbp: - preamble: '0x55' - msg_type: '0x023A' - sender: '0x0042' - length: 14 - payload: AQACAAMEBQAGAAcACAk= - crc: '0xE832' diff --git a/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgItrf.yaml b/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgItrf.yaml deleted file mode 100644 index 04beccb51d..0000000000 --- a/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgItrf.yaml +++ /dev/null @@ -1,47 +0,0 @@ -description: Unit tests for swiftnav.sbp.navigation MsgItrf -generated_on: 2022-05-11 # manually generated -package: sbp.navigation -tests: - - - msg: - fields: - ssr_iod: 1 - sn_counter_n: 2 - sn: "foo\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - tn_counter_m: 3 - tn: "bar\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - sin: 4 - utn: 5 - re_t0: 6 - delta_X0: 7 - delta_Y0: 8 - delta_Z0: 9 - theta_01: 10 - theta_02: 11 - theta_03: 12 - scale: 13 - dot_delta_X0: 14 - dot_delta_Y0: 15 - dot_delta_Z0: 16 - dot_theta_01: 17 - dot_theta_02: 18 - dot_theta_03: 19 - dot_scale: 20 - module: sbp.navigation - name: MsgItrf - msg_type: '580' - raw_json: '{"ssr_iod": 1, "sn_counter_n": 2, "sn": "foo\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "tn_counter_m": 3, "tn": "bar\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "sin": 4, "utn": 5, "re_t0": 6, "delta_X0": 7, "delta_Y0": 8, "delta_Z0": 9, "theta_01": 10, "theta_02": 11, "theta_03": 12, "scale": 13, - "dot_delta_X0": 14, "dot_delta_Y0": 15, "dot_delta_Z0": 16, "dot_theta_01": 17, "dot_theta_02": 18, "dot_theta_03": 19, "dot_scale": 20, - "preamble": 85, "msg_type": 580, "sender": 66, "length": 124, - "payload": "AQJmb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JhcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBQAGAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAA==", - "crc": 32322}' - raw_packet: VUQCQgB8AQJmb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JhcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBQAGAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAEJ+ - sbp: - preamble: '0x55' - msg_type: '0x0244' - sender: '0x0042' - length: 124 - payload: AQJmb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JhcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBQAGAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAA== - crc: '0x7E42' diff --git a/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgReferenceFrameParam.yaml b/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgReferenceFrameParam.yaml index 7d7c14b276..358fc49aed 100644 --- a/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgReferenceFrameParam.yaml +++ b/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgReferenceFrameParam.yaml @@ -5,30 +5,42 @@ tests: - msg: fields: - stub: [1, 2, 102, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, - 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, - 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 14, 0, 0, 0, - 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 19, - 0, 0, 0, 20, 0] - c_decoded_fields: - n_stub: 124 + ssr_iod: 1 + sn: "foo\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + tn: "bar\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + sin: 4 + utn: 5 + re_t0: 6 + delta_X0: 7 + delta_Y0: 8 + delta_Z0: 9 + theta_01: 10 + theta_02: 11 + theta_03: 12 + scale: 13 + dot_delta_X0: 14 + dot_delta_Y0: 15 + dot_delta_Z0: 16 + dot_theta_01: 17 + dot_theta_02: 18 + dot_theta_03: 19 + dot_scale: 20 module: sbp.navigation name: MsgReferenceFrameParam msg_type: '580' - raw_json: '{"stub": [1,2,102,111,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,98,97,114,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,5,0,6,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,12,0,0,0,13,0,0, - 0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0], + raw_json: '{"ssr_iod": 1, + "sn": "foo\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "tn": "bar\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "sin": 4, "utn": 5, "re_t0": 6, "delta_X0": 7, "delta_Y0": 8, "delta_Z0": 9, "theta_01": 10, "theta_02": 11, "theta_03": 12, "scale": 13, + "dot_delta_X0": 14, "dot_delta_Y0": 15, "dot_delta_Z0": 16, "dot_theta_01": 17, "dot_theta_02": 18, "dot_theta_03": 19, "dot_scale": 20, "preamble": 85, "msg_type": 580, "sender": 66, "length": 124, - "payload": "AQJmb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JhcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBQAGAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAA==", - "crc": 32322}' - raw_packet: VUQCQgB8AQJmb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JhcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBQAGAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAEJ+ + "payload": "AWZvbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYmFyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBQAGAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAA==", + "crc": 41222}' + raw_packet: VUQCQgB8AWZvbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYmFyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBQAGAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAah sbp: preamble: '0x55' msg_type: '0x0244' sender: '0x0042' length: 124 - payload: AQJmb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2JhcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBQAGAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAA== - crc: '0x7E42' + payload: AWZvbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYmFyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBQAGAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAA== + crc: '0xA106' diff --git a/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgUTCLeapSecond.yaml b/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgUTCLeapSecond.yaml index fd311d2be2..4d0593b5a7 100644 --- a/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgUTCLeapSecond.yaml +++ b/spec/tests/yaml/swiftnav/sbp/navigation/test_MsgUTCLeapSecond.yaml @@ -5,14 +5,20 @@ tests: - msg: fields: - stub: [1, 0, 2, 0, 3, 4, 5, 0, 6, 0, 7, 0, 8, 9] - c_decoded_fields: - n_stub: 14 + bias_coeff: 1 + drift_coeff: 2 + drift_rate_coeff: 3 + count_before: 4 + tow_s: 5 + wn: 6 + ref_wn: 7 + ref_dn: 8 + count_after: 9 module: sbp.navigation name: MsgUtcLeapSecond msg_type: '570' - raw_json: '{"stub": [1, 0, 2, 0, 3, 4, 5, 0, 6, 0, 7, 0, 8, 9], - "preamble": 85, "msg_type": 570, "sender": 66, "length": 14, + raw_json: '{"bias_coeff": 1, "drift_coeff": 2, "drift_rate_coeff": 3, "count_before": 4, "tow_s": 5, "wn": 6, + "ref_wn": 7, "ref_dn": 8, "count_after": 9, "preamble": 85, "msg_type": 570, "sender": 66, "length": 14, "payload": "AQACAAMEBQAGAAcACAk=", "crc": 59442}' raw_packet: VToCQgAOAQACAAMEBQAGAAcACAky6A== sbp: diff --git a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml index bed08e07a2..af539ee41a 100644 --- a/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml +++ b/spec/tests/yaml/swiftnav/sbp/ssr/test_MsgSsrGriddedCorrectionBounds.yaml @@ -22,8 +22,10 @@ tests: hydro: 500 wet: 100 stddev: 200 - tropo_bound_mu: 150 - tropo_bound_sig: 100 + tropo_v_hydro_bound_mu: 150 + tropo_v_hydro_bound_sig: 100 + tropo_v_wet_bound_mu: 150 + tropo_v_wet_bound_sig: 100 n_sats: 2 stec_sat_list: - stec_residual: @@ -51,17 +53,18 @@ tests: 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": + {"hydro": 500, "wet": 100, "stddev": 200}, "tropo_v_hydro_bound_mu": 150, "tropo_v_hydro_bound_sig": 100, + "tropo_v_wet_bound_mu": 150, "tropo_v_wet_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 + "stec_bound_sig_dot": 27}], "preamble": 85, "msg_type": 1534, "sender": 66, "length": 45, + "payload": "tAAAAAMAAQEKAA8BAAoAJ+gD9AFkyJZklmQCBQoQABESExQVBgoWABcYGRob", "crc": 21111}' + raw_packet: Vf4FQgAttAAAAAMAAQEKAA8BAAoAJ+gD9AFkyJZklmQCBQoQABESExQVBgoWABcYGRobd1I= sbp: preamble: '0x55' msg_type: '0x05FE' sender: '0x0042' - length: 43 - payload: tAAAAAMAAQEKAA8BAAoAJ+gD9AFkyJZkAgUKEAAREhMUFQYKFgAXGBkaGw== - crc: '0x9170' + length: 45 + payload: tAAAAAMAAQEKAA8BAAoAJ+gD9AFkyJZklmQCBQoQABESExQVBgoWABcYGRob + crc: '0x5277' diff --git a/spec/yaml/swiftnav/sbp/navigation.yaml b/spec/yaml/swiftnav/sbp/navigation.yaml index 38bf456caa..db9e74ed36 100644 --- a/spec/yaml/swiftnav/sbp/navigation.yaml +++ b/spec/yaml/swiftnav/sbp/navigation.yaml @@ -2428,7 +2428,7 @@ definitions: - 31: desc: Safe state ROPL - - MSG_GPS_LEAP_SECOND: + - MSG_UTC_LEAP_SECOND: id: 0x023A short_desc: > Leap second SBP message. @@ -2479,27 +2479,23 @@ definitions: units: s desc: Leap second count after insertion. - - MSG_ITRF: + - MSG_REFERENCE_FRAME_PARAM: id: 0x0244 - short_desc: Reference Frame Transformation Parameter + short_desc: Reference Frame Transformation Parameters fields: - ssr_iod: type: u8 desc: SSR IOD parameter. - - sn_counter_n: - type: u8 - desc: Source-Name Counter N. - sn: type: string - size: 31 - desc: Source-Name - - tn_counter_m: - type: u8 - desc: Target-Name Counter M. + encoding: null_terminated + size: 32 + desc: Name of source coordinate-system using the EPSG identification code. - tn: type: string - size: 31 - desc: Target-Name + encoding: null_terminated + size: 32 + desc: Name of target coordinate-system using the EPSG identification code. - sin: type: u8 desc: System Identification Number. diff --git a/spec/yaml/swiftnav/sbp/ssr.yaml b/spec/yaml/swiftnav/sbp/ssr.yaml index acc04a3cbb..a1bd6d0274 100644 --- a/spec/yaml/swiftnav/sbp/ssr.yaml +++ b/spec/yaml/swiftnav/sbp/ssr.yaml @@ -477,15 +477,11 @@ definitions: - stec_bound_mu_dot: type: u8 units: 0.00005 m/s - desc: > - Error Bound Mean First derivative. - Range: 0-0.01275 m/s + desc: Error Bound Mean First derivative. - stec_bound_sig_dot: type: u8 units: 0.00005 m/s - desc: > - Error Bound StDev First derivative. - Range: 0-0.01275 m/s + desc: Error Bound StDev First derivative. - MSG_SSR_GRIDDED_CORRECTION_BOUNDS: id: 0x05FE @@ -501,10 +497,10 @@ definitions: desc: Header of a bounds message. - ssr_iod_atmo: type: u8 - desc: IOD of the SSR atmospheric correction. + desc: IOD of the correction. - tile_set_id: type: u16 - desc: Unique identifier of the set this tile belongs to. + desc: Set this tile belongs to. - tile_id: type: u16 desc: Unique identifier of this tile in the tile set. @@ -517,18 +513,22 @@ definitions: - tropo_delay_correction: type: TroposphericDelayCorrection desc: Tropospheric delay at grid point. - - tropo_bound_mu: + - tropo_v_hydro_bound_mu: type: u8 units: 0.005 m - desc: > - Troposphere Error Bound Mean. - Range: 0-1.275 m - - tropo_bound_sig: + desc: Vertical Hydrostatic Error Bound Mean. + - tropo_v_hydro_bound_sig: type: u8 units: 0.005 m - desc: > - Troposphere Error Bound StDev. - Range: 0-1.275 m + desc: Vertical Hydrostatic Error Bound StDev. + - tropo_v_wet_bound_mu: + type: u8 + units: 0.005 m + desc: Vertical Wet Error Bound Mean. + - tropo_v_wet_bound_sig: + type: u8 + units: 0.005 m + desc: Vertical Wet Error Bound StDev. - n_sats: type: u8 desc: Number of satellites. @@ -1081,19 +1081,19 @@ definitions: units: m desc: > Standard Deviation Radial. - See Note 1. + See Note 2. - orb_along_bound_sig: type: u8 units: m desc: > Standard Deviation Along-Track. - See Note 1. + See Note 2. - orb_cross_bound_sig: type: u8 units: m desc: > Standard Deviation Cross-Track. - See Note 1. + See Note 2. - clock_bound_mu: type: u8 units: m @@ -1105,16 +1105,22 @@ definitions: units: m desc: > Clock Bound Standard Deviation. - See Note 1. + See Note 2. - MSG_SSR_ORBIT_CLOCK_BOUNDS: id: 0x05DE short_desc: Combined Orbit and Clock Bound desc: > - Note 1: Range: 0-55 m. - i<=200, mean=0.0251i; - 200240, mean=25+2(i-240). + Note 1: Range: 0-17.5 m. + i<=200, mean=0.01i; + 200230, mean=5+0.5(i-230). + + + Note 2: Range: 0-17.5 m. + i<=200, std=0.01i; + 200230, std=5+0.5(i-230). fields: - header: type: BoundsHeader @@ -1265,7 +1271,8 @@ definitions: type: u64 desc: > Satellite Bit Mask. Put 1 for each satellite where the following - degradation parameters are applicable, 0 otherwise. + degradation parameters are applicable, 0 otherwise. Encoded + following RTCM DF394 specification. - orbit_clock_bounds_degradation: type: OrbitClockBoundDegradation desc: Orbit and Clock Bounds Degradation Parameters From d8bc14dc6cbb8e294f570008e918652501490178 Mon Sep 17 00:00:00 2001 From: fpezzinosn Date: Fri, 17 Jun 2022 12:56:03 -0400 Subject: [PATCH 10/10] make all --- c/include/libsbp/integrity_macros.h | 75 +- c/include/libsbp/legacy/integrity.h | 62 +- c/include/libsbp/legacy/navigation.h | 45 +- c/include/libsbp/legacy/ssr.h | 235 +++- c/include/libsbp/navigation_macros.h | 43 +- c/include/libsbp/ssr_macros.h | 116 +- c/include/libsbp/v4/integrity.h | 1 + .../v4/integrity/MSG_SSR_FLAG_HIGH_LEVEL.h | 82 +- .../integrity/MSG_SSR_FLAG_IONO_GRID_POINTS.h | 25 +- .../MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS.h | 32 +- .../MSG_SSR_FLAG_IONO_TILE_SAT_LOS.h | 26 +- .../v4/integrity/MSG_SSR_FLAG_SATELLITES.h | 50 +- .../MSG_SSR_FLAG_TROPO_GRID_POINTS.h | 25 +- .../v4/navigation/MSG_REFERENCE_FRAME_PARAM.h | 116 +- .../v4/navigation/MSG_UTC_LEAP_SECOND.h | 59 +- c/include/libsbp/v4/ssr.h | 4 + .../v4/ssr/MSG_SSR_CODE_PHASE_BIASES_BOUNDS.h | 37 +- .../ssr/MSG_SSR_GRIDDED_CORRECTION_BOUNDS.h | 84 +- .../v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS.h | 37 +- .../MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION.h | 40 +- .../libsbp/v4/ssr/MSG_SSR_STEC_CORRECTION.h | 42 +- .../libsbp/v4/ssr/MSG_SSR_TILE_DEFINITION.h | 96 +- c/src/include/libsbp/internal/v4/integrity.h | 20 + c/src/include/libsbp/internal/v4/ssr.h | 77 +- c/src/v4/integrity.c | 545 +++++++- c/src/v4/navigation.c | 335 ++++- c/src/v4/ssr.c | 878 ++++++++++--- ..._check_sbp_integrity_MsgSsrFlagHighLevel.c | 287 ++--- ..._integrity_MsgSsrFlagIonoGridPointSatLos.c | 251 ++-- ...k_sbp_integrity_MsgSsrFlagIonoGridPoints.c | 227 ++-- ...k_sbp_integrity_MsgSsrFlagIonoTileSatLos.c | 210 ++- ...check_sbp_integrity_MsgSsrFlagSatellites.c | 147 +-- ..._sbp_integrity_MsgSsrFlagTropoGridPoints.c | 229 ++-- ...ck_sbp_navigation_MsgReferenceFrameParam.c | 996 +++------------ ...to_check_sbp_navigation_MsgUTCLeapSecond.c | 133 +- ...heck_sbp_ssr_MsgSsrCodePhaseBiasesBounds.c | 360 +++--- ...ck_sbp_ssr_MsgSsrGriddedCorrectionBounds.c | 510 ++++---- ...uto_check_sbp_ssr_MsgSsrOrbitClockBounds.c | 411 +++--- ...bp_ssr_MsgSsrOrbitClockBoundsDegradation.c | 308 ++--- .../auto_check_sbp_ssr_MsgSsrStecCorrection.c | 365 +++--- .../auto_check_sbp_ssr_MsgSsrTileDefinition.c | 214 +--- ...check_sbp_integrity_MsgSsrFlagHighLevel.cc | 238 ++-- ...integrity_MsgSsrFlagIonoGridPointSatLos.cc | 167 +-- ..._sbp_integrity_MsgSsrFlagIonoGridPoints.cc | 154 +-- ..._sbp_integrity_MsgSsrFlagIonoTileSatLos.cc | 153 +-- ...heck_sbp_integrity_MsgSsrFlagSatellites.cc | 120 +- ...sbp_integrity_MsgSsrFlagTropoGridPoints.cc | 154 +-- ...k_sbp_navigation_MsgReferenceFrameParam.cc | 750 ++--------- ...o_check_sbp_navigation_MsgUTCLeapSecond.cc | 109 +- ...eck_sbp_ssr_MsgSsrCodePhaseBiasesBounds.cc | 288 ++--- ...k_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc | 394 +++--- ...to_check_sbp_ssr_MsgSsrOrbitClockBounds.cc | 287 ++--- ...p_ssr_MsgSsrOrbitClockBoundsDegradation.cc | 234 ++-- ...auto_check_sbp_ssr_MsgSsrStecCorrection.cc | 297 ++--- ...auto_check_sbp_ssr_MsgSsrTileDefinition.cc | 169 +-- ..._check_sbp_integrity_MsgSsrFlagHighLevel.c | 337 ++--- ..._integrity_MsgSsrFlagIonoGridPointSatLos.c | 227 +--- ...k_sbp_integrity_MsgSsrFlagIonoGridPoints.c | 217 +--- ...k_sbp_integrity_MsgSsrFlagIonoTileSatLos.c | 207 +-- ...check_sbp_integrity_MsgSsrFlagSatellites.c | 164 +-- ..._sbp_integrity_MsgSsrFlagTropoGridPoints.c | 217 +--- ...ck_sbp_navigation_MsgReferenceFrameParam.c | 1126 ++--------------- ...to_check_sbp_navigation_MsgUTCLeapSecond.c | 147 +-- ...heck_sbp_ssr_MsgSsrCodePhaseBiasesBounds.c | 393 +++--- ...ck_sbp_ssr_MsgSsrGriddedCorrectionBounds.c | 530 +++----- ...uto_check_sbp_ssr_MsgSsrOrbitClockBounds.c | 391 +++--- ...bp_ssr_MsgSsrOrbitClockBoundsDegradation.c | 321 ++--- .../auto_check_sbp_ssr_MsgSsrStecCorrection.c | 415 ++---- .../auto_check_sbp_ssr_MsgSsrTileDefinition.c | 240 +--- ...check_sbp_integrity_MsgSsrFlagHighLevel.cc | 304 ++--- ...integrity_MsgSsrFlagIonoGridPointSatLos.cc | 216 +--- ..._sbp_integrity_MsgSsrFlagIonoGridPoints.cc | 198 +-- ..._sbp_integrity_MsgSsrFlagIonoTileSatLos.cc | 197 +-- ...heck_sbp_integrity_MsgSsrFlagSatellites.cc | 150 +-- ...sbp_integrity_MsgSsrFlagTropoGridPoints.cc | 198 +-- ...k_sbp_navigation_MsgReferenceFrameParam.cc | 1026 ++------------- ...o_check_sbp_navigation_MsgUTCLeapSecond.cc | 130 +- ...eck_sbp_ssr_MsgSsrCodePhaseBiasesBounds.cc | 357 ++---- ...k_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc | 490 +++---- ...to_check_sbp_ssr_MsgSsrOrbitClockBounds.cc | 358 ++---- ...p_ssr_MsgSsrOrbitClockBoundsDegradation.cc | 292 ++--- ...auto_check_sbp_ssr_MsgSsrStecCorrection.cc | 384 ++---- ...auto_check_sbp_ssr_MsgSsrTileDefinition.cc | 219 +--- docs/sbp.pdf | Bin 457950 -> 494449 bytes haskell/src/SwiftNav/SBP/Integrity.hs | 198 ++- haskell/src/SwiftNav/SBP/Navigation.hs | 126 +- haskell/src/SwiftNav/SBP/Ssr.hs | 465 ++++++- .../sbp/integrity/MsgSsrFlagHighLevel.java | 87 +- .../MsgSsrFlagIonoGridPointSatLos.java | 29 +- .../integrity/MsgSsrFlagIonoGridPoints.java | 21 +- .../integrity/MsgSsrFlagIonoTileSatLos.java | 23 +- .../sbp/integrity/MsgSsrFlagSatellites.java | 51 +- .../integrity/MsgSsrFlagTropoGridPoints.java | 21 +- .../navigation/MsgReferenceFrameParam.java | 127 +- .../sbp/navigation/MsgUtcLeapSecond.java | 61 +- .../sbp/ssr/MsgSsrCodePhaseBiasesBounds.java | 35 +- .../ssr/MsgSsrGriddedCorrectionBounds.java | 92 +- .../sbp/ssr/MsgSsrOrbitClockBounds.java | 35 +- .../MsgSsrOrbitClockBoundsDegradation.java | 38 +- .../sbp/ssr/MsgSsrStecCorrection.java | 41 +- .../sbp/ssr/MsgSsrTileDefinition.java | 113 +- ...sbp_integrity_MsgSsrFlagHighLevelTest.java | 220 ++-- ...ity_MsgSsrFlagIonoGridPointSatLosTest.java | 159 +-- ...ntegrity_MsgSsrFlagIonoGridPointsTest.java | 161 +-- ...ntegrity_MsgSsrFlagIonoTileSatLosTest.java | 142 +-- ...bp_integrity_MsgSsrFlagSatellitesTest.java | 107 +- ...tegrity_MsgSsrFlagTropoGridPointsTest.java | 161 +-- ...navigation_MsgReferenceFrameParamTest.java | 1093 +--------------- ...k_sbp_navigation_MsgUTCLeapSecondTest.java | 98 +- ...p_ssr_MsgSsrCodePhaseBiasesBoundsTest.java | 191 ++- ...ssr_MsgSsrGriddedCorrectionBoundsTest.java | 343 +++-- ...MsgSsrOrbitClockBoundsDegradationTest.java | 245 ++-- ...ck_sbp_ssr_MsgSsrOrbitClockBoundsTest.java | 215 ++-- ...heck_sbp_ssr_MsgSsrStecCorrectionTest.java | 277 ++-- ...heck_sbp_ssr_MsgSsrTileDefinitionTest.java | 212 +--- javascript/sbp.bundle.js | 4 +- javascript/sbp/integrity.js | 167 ++- javascript/sbp/navigation.js | 95 +- javascript/sbp/ssr.js | 412 +++++- jsonschema/MsgReferenceFrameParam.json | 42 +- jsonschema/MsgSsrCodePhaseBiasesBounds.json | 12 +- jsonschema/MsgSsrFlagHighLevel.json | 28 +- jsonschema/MsgSsrFlagIonoGridPointSatLos.json | 10 +- jsonschema/MsgSsrFlagIonoGridPoints.json | 8 +- jsonschema/MsgSsrFlagIonoTileSatLos.json | 8 +- jsonschema/MsgSsrFlagSatellites.json | 18 +- jsonschema/MsgSsrFlagTropoGridPoints.json | 8 +- jsonschema/MsgSsrGriddedCorrectionBounds.json | 28 +- jsonschema/MsgSsrOrbitClockBounds.json | 12 +- .../MsgSsrOrbitClockBoundsDegradation.json | 12 +- jsonschema/MsgSsrStecCorrection.json | 14 +- jsonschema/MsgSsrTileDefinition.json | 22 +- jsonschema/MsgUtcLeapSecond.json | 20 +- proto/integrity.proto | 54 +- proto/navigation.proto | 33 +- proto/ssr.proto | 129 +- python/sbp/integrity.py | 260 +++- python/sbp/navigation.py | 157 ++- python/sbp/ssr.py | 602 ++++++++- rust/sbp/src/messages/integrity.rs | 358 +++++- rust/sbp/src/messages/mod.rs | 6 +- rust/sbp/src/messages/navigation.rs | 570 +++------ rust/sbp/src/messages/ssr.rs | 806 +++++++++++- ...k_sbp_integrity_msg_ssr_flag_high_level.rs | 176 +-- ...ty_msg_ssr_flag_iono_grid_point_sat_los.rs | 119 +- ...integrity_msg_ssr_flag_iono_grid_points.rs | 117 +- ...ntegrity_msg_ssr_flag_iono_tile_sat_los.rs | 108 +- ...k_sbp_integrity_msg_ssr_flag_satellites.rs | 86 +- ...ntegrity_msg_ssr_flag_tropo_grid_points.rs | 117 +- ...bp_navigation_msg_reference_frame_param.rs | Bin 25686 -> 6381 bytes ...heck_sbp_navigation_msg_utc_leap_second.rs | 79 +- ...bp_ssr_msg_ssr_code_phase_biases_bounds.rs | 182 +-- ...p_ssr_msg_ssr_gridded_correction_bounds.rs | 256 ++-- ...heck_sbp_ssr_msg_ssr_orbit_clock_bounds.rs | 182 +-- ..._msg_ssr_orbit_clock_bounds_degradation.rs | 157 +-- ...o_check_sbp_ssr_msg_ssr_stec_correction.rs | 214 +--- ...o_check_sbp_ssr_msg_ssr_tile_definition.rs | 135 +- sbpjson/elm/SbpJson.elm | 653 +++++++++- sbpjson/javascript/SbpJson.js | 260 ++-- sbpjson/typescript/SbpJson.ts | 452 ++++++- 160 files changed, 15461 insertions(+), 17714 deletions(-) diff --git a/c/include/libsbp/integrity_macros.h b/c/include/libsbp/integrity_macros.h index 3fc8a5f428..fef1547d27 100644 --- a/c/include/libsbp/integrity_macros.h +++ b/c/include/libsbp/integrity_macros.h @@ -18,38 +18,35 @@ #ifndef LIBSBP_INTEGRITY_MACROS_H #define LIBSBP_INTEGRITY_MACROS_H +/** + * Encoded length of sbp_integrity_ssr_header_t (V4 API) and + * integrity_ssr_header_t (legacy API) + */ +#define SBP_INTEGRITY_SSR_HEADER_ENCODED_LEN 14u + #define SBP_MSG_SSR_FLAG_HIGH_LEVEL 0x0BB9 /** * The maximum number of items that can be stored in - * sbp_msg_ssr_flag_high_level_t::stub (V4 API) or - * msg_ssr_flag_high_level_t::stub (legacy API) before the maximum SBP message - * size is exceeded + * sbp_msg_ssr_flag_high_level_t::reserved (V4 API) or + * msg_ssr_flag_high_level_t::reserved (legacy API) before the maximum SBP + * message size is exceeded */ -#define SBP_MSG_SSR_FLAG_HIGH_LEVEL_STUB_MAX 255u +#define SBP_MSG_SSR_FLAG_HIGH_LEVEL_RESERVED_MAX 6u /** * Encoded length of sbp_msg_ssr_flag_high_level_t (V4 API) and * msg_ssr_flag_high_level_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_flag_high_level_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_FLAG_HIGH_LEVEL_ENCODED_OVERHEAD 0u +#define SBP_MSG_SSR_FLAG_HIGH_LEVEL_ENCODED_LEN 31u #define SBP_MSG_SSR_FLAG_SATELLITES 0x0BBD /** * The maximum number of items that can be stored in - * sbp_msg_ssr_flag_satellites_t::stub (V4 API) or - * msg_ssr_flag_satellites_t::stub (legacy API) before the maximum SBP message - * size is exceeded + * sbp_msg_ssr_flag_satellites_t::faulty_sats (V4 API) or + * msg_ssr_flag_satellites_t::faulty_sats (legacy API) before the maximum SBP + * message size is exceeded */ -#define SBP_MSG_SSR_FLAG_SATELLITES_STUB_MAX 255u +#define SBP_MSG_SSR_FLAG_SATELLITES_FAULTY_SATS_MAX 243u /** * Encoded length of sbp_msg_ssr_flag_satellites_t (V4 API) and @@ -64,16 +61,16 @@ * See the documentation for libsbp for more details regarding the message * structure and its variable length component(s) */ -#define SBP_MSG_SSR_FLAG_SATELLITES_ENCODED_OVERHEAD 0u +#define SBP_MSG_SSR_FLAG_SATELLITES_ENCODED_OVERHEAD 12u #define SBP_MSG_SSR_FLAG_TROPO_GRID_POINTS 0x0BC3 /** * The maximum number of items that can be stored in - * sbp_msg_ssr_flag_tropo_grid_points_t::stub (V4 API) or - * msg_ssr_flag_tropo_grid_points_t::stub (legacy API) before the maximum SBP - * message size is exceeded + * sbp_msg_ssr_flag_tropo_grid_points_t::faulty_points (V4 API) or + * msg_ssr_flag_tropo_grid_points_t::faulty_points (legacy API) before the + * maximum SBP message size is exceeded */ -#define SBP_MSG_SSR_FLAG_TROPO_GRID_POINTS_STUB_MAX 255u +#define SBP_MSG_SSR_FLAG_TROPO_GRID_POINTS_FAULTY_POINTS_MAX 120u /** * Encoded length of sbp_msg_ssr_flag_tropo_grid_points_t (V4 API) and @@ -88,16 +85,16 @@ * See the documentation for libsbp for more details regarding the message * structure and its variable length component(s) */ -#define SBP_MSG_SSR_FLAG_TROPO_GRID_POINTS_ENCODED_OVERHEAD 0u +#define SBP_MSG_SSR_FLAG_TROPO_GRID_POINTS_ENCODED_OVERHEAD 15u #define SBP_MSG_SSR_FLAG_IONO_GRID_POINTS 0x0BC7 /** * The maximum number of items that can be stored in - * sbp_msg_ssr_flag_iono_grid_points_t::stub (V4 API) or - * msg_ssr_flag_iono_grid_points_t::stub (legacy API) before the maximum SBP - * message size is exceeded + * sbp_msg_ssr_flag_iono_grid_points_t::faulty_points (V4 API) or + * msg_ssr_flag_iono_grid_points_t::faulty_points (legacy API) before the + * maximum SBP message size is exceeded */ -#define SBP_MSG_SSR_FLAG_IONO_GRID_POINTS_STUB_MAX 255u +#define SBP_MSG_SSR_FLAG_IONO_GRID_POINTS_FAULTY_POINTS_MAX 120u /** * Encoded length of sbp_msg_ssr_flag_iono_grid_points_t (V4 API) and @@ -112,16 +109,16 @@ * See the documentation for libsbp for more details regarding the message * structure and its variable length component(s) */ -#define SBP_MSG_SSR_FLAG_IONO_GRID_POINTS_ENCODED_OVERHEAD 0u +#define SBP_MSG_SSR_FLAG_IONO_GRID_POINTS_ENCODED_OVERHEAD 15u #define SBP_MSG_SSR_FLAG_IONO_TILE_SAT_LOS 0x0BCD /** * The maximum number of items that can be stored in - * sbp_msg_ssr_flag_iono_tile_sat_los_t::stub (V4 API) or - * msg_ssr_flag_iono_tile_sat_los_t::stub (legacy API) before the maximum SBP - * message size is exceeded + * sbp_msg_ssr_flag_iono_tile_sat_los_t::faulty_los (V4 API) or + * msg_ssr_flag_iono_tile_sat_los_t::faulty_los (legacy API) before the maximum + * SBP message size is exceeded */ -#define SBP_MSG_SSR_FLAG_IONO_TILE_SAT_LOS_STUB_MAX 255u +#define SBP_MSG_SSR_FLAG_IONO_TILE_SAT_LOS_FAULTY_LOS_MAX 120u /** * Encoded length of sbp_msg_ssr_flag_iono_tile_sat_los_t (V4 API) and @@ -136,16 +133,16 @@ * See the documentation for libsbp for more details regarding the message * structure and its variable length component(s) */ -#define SBP_MSG_SSR_FLAG_IONO_TILE_SAT_LOS_ENCODED_OVERHEAD 0u +#define SBP_MSG_SSR_FLAG_IONO_TILE_SAT_LOS_ENCODED_OVERHEAD 15u #define SBP_MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS 0x0BD1 /** * The maximum number of items that can be stored in - * sbp_msg_ssr_flag_iono_grid_point_sat_los_t::stub (V4 API) or - * msg_ssr_flag_iono_grid_point_sat_los_t::stub (legacy API) before the maximum - * SBP message size is exceeded + * sbp_msg_ssr_flag_iono_grid_point_sat_los_t::faulty_los (V4 API) or + * msg_ssr_flag_iono_grid_point_sat_los_t::faulty_los (legacy API) before the + * maximum SBP message size is exceeded */ -#define SBP_MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS_STUB_MAX 255u +#define SBP_MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS_FAULTY_LOS_MAX 119u /** * Encoded length of sbp_msg_ssr_flag_iono_grid_point_sat_los_t (V4 API) and @@ -160,6 +157,6 @@ * See the documentation for libsbp for more details regarding the message * structure and its variable length component(s) */ -#define SBP_MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS_ENCODED_OVERHEAD 0u +#define SBP_MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS_ENCODED_OVERHEAD 17u #endif /* LIBSBP_INTEGRITY_MACROS_H */ diff --git a/c/include/libsbp/legacy/integrity.h b/c/include/libsbp/legacy/integrity.h index dc9f019a0f..a61099e266 100644 --- a/c/include/libsbp/legacy/integrity.h +++ b/c/include/libsbp/legacy/integrity.h @@ -31,27 +31,77 @@ SBP_PACK_START typedef struct SBP_ATTR_PACKED { - u8 stub[0]; + gps_time_sec_t obs_time; /**< GNSS reference time of the observation + used to generate the flag. */ + u8 num_msgs; /**< Number of messages in the dataset */ + u8 seq_num; /**< Position of this message in the dataset */ + u8 ssr_sol_id; /**< SSR Solution ID. */ + 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 chain_id; /**< Chain and type of flag. */ +} integrity_ssr_header_t; + +typedef struct SBP_ATTR_PACKED { + gps_time_sec_t obs_time; /**< GNSS reference time of + the observation used to + generate the flag. */ + gps_time_sec_t corr_time; /**< GNSS reference time of + the correction + associated to the flag. */ + u8 ssr_sol_id; /**< SSR Solution ID. */ + 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 chain_id; /**< Chain and type of flag. */ + u8 use_gps_sat; /**< Use GPS satellites. */ + u8 use_gal_sat; /**< Use GAL satellites. */ + u8 use_bds_sat; /**< Use BDS satellites. */ + u8 reserved[6]; /**< Reserved */ + u8 use_tropo_grid_points; /**< Use tropo grid points. */ + u8 use_iono_grid_points; /**< Use iono grid points. */ + u8 use_iono_tile_sat_los; /**< Use iono tile satellite LoS. */ + u8 use_iono_grid_point_sat_los; /**< Use iono grid point satellite LoS. */ } msg_ssr_flag_high_level_t; typedef struct SBP_ATTR_PACKED { - u8 stub[0]; + gps_time_sec_t obs_time; /**< GNSS reference time of the observation + used to generate the flag. */ + u8 num_msgs; /**< Number of messages in the dataset */ + u8 seq_num; /**< Position of this message in the dataset */ + u8 ssr_sol_id; /**< SSR Solution ID. */ + u8 chain_id; /**< Chain and type of flag. */ + u8 const_id; /**< Constellation ID. */ + u8 n_faulty_sats; /**< Number of faulty satellites. */ + u8 faulty_sats[0]; /**< List of faulty satellites. */ } msg_ssr_flag_satellites_t; typedef struct SBP_ATTR_PACKED { - u8 stub[0]; + integrity_ssr_header_t header; /**< Header of an integrity + message. */ + u8 n_faulty_points; /**< Number of faulty grid points. */ + u16 faulty_points[0]; /**< List of faulty grid points. */ } msg_ssr_flag_tropo_grid_points_t; typedef struct SBP_ATTR_PACKED { - u8 stub[0]; + integrity_ssr_header_t header; /**< Header of an integrity + message. */ + u8 n_faulty_points; /**< Number of faulty grid points. */ + u16 faulty_points[0]; /**< List of faulty grid points. */ } msg_ssr_flag_iono_grid_points_t; typedef struct SBP_ATTR_PACKED { - u8 stub[0]; + integrity_ssr_header_t header; /**< Header of an integrity message. */ + u8 n_faulty_los; /**< Number of faulty LOS. */ + sv_id_t faulty_los[0]; /**< List of faulty LOS */ } msg_ssr_flag_iono_tile_sat_los_t; typedef struct SBP_ATTR_PACKED { - u8 stub[0]; + integrity_ssr_header_t header; /**< Header of an integrity + message. */ + u16 grid_point_id; /**< Index of the grid point. */ + u8 n_faulty_los; /**< Number of faulty LOS. */ + sv_id_t faulty_los[0]; /**< List of faulty LOS */ } msg_ssr_flag_iono_grid_point_sat_los_t; /** \} */ diff --git a/c/include/libsbp/legacy/navigation.h b/c/include/libsbp/legacy/navigation.h index 9ff79e6e77..1bd7e72e6b 100644 --- a/c/include/libsbp/legacy/navigation.h +++ b/c/include/libsbp/legacy/navigation.h @@ -927,11 +927,52 @@ typedef struct SBP_ATTR_PACKED { */ typedef struct SBP_ATTR_PACKED { - u8 stub[0]; + s16 bias_coeff; /**< Reserved. Bias coefficient of GPS time scale + with respect to UTC drift model. [2^-35 s] */ + s16 drift_coeff; /**< Reserved. Drift coefficient of GPS time scale + with respect to UTC drift model. [2^-51 s/s] */ + s8 drift_rate_coeff; /**< Reserved. Drift rate correction coefficient of + GPS time scale with respect to UTC drift model. + [2^-68 s/s^2] */ + s8 count_before; /**< Leap second count before insertion. [s] */ + u16 tow_s; /**< Reserved. Drift model reference week second. [s] */ + u16 wn; /**< Reserved. Drift model reference week number. [weeks] */ + u16 ref_wn; /**< Leap second reference week number. [weeks] */ + u8 ref_dn; /**< Leap second reference day number. [days] */ + s8 count_after; /**< Leap second count after insertion. [s] */ } msg_utc_leap_second_t; typedef struct SBP_ATTR_PACKED { - u8 stub[0]; + u8 ssr_iod; /**< SSR IOD parameter. */ + char sn[32]; /**< Name of source coordinate-system using the EPSG + identification code. */ + char tn[32]; /**< Name of target coordinate-system using the EPSG + identification code. */ + u8 sin; /**< System Identification Number. */ + u16 utn; /**< Utilized Transformation Message. */ + u16 re_t0; /**< Reference Epoch t0 for transformation parameter + set given as Modified Julian Day (MDJ) Number + minus 44244 days. [1 day] */ + s32 delta_X0; /**< Translation in X for Reference Epoch t0. [0.001 m] */ + s32 delta_Y0; /**< Translation in Y for Reference Epoch t0. [0.001 m] */ + s32 delta_Z0; /**< Translation in Z for Reference Epoch t0. [0.001 m] */ + s32 theta_01; /**< Rotation around the X-axis for Reference Epoch t0. [0.00002 + "] */ + s32 theta_02; /**< Rotation around the Y-axis for Reference Epoch t0. [0.00002 + "] */ + s32 theta_03; /**< Rotation around the Z-axis for Reference Epoch t0. [0.00002 + "] */ + s32 scale; /**< Scale correction for Reference Epoch t0. [0.00001 ppm] */ + s32 dot_delta_X0; /**< Rate of change of translation in X. [0.00002 m/yr] */ + s32 dot_delta_Y0; /**< Rate of change of translation in Y. [0.00002 m/yr] */ + s32 dot_delta_Z0; /**< Rate of change of translation in Z. [0.00002 m/yr] */ + s32 dot_theta_01; /**< Rate of change of rotation around the X-axis. + [0.0000004 "/yr] */ + s32 dot_theta_02; /**< Rate of change of rotation around the Y-axis. + [0.0000004 "/yr] */ + s32 dot_theta_03; /**< Rate of change of rotation around the Z-axis. + [0.0000004 "/yr] */ + s16 dot_scale; /**< Rate of change of scale correction. [0.0000002 ppm/yr] */ } msg_reference_frame_param_t; /** \} */ diff --git a/c/include/libsbp/legacy/ssr.h b/c/include/libsbp/legacy/ssr.h index 7cfca3bcbe..2a595ffd01 100644 --- a/c/include/libsbp/legacy/ssr.h +++ b/c/include/libsbp/legacy/ssr.h @@ -115,8 +115,9 @@ typedef struct SBP_ATTR_PACKED { following RTCM DF389 specification but in units of TECU instead of m. */ s16 stec_coeff[4]; /**< Coefficients of the STEC polynomial in - the order of C00, C01, C10, C11 [C00 = 0.05 TECU, - C01/C10 = 0.02 TECU/deg, C11 0.02 TECU/deg^2] */ + the order of C00, C01, C10, C11. C00 = + 0.05 TECU, C01/C10 = 0.02 TECU/deg, C11 + 0.02 TECU/deg^2 */ } stec_sat_element_t; /** None @@ -138,13 +139,11 @@ typedef struct SBP_ATTR_PACKED { */ typedef struct SBP_ATTR_PACKED { - s16 hydro; /**< Hydrostatic vertical delay [4 mm (add 2.3 m to get actual - vertical hydro delay)] */ - s8 wet; /**< Wet vertical delay [4 mm (add 0.252 m to get actual vertical wet - delay)] */ - u8 stddev; /**< stddev [modified DF389 scale; class is upper 3 bits, value is -lower 5 stddev <= (3^class * (1 + value/16) - 1) mm -] */ + s16 hydro; /**< Hydrostatic vertical delay. Add 2.3 m to get actual + value. [4 mm] */ + s8 wet; /**< Wet vertical delay. Add 0.252 m to get actual value. [4 mm] */ + u8 stddev; /**< Modified DF389 scale. Class is upper 3 bits, value is + lower 5. stddev <= (3^class * (1 + value/16) - 1) mm [mm] */ } tropospheric_delay_correction_t; /** None @@ -166,9 +165,9 @@ typedef struct SBP_ATTR_PACKED { typedef struct SBP_ATTR_PACKED { sv_id_t sv_id; /**< space vehicle identifier */ s16 residual; /**< STEC residual [0.04 TECU] */ - u8 stddev; /**< stddev [modified DF389 scale; class is upper 3 bits, value is -lower 5 stddev <= (3^class * (1 + value/16) - 1) * 10 TECU -] */ + u8 stddev; /**< Modified DF389 scale. Class is upper 3 bits, value is + lower 5. stddev <= (3^class * (1 + value/16) - 1) * 10 + TECU */ } stec_residual_t; /** Precise orbit and clock correction @@ -270,7 +269,24 @@ typedef struct SBP_ATTR_PACKED { } msg_ssr_stec_correction_dep_t; typedef struct SBP_ATTR_PACKED { - u8 stub[0]; + 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 @@ -296,8 +312,51 @@ 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; /**< Error Bound Mean. See Note 1. [m] */ + u8 stec_bound_sig; /**< Error Bound StDev. See Note 1. [m] */ + u8 stec_bound_mu_dot; /**< Error Bound Mean First derivative. [0.00005 m/s] */ + u8 stec_bound_sig_dot; /**< Error Bound StDev First derivative. [0.00005 m/s] + */ +} stec_sat_element_integrity_t; + +/** Gridded troposhere and STEC correction residuals bounds + * + * Note 1: Range: 0-17.5 m. i<= 200, mean = 0.01i; 200230, mean=5+0.5(i-230). + */ + typedef struct SBP_ATTR_PACKED { - u8 stub[0]; + bounds_header_t header; /**< Header of a bounds message. */ + u8 ssr_iod_atmo; /**< IOD of the correction. */ + u16 tile_set_id; /**< 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_v_hydro_bound_mu; /**< Vertical Hydrostatic Error Bound Mean. [0.005 + m] */ + u8 tropo_v_hydro_bound_sig; /**< Vertical Hydrostatic Error Bound StDev. + [0.005 m] */ + u8 tropo_v_wet_bound_mu; /**< Vertical Wet Error Bound Mean. [0.005 m] */ + u8 tropo_v_wet_bound_sig; /**< Vertical Wet Error Bound StDev. [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. @@ -388,7 +447,67 @@ typedef struct SBP_ATTR_PACKED { */ typedef struct SBP_ATTR_PACKED { - u8 stub[0]; + 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. + 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_t; /** Antenna phase center correction @@ -544,17 +663,44 @@ typedef struct SBP_ATTR_PACKED { are encoded as u8 integers. */ } msg_ssr_grid_definition_dep_a_t; -typedef struct SBP_ATTR_PACKED { - u8 stub[0]; -} msg_ssr_orbit_clock_bounds_t; +/** None + * + * Orbit and clock bound. + */ typedef struct SBP_ATTR_PACKED { - u8 stub[0]; -} msg_ssr_code_phase_biases_bounds_t; + u8 sat_id; /**< Satellite ID. Similar to either RTCM DF068 + (GPS), DF252 (Galileo), or DF488 (BDS) + depending on the constellation. */ + u8 orb_radial_bound_mu; /**< Mean Radial. See Note 1. [m] */ + u8 orb_along_bound_mu; /**< Mean Along-Track. See Note 1. [m] */ + u8 orb_cross_bound_mu; /**< Mean Cross-Track. See Note 1. [m] */ + u8 orb_radial_bound_sig; /**< Standard Deviation Radial. See Note 2. [m] */ + u8 orb_along_bound_sig; /**< Standard Deviation Along-Track. See Note 2. [m] + */ + u8 orb_cross_bound_sig; /**< Standard Deviation Cross-Track. See Note 2. [m] + */ + u8 clock_bound_mu; /**< Clock Bound Mean. See Note 1. [m] */ + u8 clock_bound_sig; /**< Clock Bound Standard Deviation. See Note 2. [m] */ +} orbit_clock_bound_t; + +/** Combined Orbit and Clock Bound + * + * Note 1: Range: 0-17.5 m. i<=200, mean=0.01i; 200230, mean=5+0.5(i-230). + * + * Note 2: Range: 0-17.5 m. i<=200, std=0.01i; 200230, std=5+0.5(i-230). + */ typedef struct SBP_ATTR_PACKED { - u8 stub[0]; -} msg_ssr_orbit_clock_bounds_degradation_t; + bounds_header_t header; /**< Header of a bounds message. */ + u8 ssr_iod; /**< IOD of the SSR bound. */ + u8 const_id; /**< Constellation ID to which the SVs belong. */ + u8 n_sats; /**< Number of satellites. */ + orbit_clock_bound_t orbit_clock_bounds[0]; /**< Orbit and Clock Bounds per + Satellite */ +} msg_ssr_orbit_clock_bounds_t; typedef struct SBP_ATTR_PACKED { u8 sat_id; /**< Satellite ID. Similar to either RTCM DF068 @@ -564,12 +710,12 @@ typedef struct SBP_ATTR_PACKED { Similar to either RTCM DF380 (GPS), DF382 (Galileo) or DF467 (BDS) depending on the constellation. */ - u8 code_bias_bound_mu; /**< Code Bias Mean (range 0-1.275) [0.005 m] */ - u8 code_bias_bound_sig; /**< Code Bias Standard Deviation (range - 0-1.275) [0.005 m] */ - u8 phase_bias_bound_mu; /**< Phase Bias Mean (range 0-1.275) [0.005 m] */ - u8 phase_bias_bound_sig; /**< Phase Bias Standard Deviation (range - 0-1.275) [0.005 m] */ + u8 code_bias_bound_mu; /**< Code Bias Mean. Range: 0-1.275 m [0.005 m] */ + u8 code_bias_bound_sig; /**< Code Bias Standard Deviation. Range: + 0-1.275 m [0.005 m] */ + u8 phase_bias_bound_mu; /**< Phase Bias Mean. Range: 0-1.275 m [0.005 m] */ + u8 phase_bias_bound_sig; /**< Phase Bias Standard Deviation. Range: + 0-1.275 m [0.005 m] */ } code_phase_biases_sat_sig_t; typedef struct SBP_ATTR_PACKED { @@ -590,29 +736,24 @@ typedef struct SBP_ATTR_PACKED { typedef struct SBP_ATTR_PACKED { u8 orb_radial_bound_mu_dot; /**< Orbit Bound Mean Radial First - derivative degradation parameter (range - 0-0.255) [0.001 m/s] */ + derivative. Range: 0-0.255 m/s [0.001 m/s] */ u8 orb_along_bound_mu_dot; /**< Orbit Bound Mean Along-Track First - derivative degradation parameter (range - 0-0.255) [0.001 m/s] */ + derivative. Range: 0-0.255 m/s [0.001 m/s] */ u8 orb_cross_bound_mu_dot; /**< Orbit Bound Mean Cross-Track First - derivative degradation parameter (range - 0-0.255) [0.001 m/s] */ + derivative. Range: 0-0.255 m/s [0.001 m/s] */ u8 orb_radial_bound_sig_dot; /**< Orbit Bound Standard Deviation Radial - First derivative degradation parameter - (range 0-0.255) [0.001 m/s] */ + First derivative. Range: 0-0.255 m/s [0.001 + m/s] */ u8 orb_along_bound_sig_dot; /**< Orbit Bound Standard Deviation Along- - Track First derivative degradation - parameter (range 0-0.255) [0.001 m/s] */ + Track First derivative. Range: 0-0.255 + m/s [0.001 m/s] */ u8 orb_cross_bound_sig_dot; /**< Orbit Bound Standard Deviation Cross- - Track First derivative degradation - parameter (range 0-0.255) [0.001 m/s] */ - u8 clock_bound_mu_dot; /**< Clock Bound Mean First derivative - degradation parameter (range 0-0.255) [0.001 m/s] - */ + Track First derivative. Range: 0-0.255 + m/s [0.001 m/s] */ + u8 clock_bound_mu_dot; /**< Clock Bound Mean First derivative. + Range: 0-0.255 m/s [0.001 m/s] */ u8 clock_bound_sig_dot; /**< Clock Bound Standard Deviation First - derivative degradation parameter (range - 0-0.255) [0.001 m/s] */ + derivative. Range: 0-0.255 m/s [0.001 m/s] */ } orbit_clock_bound_degradation_t; typedef struct SBP_ATTR_PACKED { @@ -625,7 +766,9 @@ typedef struct SBP_ATTR_PACKED { u64 sat_bitmask; /**< Satellite Bit Mask. Put 1 for each satellite where the following degradation parameters - are applicable, 0 otherwise. */ + are applicable, 0 otherwise. + Encoded following RTCM DF394 + specification. */ orbit_clock_bound_degradation_t orbit_clock_bounds_degradation; /**< Orbit and diff --git a/c/include/libsbp/navigation_macros.h b/c/include/libsbp/navigation_macros.h index 647140c42d..e2ad5dcf0e 100644 --- a/c/include/libsbp/navigation_macros.h +++ b/c/include/libsbp/navigation_macros.h @@ -1737,50 +1737,33 @@ #define SBP_MSG_PROTECTION_LEVEL_ENCODED_LEN 76u #define SBP_MSG_UTC_LEAP_SECOND 0x023A -/** - * The maximum number of items that can be stored in - * sbp_msg_utc_leap_second_t::stub (V4 API) or msg_utc_leap_second_t::stub - * (legacy API) before the maximum SBP message size is exceeded - */ -#define SBP_MSG_UTC_LEAP_SECOND_STUB_MAX 255u - /** * Encoded length of sbp_msg_utc_leap_second_t (V4 API) and * msg_utc_leap_second_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_utc_leap_second_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_UTC_LEAP_SECOND_ENCODED_OVERHEAD 0u +#define SBP_MSG_UTC_LEAP_SECOND_ENCODED_LEN 14u #define SBP_MSG_REFERENCE_FRAME_PARAM 0x0244 /** * The maximum number of items that can be stored in - * sbp_msg_reference_frame_param_t::stub (V4 API) or - * msg_reference_frame_param_t::stub (legacy API) before the maximum SBP message + * sbp_msg_reference_frame_param_t::sn (V4 API) or + * msg_reference_frame_param_t::sn (legacy API) before the maximum SBP message * size is exceeded */ -#define SBP_MSG_REFERENCE_FRAME_PARAM_STUB_MAX 255u +#define SBP_MSG_REFERENCE_FRAME_PARAM_SN_MAX 32u + +/** + * The maximum number of items that can be stored in + * sbp_msg_reference_frame_param_t::tn (V4 API) or + * msg_reference_frame_param_t::tn (legacy API) before the maximum SBP message + * size is exceeded + */ +#define SBP_MSG_REFERENCE_FRAME_PARAM_TN_MAX 32u /** * Encoded length of sbp_msg_reference_frame_param_t (V4 API) and * msg_reference_frame_param_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_reference_frame_param_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_REFERENCE_FRAME_PARAM_ENCODED_OVERHEAD 0u +#define SBP_MSG_REFERENCE_FRAME_PARAM_ENCODED_LEN 124u #endif /* LIBSBP_NAVIGATION_MACROS_H */ diff --git a/c/include/libsbp/ssr_macros.h b/c/include/libsbp/ssr_macros.h index a0f97fa347..4cd8bc86a4 100644 --- a/c/include/libsbp/ssr_macros.h +++ b/c/include/libsbp/ssr_macros.h @@ -156,14 +156,20 @@ */ #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::stub (V4 API) or - * msg_ssr_stec_correction_t::stub (legacy API) before the maximum SBP message - * size is exceeded + * sbp_msg_ssr_stec_correction_t::stec_sat_list (V4 API) or + * msg_ssr_stec_correction_t::stec_sat_list (legacy API) before the maximum SBP + * message size is exceeded */ -#define SBP_MSG_SSR_STEC_CORRECTION_STUB_MAX 255u +#define SBP_MSG_SSR_STEC_CORRECTION_STEC_SAT_LIST_MAX 21u /** * Encoded length of sbp_msg_ssr_stec_correction_t (V4 API) and @@ -178,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 0u +#define SBP_MSG_SSR_STEC_CORRECTION_ENCODED_OVERHEAD 16u #define SBP_MSG_SSR_GRIDDED_CORRECTION 0x05FC /** @@ -204,14 +210,20 @@ */ #define SBP_MSG_SSR_GRIDDED_CORRECTION_ENCODED_OVERHEAD 23u +/** + * 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::stub (V4 API) or - * msg_ssr_gridded_correction_bounds_t::stub (legacy API) before the maximum SBP - * message size is exceeded + * 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_STUB_MAX 255u +#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 @@ -226,7 +238,7 @@ * 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 0u +#define SBP_MSG_SSR_GRIDDED_CORRECTION_BOUNDS_ENCODED_OVERHEAD 27u #define SBP_MSG_SSR_TILE_DEFINITION_DEP 0x05F6 /** @@ -236,28 +248,11 @@ #define SBP_MSG_SSR_TILE_DEFINITION_DEP_ENCODED_LEN 24u #define SBP_MSG_SSR_TILE_DEFINITION 0x05F7 -/** - * The maximum number of items that can be stored in - * sbp_msg_ssr_tile_definition_t::stub (V4 API) or - * msg_ssr_tile_definition_t::stub (legacy API) before the maximum SBP message - * size is exceeded - */ -#define SBP_MSG_SSR_TILE_DEFINITION_STUB_MAX 255u - /** * Encoded length of sbp_msg_ssr_tile_definition_t (V4 API) and * msg_ssr_tile_definition_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_tile_definition_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_TILE_DEFINITION_ENCODED_OVERHEAD 0u +#define SBP_MSG_SSR_TILE_DEFINITION_ENCODED_LEN 25u #define SBP_SATELLITEAPC_SATELLITE_TYPE_MASK (0x1fu) #define SBP_SATELLITEAPC_SATELLITE_TYPE_SHIFT (0u) @@ -457,14 +452,20 @@ */ #define SBP_MSG_SSR_GRID_DEFINITION_DEP_A_ENCODED_OVERHEAD 9u +/** + * Encoded length of sbp_orbit_clock_bound_t (V4 API) and + * orbit_clock_bound_t (legacy API) + */ +#define SBP_ORBIT_CLOCK_BOUND_ENCODED_LEN 9u + #define SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS 0x05DE /** * The maximum number of items that can be stored in - * sbp_msg_ssr_orbit_clock_bounds_t::stub (V4 API) or - * msg_ssr_orbit_clock_bounds_t::stub (legacy API) before the maximum SBP - * message size is exceeded + * sbp_msg_ssr_orbit_clock_bounds_t::orbit_clock_bounds (V4 API) or + * msg_ssr_orbit_clock_bounds_t::orbit_clock_bounds (legacy API) before the + * maximum SBP message size is exceeded */ -#define SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_STUB_MAX 255u +#define SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_ORBIT_CLOCK_BOUNDS_MAX 26u /** * Encoded length of sbp_msg_ssr_orbit_clock_bounds_t (V4 API) and @@ -479,56 +480,7 @@ * See the documentation for libsbp for more details regarding the message * structure and its variable length component(s) */ -#define SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_ENCODED_OVERHEAD 0u - -#define SBP_MSG_SSR_CODE_PHASE_BIASES_BOUNDS 0x05EC -/** - * The maximum number of items that can be stored in - * sbp_msg_ssr_code_phase_biases_bounds_t::stub (V4 API) or - * msg_ssr_code_phase_biases_bounds_t::stub (legacy API) before the maximum SBP - * message size is exceeded - */ -#define SBP_MSG_SSR_CODE_PHASE_BIASES_BOUNDS_STUB_MAX 255u - -/** - * Encoded length of sbp_msg_ssr_code_phase_biases_bounds_t (V4 API) and - * msg_ssr_code_phase_biases_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_code_phase_biases_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_CODE_PHASE_BIASES_BOUNDS_ENCODED_OVERHEAD 0u - -#define SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION 0x05DF -/** - * The maximum number of items that can be stored in - * sbp_msg_ssr_orbit_clock_bounds_degradation_t::stub (V4 API) or - * msg_ssr_orbit_clock_bounds_degradation_t::stub (legacy API) before the - * maximum SBP message size is exceeded - */ -#define SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION_STUB_MAX 255u - -/** - * Encoded length of sbp_msg_ssr_orbit_clock_bounds_degradation_t (V4 API) and - * msg_ssr_orbit_clock_bounds_degradation_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_orbit_clock_bounds_degradation_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_ORBIT_CLOCK_BOUNDS_DEGRADATION_ENCODED_OVERHEAD 0u +#define SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_ENCODED_OVERHEAD 13u /** * Encoded length of sbp_code_phase_biases_sat_sig_t (V4 API) and diff --git a/c/include/libsbp/v4/integrity.h b/c/include/libsbp/v4/integrity.h index 71576464b1..d83beca69c 100644 --- a/c/include/libsbp/v4/integrity.h +++ b/c/include/libsbp/v4/integrity.h @@ -17,6 +17,7 @@ #ifndef LIBSBP_V4_INTEGRITY_MESSAGES_H #define LIBSBP_V4_INTEGRITY_MESSAGES_H +#include #include #include #include diff --git a/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_HIGH_LEVEL.h b/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_HIGH_LEVEL.h index 9ee327f9cb..dc346a5ff1 100644 --- a/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_HIGH_LEVEL.h +++ b/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_HIGH_LEVEL.h @@ -27,6 +27,7 @@ #include #include +#include #include #ifdef __cplusplus @@ -39,18 +40,75 @@ extern "C" { * *****************************************************************************/ typedef struct { - u8 stub[SBP_MSG_SSR_FLAG_HIGH_LEVEL_STUB_MAX]; /** - * Number of elements in stub - * - * When sending a message fill in this field with the number elements set in - * stub before calling an appropriate libsbp send function - * - * When receiving a message query this field for the number of elements in - * stub. The value of any elements beyond the index specified in this field is - * undefined + * GNSS reference time of the observation used to generate the flag. */ - u8 n_stub; + sbp_gps_time_sec_t obs_time; + + /** + * GNSS reference time of the correction associated to the flag. + */ + sbp_gps_time_sec_t corr_time; + + /** + * SSR Solution ID. + */ + u8 ssr_sol_id; + + /** + * 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; + + /** + * Chain and type of flag. + */ + u8 chain_id; + + /** + * Use GPS satellites. + */ + u8 use_gps_sat; + + /** + * Use GAL satellites. + */ + u8 use_gal_sat; + + /** + * Use BDS satellites. + */ + u8 use_bds_sat; + + /** + * Reserved + */ + u8 reserved[SBP_MSG_SSR_FLAG_HIGH_LEVEL_RESERVED_MAX]; + + /** + * Use tropo grid points. + */ + u8 use_tropo_grid_points; + + /** + * Use iono grid points. + */ + u8 use_iono_grid_points; + + /** + * Use iono tile satellite LoS. + */ + u8 use_iono_tile_sat_los; + + /** + * Use iono grid point satellite LoS. + */ + u8 use_iono_grid_point_sat_los; } sbp_msg_ssr_flag_high_level_t; /** @@ -61,8 +119,8 @@ typedef struct { */ static inline size_t sbp_msg_ssr_flag_high_level_encoded_len( const sbp_msg_ssr_flag_high_level_t *msg) { - return SBP_MSG_SSR_FLAG_HIGH_LEVEL_ENCODED_OVERHEAD + - (msg->n_stub * SBP_ENCODED_LEN_U8); + (void)msg; + return SBP_MSG_SSR_FLAG_HIGH_LEVEL_ENCODED_LEN; } /** diff --git a/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_IONO_GRID_POINTS.h b/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_IONO_GRID_POINTS.h index 1e36115ef9..f6ad5c300e 100644 --- a/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_IONO_GRID_POINTS.h +++ b/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_IONO_GRID_POINTS.h @@ -27,6 +27,7 @@ #include #include +#include #include #ifdef __cplusplus @@ -39,18 +40,20 @@ extern "C" { * *****************************************************************************/ typedef struct { - u8 stub[SBP_MSG_SSR_FLAG_IONO_GRID_POINTS_STUB_MAX]; /** - * Number of elements in stub - * - * When sending a message fill in this field with the number elements set in - * stub before calling an appropriate libsbp send function - * - * When receiving a message query this field for the number of elements in - * stub. The value of any elements beyond the index specified in this field is - * undefined + * Header of an integrity message. */ - u8 n_stub; + sbp_integrity_ssr_header_t header; + + /** + * Number of faulty grid points. + */ + u8 n_faulty_points; + + /** + * List of faulty grid points. + */ + u16 faulty_points[SBP_MSG_SSR_FLAG_IONO_GRID_POINTS_FAULTY_POINTS_MAX]; } sbp_msg_ssr_flag_iono_grid_points_t; /** @@ -62,7 +65,7 @@ typedef struct { static inline size_t sbp_msg_ssr_flag_iono_grid_points_encoded_len( const sbp_msg_ssr_flag_iono_grid_points_t *msg) { return SBP_MSG_SSR_FLAG_IONO_GRID_POINTS_ENCODED_OVERHEAD + - (msg->n_stub * SBP_ENCODED_LEN_U8); + (msg->n_faulty_points * SBP_ENCODED_LEN_U16); } /** diff --git a/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS.h b/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS.h index e233b0dcff..4f1dcee826 100644 --- a/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS.h +++ b/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS.h @@ -27,6 +27,8 @@ #include #include +#include +#include #include #ifdef __cplusplus @@ -39,18 +41,26 @@ extern "C" { * *****************************************************************************/ typedef struct { - u8 stub[SBP_MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS_STUB_MAX]; /** - * Number of elements in stub - * - * When sending a message fill in this field with the number elements set in - * stub before calling an appropriate libsbp send function - * - * When receiving a message query this field for the number of elements in - * stub. The value of any elements beyond the index specified in this field is - * undefined + * Header of an integrity message. */ - u8 n_stub; + sbp_integrity_ssr_header_t header; + + /** + * Index of the grid point. + */ + u16 grid_point_id; + + /** + * Number of faulty LOS. + */ + u8 n_faulty_los; + + /** + * List of faulty LOS + */ + sbp_sv_id_t + faulty_los[SBP_MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS_FAULTY_LOS_MAX]; } sbp_msg_ssr_flag_iono_grid_point_sat_los_t; /** @@ -62,7 +72,7 @@ typedef struct { static inline size_t sbp_msg_ssr_flag_iono_grid_point_sat_los_encoded_len( const sbp_msg_ssr_flag_iono_grid_point_sat_los_t *msg) { return SBP_MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS_ENCODED_OVERHEAD + - (msg->n_stub * SBP_ENCODED_LEN_U8); + (msg->n_faulty_los * SBP_SV_ID_ENCODED_LEN); } /** diff --git a/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_IONO_TILE_SAT_LOS.h b/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_IONO_TILE_SAT_LOS.h index 7424224c75..f406f65e48 100644 --- a/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_IONO_TILE_SAT_LOS.h +++ b/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_IONO_TILE_SAT_LOS.h @@ -27,6 +27,8 @@ #include #include +#include +#include #include #ifdef __cplusplus @@ -39,18 +41,20 @@ extern "C" { * *****************************************************************************/ typedef struct { - u8 stub[SBP_MSG_SSR_FLAG_IONO_TILE_SAT_LOS_STUB_MAX]; /** - * Number of elements in stub - * - * When sending a message fill in this field with the number elements set in - * stub before calling an appropriate libsbp send function - * - * When receiving a message query this field for the number of elements in - * stub. The value of any elements beyond the index specified in this field is - * undefined + * Header of an integrity message. */ - u8 n_stub; + sbp_integrity_ssr_header_t header; + + /** + * Number of faulty LOS. + */ + u8 n_faulty_los; + + /** + * List of faulty LOS + */ + sbp_sv_id_t faulty_los[SBP_MSG_SSR_FLAG_IONO_TILE_SAT_LOS_FAULTY_LOS_MAX]; } sbp_msg_ssr_flag_iono_tile_sat_los_t; /** @@ -62,7 +66,7 @@ typedef struct { static inline size_t sbp_msg_ssr_flag_iono_tile_sat_los_encoded_len( const sbp_msg_ssr_flag_iono_tile_sat_los_t *msg) { return SBP_MSG_SSR_FLAG_IONO_TILE_SAT_LOS_ENCODED_OVERHEAD + - (msg->n_stub * SBP_ENCODED_LEN_U8); + (msg->n_faulty_los * SBP_SV_ID_ENCODED_LEN); } /** diff --git a/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_SATELLITES.h b/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_SATELLITES.h index f4144a4c80..cdfdbac228 100644 --- a/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_SATELLITES.h +++ b/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_SATELLITES.h @@ -27,6 +27,7 @@ #include #include +#include #include #ifdef __cplusplus @@ -39,18 +40,45 @@ extern "C" { * *****************************************************************************/ typedef struct { - u8 stub[SBP_MSG_SSR_FLAG_SATELLITES_STUB_MAX]; /** - * Number of elements in stub - * - * When sending a message fill in this field with the number elements set in - * stub before calling an appropriate libsbp send function - * - * When receiving a message query this field for the number of elements in - * stub. The value of any elements beyond the index specified in this field is - * undefined + * GNSS reference time of the observation used to generate the flag. */ - u8 n_stub; + sbp_gps_time_sec_t obs_time; + + /** + * Number of messages in the dataset + */ + u8 num_msgs; + + /** + * Position of this message in the dataset + */ + u8 seq_num; + + /** + * SSR Solution ID. + */ + u8 ssr_sol_id; + + /** + * Chain and type of flag. + */ + u8 chain_id; + + /** + * Constellation ID. + */ + u8 const_id; + + /** + * Number of faulty satellites. + */ + u8 n_faulty_sats; + + /** + * List of faulty satellites. + */ + u8 faulty_sats[SBP_MSG_SSR_FLAG_SATELLITES_FAULTY_SATS_MAX]; } sbp_msg_ssr_flag_satellites_t; /** @@ -62,7 +90,7 @@ typedef struct { static inline size_t sbp_msg_ssr_flag_satellites_encoded_len( const sbp_msg_ssr_flag_satellites_t *msg) { return SBP_MSG_SSR_FLAG_SATELLITES_ENCODED_OVERHEAD + - (msg->n_stub * SBP_ENCODED_LEN_U8); + (msg->n_faulty_sats * SBP_ENCODED_LEN_U8); } /** diff --git a/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_TROPO_GRID_POINTS.h b/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_TROPO_GRID_POINTS.h index e2cc205f24..47c61a0f24 100644 --- a/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_TROPO_GRID_POINTS.h +++ b/c/include/libsbp/v4/integrity/MSG_SSR_FLAG_TROPO_GRID_POINTS.h @@ -27,6 +27,7 @@ #include #include +#include #include #ifdef __cplusplus @@ -39,18 +40,20 @@ extern "C" { * *****************************************************************************/ typedef struct { - u8 stub[SBP_MSG_SSR_FLAG_TROPO_GRID_POINTS_STUB_MAX]; /** - * Number of elements in stub - * - * When sending a message fill in this field with the number elements set in - * stub before calling an appropriate libsbp send function - * - * When receiving a message query this field for the number of elements in - * stub. The value of any elements beyond the index specified in this field is - * undefined + * Header of an integrity message. */ - u8 n_stub; + sbp_integrity_ssr_header_t header; + + /** + * Number of faulty grid points. + */ + u8 n_faulty_points; + + /** + * List of faulty grid points. + */ + u16 faulty_points[SBP_MSG_SSR_FLAG_TROPO_GRID_POINTS_FAULTY_POINTS_MAX]; } sbp_msg_ssr_flag_tropo_grid_points_t; /** @@ -62,7 +65,7 @@ typedef struct { static inline size_t sbp_msg_ssr_flag_tropo_grid_points_encoded_len( const sbp_msg_ssr_flag_tropo_grid_points_t *msg) { return SBP_MSG_SSR_FLAG_TROPO_GRID_POINTS_ENCODED_OVERHEAD + - (msg->n_stub * SBP_ENCODED_LEN_U8); + (msg->n_faulty_points * SBP_ENCODED_LEN_U16); } /** diff --git a/c/include/libsbp/v4/navigation/MSG_REFERENCE_FRAME_PARAM.h b/c/include/libsbp/v4/navigation/MSG_REFERENCE_FRAME_PARAM.h index e22b051077..e92f9fe49b 100644 --- a/c/include/libsbp/v4/navigation/MSG_REFERENCE_FRAME_PARAM.h +++ b/c/include/libsbp/v4/navigation/MSG_REFERENCE_FRAME_PARAM.h @@ -39,18 +39,106 @@ extern "C" { * *****************************************************************************/ typedef struct { - u8 stub[SBP_MSG_REFERENCE_FRAME_PARAM_STUB_MAX]; - /** - * Number of elements in stub - * - * When sending a message fill in this field with the number elements set in - * stub before calling an appropriate libsbp send function - * - * When receiving a message query this field for the number of elements in - * stub. The value of any elements beyond the index specified in this field is - * undefined - */ - u8 n_stub; + /** + * SSR IOD parameter. + */ + u8 ssr_iod; + + /** + * Name of source coordinate-system using the EPSG identification code. + */ + char sn[SBP_MSG_REFERENCE_FRAME_PARAM_SN_MAX]; + + /** + * Name of target coordinate-system using the EPSG identification code. + */ + char tn[SBP_MSG_REFERENCE_FRAME_PARAM_TN_MAX]; + + /** + * System Identification Number. + */ + u8 sin; + + /** + * Utilized Transformation Message. + */ + u16 utn; + + /** + * Reference Epoch t0 for transformation parameter set given as Modified + * Julian Day (MDJ) Number minus 44244 days. [1 day] + */ + u16 re_t0; + + /** + * Translation in X for Reference Epoch t0. [0.001 m] + */ + s32 delta_X0; + + /** + * Translation in Y for Reference Epoch t0. [0.001 m] + */ + s32 delta_Y0; + + /** + * Translation in Z for Reference Epoch t0. [0.001 m] + */ + s32 delta_Z0; + + /** + * Rotation around the X-axis for Reference Epoch t0. [0.00002 "] + */ + s32 theta_01; + + /** + * Rotation around the Y-axis for Reference Epoch t0. [0.00002 "] + */ + s32 theta_02; + + /** + * Rotation around the Z-axis for Reference Epoch t0. [0.00002 "] + */ + s32 theta_03; + + /** + * Scale correction for Reference Epoch t0. [0.00001 ppm] + */ + s32 scale; + + /** + * Rate of change of translation in X. [0.00002 m/yr] + */ + s32 dot_delta_X0; + + /** + * Rate of change of translation in Y. [0.00002 m/yr] + */ + s32 dot_delta_Y0; + + /** + * Rate of change of translation in Z. [0.00002 m/yr] + */ + s32 dot_delta_Z0; + + /** + * Rate of change of rotation around the X-axis. [0.0000004 "/yr] + */ + s32 dot_theta_01; + + /** + * Rate of change of rotation around the Y-axis. [0.0000004 "/yr] + */ + s32 dot_theta_02; + + /** + * Rate of change of rotation around the Z-axis. [0.0000004 "/yr] + */ + s32 dot_theta_03; + + /** + * Rate of change of scale correction. [0.0000002 ppm/yr] + */ + s16 dot_scale; } sbp_msg_reference_frame_param_t; /** @@ -61,8 +149,8 @@ typedef struct { */ static inline size_t sbp_msg_reference_frame_param_encoded_len( const sbp_msg_reference_frame_param_t *msg) { - return SBP_MSG_REFERENCE_FRAME_PARAM_ENCODED_OVERHEAD + - (msg->n_stub * SBP_ENCODED_LEN_U8); + (void)msg; + return SBP_MSG_REFERENCE_FRAME_PARAM_ENCODED_LEN; } /** diff --git a/c/include/libsbp/v4/navigation/MSG_UTC_LEAP_SECOND.h b/c/include/libsbp/v4/navigation/MSG_UTC_LEAP_SECOND.h index 4d738ba7bf..79b3692f19 100644 --- a/c/include/libsbp/v4/navigation/MSG_UTC_LEAP_SECOND.h +++ b/c/include/libsbp/v4/navigation/MSG_UTC_LEAP_SECOND.h @@ -45,18 +45,53 @@ extern "C" { drift model parameters. */ typedef struct { - u8 stub[SBP_MSG_UTC_LEAP_SECOND_STUB_MAX]; /** - * Number of elements in stub - * - * When sending a message fill in this field with the number elements set in - * stub before calling an appropriate libsbp send function - * - * When receiving a message query this field for the number of elements in - * stub. The value of any elements beyond the index specified in this field is - * undefined + * Reserved. Bias coefficient of GPS time scale with respect to UTC drift + * model. [2^-35 s] */ - u8 n_stub; + s16 bias_coeff; + + /** + * Reserved. Drift coefficient of GPS time scale with respect to UTC drift + * model. [2^-51 s/s] + */ + s16 drift_coeff; + + /** + * Reserved. Drift rate correction coefficient of GPS time scale with respect + * to UTC drift model. [2^-68 s/s^2] + */ + s8 drift_rate_coeff; + + /** + * Leap second count before insertion. [s] + */ + s8 count_before; + + /** + * Reserved. Drift model reference week second. [s] + */ + u16 tow_s; + + /** + * Reserved. Drift model reference week number. [weeks] + */ + u16 wn; + + /** + * Leap second reference week number. [weeks] + */ + u16 ref_wn; + + /** + * Leap second reference day number. [days] + */ + u8 ref_dn; + + /** + * Leap second count after insertion. [s] + */ + s8 count_after; } sbp_msg_utc_leap_second_t; /** @@ -67,8 +102,8 @@ typedef struct { */ static inline size_t sbp_msg_utc_leap_second_encoded_len( const sbp_msg_utc_leap_second_t *msg) { - return SBP_MSG_UTC_LEAP_SECOND_ENCODED_OVERHEAD + - (msg->n_stub * SBP_ENCODED_LEN_U8); + (void)msg; + return SBP_MSG_UTC_LEAP_SECOND_ENCODED_LEN; } /** diff --git a/c/include/libsbp/v4/ssr.h b/c/include/libsbp/v4/ssr.h index b3cf74741d..5dfb14cfef 100644 --- a/c/include/libsbp/v4/ssr.h +++ b/c/include/libsbp/v4/ssr.h @@ -17,6 +17,7 @@ #ifndef LIBSBP_V4_SSR_MESSAGES_H #define LIBSBP_V4_SSR_MESSAGES_H +#include #include #include #include @@ -40,12 +41,15 @@ #include #include #include +#include +#include #include #include #include #include #include #include +#include #include #include #include diff --git a/c/include/libsbp/v4/ssr/MSG_SSR_CODE_PHASE_BIASES_BOUNDS.h b/c/include/libsbp/v4/ssr/MSG_SSR_CODE_PHASE_BIASES_BOUNDS.h index aeab349b5a..11173dc59d 100644 --- a/c/include/libsbp/v4/ssr/MSG_SSR_CODE_PHASE_BIASES_BOUNDS.h +++ b/c/include/libsbp/v4/ssr/MSG_SSR_CODE_PHASE_BIASES_BOUNDS.h @@ -27,6 +27,8 @@ #include #include +#include +#include #include #ifdef __cplusplus @@ -39,18 +41,31 @@ extern "C" { * *****************************************************************************/ typedef struct { - u8 stub[SBP_MSG_SSR_CODE_PHASE_BIASES_BOUNDS_STUB_MAX]; /** - * Number of elements in stub - * - * When sending a message fill in this field with the number elements set in - * stub before calling an appropriate libsbp send function - * - * When receiving a message query this field for the number of elements in - * stub. The value of any elements beyond the index specified in this field is - * undefined + * Header of a bounds message. */ - u8 n_stub; + sbp_bounds_header_t header; + + /** + * IOD of the SSR bound. + */ + u8 ssr_iod; + + /** + * Constellation ID to which the SVs belong. + */ + u8 const_id; + + /** + * Number of satellite-signal couples. + */ + u8 n_sats_signals; + + /** + * Code and Phase Biases Bounds per Satellite-Signal couple. + */ + sbp_code_phase_biases_sat_sig_t satellites_signals + [SBP_MSG_SSR_CODE_PHASE_BIASES_BOUNDS_SATELLITES_SIGNALS_MAX]; } sbp_msg_ssr_code_phase_biases_bounds_t; /** @@ -62,7 +77,7 @@ typedef struct { static inline size_t sbp_msg_ssr_code_phase_biases_bounds_encoded_len( const sbp_msg_ssr_code_phase_biases_bounds_t *msg) { return SBP_MSG_SSR_CODE_PHASE_BIASES_BOUNDS_ENCODED_OVERHEAD + - (msg->n_stub * SBP_ENCODED_LEN_U8); + (msg->n_sats_signals * SBP_CODE_PHASE_BIASES_SAT_SIG_ENCODED_LEN); } /** 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 index 832f61a616..22f09c53bd 100644 --- a/c/include/libsbp/v4/ssr/MSG_SSR_GRIDDED_CORRECTION_BOUNDS.h +++ b/c/include/libsbp/v4/ssr/MSG_SSR_GRIDDED_CORRECTION_BOUNDS.h @@ -27,6 +27,9 @@ #include #include +#include +#include +#include #include #ifdef __cplusplus @@ -38,19 +41,78 @@ extern "C" { * SBP_MSG_SSR_GRIDDED_CORRECTION_BOUNDS * *****************************************************************************/ +/** Gridded troposhere and STEC correction residuals bounds + * + * Note 1: Range: 0-17.5 m. i<= 200, mean = 0.01i; 200230, mean=5+0.5(i-230). + */ typedef struct { - u8 stub[SBP_MSG_SSR_GRIDDED_CORRECTION_BOUNDS_STUB_MAX]; /** - * Number of elements in stub - * - * When sending a message fill in this field with the number elements set in - * stub before calling an appropriate libsbp send function - * - * When receiving a message query this field for the number of elements in - * stub. The value of any elements beyond the index specified in this field is - * undefined + * Header of a bounds message. + */ + sbp_bounds_header_t header; + + /** + * IOD of the correction. + */ + u8 ssr_iod_atmo; + + /** + * 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; + + /** + * Vertical Hydrostatic Error Bound Mean. [0.005 m] + */ + u8 tropo_v_hydro_bound_mu; + + /** + * Vertical Hydrostatic Error Bound StDev. [0.005 m] + */ + u8 tropo_v_hydro_bound_sig; + + /** + * Vertical Wet Error Bound Mean. [0.005 m] + */ + u8 tropo_v_wet_bound_mu; + + /** + * Vertical Wet Error Bound StDev. [0.005 m] + */ + u8 tropo_v_wet_bound_sig; + + /** + * Number of satellites. + */ + u8 n_sats; + + /** + * Array of STEC polynomial coefficients and its bounds for each space + * vehicle. */ - u8 n_stub; + 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; /** @@ -62,7 +124,7 @@ typedef struct { 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_stub * SBP_ENCODED_LEN_U8); + (msg->n_sats * SBP_STEC_SAT_ELEMENT_INTEGRITY_ENCODED_LEN); } /** diff --git a/c/include/libsbp/v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS.h b/c/include/libsbp/v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS.h index 41a0d8e224..a2b6efcacc 100644 --- a/c/include/libsbp/v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS.h +++ b/c/include/libsbp/v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS.h @@ -27,6 +27,8 @@ #include #include +#include +#include #include #ifdef __cplusplus @@ -45,18 +47,31 @@ extern "C" { * */ typedef struct { - u8 stub[SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_STUB_MAX]; /** - * Number of elements in stub - * - * When sending a message fill in this field with the number elements set in - * stub before calling an appropriate libsbp send function - * - * When receiving a message query this field for the number of elements in - * stub. The value of any elements beyond the index specified in this field is - * undefined + * Header of a bounds message. */ - u8 n_stub; + sbp_bounds_header_t header; + + /** + * IOD of the SSR bound. + */ + u8 ssr_iod; + + /** + * Constellation ID to which the SVs belong. + */ + u8 const_id; + + /** + * Number of satellites. + */ + u8 n_sats; + + /** + * Orbit and Clock Bounds per Satellite + */ + sbp_orbit_clock_bound_t + orbit_clock_bounds[SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_ORBIT_CLOCK_BOUNDS_MAX]; } sbp_msg_ssr_orbit_clock_bounds_t; /** @@ -68,7 +83,7 @@ typedef struct { static inline size_t sbp_msg_ssr_orbit_clock_bounds_encoded_len( const sbp_msg_ssr_orbit_clock_bounds_t *msg) { return SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_ENCODED_OVERHEAD + - (msg->n_stub * SBP_ENCODED_LEN_U8); + (msg->n_sats * SBP_ORBIT_CLOCK_BOUND_ENCODED_LEN); } /** diff --git a/c/include/libsbp/v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION.h b/c/include/libsbp/v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION.h index 7c501100c4..1d75fb33ee 100644 --- a/c/include/libsbp/v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION.h +++ b/c/include/libsbp/v4/ssr/MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION.h @@ -27,6 +27,8 @@ #include #include +#include +#include #include #ifdef __cplusplus @@ -39,18 +41,32 @@ extern "C" { * *****************************************************************************/ typedef struct { - u8 stub[SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION_STUB_MAX]; /** - * Number of elements in stub - * - * When sending a message fill in this field with the number elements set in - * stub before calling an appropriate libsbp send function - * - * When receiving a message query this field for the number of elements in - * stub. The value of any elements beyond the index specified in this field is - * undefined + * Header of a bounds message. */ - u8 n_stub; + sbp_bounds_header_t header; + + /** + * IOD of the SSR bound degradation parameter. + */ + u8 ssr_iod; + + /** + * Constellation ID to which the SVs belong. + */ + u8 const_id; + + /** + * Satellite Bit Mask. Put 1 for each satellite where the following + * degradation parameters are applicable, 0 otherwise. Encoded following RTCM + * DF394 specification. + */ + u64 sat_bitmask; + + /** + * Orbit and Clock Bounds Degradation Parameters + */ + sbp_orbit_clock_bound_degradation_t orbit_clock_bounds_degradation; } sbp_msg_ssr_orbit_clock_bounds_degradation_t; /** @@ -62,8 +78,8 @@ typedef struct { */ static inline size_t sbp_msg_ssr_orbit_clock_bounds_degradation_encoded_len( const sbp_msg_ssr_orbit_clock_bounds_degradation_t *msg) { - return SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION_ENCODED_OVERHEAD + - (msg->n_stub * SBP_ENCODED_LEN_U8); + (void)msg; + return SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION_ENCODED_LEN; } /** 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 aaa5e65704..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,6 +27,8 @@ #include #include +#include +#include #include #ifdef __cplusplus @@ -39,18 +41,36 @@ extern "C" { * *****************************************************************************/ typedef struct { - u8 stub[SBP_MSG_SSR_STEC_CORRECTION_STUB_MAX]; /** - * Number of elements in stub - * - * When sending a message fill in this field with the number elements set in - * stub before calling an appropriate libsbp send function - * - * When receiving a message query this field for the number of elements in - * stub. The value of any elements beyond the index specified in this field is - * undefined + * Header of a STEC correction with bounds message. */ - u8 n_stub; + sbp_bounds_header_t header; + + /** + * IOD of the SSR atmospheric correction + */ + u8 ssr_iod_atmo; + + /** + * Tile set ID + */ + 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]; } sbp_msg_ssr_stec_correction_t; /** @@ -62,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_stub * SBP_ENCODED_LEN_U8); + (msg->n_sats * SBP_STEC_SAT_ELEMENT_ENCODED_LEN); } /** 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 73c124b3d8..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,18 +46,94 @@ extern "C" { * */ typedef struct { - u8 stub[SBP_MSG_SSR_TILE_DEFINITION_STUB_MAX]; /** - * Number of elements in stub + * SSR Solution ID. + */ + u8 ssr_sol_id; + + /** + * 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. * - * When sending a message fill in this field with the number elements set in - * stub before calling an appropriate libsbp send function + * 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. * - * When receiving a message query this field for the number of elements in - * stub. The value of any elements beyond the index specified in this field is - * undefined + * See GNSS-SSR-ArrayOfCorrectionPoints field bitmaskOfGrids but note the + * definition of the bits is inverted. */ - u8 n_stub; + u64 bitmask; } sbp_msg_ssr_tile_definition_t; /** @@ -68,8 +144,8 @@ typedef struct { */ static inline size_t sbp_msg_ssr_tile_definition_encoded_len( const sbp_msg_ssr_tile_definition_t *msg) { - return SBP_MSG_SSR_TILE_DEFINITION_ENCODED_OVERHEAD + - (msg->n_stub * SBP_ENCODED_LEN_U8); + (void)msg; + return SBP_MSG_SSR_TILE_DEFINITION_ENCODED_LEN; } /** diff --git a/c/src/include/libsbp/internal/v4/integrity.h b/c/src/include/libsbp/internal/v4/integrity.h index e61261b598..edfd4d1ddc 100644 --- a/c/src/include/libsbp/internal/v4/integrity.h +++ b/c/src/include/libsbp/internal/v4/integrity.h @@ -28,6 +28,26 @@ extern "C" { #endif +/** + * 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_integrity_ssr_header_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_integrity_ssr_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_integrity_ssr_header_decode_internal(sbp_decode_ctx_t *ctx, + sbp_integrity_ssr_header_t *msg); + /** * Internal function to encode an SBP type to a buffer * diff --git a/c/src/include/libsbp/internal/v4/ssr.h b/c/src/include/libsbp/internal/v4/ssr.h index 1922c71f6d..9447bc1a0c 100644 --- a/c/src/include/libsbp/internal/v4/ssr.h +++ b/c/src/include/libsbp/internal/v4/ssr.h @@ -289,6 +289,26 @@ bool sbp_msg_ssr_stec_correction_dep_encode_internal( 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 * @@ -329,6 +349,26 @@ 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 * @@ -597,28 +637,8 @@ bool sbp_msg_ssr_grid_definition_dep_a_decode_internal( * @param msg SBP type instance * @return true on success, false otherwise */ -bool sbp_msg_ssr_orbit_clock_bounds_encode_internal( - sbp_encode_ctx_t *ctx, const sbp_msg_ssr_orbit_clock_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_orbit_clock_bounds_decode_internal( - sbp_decode_ctx_t *ctx, sbp_msg_ssr_orbit_clock_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_code_phase_biases_bounds_encode_internal( - sbp_encode_ctx_t *ctx, const sbp_msg_ssr_code_phase_biases_bounds_t *msg); +bool sbp_orbit_clock_bound_encode_internal(sbp_encode_ctx_t *ctx, + const sbp_orbit_clock_bound_t *msg); /** * Internal function to decode an SBP type from a buffer @@ -627,8 +647,8 @@ bool sbp_msg_ssr_code_phase_biases_bounds_encode_internal( * @param msg SBP type instance * @return true on success, false otherwise */ -bool sbp_msg_ssr_code_phase_biases_bounds_decode_internal( - sbp_decode_ctx_t *ctx, sbp_msg_ssr_code_phase_biases_bounds_t *msg); +bool sbp_orbit_clock_bound_decode_internal(sbp_decode_ctx_t *ctx, + sbp_orbit_clock_bound_t *msg); /** * Internal function to encode an SBP type to a buffer @@ -637,9 +657,8 @@ bool sbp_msg_ssr_code_phase_biases_bounds_decode_internal( * @param msg SBP type instance * @return true on success, false otherwise */ -bool sbp_msg_ssr_orbit_clock_bounds_degradation_encode_internal( - sbp_encode_ctx_t *ctx, - const sbp_msg_ssr_orbit_clock_bounds_degradation_t *msg); +bool sbp_msg_ssr_orbit_clock_bounds_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_msg_ssr_orbit_clock_bounds_t *msg); /** * Internal function to decode an SBP type from a buffer @@ -648,8 +667,8 @@ bool sbp_msg_ssr_orbit_clock_bounds_degradation_encode_internal( * @param msg SBP type instance * @return true on success, false otherwise */ -bool sbp_msg_ssr_orbit_clock_bounds_degradation_decode_internal( - sbp_decode_ctx_t *ctx, sbp_msg_ssr_orbit_clock_bounds_degradation_t *msg); +bool sbp_msg_ssr_orbit_clock_bounds_decode_internal( + sbp_decode_ctx_t *ctx, sbp_msg_ssr_orbit_clock_bounds_t *msg); /** * Internal function to encode an SBP type to a buffer diff --git a/c/src/v4/integrity.c b/c/src/v4/integrity.c index 1fd87c172d..94029d5cab 100644 --- a/c/src/v4/integrity.c +++ b/c/src/v4/integrity.c @@ -16,13 +16,177 @@ #include #include +bool sbp_integrity_ssr_header_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_integrity_ssr_header_t *msg) { + if (!sbp_gps_time_sec_encode_internal(ctx, &msg->obs_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->ssr_sol_id)) { + 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->chain_id)) { + return false; + } + return true; +} + +s8 sbp_integrity_ssr_header_encode(uint8_t *buf, uint8_t len, + uint8_t *n_written, + const sbp_integrity_ssr_header_t *msg) { + sbp_encode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_integrity_ssr_header_encode_internal(&ctx, msg)) { + return SBP_ENCODE_ERROR; + } + if (n_written != NULL) { + *n_written = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +bool sbp_integrity_ssr_header_decode_internal(sbp_decode_ctx_t *ctx, + sbp_integrity_ssr_header_t *msg) { + if (!sbp_gps_time_sec_decode_internal(ctx, &msg->obs_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->ssr_sol_id)) { + 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->chain_id)) { + return false; + } + return true; +} + +s8 sbp_integrity_ssr_header_decode(const uint8_t *buf, uint8_t len, + uint8_t *n_read, + sbp_integrity_ssr_header_t *msg) { + sbp_decode_ctx_t ctx; + ctx.buf = buf; + ctx.buf_len = len; + ctx.offset = 0; + if (!sbp_integrity_ssr_header_decode_internal(&ctx, msg)) { + return SBP_DECODE_ERROR; + } + if (n_read != NULL) { + *n_read = (uint8_t)ctx.offset; + } + return SBP_OK; +} + +int sbp_integrity_ssr_header_cmp(const sbp_integrity_ssr_header_t *a, + const sbp_integrity_ssr_header_t *b) { + int ret = 0; + + ret = sbp_gps_time_sec_cmp(&a->obs_time, &b->obs_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->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; + } + + ret = sbp_u16_cmp(&a->tile_id, &b->tile_id); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->chain_id, &b->chain_id); + if (ret != 0) { + return ret; + } + return ret; +} + bool sbp_msg_ssr_flag_high_level_encode_internal( sbp_encode_ctx_t *ctx, const sbp_msg_ssr_flag_high_level_t *msg) { - for (size_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_encode(ctx, &msg->stub[i])) { + if (!sbp_gps_time_sec_encode_internal(ctx, &msg->obs_time)) { + return false; + } + if (!sbp_gps_time_sec_encode_internal(ctx, &msg->corr_time)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->ssr_sol_id)) { + 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->chain_id)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->use_gps_sat)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->use_gal_sat)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->use_bds_sat)) { + return false; + } + for (size_t i = 0; i < SBP_MSG_SSR_FLAG_HIGH_LEVEL_RESERVED_MAX; i++) { + if (!sbp_u8_encode(ctx, &msg->reserved[i])) { return false; } } + if (!sbp_u8_encode(ctx, &msg->use_tropo_grid_points)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->use_iono_grid_points)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->use_iono_tile_sat_los)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->use_iono_grid_point_sat_los)) { + return false; + } return true; } @@ -44,12 +208,50 @@ s8 sbp_msg_ssr_flag_high_level_encode( bool sbp_msg_ssr_flag_high_level_decode_internal( sbp_decode_ctx_t *ctx, sbp_msg_ssr_flag_high_level_t *msg) { - msg->n_stub = (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U8); - for (uint8_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_decode(ctx, &msg->stub[i])) { + if (!sbp_gps_time_sec_decode_internal(ctx, &msg->obs_time)) { + return false; + } + if (!sbp_gps_time_sec_decode_internal(ctx, &msg->corr_time)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->ssr_sol_id)) { + 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->chain_id)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->use_gps_sat)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->use_gal_sat)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->use_bds_sat)) { + return false; + } + for (uint8_t i = 0; i < SBP_MSG_SSR_FLAG_HIGH_LEVEL_RESERVED_MAX; i++) { + if (!sbp_u8_decode(ctx, &msg->reserved[i])) { return false; } } + if (!sbp_u8_decode(ctx, &msg->use_tropo_grid_points)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->use_iono_grid_points)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->use_iono_tile_sat_los)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->use_iono_grid_point_sat_los)) { + return false; + } return true; } @@ -87,10 +289,76 @@ int sbp_msg_ssr_flag_high_level_cmp(const sbp_msg_ssr_flag_high_level_t *a, const sbp_msg_ssr_flag_high_level_t *b) { int ret = 0; - ret = sbp_u8_cmp(&a->n_stub, &b->n_stub); - for (uint8_t i = 0; ret == 0 && i < a->n_stub; i++) { - ret = sbp_u8_cmp(&a->stub[i], &b->stub[i]); + ret = sbp_gps_time_sec_cmp(&a->obs_time, &b->obs_time); + if (ret != 0) { + return ret; + } + + ret = sbp_gps_time_sec_cmp(&a->corr_time, &b->corr_time); + if (ret != 0) { + return ret; + } + + 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; + } + + ret = sbp_u16_cmp(&a->tile_id, &b->tile_id); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->chain_id, &b->chain_id); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->use_gps_sat, &b->use_gps_sat); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->use_gal_sat, &b->use_gal_sat); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->use_bds_sat, &b->use_bds_sat); + if (ret != 0) { + return ret; + } + + for (uint8_t i = 0; ret == 0 && i < SBP_MSG_SSR_FLAG_HIGH_LEVEL_RESERVED_MAX; + i++) { + ret = sbp_u8_cmp(&a->reserved[i], &b->reserved[i]); + } + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->use_tropo_grid_points, &b->use_tropo_grid_points); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->use_iono_grid_points, &b->use_iono_grid_points); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->use_iono_tile_sat_los, &b->use_iono_tile_sat_los); + if (ret != 0) { + return ret; } + + ret = sbp_u8_cmp(&a->use_iono_grid_point_sat_los, + &b->use_iono_grid_point_sat_los); if (ret != 0) { return ret; } @@ -99,8 +367,29 @@ int sbp_msg_ssr_flag_high_level_cmp(const sbp_msg_ssr_flag_high_level_t *a, bool sbp_msg_ssr_flag_satellites_encode_internal( sbp_encode_ctx_t *ctx, const sbp_msg_ssr_flag_satellites_t *msg) { - for (size_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_encode(ctx, &msg->stub[i])) { + if (!sbp_gps_time_sec_encode_internal(ctx, &msg->obs_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->ssr_sol_id)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->chain_id)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->const_id)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->n_faulty_sats)) { + return false; + } + for (size_t i = 0; i < msg->n_faulty_sats; i++) { + if (!sbp_u8_encode(ctx, &msg->faulty_sats[i])) { return false; } } @@ -125,9 +414,31 @@ s8 sbp_msg_ssr_flag_satellites_encode( bool sbp_msg_ssr_flag_satellites_decode_internal( sbp_decode_ctx_t *ctx, sbp_msg_ssr_flag_satellites_t *msg) { - msg->n_stub = (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U8); - for (uint8_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_decode(ctx, &msg->stub[i])) { + if (!sbp_gps_time_sec_decode_internal(ctx, &msg->obs_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->ssr_sol_id)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->chain_id)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->const_id)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->n_faulty_sats)) { + return false; + } + msg->n_faulty_sats = + (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U8); + for (uint8_t i = 0; i < msg->n_faulty_sats; i++) { + if (!sbp_u8_decode(ctx, &msg->faulty_sats[i])) { return false; } } @@ -168,9 +479,44 @@ int sbp_msg_ssr_flag_satellites_cmp(const sbp_msg_ssr_flag_satellites_t *a, const sbp_msg_ssr_flag_satellites_t *b) { int ret = 0; - ret = sbp_u8_cmp(&a->n_stub, &b->n_stub); - for (uint8_t i = 0; ret == 0 && i < a->n_stub; i++) { - ret = sbp_u8_cmp(&a->stub[i], &b->stub[i]); + ret = sbp_gps_time_sec_cmp(&a->obs_time, &b->obs_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->ssr_sol_id, &b->ssr_sol_id); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->chain_id, &b->chain_id); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->const_id, &b->const_id); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->n_faulty_sats, &b->n_faulty_sats); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->n_faulty_sats, &b->n_faulty_sats); + for (uint8_t i = 0; ret == 0 && i < a->n_faulty_sats; i++) { + ret = sbp_u8_cmp(&a->faulty_sats[i], &b->faulty_sats[i]); } if (ret != 0) { return ret; @@ -180,8 +526,14 @@ int sbp_msg_ssr_flag_satellites_cmp(const sbp_msg_ssr_flag_satellites_t *a, bool sbp_msg_ssr_flag_tropo_grid_points_encode_internal( sbp_encode_ctx_t *ctx, const sbp_msg_ssr_flag_tropo_grid_points_t *msg) { - for (size_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_encode(ctx, &msg->stub[i])) { + if (!sbp_integrity_ssr_header_encode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->n_faulty_points)) { + return false; + } + for (size_t i = 0; i < msg->n_faulty_points; i++) { + if (!sbp_u16_encode(ctx, &msg->faulty_points[i])) { return false; } } @@ -206,9 +558,16 @@ s8 sbp_msg_ssr_flag_tropo_grid_points_encode( bool sbp_msg_ssr_flag_tropo_grid_points_decode_internal( sbp_decode_ctx_t *ctx, sbp_msg_ssr_flag_tropo_grid_points_t *msg) { - msg->n_stub = (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U8); - for (uint8_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_decode(ctx, &msg->stub[i])) { + if (!sbp_integrity_ssr_header_decode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->n_faulty_points)) { + return false; + } + msg->n_faulty_points = + (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U16); + for (uint8_t i = 0; i < msg->n_faulty_points; i++) { + if (!sbp_u16_decode(ctx, &msg->faulty_points[i])) { return false; } } @@ -250,9 +609,19 @@ int sbp_msg_ssr_flag_tropo_grid_points_cmp( const sbp_msg_ssr_flag_tropo_grid_points_t *b) { int ret = 0; - ret = sbp_u8_cmp(&a->n_stub, &b->n_stub); - for (uint8_t i = 0; ret == 0 && i < a->n_stub; i++) { - ret = sbp_u8_cmp(&a->stub[i], &b->stub[i]); + ret = sbp_integrity_ssr_header_cmp(&a->header, &b->header); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->n_faulty_points, &b->n_faulty_points); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->n_faulty_points, &b->n_faulty_points); + for (uint8_t i = 0; ret == 0 && i < a->n_faulty_points; i++) { + ret = sbp_u16_cmp(&a->faulty_points[i], &b->faulty_points[i]); } if (ret != 0) { return ret; @@ -262,8 +631,14 @@ int sbp_msg_ssr_flag_tropo_grid_points_cmp( bool sbp_msg_ssr_flag_iono_grid_points_encode_internal( sbp_encode_ctx_t *ctx, const sbp_msg_ssr_flag_iono_grid_points_t *msg) { - for (size_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_encode(ctx, &msg->stub[i])) { + if (!sbp_integrity_ssr_header_encode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->n_faulty_points)) { + return false; + } + for (size_t i = 0; i < msg->n_faulty_points; i++) { + if (!sbp_u16_encode(ctx, &msg->faulty_points[i])) { return false; } } @@ -288,9 +663,16 @@ s8 sbp_msg_ssr_flag_iono_grid_points_encode( bool sbp_msg_ssr_flag_iono_grid_points_decode_internal( sbp_decode_ctx_t *ctx, sbp_msg_ssr_flag_iono_grid_points_t *msg) { - msg->n_stub = (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U8); - for (uint8_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_decode(ctx, &msg->stub[i])) { + if (!sbp_integrity_ssr_header_decode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->n_faulty_points)) { + return false; + } + msg->n_faulty_points = + (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U16); + for (uint8_t i = 0; i < msg->n_faulty_points; i++) { + if (!sbp_u16_decode(ctx, &msg->faulty_points[i])) { return false; } } @@ -332,9 +714,19 @@ int sbp_msg_ssr_flag_iono_grid_points_cmp( const sbp_msg_ssr_flag_iono_grid_points_t *b) { int ret = 0; - ret = sbp_u8_cmp(&a->n_stub, &b->n_stub); - for (uint8_t i = 0; ret == 0 && i < a->n_stub; i++) { - ret = sbp_u8_cmp(&a->stub[i], &b->stub[i]); + ret = sbp_integrity_ssr_header_cmp(&a->header, &b->header); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->n_faulty_points, &b->n_faulty_points); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->n_faulty_points, &b->n_faulty_points); + for (uint8_t i = 0; ret == 0 && i < a->n_faulty_points; i++) { + ret = sbp_u16_cmp(&a->faulty_points[i], &b->faulty_points[i]); } if (ret != 0) { return ret; @@ -344,8 +736,14 @@ int sbp_msg_ssr_flag_iono_grid_points_cmp( bool sbp_msg_ssr_flag_iono_tile_sat_los_encode_internal( sbp_encode_ctx_t *ctx, const sbp_msg_ssr_flag_iono_tile_sat_los_t *msg) { - for (size_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_encode(ctx, &msg->stub[i])) { + if (!sbp_integrity_ssr_header_encode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->n_faulty_los)) { + return false; + } + for (size_t i = 0; i < msg->n_faulty_los; i++) { + if (!sbp_sv_id_encode_internal(ctx, &msg->faulty_los[i])) { return false; } } @@ -370,9 +768,16 @@ s8 sbp_msg_ssr_flag_iono_tile_sat_los_encode( bool sbp_msg_ssr_flag_iono_tile_sat_los_decode_internal( sbp_decode_ctx_t *ctx, sbp_msg_ssr_flag_iono_tile_sat_los_t *msg) { - msg->n_stub = (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U8); - for (uint8_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_decode(ctx, &msg->stub[i])) { + if (!sbp_integrity_ssr_header_decode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->n_faulty_los)) { + return false; + } + msg->n_faulty_los = + (uint8_t)((ctx->buf_len - ctx->offset) / SBP_SV_ID_ENCODED_LEN); + for (uint8_t i = 0; i < msg->n_faulty_los; i++) { + if (!sbp_sv_id_decode_internal(ctx, &msg->faulty_los[i])) { return false; } } @@ -414,9 +819,19 @@ int sbp_msg_ssr_flag_iono_tile_sat_los_cmp( const sbp_msg_ssr_flag_iono_tile_sat_los_t *b) { int ret = 0; - ret = sbp_u8_cmp(&a->n_stub, &b->n_stub); - for (uint8_t i = 0; ret == 0 && i < a->n_stub; i++) { - ret = sbp_u8_cmp(&a->stub[i], &b->stub[i]); + ret = sbp_integrity_ssr_header_cmp(&a->header, &b->header); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->n_faulty_los, &b->n_faulty_los); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->n_faulty_los, &b->n_faulty_los); + for (uint8_t i = 0; ret == 0 && i < a->n_faulty_los; i++) { + ret = sbp_sv_id_cmp(&a->faulty_los[i], &b->faulty_los[i]); } if (ret != 0) { return ret; @@ -427,8 +842,17 @@ int sbp_msg_ssr_flag_iono_tile_sat_los_cmp( bool sbp_msg_ssr_flag_iono_grid_point_sat_los_encode_internal( sbp_encode_ctx_t *ctx, const sbp_msg_ssr_flag_iono_grid_point_sat_los_t *msg) { - for (size_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_encode(ctx, &msg->stub[i])) { + if (!sbp_integrity_ssr_header_encode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u16_encode(ctx, &msg->grid_point_id)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->n_faulty_los)) { + return false; + } + for (size_t i = 0; i < msg->n_faulty_los; i++) { + if (!sbp_sv_id_encode_internal(ctx, &msg->faulty_los[i])) { return false; } } @@ -453,9 +877,19 @@ s8 sbp_msg_ssr_flag_iono_grid_point_sat_los_encode( bool sbp_msg_ssr_flag_iono_grid_point_sat_los_decode_internal( sbp_decode_ctx_t *ctx, sbp_msg_ssr_flag_iono_grid_point_sat_los_t *msg) { - msg->n_stub = (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U8); - for (uint8_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_decode(ctx, &msg->stub[i])) { + if (!sbp_integrity_ssr_header_decode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u16_decode(ctx, &msg->grid_point_id)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->n_faulty_los)) { + return false; + } + msg->n_faulty_los = + (uint8_t)((ctx->buf_len - ctx->offset) / SBP_SV_ID_ENCODED_LEN); + for (uint8_t i = 0; i < msg->n_faulty_los; i++) { + if (!sbp_sv_id_decode_internal(ctx, &msg->faulty_los[i])) { return false; } } @@ -498,9 +932,24 @@ int sbp_msg_ssr_flag_iono_grid_point_sat_los_cmp( const sbp_msg_ssr_flag_iono_grid_point_sat_los_t *b) { int ret = 0; - ret = sbp_u8_cmp(&a->n_stub, &b->n_stub); - for (uint8_t i = 0; ret == 0 && i < a->n_stub; i++) { - ret = sbp_u8_cmp(&a->stub[i], &b->stub[i]); + ret = sbp_integrity_ssr_header_cmp(&a->header, &b->header); + if (ret != 0) { + return ret; + } + + ret = sbp_u16_cmp(&a->grid_point_id, &b->grid_point_id); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->n_faulty_los, &b->n_faulty_los); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->n_faulty_los, &b->n_faulty_los); + for (uint8_t i = 0; ret == 0 && i < a->n_faulty_los; i++) { + ret = sbp_sv_id_cmp(&a->faulty_los[i], &b->faulty_los[i]); } if (ret != 0) { return ret; diff --git a/c/src/v4/navigation.c b/c/src/v4/navigation.c index 225040ab15..b20903fb78 100644 --- a/c/src/v4/navigation.c +++ b/c/src/v4/navigation.c @@ -5974,10 +5974,32 @@ int sbp_msg_protection_level_cmp(const sbp_msg_protection_level_t *a, bool sbp_msg_utc_leap_second_encode_internal( sbp_encode_ctx_t *ctx, const sbp_msg_utc_leap_second_t *msg) { - for (size_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_encode(ctx, &msg->stub[i])) { - return false; - } + if (!sbp_s16_encode(ctx, &msg->bias_coeff)) { + return false; + } + if (!sbp_s16_encode(ctx, &msg->drift_coeff)) { + return false; + } + if (!sbp_s8_encode(ctx, &msg->drift_rate_coeff)) { + return false; + } + if (!sbp_s8_encode(ctx, &msg->count_before)) { + return false; + } + if (!sbp_u16_encode(ctx, &msg->tow_s)) { + return false; + } + if (!sbp_u16_encode(ctx, &msg->wn)) { + return false; + } + if (!sbp_u16_encode(ctx, &msg->ref_wn)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->ref_dn)) { + return false; + } + if (!sbp_s8_encode(ctx, &msg->count_after)) { + return false; } return true; } @@ -5999,11 +6021,32 @@ s8 sbp_msg_utc_leap_second_encode(uint8_t *buf, uint8_t len, uint8_t *n_written, bool sbp_msg_utc_leap_second_decode_internal(sbp_decode_ctx_t *ctx, sbp_msg_utc_leap_second_t *msg) { - msg->n_stub = (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U8); - for (uint8_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_decode(ctx, &msg->stub[i])) { - return false; - } + if (!sbp_s16_decode(ctx, &msg->bias_coeff)) { + return false; + } + if (!sbp_s16_decode(ctx, &msg->drift_coeff)) { + return false; + } + if (!sbp_s8_decode(ctx, &msg->drift_rate_coeff)) { + return false; + } + if (!sbp_s8_decode(ctx, &msg->count_before)) { + return false; + } + if (!sbp_u16_decode(ctx, &msg->tow_s)) { + return false; + } + if (!sbp_u16_decode(ctx, &msg->wn)) { + return false; + } + if (!sbp_u16_decode(ctx, &msg->ref_wn)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->ref_dn)) { + return false; + } + if (!sbp_s8_decode(ctx, &msg->count_after)) { + return false; } return true; } @@ -6042,10 +6085,47 @@ int sbp_msg_utc_leap_second_cmp(const sbp_msg_utc_leap_second_t *a, const sbp_msg_utc_leap_second_t *b) { int ret = 0; - ret = sbp_u8_cmp(&a->n_stub, &b->n_stub); - for (uint8_t i = 0; ret == 0 && i < a->n_stub; i++) { - ret = sbp_u8_cmp(&a->stub[i], &b->stub[i]); + ret = sbp_s16_cmp(&a->bias_coeff, &b->bias_coeff); + if (ret != 0) { + return ret; + } + + ret = sbp_s16_cmp(&a->drift_coeff, &b->drift_coeff); + if (ret != 0) { + return ret; + } + + ret = sbp_s8_cmp(&a->drift_rate_coeff, &b->drift_rate_coeff); + if (ret != 0) { + return ret; + } + + ret = sbp_s8_cmp(&a->count_before, &b->count_before); + if (ret != 0) { + return ret; + } + + ret = sbp_u16_cmp(&a->tow_s, &b->tow_s); + if (ret != 0) { + return ret; + } + + ret = sbp_u16_cmp(&a->wn, &b->wn); + if (ret != 0) { + return ret; } + + ret = sbp_u16_cmp(&a->ref_wn, &b->ref_wn); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->ref_dn, &b->ref_dn); + if (ret != 0) { + return ret; + } + + ret = sbp_s8_cmp(&a->count_after, &b->count_after); if (ret != 0) { return ret; } @@ -6054,11 +6134,70 @@ int sbp_msg_utc_leap_second_cmp(const sbp_msg_utc_leap_second_t *a, bool sbp_msg_reference_frame_param_encode_internal( sbp_encode_ctx_t *ctx, const sbp_msg_reference_frame_param_t *msg) { - for (size_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_encode(ctx, &msg->stub[i])) { + if (!sbp_u8_encode(ctx, &msg->ssr_iod)) { + return false; + } + for (size_t i = 0; i < SBP_MSG_REFERENCE_FRAME_PARAM_SN_MAX; i++) { + if (!sbp_char_encode(ctx, &msg->sn[i])) { return false; } } + for (size_t i = 0; i < SBP_MSG_REFERENCE_FRAME_PARAM_TN_MAX; i++) { + if (!sbp_char_encode(ctx, &msg->tn[i])) { + return false; + } + } + if (!sbp_u8_encode(ctx, &msg->sin)) { + return false; + } + if (!sbp_u16_encode(ctx, &msg->utn)) { + return false; + } + if (!sbp_u16_encode(ctx, &msg->re_t0)) { + return false; + } + if (!sbp_s32_encode(ctx, &msg->delta_X0)) { + return false; + } + if (!sbp_s32_encode(ctx, &msg->delta_Y0)) { + return false; + } + if (!sbp_s32_encode(ctx, &msg->delta_Z0)) { + return false; + } + if (!sbp_s32_encode(ctx, &msg->theta_01)) { + return false; + } + if (!sbp_s32_encode(ctx, &msg->theta_02)) { + return false; + } + if (!sbp_s32_encode(ctx, &msg->theta_03)) { + return false; + } + if (!sbp_s32_encode(ctx, &msg->scale)) { + return false; + } + if (!sbp_s32_encode(ctx, &msg->dot_delta_X0)) { + return false; + } + if (!sbp_s32_encode(ctx, &msg->dot_delta_Y0)) { + return false; + } + if (!sbp_s32_encode(ctx, &msg->dot_delta_Z0)) { + return false; + } + if (!sbp_s32_encode(ctx, &msg->dot_theta_01)) { + return false; + } + if (!sbp_s32_encode(ctx, &msg->dot_theta_02)) { + return false; + } + if (!sbp_s32_encode(ctx, &msg->dot_theta_03)) { + return false; + } + if (!sbp_s16_encode(ctx, &msg->dot_scale)) { + return false; + } return true; } @@ -6080,12 +6219,70 @@ s8 sbp_msg_reference_frame_param_encode( bool sbp_msg_reference_frame_param_decode_internal( sbp_decode_ctx_t *ctx, sbp_msg_reference_frame_param_t *msg) { - msg->n_stub = (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U8); - for (uint8_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_decode(ctx, &msg->stub[i])) { + if (!sbp_u8_decode(ctx, &msg->ssr_iod)) { + return false; + } + for (uint8_t i = 0; i < SBP_MSG_REFERENCE_FRAME_PARAM_SN_MAX; i++) { + if (!sbp_char_decode(ctx, &msg->sn[i])) { return false; } } + for (uint8_t i = 0; i < SBP_MSG_REFERENCE_FRAME_PARAM_TN_MAX; i++) { + if (!sbp_char_decode(ctx, &msg->tn[i])) { + return false; + } + } + if (!sbp_u8_decode(ctx, &msg->sin)) { + return false; + } + if (!sbp_u16_decode(ctx, &msg->utn)) { + return false; + } + if (!sbp_u16_decode(ctx, &msg->re_t0)) { + return false; + } + if (!sbp_s32_decode(ctx, &msg->delta_X0)) { + return false; + } + if (!sbp_s32_decode(ctx, &msg->delta_Y0)) { + return false; + } + if (!sbp_s32_decode(ctx, &msg->delta_Z0)) { + return false; + } + if (!sbp_s32_decode(ctx, &msg->theta_01)) { + return false; + } + if (!sbp_s32_decode(ctx, &msg->theta_02)) { + return false; + } + if (!sbp_s32_decode(ctx, &msg->theta_03)) { + return false; + } + if (!sbp_s32_decode(ctx, &msg->scale)) { + return false; + } + if (!sbp_s32_decode(ctx, &msg->dot_delta_X0)) { + return false; + } + if (!sbp_s32_decode(ctx, &msg->dot_delta_Y0)) { + return false; + } + if (!sbp_s32_decode(ctx, &msg->dot_delta_Z0)) { + return false; + } + if (!sbp_s32_decode(ctx, &msg->dot_theta_01)) { + return false; + } + if (!sbp_s32_decode(ctx, &msg->dot_theta_02)) { + return false; + } + if (!sbp_s32_decode(ctx, &msg->dot_theta_03)) { + return false; + } + if (!sbp_s16_decode(ctx, &msg->dot_scale)) { + return false; + } return true; } @@ -6124,10 +6321,108 @@ int sbp_msg_reference_frame_param_cmp( const sbp_msg_reference_frame_param_t *b) { int ret = 0; - ret = sbp_u8_cmp(&a->n_stub, &b->n_stub); - for (uint8_t i = 0; ret == 0 && i < a->n_stub; i++) { - ret = sbp_u8_cmp(&a->stub[i], &b->stub[i]); + ret = sbp_u8_cmp(&a->ssr_iod, &b->ssr_iod); + if (ret != 0) { + return ret; + } + + for (uint8_t i = 0; ret == 0 && i < SBP_MSG_REFERENCE_FRAME_PARAM_SN_MAX; + i++) { + ret = sbp_char_cmp(&a->sn[i], &b->sn[i]); + } + if (ret != 0) { + return ret; + } + + for (uint8_t i = 0; ret == 0 && i < SBP_MSG_REFERENCE_FRAME_PARAM_TN_MAX; + i++) { + ret = sbp_char_cmp(&a->tn[i], &b->tn[i]); + } + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->sin, &b->sin); + if (ret != 0) { + return ret; } + + ret = sbp_u16_cmp(&a->utn, &b->utn); + if (ret != 0) { + return ret; + } + + ret = sbp_u16_cmp(&a->re_t0, &b->re_t0); + if (ret != 0) { + return ret; + } + + ret = sbp_s32_cmp(&a->delta_X0, &b->delta_X0); + if (ret != 0) { + return ret; + } + + ret = sbp_s32_cmp(&a->delta_Y0, &b->delta_Y0); + if (ret != 0) { + return ret; + } + + ret = sbp_s32_cmp(&a->delta_Z0, &b->delta_Z0); + if (ret != 0) { + return ret; + } + + ret = sbp_s32_cmp(&a->theta_01, &b->theta_01); + if (ret != 0) { + return ret; + } + + ret = sbp_s32_cmp(&a->theta_02, &b->theta_02); + if (ret != 0) { + return ret; + } + + ret = sbp_s32_cmp(&a->theta_03, &b->theta_03); + if (ret != 0) { + return ret; + } + + ret = sbp_s32_cmp(&a->scale, &b->scale); + if (ret != 0) { + return ret; + } + + ret = sbp_s32_cmp(&a->dot_delta_X0, &b->dot_delta_X0); + if (ret != 0) { + return ret; + } + + ret = sbp_s32_cmp(&a->dot_delta_Y0, &b->dot_delta_Y0); + if (ret != 0) { + return ret; + } + + ret = sbp_s32_cmp(&a->dot_delta_Z0, &b->dot_delta_Z0); + if (ret != 0) { + return ret; + } + + ret = sbp_s32_cmp(&a->dot_theta_01, &b->dot_theta_01); + if (ret != 0) { + return ret; + } + + ret = sbp_s32_cmp(&a->dot_theta_02, &b->dot_theta_02); + if (ret != 0) { + return ret; + } + + ret = sbp_s32_cmp(&a->dot_theta_03, &b->dot_theta_03); + if (ret != 0) { + return ret; + } + + ret = sbp_s16_cmp(&a->dot_scale, &b->dot_scale); if (ret != 0) { return ret; } diff --git a/c/src/v4/ssr.c b/c/src/v4/ssr.c index 7a7ee2c0c0..839b21a87e 100644 --- a/c/src/v4/ssr.c +++ b/c/src/v4/ssr.c @@ -1442,10 +1442,126 @@ int sbp_msg_ssr_stec_correction_dep_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_msg_ssr_stec_correction_encode_internal( sbp_encode_ctx_t *ctx, const sbp_msg_ssr_stec_correction_t *msg) { - for (size_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_encode(ctx, &msg->stub[i])) { + 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; } } @@ -1470,9 +1586,25 @@ 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) { - msg->n_stub = (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U8); - for (uint8_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_decode(ctx, &msg->stub[i])) { + 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->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; } } @@ -1513,9 +1645,34 @@ 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->n_stub, &b->n_stub); - for (uint8_t i = 0; ret == 0 && i < a->n_stub; i++) { - ret = sbp_u8_cmp(&a->stub[i], &b->stub[i]); + 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; @@ -1642,10 +1799,152 @@ int sbp_msg_ssr_gridded_correction_cmp( 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) { - for (size_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_encode(ctx, &msg->stub[i])) { + 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_v_hydro_bound_mu)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->tropo_v_hydro_bound_sig)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->tropo_v_wet_bound_mu)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->tropo_v_wet_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; } } @@ -1670,9 +1969,48 @@ s8 sbp_msg_ssr_gridded_correction_bounds_encode( bool sbp_msg_ssr_gridded_correction_bounds_decode_internal( sbp_decode_ctx_t *ctx, sbp_msg_ssr_gridded_correction_bounds_t *msg) { - msg->n_stub = (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U8); - for (uint8_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_decode(ctx, &msg->stub[i])) { + 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_v_hydro_bound_mu)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->tropo_v_hydro_bound_sig)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->tropo_v_wet_bound_mu)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->tropo_v_wet_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; } } @@ -1714,9 +2052,71 @@ int sbp_msg_ssr_gridded_correction_bounds_cmp( const sbp_msg_ssr_gridded_correction_bounds_t *b) { int ret = 0; - ret = sbp_u8_cmp(&a->n_stub, &b->n_stub); - for (uint8_t i = 0; ret == 0 && i < a->n_stub; i++) { - ret = sbp_u8_cmp(&a->stub[i], &b->stub[i]); + 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; + } + + ret = sbp_u8_cmp(&a->tropo_v_hydro_bound_mu, &b->tropo_v_hydro_bound_mu); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->tropo_v_hydro_bound_sig, &b->tropo_v_hydro_bound_sig); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->tropo_v_wet_bound_mu, &b->tropo_v_wet_bound_mu); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->tropo_v_wet_bound_sig, &b->tropo_v_wet_bound_sig); + 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_integrity_cmp(&a->stec_sat_list[i], + &b->stec_sat_list[i]); } if (ret != 0) { return ret; @@ -1888,10 +2288,35 @@ int sbp_msg_ssr_tile_definition_dep_cmp( bool sbp_msg_ssr_tile_definition_encode_internal( sbp_encode_ctx_t *ctx, const sbp_msg_ssr_tile_definition_t *msg) { - for (size_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_encode(ctx, &msg->stub[i])) { - return false; - } + if (!sbp_u8_encode(ctx, &msg->ssr_sol_id)) { + 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_s16_encode(ctx, &msg->corner_nw_lat)) { + 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; } @@ -1914,11 +2339,35 @@ 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) { - msg->n_stub = (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U8); - for (uint8_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_decode(ctx, &msg->stub[i])) { - return false; - } + if (!sbp_u8_decode(ctx, &msg->ssr_sol_id)) { + 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_s16_decode(ctx, &msg->corner_nw_lat)) { + 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; } @@ -1936,31 +2385,73 @@ s8 sbp_msg_ssr_tile_definition_decode(const uint8_t *buf, uint8_t len, if (n_read != NULL) { *n_read = (uint8_t)ctx.offset; } - return SBP_OK; -} + return SBP_OK; +} + +s8 sbp_msg_ssr_tile_definition_send(sbp_state_t *s, u16 sender_id, + const sbp_msg_ssr_tile_definition_t *msg, + sbp_write_fn_t write) { + uint8_t payload[SBP_MAX_PAYLOAD_LEN]; + uint8_t payload_len; + s8 ret = sbp_msg_ssr_tile_definition_encode(payload, sizeof(payload), + &payload_len, msg); + if (ret != SBP_OK) { + return ret; + } + return sbp_payload_send(s, SBP_MSG_SSR_TILE_DEFINITION, sender_id, + payload_len, payload, write); +} + +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; + } + + ret = sbp_u16_cmp(&a->tile_id, &b->tile_id); + if (ret != 0) { + return ret; + } + + ret = sbp_s16_cmp(&a->corner_nw_lat, &b->corner_nw_lat); + if (ret != 0) { + return ret; + } + + ret = sbp_s16_cmp(&a->corner_nw_lon, &b->corner_nw_lon); + if (ret != 0) { + return ret; + } -s8 sbp_msg_ssr_tile_definition_send(sbp_state_t *s, u16 sender_id, - const sbp_msg_ssr_tile_definition_t *msg, - sbp_write_fn_t write) { - uint8_t payload[SBP_MAX_PAYLOAD_LEN]; - uint8_t payload_len; - s8 ret = sbp_msg_ssr_tile_definition_encode(payload, sizeof(payload), - &payload_len, msg); - if (ret != SBP_OK) { + ret = sbp_u16_cmp(&a->spacing_lat, &b->spacing_lat); + if (ret != 0) { return ret; } - return sbp_payload_send(s, SBP_MSG_SSR_TILE_DEFINITION, sender_id, - payload_len, payload, write); -} -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_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_u8_cmp(&a->n_stub, &b->n_stub); - for (uint8_t i = 0; ret == 0 && i < a->n_stub; i++) { - ret = sbp_u8_cmp(&a->stub[i], &b->stub[i]); + 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; } @@ -3141,24 +3632,45 @@ int sbp_msg_ssr_grid_definition_dep_a_cmp( return ret; } -bool sbp_msg_ssr_orbit_clock_bounds_encode_internal( - sbp_encode_ctx_t *ctx, const sbp_msg_ssr_orbit_clock_bounds_t *msg) { - for (size_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_encode(ctx, &msg->stub[i])) { - return false; - } +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)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->orb_radial_bound_mu)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->orb_along_bound_mu)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->orb_cross_bound_mu)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->orb_radial_bound_sig)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->orb_along_bound_sig)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->orb_cross_bound_sig)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->clock_bound_mu)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->clock_bound_sig)) { + return false; } return true; } -s8 sbp_msg_ssr_orbit_clock_bounds_encode( - uint8_t *buf, uint8_t len, uint8_t *n_written, - const sbp_msg_ssr_orbit_clock_bounds_t *msg) { +s8 sbp_orbit_clock_bound_encode(uint8_t *buf, uint8_t len, uint8_t *n_written, + const sbp_orbit_clock_bound_t *msg) { sbp_encode_ctx_t ctx; ctx.buf = buf; ctx.buf_len = len; ctx.offset = 0; - if (!sbp_msg_ssr_orbit_clock_bounds_encode_internal(&ctx, msg)) { + if (!sbp_orbit_clock_bound_encode_internal(&ctx, msg)) { return SBP_ENCODE_ERROR; } if (n_written != NULL) { @@ -3167,25 +3679,45 @@ s8 sbp_msg_ssr_orbit_clock_bounds_encode( return SBP_OK; } -bool sbp_msg_ssr_orbit_clock_bounds_decode_internal( - sbp_decode_ctx_t *ctx, sbp_msg_ssr_orbit_clock_bounds_t *msg) { - msg->n_stub = (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U8); - for (uint8_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_decode(ctx, &msg->stub[i])) { - return false; - } +bool sbp_orbit_clock_bound_decode_internal(sbp_decode_ctx_t *ctx, + sbp_orbit_clock_bound_t *msg) { + if (!sbp_u8_decode(ctx, &msg->sat_id)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->orb_radial_bound_mu)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->orb_along_bound_mu)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->orb_cross_bound_mu)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->orb_radial_bound_sig)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->orb_along_bound_sig)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->orb_cross_bound_sig)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->clock_bound_mu)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->clock_bound_sig)) { + return false; } return true; } -s8 sbp_msg_ssr_orbit_clock_bounds_decode( - const uint8_t *buf, uint8_t len, uint8_t *n_read, - sbp_msg_ssr_orbit_clock_bounds_t *msg) { +s8 sbp_orbit_clock_bound_decode(const uint8_t *buf, uint8_t len, + uint8_t *n_read, sbp_orbit_clock_bound_t *msg) { sbp_decode_ctx_t ctx; ctx.buf = buf; ctx.buf_len = len; ctx.offset = 0; - if (!sbp_msg_ssr_orbit_clock_bounds_decode_internal(&ctx, msg)) { + if (!sbp_orbit_clock_bound_decode_internal(&ctx, msg)) { return SBP_DECODE_ERROR; } if (n_read != NULL) { @@ -3194,136 +3726,88 @@ s8 sbp_msg_ssr_orbit_clock_bounds_decode( return SBP_OK; } -s8 sbp_msg_ssr_orbit_clock_bounds_send( - sbp_state_t *s, u16 sender_id, const sbp_msg_ssr_orbit_clock_bounds_t *msg, - sbp_write_fn_t write) { - uint8_t payload[SBP_MAX_PAYLOAD_LEN]; - uint8_t payload_len; - s8 ret = sbp_msg_ssr_orbit_clock_bounds_encode(payload, sizeof(payload), - &payload_len, msg); - if (ret != SBP_OK) { - return ret; - } - return sbp_payload_send(s, SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS, sender_id, - payload_len, payload, write); -} - -int sbp_msg_ssr_orbit_clock_bounds_cmp( - const sbp_msg_ssr_orbit_clock_bounds_t *a, - const sbp_msg_ssr_orbit_clock_bounds_t *b) { +int sbp_orbit_clock_bound_cmp(const sbp_orbit_clock_bound_t *a, + const sbp_orbit_clock_bound_t *b) { int ret = 0; - ret = sbp_u8_cmp(&a->n_stub, &b->n_stub); - for (uint8_t i = 0; ret == 0 && i < a->n_stub; i++) { - ret = sbp_u8_cmp(&a->stub[i], &b->stub[i]); - } + ret = sbp_u8_cmp(&a->sat_id, &b->sat_id); if (ret != 0) { return ret; } - return ret; -} -bool sbp_msg_ssr_code_phase_biases_bounds_encode_internal( - sbp_encode_ctx_t *ctx, const sbp_msg_ssr_code_phase_biases_bounds_t *msg) { - for (size_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_encode(ctx, &msg->stub[i])) { - return false; - } + ret = sbp_u8_cmp(&a->orb_radial_bound_mu, &b->orb_radial_bound_mu); + if (ret != 0) { + return ret; } - return true; -} -s8 sbp_msg_ssr_code_phase_biases_bounds_encode( - uint8_t *buf, uint8_t len, uint8_t *n_written, - const sbp_msg_ssr_code_phase_biases_bounds_t *msg) { - sbp_encode_ctx_t ctx; - ctx.buf = buf; - ctx.buf_len = len; - ctx.offset = 0; - if (!sbp_msg_ssr_code_phase_biases_bounds_encode_internal(&ctx, msg)) { - return SBP_ENCODE_ERROR; - } - if (n_written != NULL) { - *n_written = (uint8_t)ctx.offset; + ret = sbp_u8_cmp(&a->orb_along_bound_mu, &b->orb_along_bound_mu); + if (ret != 0) { + return ret; } - return SBP_OK; -} -bool sbp_msg_ssr_code_phase_biases_bounds_decode_internal( - sbp_decode_ctx_t *ctx, sbp_msg_ssr_code_phase_biases_bounds_t *msg) { - msg->n_stub = (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U8); - for (uint8_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_decode(ctx, &msg->stub[i])) { - return false; - } + ret = sbp_u8_cmp(&a->orb_cross_bound_mu, &b->orb_cross_bound_mu); + if (ret != 0) { + return ret; } - return true; -} -s8 sbp_msg_ssr_code_phase_biases_bounds_decode( - const uint8_t *buf, uint8_t len, uint8_t *n_read, - sbp_msg_ssr_code_phase_biases_bounds_t *msg) { - sbp_decode_ctx_t ctx; - ctx.buf = buf; - ctx.buf_len = len; - ctx.offset = 0; - if (!sbp_msg_ssr_code_phase_biases_bounds_decode_internal(&ctx, msg)) { - return SBP_DECODE_ERROR; - } - if (n_read != NULL) { - *n_read = (uint8_t)ctx.offset; + ret = sbp_u8_cmp(&a->orb_radial_bound_sig, &b->orb_radial_bound_sig); + if (ret != 0) { + return ret; } - return SBP_OK; -} -s8 sbp_msg_ssr_code_phase_biases_bounds_send( - sbp_state_t *s, u16 sender_id, - const sbp_msg_ssr_code_phase_biases_bounds_t *msg, sbp_write_fn_t write) { - uint8_t payload[SBP_MAX_PAYLOAD_LEN]; - uint8_t payload_len; - s8 ret = sbp_msg_ssr_code_phase_biases_bounds_encode(payload, sizeof(payload), - &payload_len, msg); - if (ret != SBP_OK) { + ret = sbp_u8_cmp(&a->orb_along_bound_sig, &b->orb_along_bound_sig); + if (ret != 0) { return ret; } - return sbp_payload_send(s, SBP_MSG_SSR_CODE_PHASE_BIASES_BOUNDS, sender_id, - payload_len, payload, write); -} -int sbp_msg_ssr_code_phase_biases_bounds_cmp( - const sbp_msg_ssr_code_phase_biases_bounds_t *a, - const sbp_msg_ssr_code_phase_biases_bounds_t *b) { - int ret = 0; + ret = sbp_u8_cmp(&a->orb_cross_bound_sig, &b->orb_cross_bound_sig); + if (ret != 0) { + return ret; + } - ret = sbp_u8_cmp(&a->n_stub, &b->n_stub); - for (uint8_t i = 0; ret == 0 && i < a->n_stub; i++) { - ret = sbp_u8_cmp(&a->stub[i], &b->stub[i]); + ret = sbp_u8_cmp(&a->clock_bound_mu, &b->clock_bound_mu); + if (ret != 0) { + return ret; } + + ret = sbp_u8_cmp(&a->clock_bound_sig, &b->clock_bound_sig); if (ret != 0) { return ret; } return ret; } -bool sbp_msg_ssr_orbit_clock_bounds_degradation_encode_internal( - sbp_encode_ctx_t *ctx, - const sbp_msg_ssr_orbit_clock_bounds_degradation_t *msg) { - for (size_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_encode(ctx, &msg->stub[i])) { +bool sbp_msg_ssr_orbit_clock_bounds_encode_internal( + sbp_encode_ctx_t *ctx, const sbp_msg_ssr_orbit_clock_bounds_t *msg) { + if (!sbp_bounds_header_encode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->ssr_iod)) { + return false; + } + if (!sbp_u8_encode(ctx, &msg->const_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_orbit_clock_bound_encode_internal(ctx, + &msg->orbit_clock_bounds[i])) { return false; } } return true; } -s8 sbp_msg_ssr_orbit_clock_bounds_degradation_encode( +s8 sbp_msg_ssr_orbit_clock_bounds_encode( uint8_t *buf, uint8_t len, uint8_t *n_written, - const sbp_msg_ssr_orbit_clock_bounds_degradation_t *msg) { + const sbp_msg_ssr_orbit_clock_bounds_t *msg) { sbp_encode_ctx_t ctx; ctx.buf = buf; ctx.buf_len = len; ctx.offset = 0; - if (!sbp_msg_ssr_orbit_clock_bounds_degradation_encode_internal(&ctx, msg)) { + if (!sbp_msg_ssr_orbit_clock_bounds_encode_internal(&ctx, msg)) { return SBP_ENCODE_ERROR; } if (n_written != NULL) { @@ -3332,25 +3816,39 @@ s8 sbp_msg_ssr_orbit_clock_bounds_degradation_encode( return SBP_OK; } -bool sbp_msg_ssr_orbit_clock_bounds_degradation_decode_internal( - sbp_decode_ctx_t *ctx, sbp_msg_ssr_orbit_clock_bounds_degradation_t *msg) { - msg->n_stub = (uint8_t)((ctx->buf_len - ctx->offset) / SBP_ENCODED_LEN_U8); - for (uint8_t i = 0; i < msg->n_stub; i++) { - if (!sbp_u8_decode(ctx, &msg->stub[i])) { +bool sbp_msg_ssr_orbit_clock_bounds_decode_internal( + sbp_decode_ctx_t *ctx, sbp_msg_ssr_orbit_clock_bounds_t *msg) { + if (!sbp_bounds_header_decode_internal(ctx, &msg->header)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->ssr_iod)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->const_id)) { + return false; + } + if (!sbp_u8_decode(ctx, &msg->n_sats)) { + return false; + } + msg->n_sats = (uint8_t)((ctx->buf_len - ctx->offset) / + SBP_ORBIT_CLOCK_BOUND_ENCODED_LEN); + for (uint8_t i = 0; i < msg->n_sats; i++) { + if (!sbp_orbit_clock_bound_decode_internal(ctx, + &msg->orbit_clock_bounds[i])) { return false; } } return true; } -s8 sbp_msg_ssr_orbit_clock_bounds_degradation_decode( +s8 sbp_msg_ssr_orbit_clock_bounds_decode( const uint8_t *buf, uint8_t len, uint8_t *n_read, - sbp_msg_ssr_orbit_clock_bounds_degradation_t *msg) { + sbp_msg_ssr_orbit_clock_bounds_t *msg) { sbp_decode_ctx_t ctx; ctx.buf = buf; ctx.buf_len = len; ctx.offset = 0; - if (!sbp_msg_ssr_orbit_clock_bounds_degradation_decode_internal(&ctx, msg)) { + if (!sbp_msg_ssr_orbit_clock_bounds_decode_internal(&ctx, msg)) { return SBP_DECODE_ERROR; } if (n_read != NULL) { @@ -3359,29 +3857,49 @@ s8 sbp_msg_ssr_orbit_clock_bounds_degradation_decode( return SBP_OK; } -s8 sbp_msg_ssr_orbit_clock_bounds_degradation_send( - sbp_state_t *s, u16 sender_id, - const sbp_msg_ssr_orbit_clock_bounds_degradation_t *msg, +s8 sbp_msg_ssr_orbit_clock_bounds_send( + sbp_state_t *s, u16 sender_id, const sbp_msg_ssr_orbit_clock_bounds_t *msg, sbp_write_fn_t write) { uint8_t payload[SBP_MAX_PAYLOAD_LEN]; uint8_t payload_len; - s8 ret = sbp_msg_ssr_orbit_clock_bounds_degradation_encode( - payload, sizeof(payload), &payload_len, msg); + s8 ret = sbp_msg_ssr_orbit_clock_bounds_encode(payload, sizeof(payload), + &payload_len, msg); if (ret != SBP_OK) { return ret; } - return sbp_payload_send(s, SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION, - sender_id, payload_len, payload, write); + return sbp_payload_send(s, SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS, sender_id, + payload_len, payload, write); } -int sbp_msg_ssr_orbit_clock_bounds_degradation_cmp( - const sbp_msg_ssr_orbit_clock_bounds_degradation_t *a, - const sbp_msg_ssr_orbit_clock_bounds_degradation_t *b) { +int sbp_msg_ssr_orbit_clock_bounds_cmp( + const sbp_msg_ssr_orbit_clock_bounds_t *a, + const sbp_msg_ssr_orbit_clock_bounds_t *b) { int ret = 0; - ret = sbp_u8_cmp(&a->n_stub, &b->n_stub); - for (uint8_t i = 0; ret == 0 && i < a->n_stub; i++) { - ret = sbp_u8_cmp(&a->stub[i], &b->stub[i]); + ret = sbp_bounds_header_cmp(&a->header, &b->header); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->ssr_iod, &b->ssr_iod); + if (ret != 0) { + return ret; + } + + ret = sbp_u8_cmp(&a->const_id, &b->const_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_orbit_clock_bound_cmp(&a->orbit_clock_bounds[i], + &b->orbit_clock_bounds[i]); } if (ret != 0) { return ret; diff --git a/c/test/auto_check_sbp_integrity_MsgSsrFlagHighLevel.c b/c/test/auto_check_sbp_integrity_MsgSsrFlagHighLevel.c index 1173e0cb0b..3b5eb855af 100644 --- a/c/test/auto_check_sbp_integrity_MsgSsrFlagHighLevel.c +++ b/c/test/auto_check_sbp_integrity_MsgSsrFlagHighLevel.c @@ -104,69 +104,47 @@ START_TEST(test_auto_check_sbp_integrity_MsgSsrFlagHighLevel) { sbp_msg_t test_msg; memset(&test_msg, 0, sizeof(test_msg)); - test_msg.ssr_flag_high_level.n_stub = 31; + test_msg.ssr_flag_high_level.chain_id = 40; - test_msg.ssr_flag_high_level.stub[0] = 180; + test_msg.ssr_flag_high_level.corr_time.tow = 360; - test_msg.ssr_flag_high_level.stub[1] = 0; + test_msg.ssr_flag_high_level.corr_time.wn = 6; - test_msg.ssr_flag_high_level.stub[2] = 0; + test_msg.ssr_flag_high_level.obs_time.tow = 180; - test_msg.ssr_flag_high_level.stub[3] = 0; + test_msg.ssr_flag_high_level.obs_time.wn = 3; - test_msg.ssr_flag_high_level.stub[4] = 3; + test_msg.ssr_flag_high_level.reserved[0] = 0; - test_msg.ssr_flag_high_level.stub[5] = 0; + test_msg.ssr_flag_high_level.reserved[1] = 0; - test_msg.ssr_flag_high_level.stub[6] = 104; + test_msg.ssr_flag_high_level.reserved[2] = 0; - test_msg.ssr_flag_high_level.stub[7] = 1; + test_msg.ssr_flag_high_level.reserved[3] = 0; - test_msg.ssr_flag_high_level.stub[8] = 0; + test_msg.ssr_flag_high_level.reserved[4] = 0; - test_msg.ssr_flag_high_level.stub[9] = 0; + test_msg.ssr_flag_high_level.reserved[5] = 0; - test_msg.ssr_flag_high_level.stub[10] = 6; + test_msg.ssr_flag_high_level.ssr_sol_id = 10; - test_msg.ssr_flag_high_level.stub[11] = 0; + test_msg.ssr_flag_high_level.tile_id = 30; - test_msg.ssr_flag_high_level.stub[12] = 10; + test_msg.ssr_flag_high_level.tile_set_id = 20; - test_msg.ssr_flag_high_level.stub[13] = 20; + test_msg.ssr_flag_high_level.use_bds_sat = 3; - test_msg.ssr_flag_high_level.stub[14] = 0; + test_msg.ssr_flag_high_level.use_gal_sat = 2; - test_msg.ssr_flag_high_level.stub[15] = 30; + test_msg.ssr_flag_high_level.use_gps_sat = 1; - test_msg.ssr_flag_high_level.stub[16] = 0; + test_msg.ssr_flag_high_level.use_iono_grid_point_sat_los = 7; - test_msg.ssr_flag_high_level.stub[17] = 40; + test_msg.ssr_flag_high_level.use_iono_grid_points = 5; - test_msg.ssr_flag_high_level.stub[18] = 1; + test_msg.ssr_flag_high_level.use_iono_tile_sat_los = 6; - test_msg.ssr_flag_high_level.stub[19] = 2; - - test_msg.ssr_flag_high_level.stub[20] = 3; - - test_msg.ssr_flag_high_level.stub[21] = 0; - - test_msg.ssr_flag_high_level.stub[22] = 0; - - test_msg.ssr_flag_high_level.stub[23] = 0; - - test_msg.ssr_flag_high_level.stub[24] = 0; - - test_msg.ssr_flag_high_level.stub[25] = 0; - - test_msg.ssr_flag_high_level.stub[26] = 0; - - test_msg.ssr_flag_high_level.stub[27] = 4; - - test_msg.ssr_flag_high_level.stub[28] = 5; - - test_msg.ssr_flag_high_level.stub[29] = 6; - - test_msg.ssr_flag_high_level.stub[30] = 7; + test_msg.ssr_flag_high_level.use_tropo_grid_points = 4; sbp_message_send(&sbp_state, SbpMsgSsrFlagHighLevel, 66, &test_msg, &dummy_write); @@ -192,158 +170,127 @@ START_TEST(test_auto_check_sbp_integrity_MsgSsrFlagHighLevel) { sbp_message_cmp(SbpMsgSsrFlagHighLevel, &last_msg.msg, &test_msg) == 0, "Sent and received messages did not compare equal"); - ck_assert_msg(last_msg.msg.ssr_flag_high_level.n_stub == 31, - "incorrect value for " - "last_msg.msg.ssr_flag_high_level.n_stub, expected 31, is %d", - last_msg.msg.ssr_flag_high_level.n_stub); - ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[0] == 180, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[0], " - "expected 180, is %d", - last_msg.msg.ssr_flag_high_level.stub[0]); - ck_assert_msg(last_msg.msg.ssr_flag_high_level.stub[1] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_high_level.stub[1], expected 0, is %d", - last_msg.msg.ssr_flag_high_level.stub[1]); - ck_assert_msg(last_msg.msg.ssr_flag_high_level.stub[2] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_high_level.stub[2], expected 0, is %d", - last_msg.msg.ssr_flag_high_level.stub[2]); - ck_assert_msg(last_msg.msg.ssr_flag_high_level.stub[3] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_high_level.stub[3], expected 0, is %d", - last_msg.msg.ssr_flag_high_level.stub[3]); - ck_assert_msg(last_msg.msg.ssr_flag_high_level.stub[4] == 3, - "incorrect value for " - "last_msg.msg.ssr_flag_high_level.stub[4], expected 3, is %d", - last_msg.msg.ssr_flag_high_level.stub[4]); - ck_assert_msg(last_msg.msg.ssr_flag_high_level.stub[5] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_high_level.stub[5], expected 0, is %d", - last_msg.msg.ssr_flag_high_level.stub[5]); + last_msg.msg.ssr_flag_high_level.chain_id == 40, + "incorrect value for last_msg.msg.ssr_flag_high_level.chain_id, " + "expected 40, is %d", + last_msg.msg.ssr_flag_high_level.chain_id); + ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[6] == 104, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[6], " - "expected 104, is %d", - last_msg.msg.ssr_flag_high_level.stub[6]); - ck_assert_msg(last_msg.msg.ssr_flag_high_level.stub[7] == 1, - "incorrect value for " - "last_msg.msg.ssr_flag_high_level.stub[7], expected 1, is %d", - last_msg.msg.ssr_flag_high_level.stub[7]); - ck_assert_msg(last_msg.msg.ssr_flag_high_level.stub[8] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_high_level.stub[8], expected 0, is %d", - last_msg.msg.ssr_flag_high_level.stub[8]); - ck_assert_msg(last_msg.msg.ssr_flag_high_level.stub[9] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_high_level.stub[9], expected 0, is %d", - last_msg.msg.ssr_flag_high_level.stub[9]); + last_msg.msg.ssr_flag_high_level.corr_time.tow == 360, + "incorrect value for last_msg.msg.ssr_flag_high_level.corr_time.tow, " + "expected 360, is %d", + last_msg.msg.ssr_flag_high_level.corr_time.tow); + ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[10] == 6, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[10], " + last_msg.msg.ssr_flag_high_level.corr_time.wn == 6, + "incorrect value for last_msg.msg.ssr_flag_high_level.corr_time.wn, " "expected 6, is %d", - last_msg.msg.ssr_flag_high_level.stub[10]); - ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[11] == 0, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[11], " - "expected 0, is %d", - last_msg.msg.ssr_flag_high_level.stub[11]); + last_msg.msg.ssr_flag_high_level.corr_time.wn); + ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[12] == 10, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[12], " - "expected 10, is %d", - last_msg.msg.ssr_flag_high_level.stub[12]); + last_msg.msg.ssr_flag_high_level.obs_time.tow == 180, + "incorrect value for last_msg.msg.ssr_flag_high_level.obs_time.tow, " + "expected 180, is %d", + last_msg.msg.ssr_flag_high_level.obs_time.tow); + ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[13] == 20, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[13], " - "expected 20, is %d", - last_msg.msg.ssr_flag_high_level.stub[13]); + last_msg.msg.ssr_flag_high_level.obs_time.wn == 3, + "incorrect value for last_msg.msg.ssr_flag_high_level.obs_time.wn, " + "expected 3, is %d", + last_msg.msg.ssr_flag_high_level.obs_time.wn); + ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[14] == 0, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[14], " + last_msg.msg.ssr_flag_high_level.reserved[0] == 0, + "incorrect value for last_msg.msg.ssr_flag_high_level.reserved[0], " "expected 0, is %d", - last_msg.msg.ssr_flag_high_level.stub[14]); + last_msg.msg.ssr_flag_high_level.reserved[0]); ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[15] == 30, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[15], " - "expected 30, is %d", - last_msg.msg.ssr_flag_high_level.stub[15]); - ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[16] == 0, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[16], " + last_msg.msg.ssr_flag_high_level.reserved[1] == 0, + "incorrect value for last_msg.msg.ssr_flag_high_level.reserved[1], " "expected 0, is %d", - last_msg.msg.ssr_flag_high_level.stub[16]); + last_msg.msg.ssr_flag_high_level.reserved[1]); ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[17] == 40, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[17], " - "expected 40, is %d", - last_msg.msg.ssr_flag_high_level.stub[17]); - ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[18] == 1, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[18], " - "expected 1, is %d", - last_msg.msg.ssr_flag_high_level.stub[18]); - ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[19] == 2, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[19], " - "expected 2, is %d", - last_msg.msg.ssr_flag_high_level.stub[19]); - ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[20] == 3, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[20], " - "expected 3, is %d", - last_msg.msg.ssr_flag_high_level.stub[20]); - ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[21] == 0, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[21], " + last_msg.msg.ssr_flag_high_level.reserved[2] == 0, + "incorrect value for last_msg.msg.ssr_flag_high_level.reserved[2], " "expected 0, is %d", - last_msg.msg.ssr_flag_high_level.stub[21]); + last_msg.msg.ssr_flag_high_level.reserved[2]); ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[22] == 0, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[22], " + last_msg.msg.ssr_flag_high_level.reserved[3] == 0, + "incorrect value for last_msg.msg.ssr_flag_high_level.reserved[3], " "expected 0, is %d", - last_msg.msg.ssr_flag_high_level.stub[22]); + last_msg.msg.ssr_flag_high_level.reserved[3]); ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[23] == 0, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[23], " + last_msg.msg.ssr_flag_high_level.reserved[4] == 0, + "incorrect value for last_msg.msg.ssr_flag_high_level.reserved[4], " "expected 0, is %d", - last_msg.msg.ssr_flag_high_level.stub[23]); + last_msg.msg.ssr_flag_high_level.reserved[4]); ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[24] == 0, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[24], " + last_msg.msg.ssr_flag_high_level.reserved[5] == 0, + "incorrect value for last_msg.msg.ssr_flag_high_level.reserved[5], " "expected 0, is %d", - last_msg.msg.ssr_flag_high_level.stub[24]); + last_msg.msg.ssr_flag_high_level.reserved[5]); + ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[25] == 0, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[25], " - "expected 0, is %d", - last_msg.msg.ssr_flag_high_level.stub[25]); + last_msg.msg.ssr_flag_high_level.ssr_sol_id == 10, + "incorrect value for last_msg.msg.ssr_flag_high_level.ssr_sol_id, " + "expected 10, is %d", + last_msg.msg.ssr_flag_high_level.ssr_sol_id); + ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[26] == 0, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[26], " - "expected 0, is %d", - last_msg.msg.ssr_flag_high_level.stub[26]); + last_msg.msg.ssr_flag_high_level.tile_id == 30, + "incorrect value for last_msg.msg.ssr_flag_high_level.tile_id, " + "expected 30, is %d", + last_msg.msg.ssr_flag_high_level.tile_id); + ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[27] == 4, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[27], " - "expected 4, is %d", - last_msg.msg.ssr_flag_high_level.stub[27]); + last_msg.msg.ssr_flag_high_level.tile_set_id == 20, + "incorrect value for last_msg.msg.ssr_flag_high_level.tile_set_id, " + "expected 20, is %d", + last_msg.msg.ssr_flag_high_level.tile_set_id); + + ck_assert_msg( + last_msg.msg.ssr_flag_high_level.use_bds_sat == 3, + "incorrect value for last_msg.msg.ssr_flag_high_level.use_bds_sat, " + "expected 3, is %d", + last_msg.msg.ssr_flag_high_level.use_bds_sat); + ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[28] == 5, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[28], " - "expected 5, is %d", - last_msg.msg.ssr_flag_high_level.stub[28]); + last_msg.msg.ssr_flag_high_level.use_gal_sat == 2, + "incorrect value for last_msg.msg.ssr_flag_high_level.use_gal_sat, " + "expected 2, is %d", + last_msg.msg.ssr_flag_high_level.use_gal_sat); + ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[29] == 6, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[29], " - "expected 6, is %d", - last_msg.msg.ssr_flag_high_level.stub[29]); + last_msg.msg.ssr_flag_high_level.use_gps_sat == 1, + "incorrect value for last_msg.msg.ssr_flag_high_level.use_gps_sat, " + "expected 1, is %d", + last_msg.msg.ssr_flag_high_level.use_gps_sat); + ck_assert_msg( - last_msg.msg.ssr_flag_high_level.stub[30] == 7, - "incorrect value for last_msg.msg.ssr_flag_high_level.stub[30], " + last_msg.msg.ssr_flag_high_level.use_iono_grid_point_sat_los == 7, + "incorrect value for " + "last_msg.msg.ssr_flag_high_level.use_iono_grid_point_sat_los, " "expected 7, is %d", - last_msg.msg.ssr_flag_high_level.stub[30]); + last_msg.msg.ssr_flag_high_level.use_iono_grid_point_sat_los); + + ck_assert_msg(last_msg.msg.ssr_flag_high_level.use_iono_grid_points == 5, + "incorrect value for " + "last_msg.msg.ssr_flag_high_level.use_iono_grid_points, " + "expected 5, is %d", + last_msg.msg.ssr_flag_high_level.use_iono_grid_points); + + ck_assert_msg(last_msg.msg.ssr_flag_high_level.use_iono_tile_sat_los == 6, + "incorrect value for " + "last_msg.msg.ssr_flag_high_level.use_iono_tile_sat_los, " + "expected 6, is %d", + last_msg.msg.ssr_flag_high_level.use_iono_tile_sat_los); + + ck_assert_msg(last_msg.msg.ssr_flag_high_level.use_tropo_grid_points == 4, + "incorrect value for " + "last_msg.msg.ssr_flag_high_level.use_tropo_grid_points, " + "expected 4, is %d", + last_msg.msg.ssr_flag_high_level.use_tropo_grid_points); } } END_TEST diff --git a/c/test/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos.c b/c/test/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos.c index b3a7a415f5..74c9f4609e 100644 --- a/c/test/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos.c +++ b/c/test/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos.c @@ -103,49 +103,33 @@ START_TEST(test_auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos) { sbp_msg_t test_msg; memset(&test_msg, 0, sizeof(test_msg)); - test_msg.ssr_flag_iono_grid_point_sat_los.n_stub = 21; + test_msg.ssr_flag_iono_grid_point_sat_los.faulty_los[0].constellation = 11; - test_msg.ssr_flag_iono_grid_point_sat_los.stub[0] = 180; + test_msg.ssr_flag_iono_grid_point_sat_los.faulty_los[0].satId = 10; - test_msg.ssr_flag_iono_grid_point_sat_los.stub[1] = 0; + test_msg.ssr_flag_iono_grid_point_sat_los.faulty_los[1].constellation = 14; - test_msg.ssr_flag_iono_grid_point_sat_los.stub[2] = 0; + test_msg.ssr_flag_iono_grid_point_sat_los.faulty_los[1].satId = 15; - test_msg.ssr_flag_iono_grid_point_sat_los.stub[3] = 0; + test_msg.ssr_flag_iono_grid_point_sat_los.grid_point_id = 30; - test_msg.ssr_flag_iono_grid_point_sat_los.stub[4] = 3; + test_msg.ssr_flag_iono_grid_point_sat_los.header.chain_id = 6; - test_msg.ssr_flag_iono_grid_point_sat_los.stub[5] = 0; + test_msg.ssr_flag_iono_grid_point_sat_los.header.num_msgs = 1; - test_msg.ssr_flag_iono_grid_point_sat_los.stub[6] = 1; + test_msg.ssr_flag_iono_grid_point_sat_los.header.obs_time.tow = 180; - test_msg.ssr_flag_iono_grid_point_sat_los.stub[7] = 2; + test_msg.ssr_flag_iono_grid_point_sat_los.header.obs_time.wn = 3; - test_msg.ssr_flag_iono_grid_point_sat_los.stub[8] = 3; + test_msg.ssr_flag_iono_grid_point_sat_los.header.seq_num = 2; - test_msg.ssr_flag_iono_grid_point_sat_los.stub[9] = 4; + test_msg.ssr_flag_iono_grid_point_sat_los.header.ssr_sol_id = 3; - test_msg.ssr_flag_iono_grid_point_sat_los.stub[10] = 0; + test_msg.ssr_flag_iono_grid_point_sat_los.header.tile_id = 5; - test_msg.ssr_flag_iono_grid_point_sat_los.stub[11] = 5; + test_msg.ssr_flag_iono_grid_point_sat_los.header.tile_set_id = 4; - test_msg.ssr_flag_iono_grid_point_sat_los.stub[12] = 0; - - test_msg.ssr_flag_iono_grid_point_sat_los.stub[13] = 6; - - test_msg.ssr_flag_iono_grid_point_sat_los.stub[14] = 30; - - test_msg.ssr_flag_iono_grid_point_sat_los.stub[15] = 0; - - test_msg.ssr_flag_iono_grid_point_sat_los.stub[16] = 2; - - test_msg.ssr_flag_iono_grid_point_sat_los.stub[17] = 10; - - test_msg.ssr_flag_iono_grid_point_sat_los.stub[18] = 11; - - test_msg.ssr_flag_iono_grid_point_sat_los.stub[19] = 15; - - test_msg.ssr_flag_iono_grid_point_sat_los.stub[20] = 14; + test_msg.ssr_flag_iono_grid_point_sat_los.n_faulty_los = 2; sbp_message_send(&sbp_state, SbpMsgSsrFlagIonoGridPointSatLos, 66, &test_msg, &dummy_write); @@ -171,117 +155,106 @@ START_TEST(test_auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos) { &last_msg.msg, &test_msg) == 0, "Sent and received messages did not compare equal"); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.n_stub == 21, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.n_stub, " - "expected 21, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.n_stub); - - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[0] == 180, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[0], " - "expected 180, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[0]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[1] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[1], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[1]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[2] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[2], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[2]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[3] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[3], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[3]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[4] == 3, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[4], " - "expected 3, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[4]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[5] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[5], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[5]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[6] == 1, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[6], " - "expected 1, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[6]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[7] == 2, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[7], " - "expected 2, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[7]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[8] == 3, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[8], " - "expected 3, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[8]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[9] == 4, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[9], " - "expected 4, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[9]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[10] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[10], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[10]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[11] == 5, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[11], " - "expected 5, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[11]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[12] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[12], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[12]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[13] == 6, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[13], " - "expected 6, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[13]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[14] == 30, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[14], " - "expected 30, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[14]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[15] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[15], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[15]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[16] == 2, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[16], " - "expected 2, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[16]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[17] == 10, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[17], " - "expected 10, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[17]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[18] == 11, - "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[18], " - "expected 11, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[18]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[19] == 15, + ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.faulty_los[0] + .constellation == 11, "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[19], " - "expected 15, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[19]); - ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[20] == 14, + "last_msg.msg.ssr_flag_iono_grid_point_sat_los.faulty_los[0]." + "constellation, expected 11, is %d", + last_msg.msg.ssr_flag_iono_grid_point_sat_los.faulty_los[0] + .constellation); + + ck_assert_msg( + last_msg.msg.ssr_flag_iono_grid_point_sat_los.faulty_los[0].satId == 10, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_point_sat_los.faulty_los[0].satId, " + "expected 10, is %d", + last_msg.msg.ssr_flag_iono_grid_point_sat_los.faulty_los[0].satId); + + ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_point_sat_los.faulty_los[1] + .constellation == 14, "incorrect value for " - "last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[20], " - "expected 14, is %d", - last_msg.msg.ssr_flag_iono_grid_point_sat_los.stub[20]); + "last_msg.msg.ssr_flag_iono_grid_point_sat_los.faulty_los[1]." + "constellation, expected 14, is %d", + last_msg.msg.ssr_flag_iono_grid_point_sat_los.faulty_los[1] + .constellation); + + ck_assert_msg( + last_msg.msg.ssr_flag_iono_grid_point_sat_los.faulty_los[1].satId == 15, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_point_sat_los.faulty_los[1].satId, " + "expected 15, is %d", + last_msg.msg.ssr_flag_iono_grid_point_sat_los.faulty_los[1].satId); + + ck_assert_msg( + last_msg.msg.ssr_flag_iono_grid_point_sat_los.grid_point_id == 30, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_point_sat_los.grid_point_id, expected " + "30, is %d", + last_msg.msg.ssr_flag_iono_grid_point_sat_los.grid_point_id); + + ck_assert_msg( + last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.chain_id == 6, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.chain_id, " + "expected 6, is %d", + last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.chain_id); + + ck_assert_msg( + last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.num_msgs == 1, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.num_msgs, " + "expected 1, is %d", + last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.num_msgs); + + ck_assert_msg( + last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.obs_time.tow == + 180, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.obs_time.tow, " + "expected 180, is %d", + last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.obs_time.tow); + + ck_assert_msg( + last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.obs_time.wn == 3, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.obs_time.wn, " + "expected 3, is %d", + last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.obs_time.wn); + + ck_assert_msg( + last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.seq_num == 2, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.seq_num, " + "expected 2, is %d", + last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.seq_num); + + ck_assert_msg( + last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.ssr_sol_id == 3, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.ssr_sol_id, " + "expected 3, is %d", + last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.ssr_sol_id); + + ck_assert_msg( + last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.tile_id == 5, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.tile_id, " + "expected 5, is %d", + last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.tile_id); + + ck_assert_msg( + last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.tile_set_id == 4, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.tile_set_id, " + "expected 4, is %d", + last_msg.msg.ssr_flag_iono_grid_point_sat_los.header.tile_set_id); + + ck_assert_msg( + last_msg.msg.ssr_flag_iono_grid_point_sat_los.n_faulty_los == 2, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_point_sat_los.n_faulty_los, expected " + "2, is %d", + last_msg.msg.ssr_flag_iono_grid_point_sat_los.n_faulty_los); } } END_TEST diff --git a/c/test/auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints.c b/c/test/auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints.c index b607738ffd..cf087a445c 100644 --- a/c/test/auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints.c +++ b/c/test/auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints.c @@ -103,49 +103,29 @@ START_TEST(test_auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints) { sbp_msg_t test_msg; memset(&test_msg, 0, sizeof(test_msg)); - test_msg.ssr_flag_iono_grid_points.n_stub = 21; + test_msg.ssr_flag_iono_grid_points.faulty_points[0] = 10; - test_msg.ssr_flag_iono_grid_points.stub[0] = 180; + test_msg.ssr_flag_iono_grid_points.faulty_points[1] = 11; - test_msg.ssr_flag_iono_grid_points.stub[1] = 0; + test_msg.ssr_flag_iono_grid_points.faulty_points[2] = 12; - test_msg.ssr_flag_iono_grid_points.stub[2] = 0; + test_msg.ssr_flag_iono_grid_points.header.chain_id = 6; - test_msg.ssr_flag_iono_grid_points.stub[3] = 0; + test_msg.ssr_flag_iono_grid_points.header.num_msgs = 1; - test_msg.ssr_flag_iono_grid_points.stub[4] = 3; + test_msg.ssr_flag_iono_grid_points.header.obs_time.tow = 180; - test_msg.ssr_flag_iono_grid_points.stub[5] = 0; + test_msg.ssr_flag_iono_grid_points.header.obs_time.wn = 3; - test_msg.ssr_flag_iono_grid_points.stub[6] = 1; + test_msg.ssr_flag_iono_grid_points.header.seq_num = 2; - test_msg.ssr_flag_iono_grid_points.stub[7] = 2; + test_msg.ssr_flag_iono_grid_points.header.ssr_sol_id = 3; - test_msg.ssr_flag_iono_grid_points.stub[8] = 3; + test_msg.ssr_flag_iono_grid_points.header.tile_id = 5; - test_msg.ssr_flag_iono_grid_points.stub[9] = 4; + test_msg.ssr_flag_iono_grid_points.header.tile_set_id = 4; - test_msg.ssr_flag_iono_grid_points.stub[10] = 0; - - test_msg.ssr_flag_iono_grid_points.stub[11] = 5; - - test_msg.ssr_flag_iono_grid_points.stub[12] = 0; - - test_msg.ssr_flag_iono_grid_points.stub[13] = 6; - - test_msg.ssr_flag_iono_grid_points.stub[14] = 3; - - test_msg.ssr_flag_iono_grid_points.stub[15] = 10; - - test_msg.ssr_flag_iono_grid_points.stub[16] = 0; - - test_msg.ssr_flag_iono_grid_points.stub[17] = 11; - - test_msg.ssr_flag_iono_grid_points.stub[18] = 0; - - test_msg.ssr_flag_iono_grid_points.stub[19] = 12; - - test_msg.ssr_flag_iono_grid_points.stub[20] = 0; + test_msg.ssr_flag_iono_grid_points.n_faulty_points = 3; sbp_message_send(&sbp_state, SbpMsgSsrFlagIonoGridPoints, 66, &test_msg, &dummy_write); @@ -171,117 +151,78 @@ START_TEST(test_auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints) { &test_msg) == 0, "Sent and received messages did not compare equal"); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.n_stub == 21, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.n_stub, " - "expected 21, is %d", - last_msg.msg.ssr_flag_iono_grid_points.n_stub); - - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[0] == 180, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[0], " - "expected 180, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[0]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[1] == 0, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[1], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[1]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[2] == 0, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[2], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[2]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[3] == 0, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[3], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[3]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[4] == 3, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[4], " - "expected 3, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[4]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[5] == 0, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[5], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[5]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[6] == 1, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[6], " - "expected 1, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[6]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[7] == 2, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[7], " - "expected 2, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[7]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[8] == 3, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[8], " - "expected 3, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[8]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[9] == 4, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[9], " - "expected 4, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[9]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[10] == 0, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[10], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[10]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[11] == 5, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[11], " - "expected 5, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[11]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[12] == 0, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[12], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[12]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[13] == 6, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[13], " - "expected 6, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[13]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[14] == 3, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[14], " - "expected 3, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[14]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[15] == 10, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[15], " - "expected 10, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[15]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[16] == 0, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[16], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[16]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[17] == 11, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[17], " - "expected 11, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[17]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[18] == 0, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[18], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[18]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[19] == 12, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[19], " - "expected 12, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[19]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_grid_points.stub[20] == 0, - "incorrect value for last_msg.msg.ssr_flag_iono_grid_points.stub[20], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_grid_points.stub[20]); + ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_points.faulty_points[0] == 10, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_points.faulty_points[0], " + "expected 10, is %d", + last_msg.msg.ssr_flag_iono_grid_points.faulty_points[0]); + ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_points.faulty_points[1] == 11, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_points.faulty_points[1], " + "expected 11, is %d", + last_msg.msg.ssr_flag_iono_grid_points.faulty_points[1]); + ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_points.faulty_points[2] == 12, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_points.faulty_points[2], " + "expected 12, is %d", + last_msg.msg.ssr_flag_iono_grid_points.faulty_points[2]); + + ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_points.header.chain_id == 6, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_points.header.chain_id, " + "expected 6, is %d", + last_msg.msg.ssr_flag_iono_grid_points.header.chain_id); + + ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_points.header.num_msgs == 1, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_points.header.num_msgs, " + "expected 1, is %d", + last_msg.msg.ssr_flag_iono_grid_points.header.num_msgs); + + ck_assert_msg( + last_msg.msg.ssr_flag_iono_grid_points.header.obs_time.tow == 180, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_points.header.obs_time.tow, expected " + "180, is %d", + last_msg.msg.ssr_flag_iono_grid_points.header.obs_time.tow); + + ck_assert_msg( + last_msg.msg.ssr_flag_iono_grid_points.header.obs_time.wn == 3, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_points.header.obs_time.wn, expected " + "3, is %d", + last_msg.msg.ssr_flag_iono_grid_points.header.obs_time.wn); + + ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_points.header.seq_num == 2, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_points.header.seq_num, " + "expected 2, is %d", + last_msg.msg.ssr_flag_iono_grid_points.header.seq_num); + + ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_points.header.ssr_sol_id == 3, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_points.header.ssr_sol_id, " + "expected 3, is %d", + last_msg.msg.ssr_flag_iono_grid_points.header.ssr_sol_id); + + ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_points.header.tile_id == 5, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_points.header.tile_id, " + "expected 5, is %d", + last_msg.msg.ssr_flag_iono_grid_points.header.tile_id); + + ck_assert_msg( + last_msg.msg.ssr_flag_iono_grid_points.header.tile_set_id == 4, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_points.header.tile_set_id, expected " + "4, is %d", + last_msg.msg.ssr_flag_iono_grid_points.header.tile_set_id); + + ck_assert_msg(last_msg.msg.ssr_flag_iono_grid_points.n_faulty_points == 3, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_grid_points.n_faulty_points, " + "expected 3, is %d", + last_msg.msg.ssr_flag_iono_grid_points.n_faulty_points); } } END_TEST diff --git a/c/test/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos.c b/c/test/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos.c index d89531a89b..68172d7f94 100644 --- a/c/test/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos.c +++ b/c/test/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos.c @@ -103,45 +103,31 @@ START_TEST(test_auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos) { sbp_msg_t test_msg; memset(&test_msg, 0, sizeof(test_msg)); - test_msg.ssr_flag_iono_tile_sat_los.n_stub = 19; + test_msg.ssr_flag_iono_tile_sat_los.faulty_los[0].constellation = 11; - test_msg.ssr_flag_iono_tile_sat_los.stub[0] = 180; + test_msg.ssr_flag_iono_tile_sat_los.faulty_los[0].satId = 10; - test_msg.ssr_flag_iono_tile_sat_los.stub[1] = 0; + test_msg.ssr_flag_iono_tile_sat_los.faulty_los[1].constellation = 14; - test_msg.ssr_flag_iono_tile_sat_los.stub[2] = 0; + test_msg.ssr_flag_iono_tile_sat_los.faulty_los[1].satId = 15; - test_msg.ssr_flag_iono_tile_sat_los.stub[3] = 0; + test_msg.ssr_flag_iono_tile_sat_los.header.chain_id = 6; - test_msg.ssr_flag_iono_tile_sat_los.stub[4] = 3; + test_msg.ssr_flag_iono_tile_sat_los.header.num_msgs = 1; - test_msg.ssr_flag_iono_tile_sat_los.stub[5] = 0; + test_msg.ssr_flag_iono_tile_sat_los.header.obs_time.tow = 180; - test_msg.ssr_flag_iono_tile_sat_los.stub[6] = 1; + test_msg.ssr_flag_iono_tile_sat_los.header.obs_time.wn = 3; - test_msg.ssr_flag_iono_tile_sat_los.stub[7] = 2; + test_msg.ssr_flag_iono_tile_sat_los.header.seq_num = 2; - test_msg.ssr_flag_iono_tile_sat_los.stub[8] = 3; + test_msg.ssr_flag_iono_tile_sat_los.header.ssr_sol_id = 3; - test_msg.ssr_flag_iono_tile_sat_los.stub[9] = 4; + test_msg.ssr_flag_iono_tile_sat_los.header.tile_id = 5; - test_msg.ssr_flag_iono_tile_sat_los.stub[10] = 0; + test_msg.ssr_flag_iono_tile_sat_los.header.tile_set_id = 4; - test_msg.ssr_flag_iono_tile_sat_los.stub[11] = 5; - - test_msg.ssr_flag_iono_tile_sat_los.stub[12] = 0; - - test_msg.ssr_flag_iono_tile_sat_los.stub[13] = 6; - - test_msg.ssr_flag_iono_tile_sat_los.stub[14] = 2; - - test_msg.ssr_flag_iono_tile_sat_los.stub[15] = 10; - - test_msg.ssr_flag_iono_tile_sat_los.stub[16] = 11; - - test_msg.ssr_flag_iono_tile_sat_los.stub[17] = 15; - - test_msg.ssr_flag_iono_tile_sat_los.stub[18] = 14; + test_msg.ssr_flag_iono_tile_sat_los.n_faulty_los = 2; sbp_message_send(&sbp_state, SbpMsgSsrFlagIonoTileSatLos, 66, &test_msg, &dummy_write); @@ -168,106 +154,92 @@ START_TEST(test_auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos) { "Sent and received messages did not compare equal"); ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.n_stub == 19, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.n_stub, " - "expected 19, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.n_stub); + last_msg.msg.ssr_flag_iono_tile_sat_los.faulty_los[0].constellation == + 11, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_tile_sat_los.faulty_los[0].constellation, " + "expected 11, is %d", + last_msg.msg.ssr_flag_iono_tile_sat_los.faulty_los[0].constellation); ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[0] == 180, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[0], " - "expected 180, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[0]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[1] == 0, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[1], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[1]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[2] == 0, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[2], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[2]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[3] == 0, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[3], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[3]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[4] == 3, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[4], " - "expected 3, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[4]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[5] == 0, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[5], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[5]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[6] == 1, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[6], " - "expected 1, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[6]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[7] == 2, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[7], " - "expected 2, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[7]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[8] == 3, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[8], " - "expected 3, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[8]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[9] == 4, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[9], " - "expected 4, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[9]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[10] == 0, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[10], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[10]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[11] == 5, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[11], " - "expected 5, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[11]); - ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[12] == 0, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[12], " - "expected 0, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[12]); + last_msg.msg.ssr_flag_iono_tile_sat_los.faulty_los[0].satId == 10, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_tile_sat_los.faulty_los[0].satId, expected " + "10, is %d", + last_msg.msg.ssr_flag_iono_tile_sat_los.faulty_los[0].satId); + ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[13] == 6, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[13], " - "expected 6, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[13]); + last_msg.msg.ssr_flag_iono_tile_sat_los.faulty_los[1].constellation == + 14, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_tile_sat_los.faulty_los[1].constellation, " + "expected 14, is %d", + last_msg.msg.ssr_flag_iono_tile_sat_los.faulty_los[1].constellation); + ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[14] == 2, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[14], " - "expected 2, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[14]); + last_msg.msg.ssr_flag_iono_tile_sat_los.faulty_los[1].satId == 15, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_tile_sat_los.faulty_los[1].satId, expected " + "15, is %d", + last_msg.msg.ssr_flag_iono_tile_sat_los.faulty_los[1].satId); + + ck_assert_msg(last_msg.msg.ssr_flag_iono_tile_sat_los.header.chain_id == 6, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_tile_sat_los.header.chain_id, " + "expected 6, is %d", + last_msg.msg.ssr_flag_iono_tile_sat_los.header.chain_id); + + ck_assert_msg(last_msg.msg.ssr_flag_iono_tile_sat_los.header.num_msgs == 1, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_tile_sat_los.header.num_msgs, " + "expected 1, is %d", + last_msg.msg.ssr_flag_iono_tile_sat_los.header.num_msgs); + ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[15] == 10, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[15], " - "expected 10, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[15]); + last_msg.msg.ssr_flag_iono_tile_sat_los.header.obs_time.tow == 180, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_tile_sat_los.header.obs_time.tow, expected " + "180, is %d", + last_msg.msg.ssr_flag_iono_tile_sat_los.header.obs_time.tow); + ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[16] == 11, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[16], " - "expected 11, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[16]); + last_msg.msg.ssr_flag_iono_tile_sat_los.header.obs_time.wn == 3, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_tile_sat_los.header.obs_time.wn, expected " + "3, is %d", + last_msg.msg.ssr_flag_iono_tile_sat_los.header.obs_time.wn); + + ck_assert_msg(last_msg.msg.ssr_flag_iono_tile_sat_los.header.seq_num == 2, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_tile_sat_los.header.seq_num, " + "expected 2, is %d", + last_msg.msg.ssr_flag_iono_tile_sat_los.header.seq_num); + ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[17] == 15, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[17], " - "expected 15, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[17]); + last_msg.msg.ssr_flag_iono_tile_sat_los.header.ssr_sol_id == 3, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_tile_sat_los.header.ssr_sol_id, expected " + "3, is %d", + last_msg.msg.ssr_flag_iono_tile_sat_los.header.ssr_sol_id); + + ck_assert_msg(last_msg.msg.ssr_flag_iono_tile_sat_los.header.tile_id == 5, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_tile_sat_los.header.tile_id, " + "expected 5, is %d", + last_msg.msg.ssr_flag_iono_tile_sat_los.header.tile_id); + ck_assert_msg( - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[18] == 14, - "incorrect value for last_msg.msg.ssr_flag_iono_tile_sat_los.stub[18], " - "expected 14, is %d", - last_msg.msg.ssr_flag_iono_tile_sat_los.stub[18]); + last_msg.msg.ssr_flag_iono_tile_sat_los.header.tile_set_id == 4, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_tile_sat_los.header.tile_set_id, expected " + "4, is %d", + last_msg.msg.ssr_flag_iono_tile_sat_los.header.tile_set_id); + + ck_assert_msg(last_msg.msg.ssr_flag_iono_tile_sat_los.n_faulty_los == 2, + "incorrect value for " + "last_msg.msg.ssr_flag_iono_tile_sat_los.n_faulty_los, " + "expected 2, is %d", + last_msg.msg.ssr_flag_iono_tile_sat_los.n_faulty_los); } } END_TEST diff --git a/c/test/auto_check_sbp_integrity_MsgSsrFlagSatellites.c b/c/test/auto_check_sbp_integrity_MsgSsrFlagSatellites.c index 90c4d5896f..1afbdd3bcd 100644 --- a/c/test/auto_check_sbp_integrity_MsgSsrFlagSatellites.c +++ b/c/test/auto_check_sbp_integrity_MsgSsrFlagSatellites.c @@ -103,37 +103,27 @@ START_TEST(test_auto_check_sbp_integrity_MsgSsrFlagSatellites) { sbp_msg_t test_msg; memset(&test_msg, 0, sizeof(test_msg)); - test_msg.ssr_flag_satellites.n_stub = 15; + test_msg.ssr_flag_satellites.chain_id = 4; - test_msg.ssr_flag_satellites.stub[0] = 180; + test_msg.ssr_flag_satellites.const_id = 5; - test_msg.ssr_flag_satellites.stub[1] = 0; + test_msg.ssr_flag_satellites.faulty_sats[0] = 10; - test_msg.ssr_flag_satellites.stub[2] = 0; + test_msg.ssr_flag_satellites.faulty_sats[1] = 11; - test_msg.ssr_flag_satellites.stub[3] = 0; + test_msg.ssr_flag_satellites.faulty_sats[2] = 12; - test_msg.ssr_flag_satellites.stub[4] = 3; + test_msg.ssr_flag_satellites.n_faulty_sats = 3; - test_msg.ssr_flag_satellites.stub[5] = 0; + test_msg.ssr_flag_satellites.num_msgs = 1; - test_msg.ssr_flag_satellites.stub[6] = 1; + test_msg.ssr_flag_satellites.obs_time.tow = 180; - test_msg.ssr_flag_satellites.stub[7] = 2; + test_msg.ssr_flag_satellites.obs_time.wn = 3; - test_msg.ssr_flag_satellites.stub[8] = 3; + test_msg.ssr_flag_satellites.seq_num = 2; - test_msg.ssr_flag_satellites.stub[9] = 4; - - test_msg.ssr_flag_satellites.stub[10] = 5; - - test_msg.ssr_flag_satellites.stub[11] = 3; - - test_msg.ssr_flag_satellites.stub[12] = 10; - - test_msg.ssr_flag_satellites.stub[13] = 11; - - test_msg.ssr_flag_satellites.stub[14] = 12; + test_msg.ssr_flag_satellites.ssr_sol_id = 3; sbp_message_send(&sbp_state, SbpMsgSsrFlagSatellites, 66, &test_msg, &dummy_write); @@ -159,77 +149,68 @@ START_TEST(test_auto_check_sbp_integrity_MsgSsrFlagSatellites) { sbp_message_cmp(SbpMsgSsrFlagSatellites, &last_msg.msg, &test_msg) == 0, "Sent and received messages did not compare equal"); - ck_assert_msg(last_msg.msg.ssr_flag_satellites.n_stub == 15, - "incorrect value for " - "last_msg.msg.ssr_flag_satellites.n_stub, expected 15, is %d", - last_msg.msg.ssr_flag_satellites.n_stub); - ck_assert_msg( - last_msg.msg.ssr_flag_satellites.stub[0] == 180, - "incorrect value for last_msg.msg.ssr_flag_satellites.stub[0], " - "expected 180, is %d", - last_msg.msg.ssr_flag_satellites.stub[0]); - ck_assert_msg(last_msg.msg.ssr_flag_satellites.stub[1] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_satellites.stub[1], expected 0, is %d", - last_msg.msg.ssr_flag_satellites.stub[1]); - ck_assert_msg(last_msg.msg.ssr_flag_satellites.stub[2] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_satellites.stub[2], expected 0, is %d", - last_msg.msg.ssr_flag_satellites.stub[2]); - ck_assert_msg(last_msg.msg.ssr_flag_satellites.stub[3] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_satellites.stub[3], expected 0, is %d", - last_msg.msg.ssr_flag_satellites.stub[3]); - ck_assert_msg(last_msg.msg.ssr_flag_satellites.stub[4] == 3, - "incorrect value for " - "last_msg.msg.ssr_flag_satellites.stub[4], expected 3, is %d", - last_msg.msg.ssr_flag_satellites.stub[4]); - ck_assert_msg(last_msg.msg.ssr_flag_satellites.stub[5] == 0, - "incorrect value for " - "last_msg.msg.ssr_flag_satellites.stub[5], expected 0, is %d", - last_msg.msg.ssr_flag_satellites.stub[5]); - ck_assert_msg(last_msg.msg.ssr_flag_satellites.stub[6] == 1, - "incorrect value for " - "last_msg.msg.ssr_flag_satellites.stub[6], expected 1, is %d", - last_msg.msg.ssr_flag_satellites.stub[6]); - ck_assert_msg(last_msg.msg.ssr_flag_satellites.stub[7] == 2, - "incorrect value for " - "last_msg.msg.ssr_flag_satellites.stub[7], expected 2, is %d", - last_msg.msg.ssr_flag_satellites.stub[7]); - ck_assert_msg(last_msg.msg.ssr_flag_satellites.stub[8] == 3, - "incorrect value for " - "last_msg.msg.ssr_flag_satellites.stub[8], expected 3, is %d", - last_msg.msg.ssr_flag_satellites.stub[8]); - ck_assert_msg(last_msg.msg.ssr_flag_satellites.stub[9] == 4, - "incorrect value for " - "last_msg.msg.ssr_flag_satellites.stub[9], expected 4, is %d", - last_msg.msg.ssr_flag_satellites.stub[9]); + last_msg.msg.ssr_flag_satellites.chain_id == 4, + "incorrect value for last_msg.msg.ssr_flag_satellites.chain_id, " + "expected 4, is %d", + last_msg.msg.ssr_flag_satellites.chain_id); + ck_assert_msg( - last_msg.msg.ssr_flag_satellites.stub[10] == 5, - "incorrect value for last_msg.msg.ssr_flag_satellites.stub[10], " + last_msg.msg.ssr_flag_satellites.const_id == 5, + "incorrect value for last_msg.msg.ssr_flag_satellites.const_id, " "expected 5, is %d", - last_msg.msg.ssr_flag_satellites.stub[10]); - ck_assert_msg( - last_msg.msg.ssr_flag_satellites.stub[11] == 3, - "incorrect value for last_msg.msg.ssr_flag_satellites.stub[11], " - "expected 3, is %d", - last_msg.msg.ssr_flag_satellites.stub[11]); + last_msg.msg.ssr_flag_satellites.const_id); + ck_assert_msg( - last_msg.msg.ssr_flag_satellites.stub[12] == 10, - "incorrect value for last_msg.msg.ssr_flag_satellites.stub[12], " + last_msg.msg.ssr_flag_satellites.faulty_sats[0] == 10, + "incorrect value for last_msg.msg.ssr_flag_satellites.faulty_sats[0], " "expected 10, is %d", - last_msg.msg.ssr_flag_satellites.stub[12]); + last_msg.msg.ssr_flag_satellites.faulty_sats[0]); ck_assert_msg( - last_msg.msg.ssr_flag_satellites.stub[13] == 11, - "incorrect value for last_msg.msg.ssr_flag_satellites.stub[13], " + last_msg.msg.ssr_flag_satellites.faulty_sats[1] == 11, + "incorrect value for last_msg.msg.ssr_flag_satellites.faulty_sats[1], " "expected 11, is %d", - last_msg.msg.ssr_flag_satellites.stub[13]); + last_msg.msg.ssr_flag_satellites.faulty_sats[1]); ck_assert_msg( - last_msg.msg.ssr_flag_satellites.stub[14] == 12, - "incorrect value for last_msg.msg.ssr_flag_satellites.stub[14], " + last_msg.msg.ssr_flag_satellites.faulty_sats[2] == 12, + "incorrect value for last_msg.msg.ssr_flag_satellites.faulty_sats[2], " "expected 12, is %d", - last_msg.msg.ssr_flag_satellites.stub[14]); + last_msg.msg.ssr_flag_satellites.faulty_sats[2]); + + ck_assert_msg( + last_msg.msg.ssr_flag_satellites.n_faulty_sats == 3, + "incorrect value for last_msg.msg.ssr_flag_satellites.n_faulty_sats, " + "expected 3, is %d", + last_msg.msg.ssr_flag_satellites.n_faulty_sats); + + ck_assert_msg( + last_msg.msg.ssr_flag_satellites.num_msgs == 1, + "incorrect value for last_msg.msg.ssr_flag_satellites.num_msgs, " + "expected 1, is %d", + last_msg.msg.ssr_flag_satellites.num_msgs); + + ck_assert_msg( + last_msg.msg.ssr_flag_satellites.obs_time.tow == 180, + "incorrect value for last_msg.msg.ssr_flag_satellites.obs_time.tow, " + "expected 180, is %d", + last_msg.msg.ssr_flag_satellites.obs_time.tow); + + ck_assert_msg( + last_msg.msg.ssr_flag_satellites.obs_time.wn == 3, + "incorrect value for last_msg.msg.ssr_flag_satellites.obs_time.wn, " + "expected 3, is %d", + last_msg.msg.ssr_flag_satellites.obs_time.wn); + + ck_assert_msg(last_msg.msg.ssr_flag_satellites.seq_num == 2, + "incorrect value for " + "last_msg.msg.ssr_flag_satellites.seq_num, expected 2, is %d", + last_msg.msg.ssr_flag_satellites.seq_num); + + ck_assert_msg( + last_msg.msg.ssr_flag_satellites.ssr_sol_id == 3, + "incorrect value for last_msg.msg.ssr_flag_satellites.ssr_sol_id, " + "expected 3, is %d", + last_msg.msg.ssr_flag_satellites.ssr_sol_id); } } END_TEST diff --git a/c/test/auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints.c b/c/test/auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints.c index 71c6a47e00..b458f3fdce 100644 --- a/c/test/auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints.c +++ b/c/test/auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints.c @@ -103,49 +103,29 @@ START_TEST(test_auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints) { sbp_msg_t test_msg; memset(&test_msg, 0, sizeof(test_msg)); - test_msg.ssr_flag_tropo_grid_points.n_stub = 21; + test_msg.ssr_flag_tropo_grid_points.faulty_points[0] = 10; - test_msg.ssr_flag_tropo_grid_points.stub[0] = 180; + test_msg.ssr_flag_tropo_grid_points.faulty_points[1] = 11; - test_msg.ssr_flag_tropo_grid_points.stub[1] = 0; + test_msg.ssr_flag_tropo_grid_points.faulty_points[2] = 12; - test_msg.ssr_flag_tropo_grid_points.stub[2] = 0; + test_msg.ssr_flag_tropo_grid_points.header.chain_id = 6; - test_msg.ssr_flag_tropo_grid_points.stub[3] = 0; + test_msg.ssr_flag_tropo_grid_points.header.num_msgs = 1; - test_msg.ssr_flag_tropo_grid_points.stub[4] = 3; + test_msg.ssr_flag_tropo_grid_points.header.obs_time.tow = 180; - test_msg.ssr_flag_tropo_grid_points.stub[5] = 0; + test_msg.ssr_flag_tropo_grid_points.header.obs_time.wn = 3; - test_msg.ssr_flag_tropo_grid_points.stub[6] = 1; + test_msg.ssr_flag_tropo_grid_points.header.seq_num = 2; - test_msg.ssr_flag_tropo_grid_points.stub[7] = 2; + test_msg.ssr_flag_tropo_grid_points.header.ssr_sol_id = 3; - test_msg.ssr_flag_tropo_grid_points.stub[8] = 3; + test_msg.ssr_flag_tropo_grid_points.header.tile_id = 5; - test_msg.ssr_flag_tropo_grid_points.stub[9] = 4; + test_msg.ssr_flag_tropo_grid_points.header.tile_set_id = 4; - test_msg.ssr_flag_tropo_grid_points.stub[10] = 0; - - test_msg.ssr_flag_tropo_grid_points.stub[11] = 5; - - test_msg.ssr_flag_tropo_grid_points.stub[12] = 0; - - test_msg.ssr_flag_tropo_grid_points.stub[13] = 6; - - test_msg.ssr_flag_tropo_grid_points.stub[14] = 3; - - test_msg.ssr_flag_tropo_grid_points.stub[15] = 10; - - test_msg.ssr_flag_tropo_grid_points.stub[16] = 0; - - test_msg.ssr_flag_tropo_grid_points.stub[17] = 11; - - test_msg.ssr_flag_tropo_grid_points.stub[18] = 0; - - test_msg.ssr_flag_tropo_grid_points.stub[19] = 12; - - test_msg.ssr_flag_tropo_grid_points.stub[20] = 0; + test_msg.ssr_flag_tropo_grid_points.n_faulty_points = 3; sbp_message_send(&sbp_state, SbpMsgSsrFlagTropoGridPoints, 66, &test_msg, &dummy_write); @@ -172,116 +152,81 @@ START_TEST(test_auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints) { "Sent and received messages did not compare equal"); ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.n_stub == 21, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.n_stub, " - "expected 21, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.n_stub); - - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[0] == 180, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[0], " - "expected 180, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[0]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[1] == 0, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[1], " - "expected 0, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[1]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[2] == 0, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[2], " - "expected 0, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[2]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[3] == 0, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[3], " - "expected 0, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[3]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[4] == 3, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[4], " - "expected 3, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[4]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[5] == 0, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[5], " - "expected 0, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[5]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[6] == 1, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[6], " - "expected 1, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[6]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[7] == 2, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[7], " - "expected 2, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[7]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[8] == 3, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[8], " - "expected 3, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[8]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[9] == 4, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[9], " - "expected 4, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[9]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[10] == 0, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[10], " - "expected 0, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[10]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[11] == 5, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[11], " - "expected 5, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[11]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[12] == 0, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[12], " - "expected 0, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[12]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[13] == 6, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[13], " - "expected 6, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[13]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[14] == 3, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[14], " - "expected 3, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[14]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[15] == 10, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[15], " - "expected 10, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[15]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[16] == 0, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[16], " - "expected 0, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[16]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[17] == 11, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[17], " - "expected 11, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[17]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[18] == 0, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[18], " - "expected 0, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[18]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[19] == 12, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[19], " - "expected 12, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[19]); - ck_assert_msg( - last_msg.msg.ssr_flag_tropo_grid_points.stub[20] == 0, - "incorrect value for last_msg.msg.ssr_flag_tropo_grid_points.stub[20], " - "expected 0, is %d", - last_msg.msg.ssr_flag_tropo_grid_points.stub[20]); + last_msg.msg.ssr_flag_tropo_grid_points.faulty_points[0] == 10, + "incorrect value for " + "last_msg.msg.ssr_flag_tropo_grid_points.faulty_points[0], expected " + "10, is %d", + last_msg.msg.ssr_flag_tropo_grid_points.faulty_points[0]); + ck_assert_msg( + last_msg.msg.ssr_flag_tropo_grid_points.faulty_points[1] == 11, + "incorrect value for " + "last_msg.msg.ssr_flag_tropo_grid_points.faulty_points[1], expected " + "11, is %d", + last_msg.msg.ssr_flag_tropo_grid_points.faulty_points[1]); + ck_assert_msg( + last_msg.msg.ssr_flag_tropo_grid_points.faulty_points[2] == 12, + "incorrect value for " + "last_msg.msg.ssr_flag_tropo_grid_points.faulty_points[2], expected " + "12, is %d", + last_msg.msg.ssr_flag_tropo_grid_points.faulty_points[2]); + + ck_assert_msg(last_msg.msg.ssr_flag_tropo_grid_points.header.chain_id == 6, + "incorrect value for " + "last_msg.msg.ssr_flag_tropo_grid_points.header.chain_id, " + "expected 6, is %d", + last_msg.msg.ssr_flag_tropo_grid_points.header.chain_id); + + ck_assert_msg(last_msg.msg.ssr_flag_tropo_grid_points.header.num_msgs == 1, + "incorrect value for " + "last_msg.msg.ssr_flag_tropo_grid_points.header.num_msgs, " + "expected 1, is %d", + last_msg.msg.ssr_flag_tropo_grid_points.header.num_msgs); + + ck_assert_msg( + last_msg.msg.ssr_flag_tropo_grid_points.header.obs_time.tow == 180, + "incorrect value for " + "last_msg.msg.ssr_flag_tropo_grid_points.header.obs_time.tow, expected " + "180, is %d", + last_msg.msg.ssr_flag_tropo_grid_points.header.obs_time.tow); + + ck_assert_msg( + last_msg.msg.ssr_flag_tropo_grid_points.header.obs_time.wn == 3, + "incorrect value for " + "last_msg.msg.ssr_flag_tropo_grid_points.header.obs_time.wn, expected " + "3, is %d", + last_msg.msg.ssr_flag_tropo_grid_points.header.obs_time.wn); + + ck_assert_msg(last_msg.msg.ssr_flag_tropo_grid_points.header.seq_num == 2, + "incorrect value for " + "last_msg.msg.ssr_flag_tropo_grid_points.header.seq_num, " + "expected 2, is %d", + last_msg.msg.ssr_flag_tropo_grid_points.header.seq_num); + + ck_assert_msg( + last_msg.msg.ssr_flag_tropo_grid_points.header.ssr_sol_id == 3, + "incorrect value for " + "last_msg.msg.ssr_flag_tropo_grid_points.header.ssr_sol_id, expected " + "3, is %d", + last_msg.msg.ssr_flag_tropo_grid_points.header.ssr_sol_id); + + ck_assert_msg(last_msg.msg.ssr_flag_tropo_grid_points.header.tile_id == 5, + "incorrect value for " + "last_msg.msg.ssr_flag_tropo_grid_points.header.tile_id, " + "expected 5, is %d", + last_msg.msg.ssr_flag_tropo_grid_points.header.tile_id); + + ck_assert_msg( + last_msg.msg.ssr_flag_tropo_grid_points.header.tile_set_id == 4, + "incorrect value for " + "last_msg.msg.ssr_flag_tropo_grid_points.header.tile_set_id, expected " + "4, is %d", + last_msg.msg.ssr_flag_tropo_grid_points.header.tile_set_id); + + ck_assert_msg(last_msg.msg.ssr_flag_tropo_grid_points.n_faulty_points == 3, + "incorrect value for " + "last_msg.msg.ssr_flag_tropo_grid_points.n_faulty_points, " + "expected 3, is %d", + last_msg.msg.ssr_flag_tropo_grid_points.n_faulty_points); } } END_TEST diff --git a/c/test/auto_check_sbp_navigation_MsgReferenceFrameParam.c b/c/test/auto_check_sbp_navigation_MsgReferenceFrameParam.c index 668885ae4f..d7bd9057b5 100644 --- a/c/test/auto_check_sbp_navigation_MsgReferenceFrameParam.c +++ b/c/test/auto_check_sbp_navigation_MsgReferenceFrameParam.c @@ -94,14 +94,14 @@ START_TEST(test_auto_check_sbp_navigation_MsgReferenceFrameParam) { &DUMMY_MEMORY_FOR_CALLBACKS, &n); u8 encoded_frame[] = { - 85, 68, 2, 66, 0, 124, 1, 2, 102, 111, 111, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 5, 0, 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, - 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, - 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, - 0, 18, 0, 0, 0, 19, 0, 0, 0, 20, 0, 66, 126, + 85, 68, 2, 66, 0, 124, 1, 102, 111, 111, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 5, 0, 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, + 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, + 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, + 0, 18, 0, 0, 0, 19, 0, 0, 0, 20, 0, 6, 161, }; dummy_reset(); @@ -109,255 +109,63 @@ START_TEST(test_auto_check_sbp_navigation_MsgReferenceFrameParam) { sbp_msg_t test_msg; memset(&test_msg, 0, sizeof(test_msg)); - test_msg.reference_frame_param.n_stub = 124; + test_msg.reference_frame_param.delta_X0 = 7; - test_msg.reference_frame_param.stub[0] = 1; + test_msg.reference_frame_param.delta_Y0 = 8; - test_msg.reference_frame_param.stub[1] = 2; + test_msg.reference_frame_param.delta_Z0 = 9; - test_msg.reference_frame_param.stub[2] = 102; + test_msg.reference_frame_param.dot_delta_X0 = 14; - test_msg.reference_frame_param.stub[3] = 111; + test_msg.reference_frame_param.dot_delta_Y0 = 15; - test_msg.reference_frame_param.stub[4] = 111; + test_msg.reference_frame_param.dot_delta_Z0 = 16; - test_msg.reference_frame_param.stub[5] = 0; + test_msg.reference_frame_param.dot_scale = 20; - test_msg.reference_frame_param.stub[6] = 0; + test_msg.reference_frame_param.dot_theta_01 = 17; - test_msg.reference_frame_param.stub[7] = 0; + test_msg.reference_frame_param.dot_theta_02 = 18; - test_msg.reference_frame_param.stub[8] = 0; + test_msg.reference_frame_param.dot_theta_03 = 19; - test_msg.reference_frame_param.stub[9] = 0; + test_msg.reference_frame_param.re_t0 = 6; - test_msg.reference_frame_param.stub[10] = 0; + test_msg.reference_frame_param.scale = 13; - test_msg.reference_frame_param.stub[11] = 0; + test_msg.reference_frame_param.sin = 4; - test_msg.reference_frame_param.stub[12] = 0; - - test_msg.reference_frame_param.stub[13] = 0; - - test_msg.reference_frame_param.stub[14] = 0; - - test_msg.reference_frame_param.stub[15] = 0; - - test_msg.reference_frame_param.stub[16] = 0; - - test_msg.reference_frame_param.stub[17] = 0; - - test_msg.reference_frame_param.stub[18] = 0; - - test_msg.reference_frame_param.stub[19] = 0; - - test_msg.reference_frame_param.stub[20] = 0; - - test_msg.reference_frame_param.stub[21] = 0; - - test_msg.reference_frame_param.stub[22] = 0; - - test_msg.reference_frame_param.stub[23] = 0; - - test_msg.reference_frame_param.stub[24] = 0; - - test_msg.reference_frame_param.stub[25] = 0; - - test_msg.reference_frame_param.stub[26] = 0; - - test_msg.reference_frame_param.stub[27] = 0; - - test_msg.reference_frame_param.stub[28] = 0; - - test_msg.reference_frame_param.stub[29] = 0; - - test_msg.reference_frame_param.stub[30] = 0; - - test_msg.reference_frame_param.stub[31] = 0; - - test_msg.reference_frame_param.stub[32] = 0; - - test_msg.reference_frame_param.stub[33] = 3; - - test_msg.reference_frame_param.stub[34] = 98; - - test_msg.reference_frame_param.stub[35] = 97; - - test_msg.reference_frame_param.stub[36] = 114; - - test_msg.reference_frame_param.stub[37] = 0; - - test_msg.reference_frame_param.stub[38] = 0; - - test_msg.reference_frame_param.stub[39] = 0; - - test_msg.reference_frame_param.stub[40] = 0; - - test_msg.reference_frame_param.stub[41] = 0; - - test_msg.reference_frame_param.stub[42] = 0; - - test_msg.reference_frame_param.stub[43] = 0; - - test_msg.reference_frame_param.stub[44] = 0; - - test_msg.reference_frame_param.stub[45] = 0; - - test_msg.reference_frame_param.stub[46] = 0; - - test_msg.reference_frame_param.stub[47] = 0; - - test_msg.reference_frame_param.stub[48] = 0; - - test_msg.reference_frame_param.stub[49] = 0; - - test_msg.reference_frame_param.stub[50] = 0; - - test_msg.reference_frame_param.stub[51] = 0; - - test_msg.reference_frame_param.stub[52] = 0; - - test_msg.reference_frame_param.stub[53] = 0; - - test_msg.reference_frame_param.stub[54] = 0; - - test_msg.reference_frame_param.stub[55] = 0; - - test_msg.reference_frame_param.stub[56] = 0; - - test_msg.reference_frame_param.stub[57] = 0; - - test_msg.reference_frame_param.stub[58] = 0; - - test_msg.reference_frame_param.stub[59] = 0; - - test_msg.reference_frame_param.stub[60] = 0; - - test_msg.reference_frame_param.stub[61] = 0; - - test_msg.reference_frame_param.stub[62] = 0; - - test_msg.reference_frame_param.stub[63] = 0; - - test_msg.reference_frame_param.stub[64] = 0; - - test_msg.reference_frame_param.stub[65] = 4; - - test_msg.reference_frame_param.stub[66] = 5; - - test_msg.reference_frame_param.stub[67] = 0; - - test_msg.reference_frame_param.stub[68] = 6; - - test_msg.reference_frame_param.stub[69] = 0; - - test_msg.reference_frame_param.stub[70] = 7; - - test_msg.reference_frame_param.stub[71] = 0; - - test_msg.reference_frame_param.stub[72] = 0; - - test_msg.reference_frame_param.stub[73] = 0; - - test_msg.reference_frame_param.stub[74] = 8; - - test_msg.reference_frame_param.stub[75] = 0; - - test_msg.reference_frame_param.stub[76] = 0; - - test_msg.reference_frame_param.stub[77] = 0; - - test_msg.reference_frame_param.stub[78] = 9; - - test_msg.reference_frame_param.stub[79] = 0; - - test_msg.reference_frame_param.stub[80] = 0; - - test_msg.reference_frame_param.stub[81] = 0; - - test_msg.reference_frame_param.stub[82] = 10; - - test_msg.reference_frame_param.stub[83] = 0; - - test_msg.reference_frame_param.stub[84] = 0; - - test_msg.reference_frame_param.stub[85] = 0; - - test_msg.reference_frame_param.stub[86] = 11; - - test_msg.reference_frame_param.stub[87] = 0; - - test_msg.reference_frame_param.stub[88] = 0; - - test_msg.reference_frame_param.stub[89] = 0; - - test_msg.reference_frame_param.stub[90] = 12; - - test_msg.reference_frame_param.stub[91] = 0; - - test_msg.reference_frame_param.stub[92] = 0; - - test_msg.reference_frame_param.stub[93] = 0; - - test_msg.reference_frame_param.stub[94] = 13; - - test_msg.reference_frame_param.stub[95] = 0; - - test_msg.reference_frame_param.stub[96] = 0; - - test_msg.reference_frame_param.stub[97] = 0; - - test_msg.reference_frame_param.stub[98] = 14; - - test_msg.reference_frame_param.stub[99] = 0; - - test_msg.reference_frame_param.stub[100] = 0; - - test_msg.reference_frame_param.stub[101] = 0; - - test_msg.reference_frame_param.stub[102] = 15; - - test_msg.reference_frame_param.stub[103] = 0; - - test_msg.reference_frame_param.stub[104] = 0; - - test_msg.reference_frame_param.stub[105] = 0; - - test_msg.reference_frame_param.stub[106] = 16; - - test_msg.reference_frame_param.stub[107] = 0; - - test_msg.reference_frame_param.stub[108] = 0; - - test_msg.reference_frame_param.stub[109] = 0; - - test_msg.reference_frame_param.stub[110] = 17; - - test_msg.reference_frame_param.stub[111] = 0; - - test_msg.reference_frame_param.stub[112] = 0; - - test_msg.reference_frame_param.stub[113] = 0; - - test_msg.reference_frame_param.stub[114] = 18; - - test_msg.reference_frame_param.stub[115] = 0; - - test_msg.reference_frame_param.stub[116] = 0; - - test_msg.reference_frame_param.stub[117] = 0; + { + const char assign_string[] = { + (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0}; + memcpy(test_msg.reference_frame_param.sn, assign_string, + sizeof(assign_string)); + } - test_msg.reference_frame_param.stub[118] = 19; + test_msg.reference_frame_param.ssr_iod = 1; - test_msg.reference_frame_param.stub[119] = 0; + test_msg.reference_frame_param.theta_01 = 10; - test_msg.reference_frame_param.stub[120] = 0; + test_msg.reference_frame_param.theta_02 = 11; - test_msg.reference_frame_param.stub[121] = 0; + test_msg.reference_frame_param.theta_03 = 12; - test_msg.reference_frame_param.stub[122] = 20; + { + const char assign_string[] = { + (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0}; + memcpy(test_msg.reference_frame_param.tn, assign_string, + sizeof(assign_string)); + } - test_msg.reference_frame_param.stub[123] = 0; + test_msg.reference_frame_param.utn = 5; sbp_message_send(&sbp_state, SbpMsgReferenceFrameParam, 66, &test_msg, &dummy_write); @@ -384,631 +192,139 @@ START_TEST(test_auto_check_sbp_navigation_MsgReferenceFrameParam) { "Sent and received messages did not compare equal"); ck_assert_msg( - last_msg.msg.reference_frame_param.n_stub == 124, - "incorrect value for last_msg.msg.reference_frame_param.n_stub, " - "expected 124, is %d", - last_msg.msg.reference_frame_param.n_stub); - - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[0] == 1, - "incorrect value for last_msg.msg.reference_frame_param.stub[0], " - "expected 1, is %d", - last_msg.msg.reference_frame_param.stub[0]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[1] == 2, - "incorrect value for last_msg.msg.reference_frame_param.stub[1], " - "expected 2, is %d", - last_msg.msg.reference_frame_param.stub[1]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[2] == 102, - "incorrect value for last_msg.msg.reference_frame_param.stub[2], " - "expected 102, is %d", - last_msg.msg.reference_frame_param.stub[2]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[3] == 111, - "incorrect value for last_msg.msg.reference_frame_param.stub[3], " - "expected 111, is %d", - last_msg.msg.reference_frame_param.stub[3]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[4] == 111, - "incorrect value for last_msg.msg.reference_frame_param.stub[4], " - "expected 111, is %d", - last_msg.msg.reference_frame_param.stub[4]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[5] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[5], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[5]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[6] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[6], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[6]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[7] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[7], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[7]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[8] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[8], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[8]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[9] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[9], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[9]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[10] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[10], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[10]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[11] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[11], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[11]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[12] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[12], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[12]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[13] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[13], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[13]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[14] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[14], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[14]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[15] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[15], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[15]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[16] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[16], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[16]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[17] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[17], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[17]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[18] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[18], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[18]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[19] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[19], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[19]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[20] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[20], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[20]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[21] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[21], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[21]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[22] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[22], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[22]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[23] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[23], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[23]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[24] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[24], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[24]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[25] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[25], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[25]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[26] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[26], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[26]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[27] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[27], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[27]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[28] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[28], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[28]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[29] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[29], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[29]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[30] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[30], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[30]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[31] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[31], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[31]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[32] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[32], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[32]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[33] == 3, - "incorrect value for last_msg.msg.reference_frame_param.stub[33], " - "expected 3, is %d", - last_msg.msg.reference_frame_param.stub[33]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[34] == 98, - "incorrect value for last_msg.msg.reference_frame_param.stub[34], " - "expected 98, is %d", - last_msg.msg.reference_frame_param.stub[34]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[35] == 97, - "incorrect value for last_msg.msg.reference_frame_param.stub[35], " - "expected 97, is %d", - last_msg.msg.reference_frame_param.stub[35]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[36] == 114, - "incorrect value for last_msg.msg.reference_frame_param.stub[36], " - "expected 114, is %d", - last_msg.msg.reference_frame_param.stub[36]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[37] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[37], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[37]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[38] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[38], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[38]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[39] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[39], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[39]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[40] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[40], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[40]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[41] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[41], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[41]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[42] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[42], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[42]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[43] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[43], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[43]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[44] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[44], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[44]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[45] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[45], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[45]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[46] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[46], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[46]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[47] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[47], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[47]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[48] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[48], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[48]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[49] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[49], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[49]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[50] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[50], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[50]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[51] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[51], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[51]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[52] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[52], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[52]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[53] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[53], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[53]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[54] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[54], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[54]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[55] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[55], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[55]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[56] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[56], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[56]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[57] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[57], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[57]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[58] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[58], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[58]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[59] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[59], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[59]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[60] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[60], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[60]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[61] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[61], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[61]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[62] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[62], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[62]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[63] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[63], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[63]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[64] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[64], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[64]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[65] == 4, - "incorrect value for last_msg.msg.reference_frame_param.stub[65], " - "expected 4, is %d", - last_msg.msg.reference_frame_param.stub[65]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[66] == 5, - "incorrect value for last_msg.msg.reference_frame_param.stub[66], " - "expected 5, is %d", - last_msg.msg.reference_frame_param.stub[66]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[67] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[67], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[67]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[68] == 6, - "incorrect value for last_msg.msg.reference_frame_param.stub[68], " - "expected 6, is %d", - last_msg.msg.reference_frame_param.stub[68]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[69] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[69], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[69]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[70] == 7, - "incorrect value for last_msg.msg.reference_frame_param.stub[70], " + last_msg.msg.reference_frame_param.delta_X0 == 7, + "incorrect value for last_msg.msg.reference_frame_param.delta_X0, " "expected 7, is %d", - last_msg.msg.reference_frame_param.stub[70]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[71] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[71], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[71]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[72] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[72], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[72]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[73] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[73], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[73]); + last_msg.msg.reference_frame_param.delta_X0); + ck_assert_msg( - last_msg.msg.reference_frame_param.stub[74] == 8, - "incorrect value for last_msg.msg.reference_frame_param.stub[74], " + last_msg.msg.reference_frame_param.delta_Y0 == 8, + "incorrect value for last_msg.msg.reference_frame_param.delta_Y0, " "expected 8, is %d", - last_msg.msg.reference_frame_param.stub[74]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[75] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[75], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[75]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[76] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[76], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[76]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[77] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[77], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[77]); + last_msg.msg.reference_frame_param.delta_Y0); + ck_assert_msg( - last_msg.msg.reference_frame_param.stub[78] == 9, - "incorrect value for last_msg.msg.reference_frame_param.stub[78], " + last_msg.msg.reference_frame_param.delta_Z0 == 9, + "incorrect value for last_msg.msg.reference_frame_param.delta_Z0, " "expected 9, is %d", - last_msg.msg.reference_frame_param.stub[78]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[79] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[79], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[79]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[80] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[80], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[80]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[81] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[81], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[81]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[82] == 10, - "incorrect value for last_msg.msg.reference_frame_param.stub[82], " - "expected 10, is %d", - last_msg.msg.reference_frame_param.stub[82]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[83] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[83], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[83]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[84] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[84], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[84]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[85] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[85], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[85]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[86] == 11, - "incorrect value for last_msg.msg.reference_frame_param.stub[86], " - "expected 11, is %d", - last_msg.msg.reference_frame_param.stub[86]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[87] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[87], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[87]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[88] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[88], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[88]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[89] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[89], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[89]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[90] == 12, - "incorrect value for last_msg.msg.reference_frame_param.stub[90], " - "expected 12, is %d", - last_msg.msg.reference_frame_param.stub[90]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[91] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[91], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[91]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[92] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[92], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[92]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[93] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[93], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[93]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[94] == 13, - "incorrect value for last_msg.msg.reference_frame_param.stub[94], " - "expected 13, is %d", - last_msg.msg.reference_frame_param.stub[94]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[95] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[95], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[95]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[96] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[96], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[96]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[97] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[97], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[97]); + last_msg.msg.reference_frame_param.delta_Z0); + ck_assert_msg( - last_msg.msg.reference_frame_param.stub[98] == 14, - "incorrect value for last_msg.msg.reference_frame_param.stub[98], " + last_msg.msg.reference_frame_param.dot_delta_X0 == 14, + "incorrect value for last_msg.msg.reference_frame_param.dot_delta_X0, " "expected 14, is %d", - last_msg.msg.reference_frame_param.stub[98]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[99] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[99], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[99]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[100] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[100], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[100]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[101] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[101], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[101]); + last_msg.msg.reference_frame_param.dot_delta_X0); + ck_assert_msg( - last_msg.msg.reference_frame_param.stub[102] == 15, - "incorrect value for last_msg.msg.reference_frame_param.stub[102], " + last_msg.msg.reference_frame_param.dot_delta_Y0 == 15, + "incorrect value for last_msg.msg.reference_frame_param.dot_delta_Y0, " "expected 15, is %d", - last_msg.msg.reference_frame_param.stub[102]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[103] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[103], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[103]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[104] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[104], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[104]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[105] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[105], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[105]); + last_msg.msg.reference_frame_param.dot_delta_Y0); + ck_assert_msg( - last_msg.msg.reference_frame_param.stub[106] == 16, - "incorrect value for last_msg.msg.reference_frame_param.stub[106], " + last_msg.msg.reference_frame_param.dot_delta_Z0 == 16, + "incorrect value for last_msg.msg.reference_frame_param.dot_delta_Z0, " "expected 16, is %d", - last_msg.msg.reference_frame_param.stub[106]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[107] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[107], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[107]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[108] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[108], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[108]); + last_msg.msg.reference_frame_param.dot_delta_Z0); + ck_assert_msg( - last_msg.msg.reference_frame_param.stub[109] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[109], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[109]); + last_msg.msg.reference_frame_param.dot_scale == 20, + "incorrect value for last_msg.msg.reference_frame_param.dot_scale, " + "expected 20, is %d", + last_msg.msg.reference_frame_param.dot_scale); + ck_assert_msg( - last_msg.msg.reference_frame_param.stub[110] == 17, - "incorrect value for last_msg.msg.reference_frame_param.stub[110], " + last_msg.msg.reference_frame_param.dot_theta_01 == 17, + "incorrect value for last_msg.msg.reference_frame_param.dot_theta_01, " "expected 17, is %d", - last_msg.msg.reference_frame_param.stub[110]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[111] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[111], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[111]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[112] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[112], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[112]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[113] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[113], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[113]); + last_msg.msg.reference_frame_param.dot_theta_01); + ck_assert_msg( - last_msg.msg.reference_frame_param.stub[114] == 18, - "incorrect value for last_msg.msg.reference_frame_param.stub[114], " + last_msg.msg.reference_frame_param.dot_theta_02 == 18, + "incorrect value for last_msg.msg.reference_frame_param.dot_theta_02, " "expected 18, is %d", - last_msg.msg.reference_frame_param.stub[114]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[115] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[115], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[115]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[116] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[116], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[116]); - ck_assert_msg( - last_msg.msg.reference_frame_param.stub[117] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[117], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[117]); + last_msg.msg.reference_frame_param.dot_theta_02); + ck_assert_msg( - last_msg.msg.reference_frame_param.stub[118] == 19, - "incorrect value for last_msg.msg.reference_frame_param.stub[118], " + last_msg.msg.reference_frame_param.dot_theta_03 == 19, + "incorrect value for last_msg.msg.reference_frame_param.dot_theta_03, " "expected 19, is %d", - last_msg.msg.reference_frame_param.stub[118]); + last_msg.msg.reference_frame_param.dot_theta_03); + + ck_assert_msg(last_msg.msg.reference_frame_param.re_t0 == 6, + "incorrect value for " + "last_msg.msg.reference_frame_param.re_t0, expected 6, is %d", + last_msg.msg.reference_frame_param.re_t0); + ck_assert_msg( - last_msg.msg.reference_frame_param.stub[119] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[119], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[119]); + last_msg.msg.reference_frame_param.scale == 13, + "incorrect value for last_msg.msg.reference_frame_param.scale, " + "expected 13, is %d", + last_msg.msg.reference_frame_param.scale); + + ck_assert_msg(last_msg.msg.reference_frame_param.sin == 4, + "incorrect value for last_msg.msg.reference_frame_param.sin, " + "expected 4, is %d", + last_msg.msg.reference_frame_param.sin); + + { + const char check_string[] = { + (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0}; + ck_assert_msg( + memcmp(&last_msg.msg.reference_frame_param.sn, check_string, + sizeof(check_string)) == 0, + "incorrect value for last_msg.msg.reference_frame_param.sn, expected " + "string '%s', is '%s'", + check_string, last_msg.msg.reference_frame_param.sn); + } + ck_assert_msg( - last_msg.msg.reference_frame_param.stub[120] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[120], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[120]); + last_msg.msg.reference_frame_param.ssr_iod == 1, + "incorrect value for last_msg.msg.reference_frame_param.ssr_iod, " + "expected 1, is %d", + last_msg.msg.reference_frame_param.ssr_iod); + ck_assert_msg( - last_msg.msg.reference_frame_param.stub[121] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[121], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[121]); + last_msg.msg.reference_frame_param.theta_01 == 10, + "incorrect value for last_msg.msg.reference_frame_param.theta_01, " + "expected 10, is %d", + last_msg.msg.reference_frame_param.theta_01); + ck_assert_msg( - last_msg.msg.reference_frame_param.stub[122] == 20, - "incorrect value for last_msg.msg.reference_frame_param.stub[122], " - "expected 20, is %d", - last_msg.msg.reference_frame_param.stub[122]); + last_msg.msg.reference_frame_param.theta_02 == 11, + "incorrect value for last_msg.msg.reference_frame_param.theta_02, " + "expected 11, is %d", + last_msg.msg.reference_frame_param.theta_02); + ck_assert_msg( - last_msg.msg.reference_frame_param.stub[123] == 0, - "incorrect value for last_msg.msg.reference_frame_param.stub[123], " - "expected 0, is %d", - last_msg.msg.reference_frame_param.stub[123]); + last_msg.msg.reference_frame_param.theta_03 == 12, + "incorrect value for last_msg.msg.reference_frame_param.theta_03, " + "expected 12, is %d", + last_msg.msg.reference_frame_param.theta_03); + + { + const char check_string[] = { + (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0}; + ck_assert_msg( + memcmp(&last_msg.msg.reference_frame_param.tn, check_string, + sizeof(check_string)) == 0, + "incorrect value for last_msg.msg.reference_frame_param.tn, expected " + "string '%s', is '%s'", + check_string, last_msg.msg.reference_frame_param.tn); + } + + ck_assert_msg(last_msg.msg.reference_frame_param.utn == 5, + "incorrect value for last_msg.msg.reference_frame_param.utn, " + "expected 5, is %d", + last_msg.msg.reference_frame_param.utn); } } END_TEST diff --git a/c/test/auto_check_sbp_navigation_MsgUTCLeapSecond.c b/c/test/auto_check_sbp_navigation_MsgUTCLeapSecond.c index 8142a2900b..843523a886 100644 --- a/c/test/auto_check_sbp_navigation_MsgUTCLeapSecond.c +++ b/c/test/auto_check_sbp_navigation_MsgUTCLeapSecond.c @@ -102,35 +102,23 @@ START_TEST(test_auto_check_sbp_navigation_MsgUTCLeapSecond) { sbp_msg_t test_msg; memset(&test_msg, 0, sizeof(test_msg)); - test_msg.utc_leap_second.n_stub = 14; + test_msg.utc_leap_second.bias_coeff = 1; - test_msg.utc_leap_second.stub[0] = 1; + test_msg.utc_leap_second.count_after = 9; - test_msg.utc_leap_second.stub[1] = 0; + test_msg.utc_leap_second.count_before = 4; - test_msg.utc_leap_second.stub[2] = 2; + test_msg.utc_leap_second.drift_coeff = 2; - test_msg.utc_leap_second.stub[3] = 0; + test_msg.utc_leap_second.drift_rate_coeff = 3; - test_msg.utc_leap_second.stub[4] = 3; + test_msg.utc_leap_second.ref_dn = 8; - test_msg.utc_leap_second.stub[5] = 4; + test_msg.utc_leap_second.ref_wn = 7; - test_msg.utc_leap_second.stub[6] = 5; + test_msg.utc_leap_second.tow_s = 5; - test_msg.utc_leap_second.stub[7] = 0; - - test_msg.utc_leap_second.stub[8] = 6; - - test_msg.utc_leap_second.stub[9] = 0; - - test_msg.utc_leap_second.stub[10] = 7; - - test_msg.utc_leap_second.stub[11] = 0; - - test_msg.utc_leap_second.stub[12] = 8; - - test_msg.utc_leap_second.stub[13] = 9; + test_msg.utc_leap_second.wn = 6; sbp_message_send(&sbp_state, SbpMsgUtcLeapSecond, 66, &test_msg, &dummy_write); @@ -156,67 +144,52 @@ START_TEST(test_auto_check_sbp_navigation_MsgUTCLeapSecond) { sbp_message_cmp(SbpMsgUtcLeapSecond, &last_msg.msg, &test_msg) == 0, "Sent and received messages did not compare equal"); - ck_assert_msg(last_msg.msg.utc_leap_second.n_stub == 14, - "incorrect value for last_msg.msg.utc_leap_second.n_stub, " - "expected 14, is %d", - last_msg.msg.utc_leap_second.n_stub); - - ck_assert_msg(last_msg.msg.utc_leap_second.stub[0] == 1, - "incorrect value for last_msg.msg.utc_leap_second.stub[0], " - "expected 1, is %d", - last_msg.msg.utc_leap_second.stub[0]); - ck_assert_msg(last_msg.msg.utc_leap_second.stub[1] == 0, - "incorrect value for last_msg.msg.utc_leap_second.stub[1], " - "expected 0, is %d", - last_msg.msg.utc_leap_second.stub[1]); - ck_assert_msg(last_msg.msg.utc_leap_second.stub[2] == 2, - "incorrect value for last_msg.msg.utc_leap_second.stub[2], " - "expected 2, is %d", - last_msg.msg.utc_leap_second.stub[2]); - ck_assert_msg(last_msg.msg.utc_leap_second.stub[3] == 0, - "incorrect value for last_msg.msg.utc_leap_second.stub[3], " - "expected 0, is %d", - last_msg.msg.utc_leap_second.stub[3]); - ck_assert_msg(last_msg.msg.utc_leap_second.stub[4] == 3, - "incorrect value for last_msg.msg.utc_leap_second.stub[4], " - "expected 3, is %d", - last_msg.msg.utc_leap_second.stub[4]); - ck_assert_msg(last_msg.msg.utc_leap_second.stub[5] == 4, - "incorrect value for last_msg.msg.utc_leap_second.stub[5], " - "expected 4, is %d", - last_msg.msg.utc_leap_second.stub[5]); - ck_assert_msg(last_msg.msg.utc_leap_second.stub[6] == 5, - "incorrect value for last_msg.msg.utc_leap_second.stub[6], " + ck_assert_msg(last_msg.msg.utc_leap_second.bias_coeff == 1, + "incorrect value for " + "last_msg.msg.utc_leap_second.bias_coeff, expected 1, is %d", + last_msg.msg.utc_leap_second.bias_coeff); + + ck_assert_msg(last_msg.msg.utc_leap_second.count_after == 9, + "incorrect value for " + "last_msg.msg.utc_leap_second.count_after, expected 9, is %d", + last_msg.msg.utc_leap_second.count_after); + + ck_assert_msg( + last_msg.msg.utc_leap_second.count_before == 4, + "incorrect value for last_msg.msg.utc_leap_second.count_before, " + "expected 4, is %d", + last_msg.msg.utc_leap_second.count_before); + + ck_assert_msg(last_msg.msg.utc_leap_second.drift_coeff == 2, + "incorrect value for " + "last_msg.msg.utc_leap_second.drift_coeff, expected 2, is %d", + last_msg.msg.utc_leap_second.drift_coeff); + + ck_assert_msg( + last_msg.msg.utc_leap_second.drift_rate_coeff == 3, + "incorrect value for last_msg.msg.utc_leap_second.drift_rate_coeff, " + "expected 3, is %d", + last_msg.msg.utc_leap_second.drift_rate_coeff); + + ck_assert_msg(last_msg.msg.utc_leap_second.ref_dn == 8, + "incorrect value for last_msg.msg.utc_leap_second.ref_dn, " + "expected 8, is %d", + last_msg.msg.utc_leap_second.ref_dn); + + ck_assert_msg(last_msg.msg.utc_leap_second.ref_wn == 7, + "incorrect value for last_msg.msg.utc_leap_second.ref_wn, " + "expected 7, is %d", + last_msg.msg.utc_leap_second.ref_wn); + + ck_assert_msg(last_msg.msg.utc_leap_second.tow_s == 5, + "incorrect value for last_msg.msg.utc_leap_second.tow_s, " "expected 5, is %d", - last_msg.msg.utc_leap_second.stub[6]); - ck_assert_msg(last_msg.msg.utc_leap_second.stub[7] == 0, - "incorrect value for last_msg.msg.utc_leap_second.stub[7], " - "expected 0, is %d", - last_msg.msg.utc_leap_second.stub[7]); - ck_assert_msg(last_msg.msg.utc_leap_second.stub[8] == 6, - "incorrect value for last_msg.msg.utc_leap_second.stub[8], " + last_msg.msg.utc_leap_second.tow_s); + + ck_assert_msg(last_msg.msg.utc_leap_second.wn == 6, + "incorrect value for last_msg.msg.utc_leap_second.wn, " "expected 6, is %d", - last_msg.msg.utc_leap_second.stub[8]); - ck_assert_msg(last_msg.msg.utc_leap_second.stub[9] == 0, - "incorrect value for last_msg.msg.utc_leap_second.stub[9], " - "expected 0, is %d", - last_msg.msg.utc_leap_second.stub[9]); - ck_assert_msg(last_msg.msg.utc_leap_second.stub[10] == 7, - "incorrect value for last_msg.msg.utc_leap_second.stub[10], " - "expected 7, is %d", - last_msg.msg.utc_leap_second.stub[10]); - ck_assert_msg(last_msg.msg.utc_leap_second.stub[11] == 0, - "incorrect value for last_msg.msg.utc_leap_second.stub[11], " - "expected 0, is %d", - last_msg.msg.utc_leap_second.stub[11]); - ck_assert_msg(last_msg.msg.utc_leap_second.stub[12] == 8, - "incorrect value for last_msg.msg.utc_leap_second.stub[12], " - "expected 8, is %d", - last_msg.msg.utc_leap_second.stub[12]); - ck_assert_msg(last_msg.msg.utc_leap_second.stub[13] == 9, - "incorrect value for last_msg.msg.utc_leap_second.stub[13], " - "expected 9, is %d", - last_msg.msg.utc_leap_second.stub[13]); + last_msg.msg.utc_leap_second.wn); } } END_TEST diff --git a/c/test/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds.c b/c/test/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds.c index a358a9cf02..0969be633c 100644 --- a/c/test/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds.c +++ b/c/test/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds.c @@ -104,69 +104,71 @@ START_TEST(test_auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds) { sbp_msg_t test_msg; memset(&test_msg, 0, sizeof(test_msg)); - test_msg.ssr_code_phase_biases_bounds.n_stub = 31; + test_msg.ssr_code_phase_biases_bounds.const_id = 1; - test_msg.ssr_code_phase_biases_bounds.stub[0] = 180; + test_msg.ssr_code_phase_biases_bounds.header.num_msgs = 1; - test_msg.ssr_code_phase_biases_bounds.stub[1] = 0; + test_msg.ssr_code_phase_biases_bounds.header.seq_num = 2; - test_msg.ssr_code_phase_biases_bounds.stub[2] = 0; + test_msg.ssr_code_phase_biases_bounds.header.sol_id = 14; - test_msg.ssr_code_phase_biases_bounds.stub[3] = 0; + test_msg.ssr_code_phase_biases_bounds.header.time.tow = 180; - test_msg.ssr_code_phase_biases_bounds.stub[4] = 3; + test_msg.ssr_code_phase_biases_bounds.header.time.wn = 3; - test_msg.ssr_code_phase_biases_bounds.stub[5] = 0; + test_msg.ssr_code_phase_biases_bounds.header.update_interval = 1; - test_msg.ssr_code_phase_biases_bounds.stub[6] = 1; + test_msg.ssr_code_phase_biases_bounds.n_sats_signals = 3; - test_msg.ssr_code_phase_biases_bounds.stub[7] = 2; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[0] + .code_bias_bound_mu = 39; - test_msg.ssr_code_phase_biases_bounds.stub[8] = 1; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[0] + .code_bias_bound_sig = 1; - test_msg.ssr_code_phase_biases_bounds.stub[9] = 14; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[0] + .phase_bias_bound_mu = 39; - test_msg.ssr_code_phase_biases_bounds.stub[10] = 15; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[0] + .phase_bias_bound_sig = 1; - test_msg.ssr_code_phase_biases_bounds.stub[11] = 1; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[0].sat_id = 0; - test_msg.ssr_code_phase_biases_bounds.stub[12] = 3; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[0].signal_id = 3; - test_msg.ssr_code_phase_biases_bounds.stub[13] = 0; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[1] + .code_bias_bound_mu = 39; - test_msg.ssr_code_phase_biases_bounds.stub[14] = 3; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[1] + .code_bias_bound_sig = 1; - test_msg.ssr_code_phase_biases_bounds.stub[15] = 39; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[1] + .phase_bias_bound_mu = 39; - test_msg.ssr_code_phase_biases_bounds.stub[16] = 1; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[1] + .phase_bias_bound_sig = 1; - test_msg.ssr_code_phase_biases_bounds.stub[17] = 39; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[1].sat_id = 1; - test_msg.ssr_code_phase_biases_bounds.stub[18] = 1; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[1].signal_id = 3; - test_msg.ssr_code_phase_biases_bounds.stub[19] = 1; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[2] + .code_bias_bound_mu = 39; - test_msg.ssr_code_phase_biases_bounds.stub[20] = 3; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[2] + .code_bias_bound_sig = 1; - test_msg.ssr_code_phase_biases_bounds.stub[21] = 39; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[2] + .phase_bias_bound_mu = 39; - test_msg.ssr_code_phase_biases_bounds.stub[22] = 1; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[2] + .phase_bias_bound_sig = 1; - test_msg.ssr_code_phase_biases_bounds.stub[23] = 39; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[2].sat_id = 1; - test_msg.ssr_code_phase_biases_bounds.stub[24] = 1; + test_msg.ssr_code_phase_biases_bounds.satellites_signals[2].signal_id = 1; - test_msg.ssr_code_phase_biases_bounds.stub[25] = 1; - - test_msg.ssr_code_phase_biases_bounds.stub[26] = 1; - - test_msg.ssr_code_phase_biases_bounds.stub[27] = 39; - - test_msg.ssr_code_phase_biases_bounds.stub[28] = 1; - - test_msg.ssr_code_phase_biases_bounds.stub[29] = 39; - - test_msg.ssr_code_phase_biases_bounds.stub[30] = 1; + test_msg.ssr_code_phase_biases_bounds.ssr_iod = 15; sbp_message_send(&sbp_state, SbpMsgSsrCodePhaseBiasesBounds, 66, &test_msg, &dummy_write); @@ -193,166 +195,220 @@ START_TEST(test_auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds) { "Sent and received messages did not compare equal"); ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.n_stub == 31, - "incorrect value for last_msg.msg.ssr_code_phase_biases_bounds.n_stub, " - "expected 31, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.n_stub); - - ck_assert_msg(last_msg.msg.ssr_code_phase_biases_bounds.stub[0] == 180, - "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[0], expected " - "180, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[0]); - ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[1] == 0, + last_msg.msg.ssr_code_phase_biases_bounds.const_id == 1, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[1], expected 0, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[1]); + "last_msg.msg.ssr_code_phase_biases_bounds.const_id, expected 1, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.const_id); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[2] == 0, + last_msg.msg.ssr_code_phase_biases_bounds.header.num_msgs == 1, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[2], expected 0, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[2]); + "last_msg.msg.ssr_code_phase_biases_bounds.header.num_msgs, expected " + "1, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.header.num_msgs); + + ck_assert_msg(last_msg.msg.ssr_code_phase_biases_bounds.header.seq_num == 2, + "incorrect value for " + "last_msg.msg.ssr_code_phase_biases_bounds.header.seq_num, " + "expected 2, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.header.seq_num); + + ck_assert_msg(last_msg.msg.ssr_code_phase_biases_bounds.header.sol_id == 14, + "incorrect value for " + "last_msg.msg.ssr_code_phase_biases_bounds.header.sol_id, " + "expected 14, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.header.sol_id); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[3] == 0, + last_msg.msg.ssr_code_phase_biases_bounds.header.time.tow == 180, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[3], expected 0, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[3]); + "last_msg.msg.ssr_code_phase_biases_bounds.header.time.tow, expected " + "180, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.header.time.tow); + + ck_assert_msg(last_msg.msg.ssr_code_phase_biases_bounds.header.time.wn == 3, + "incorrect value for " + "last_msg.msg.ssr_code_phase_biases_bounds.header.time.wn, " + "expected 3, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.header.time.wn); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[4] == 3, + last_msg.msg.ssr_code_phase_biases_bounds.header.update_interval == 1, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[4], expected 3, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[4]); + "last_msg.msg.ssr_code_phase_biases_bounds.header.update_interval, " + "expected 1, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.header.update_interval); + + ck_assert_msg(last_msg.msg.ssr_code_phase_biases_bounds.n_sats_signals == 3, + "incorrect value for " + "last_msg.msg.ssr_code_phase_biases_bounds.n_sats_signals, " + "expected 3, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.n_sats_signals); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[5] == 0, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0] + .code_bias_bound_mu == 39, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[5], expected 0, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[5]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0].code_" + "bias_bound_mu, expected 39, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0] + .code_bias_bound_mu); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[6] == 1, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0] + .code_bias_bound_sig == 1, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[6], expected 1, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[6]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0].code_" + "bias_bound_sig, expected 1, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0] + .code_bias_bound_sig); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[7] == 2, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0] + .phase_bias_bound_mu == 39, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[7], expected 2, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[7]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0].phase_" + "bias_bound_mu, expected 39, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0] + .phase_bias_bound_mu); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[8] == 1, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0] + .phase_bias_bound_sig == 1, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[8], expected 1, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[8]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0].phase_" + "bias_bound_sig, expected 1, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0] + .phase_bias_bound_sig); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[9] == 14, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0] + .sat_id == 0, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[9], expected 14, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[9]); - ck_assert_msg(last_msg.msg.ssr_code_phase_biases_bounds.stub[10] == 15, - "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[10], " - "expected 15, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[10]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0].sat_" + "id, expected 0, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0].sat_id); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[11] == 1, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0] + .signal_id == 3, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[11], expected 1, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[11]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0]." + "signal_id, expected 3, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[0] + .signal_id); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[12] == 3, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1] + .code_bias_bound_mu == 39, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[12], expected 3, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[12]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1].code_" + "bias_bound_mu, expected 39, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1] + .code_bias_bound_mu); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[13] == 0, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1] + .code_bias_bound_sig == 1, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[13], expected 0, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[13]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1].code_" + "bias_bound_sig, expected 1, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1] + .code_bias_bound_sig); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[14] == 3, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1] + .phase_bias_bound_mu == 39, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[14], expected 3, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[14]); - ck_assert_msg(last_msg.msg.ssr_code_phase_biases_bounds.stub[15] == 39, - "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[15], " - "expected 39, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[15]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1].phase_" + "bias_bound_mu, expected 39, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1] + .phase_bias_bound_mu); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[16] == 1, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1] + .phase_bias_bound_sig == 1, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[16], expected 1, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[16]); - ck_assert_msg(last_msg.msg.ssr_code_phase_biases_bounds.stub[17] == 39, - "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[17], " - "expected 39, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[17]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1].phase_" + "bias_bound_sig, expected 1, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1] + .phase_bias_bound_sig); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[18] == 1, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1] + .sat_id == 1, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[18], expected 1, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[18]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1].sat_" + "id, expected 1, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1].sat_id); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[19] == 1, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1] + .signal_id == 3, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[19], expected 1, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[19]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1]." + "signal_id, expected 3, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[1] + .signal_id); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[20] == 3, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2] + .code_bias_bound_mu == 39, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[20], expected 3, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[20]); - ck_assert_msg(last_msg.msg.ssr_code_phase_biases_bounds.stub[21] == 39, - "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[21], " - "expected 39, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[21]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2].code_" + "bias_bound_mu, expected 39, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2] + .code_bias_bound_mu); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[22] == 1, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2] + .code_bias_bound_sig == 1, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[22], expected 1, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[22]); - ck_assert_msg(last_msg.msg.ssr_code_phase_biases_bounds.stub[23] == 39, - "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[23], " - "expected 39, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[23]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2].code_" + "bias_bound_sig, expected 1, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2] + .code_bias_bound_sig); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[24] == 1, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2] + .phase_bias_bound_mu == 39, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[24], expected 1, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[24]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2].phase_" + "bias_bound_mu, expected 39, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2] + .phase_bias_bound_mu); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[25] == 1, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2] + .phase_bias_bound_sig == 1, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[25], expected 1, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[25]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2].phase_" + "bias_bound_sig, expected 1, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2] + .phase_bias_bound_sig); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[26] == 1, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2] + .sat_id == 1, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[26], expected 1, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[26]); - ck_assert_msg(last_msg.msg.ssr_code_phase_biases_bounds.stub[27] == 39, - "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[27], " - "expected 39, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[27]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2].sat_" + "id, expected 1, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2].sat_id); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[28] == 1, + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2] + .signal_id == 1, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[28], expected 1, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[28]); - ck_assert_msg(last_msg.msg.ssr_code_phase_biases_bounds.stub[29] == 39, - "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[29], " - "expected 39, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[29]); + "last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2]." + "signal_id, expected 1, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.satellites_signals[2] + .signal_id); + ck_assert_msg( - last_msg.msg.ssr_code_phase_biases_bounds.stub[30] == 1, + last_msg.msg.ssr_code_phase_biases_bounds.ssr_iod == 15, "incorrect value for " - "last_msg.msg.ssr_code_phase_biases_bounds.stub[30], expected 1, is %d", - last_msg.msg.ssr_code_phase_biases_bounds.stub[30]); + "last_msg.msg.ssr_code_phase_biases_bounds.ssr_iod, expected 15, is %d", + last_msg.msg.ssr_code_phase_biases_bounds.ssr_iod); } } END_TEST diff --git a/c/test/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.c b/c/test/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.c index 9138c6473f..9121a53e25 100644 --- a/c/test/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.c +++ b/c/test/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.c @@ -94,10 +94,10 @@ START_TEST(test_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds) { &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, + 85, 254, 5, 66, 0, 45, 180, 0, 0, 0, 3, 0, 1, 1, + 10, 0, 15, 1, 0, 10, 0, 39, 232, 3, 244, 1, 100, 200, + 150, 100, 150, 100, 2, 5, 10, 16, 0, 17, 18, 19, 20, 21, + 6, 10, 22, 0, 23, 24, 25, 26, 27, 119, 82, }; dummy_reset(); @@ -105,93 +105,87 @@ START_TEST(test_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds) { sbp_msg_t test_msg; memset(&test_msg, 0, sizeof(test_msg)); - test_msg.ssr_gridded_correction_bounds.n_stub = 43; + test_msg.ssr_gridded_correction_bounds.grid_point_id = 1000; - test_msg.ssr_gridded_correction_bounds.stub[0] = 180; + test_msg.ssr_gridded_correction_bounds.header.num_msgs = 1; - test_msg.ssr_gridded_correction_bounds.stub[1] = 0; + test_msg.ssr_gridded_correction_bounds.header.seq_num = 1; - test_msg.ssr_gridded_correction_bounds.stub[2] = 0; + test_msg.ssr_gridded_correction_bounds.header.sol_id = 0; - test_msg.ssr_gridded_correction_bounds.stub[3] = 0; + test_msg.ssr_gridded_correction_bounds.header.time.tow = 180; - test_msg.ssr_gridded_correction_bounds.stub[4] = 3; + test_msg.ssr_gridded_correction_bounds.header.time.wn = 3; - test_msg.ssr_gridded_correction_bounds.stub[5] = 0; + test_msg.ssr_gridded_correction_bounds.header.update_interval = 10; - test_msg.ssr_gridded_correction_bounds.stub[6] = 1; + test_msg.ssr_gridded_correction_bounds.n_sats = 2; - test_msg.ssr_gridded_correction_bounds.stub[7] = 1; + test_msg.ssr_gridded_correction_bounds.ssr_iod_atmo = 15; - test_msg.ssr_gridded_correction_bounds.stub[8] = 10; + test_msg.ssr_gridded_correction_bounds.stec_sat_list[0].stec_bound_mu = 18; - test_msg.ssr_gridded_correction_bounds.stub[9] = 0; + test_msg.ssr_gridded_correction_bounds.stec_sat_list[0].stec_bound_mu_dot = + 20; - test_msg.ssr_gridded_correction_bounds.stub[10] = 15; + test_msg.ssr_gridded_correction_bounds.stec_sat_list[0].stec_bound_sig = 19; - test_msg.ssr_gridded_correction_bounds.stub[11] = 1; + test_msg.ssr_gridded_correction_bounds.stec_sat_list[0].stec_bound_sig_dot = + 21; - test_msg.ssr_gridded_correction_bounds.stub[12] = 0; + test_msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_residual.residual = 16; - test_msg.ssr_gridded_correction_bounds.stub[13] = 10; + test_msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_residual.stddev = 17; - test_msg.ssr_gridded_correction_bounds.stub[14] = 0; + test_msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_residual.sv_id.constellation = 10; - test_msg.ssr_gridded_correction_bounds.stub[15] = 39; + test_msg.ssr_gridded_correction_bounds.stec_sat_list[0] + .stec_residual.sv_id.satId = 5; - test_msg.ssr_gridded_correction_bounds.stub[16] = 232; + test_msg.ssr_gridded_correction_bounds.stec_sat_list[1].stec_bound_mu = 24; - test_msg.ssr_gridded_correction_bounds.stub[17] = 3; + test_msg.ssr_gridded_correction_bounds.stec_sat_list[1].stec_bound_mu_dot = + 26; - test_msg.ssr_gridded_correction_bounds.stub[18] = 244; + test_msg.ssr_gridded_correction_bounds.stec_sat_list[1].stec_bound_sig = 25; - test_msg.ssr_gridded_correction_bounds.stub[19] = 1; + test_msg.ssr_gridded_correction_bounds.stec_sat_list[1].stec_bound_sig_dot = + 27; - test_msg.ssr_gridded_correction_bounds.stub[20] = 100; + test_msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_residual.residual = 22; - test_msg.ssr_gridded_correction_bounds.stub[21] = 200; + test_msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_residual.stddev = 23; - test_msg.ssr_gridded_correction_bounds.stub[22] = 150; + test_msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_residual.sv_id.constellation = 10; - test_msg.ssr_gridded_correction_bounds.stub[23] = 100; + test_msg.ssr_gridded_correction_bounds.stec_sat_list[1] + .stec_residual.sv_id.satId = 6; - test_msg.ssr_gridded_correction_bounds.stub[24] = 2; + test_msg.ssr_gridded_correction_bounds.tile_id = 10; - test_msg.ssr_gridded_correction_bounds.stub[25] = 5; + test_msg.ssr_gridded_correction_bounds.tile_set_id = 1; - test_msg.ssr_gridded_correction_bounds.stub[26] = 10; + test_msg.ssr_gridded_correction_bounds.tropo_delay_correction.hydro = 500; - test_msg.ssr_gridded_correction_bounds.stub[27] = 16; + test_msg.ssr_gridded_correction_bounds.tropo_delay_correction.stddev = 200; - test_msg.ssr_gridded_correction_bounds.stub[28] = 0; + test_msg.ssr_gridded_correction_bounds.tropo_delay_correction.wet = 100; - test_msg.ssr_gridded_correction_bounds.stub[29] = 17; + test_msg.ssr_gridded_correction_bounds.tropo_qi = 39; - test_msg.ssr_gridded_correction_bounds.stub[30] = 18; + test_msg.ssr_gridded_correction_bounds.tropo_v_hydro_bound_mu = 150; - test_msg.ssr_gridded_correction_bounds.stub[31] = 19; + test_msg.ssr_gridded_correction_bounds.tropo_v_hydro_bound_sig = 100; - test_msg.ssr_gridded_correction_bounds.stub[32] = 20; + test_msg.ssr_gridded_correction_bounds.tropo_v_wet_bound_mu = 150; - test_msg.ssr_gridded_correction_bounds.stub[33] = 21; - - test_msg.ssr_gridded_correction_bounds.stub[34] = 6; - - test_msg.ssr_gridded_correction_bounds.stub[35] = 10; - - test_msg.ssr_gridded_correction_bounds.stub[36] = 22; - - test_msg.ssr_gridded_correction_bounds.stub[37] = 0; - - test_msg.ssr_gridded_correction_bounds.stub[38] = 23; - - test_msg.ssr_gridded_correction_bounds.stub[39] = 24; - - test_msg.ssr_gridded_correction_bounds.stub[40] = 25; - - test_msg.ssr_gridded_correction_bounds.stub[41] = 26; - - test_msg.ssr_gridded_correction_bounds.stub[42] = 27; + test_msg.ssr_gridded_correction_bounds.tropo_v_wet_bound_sig = 100; sbp_message_send(&sbp_state, SbpMsgSsrGriddedCorrectionBounds, 66, &test_msg, &dummy_write); @@ -218,226 +212,264 @@ START_TEST(test_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds) { "Sent and received messages did not compare equal"); ck_assert_msg( - last_msg.msg.ssr_gridded_correction_bounds.n_stub == 43, + last_msg.msg.ssr_gridded_correction_bounds.grid_point_id == 1000, "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.n_stub, expected 43, is %d", - last_msg.msg.ssr_gridded_correction_bounds.n_stub); + "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.stub[0] == 180, - "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[0], " - "expected 180, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[0]); ck_assert_msg( - last_msg.msg.ssr_gridded_correction_bounds.stub[1] == 0, + last_msg.msg.ssr_gridded_correction_bounds.header.num_msgs == 1, "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[1], expected 0, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[1]); - ck_assert_msg( - last_msg.msg.ssr_gridded_correction_bounds.stub[2] == 0, - "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[2], expected 0, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[2]); - ck_assert_msg( - last_msg.msg.ssr_gridded_correction_bounds.stub[3] == 0, - "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[3], expected 0, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[3]); + "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.stub[4] == 3, + last_msg.msg.ssr_gridded_correction_bounds.header.seq_num == 1, "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[4], expected 3, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[4]); + "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.stub[5] == 0, + last_msg.msg.ssr_gridded_correction_bounds.header.time.tow == 180, "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[5], expected 0, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[5]); + "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.stub[6] == 1, + last_msg.msg.ssr_gridded_correction_bounds.header.time.wn == 3, "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[6], expected 1, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[6]); + "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.stub[7] == 1, + last_msg.msg.ssr_gridded_correction_bounds.header.update_interval == 10, "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[7], expected 1, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[7]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[8] == 10, - "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[8], " - "expected 10, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[8]); + "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.stub[9] == 0, + last_msg.msg.ssr_gridded_correction_bounds.n_sats == 2, "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[9], expected 0, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[9]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[10] == 15, + "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.stub[10], " + "last_msg.msg.ssr_gridded_correction_bounds.ssr_iod_atmo, " "expected 15, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[10]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[11] == 1, - "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[11], " - "expected 1, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[11]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[12] == 0, - "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[12], " - "expected 0, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[12]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[13] == 10, - "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[13], " - "expected 10, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[13]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[14] == 0, - "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[14], " - "expected 0, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[14]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[15] == 39, - "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[15], " - "expected 39, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[15]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[16] == 232, - "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[16], " - "expected 232, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[16]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[17] == 3, - "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[17], " - "expected 3, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[17]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[18] == 244, - "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[18], " - "expected 244, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[18]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[19] == 1, + 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.stub[19], " - "expected 1, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[19]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[20] == 100, + "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.stub[20], " - "expected 100, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[20]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[21] == 200, + "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.stub[21], " - "expected 200, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[21]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[22] == 150, + "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.stub[22], " - "expected 150, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[22]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[23] == 100, + "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.stub[23], " - "expected 100, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[23]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[24] == 2, + "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.stub[24], " - "expected 2, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[24]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[25] == 5, + "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.stub[25], " - "expected 5, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[25]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[26] == 10, + "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.stub[26], " - "expected 10, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[26]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[27] == 16, + "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.stub[27], " - "expected 16, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[27]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[28] == 0, + "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.stub[28], " - "expected 0, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[28]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[29] == 17, + "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.stub[29], " - "expected 17, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[29]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[30] == 18, + "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.stub[30], " - "expected 18, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[30]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[31] == 19, + "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.stub[31], " - "expected 19, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[31]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[32] == 20, + "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.stub[32], " - "expected 20, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[32]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[33] == 21, + "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.stub[33], " - "expected 21, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[33]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[34] == 6, + "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.stub[34], " - "expected 6, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[34]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[35] == 10, + "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.stub[35], " + "last_msg.msg.ssr_gridded_correction_bounds.tile_id, " "expected 10, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[35]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[36] == 22, - "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[36], " - "expected 22, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[36]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[37] == 0, - "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[37], " - "expected 0, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[37]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[38] == 23, - "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[38], " - "expected 23, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[38]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[39] == 24, + 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.stub[39], " - "expected 24, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[39]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[40] == 25, + "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_delay_correction.hydro == 500, "incorrect value for " - "last_msg.msg.ssr_gridded_correction_bounds.stub[40], " - "expected 25, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[40]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[41] == 26, + "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.stub[41], " - "expected 26, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[41]); - ck_assert_msg(last_msg.msg.ssr_gridded_correction_bounds.stub[42] == 27, + "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.stub[42], " - "expected 27, is %d", - last_msg.msg.ssr_gridded_correction_bounds.stub[42]); + "last_msg.msg.ssr_gridded_correction_bounds.tropo_qi, " + "expected 39, is %d", + last_msg.msg.ssr_gridded_correction_bounds.tropo_qi); + + ck_assert_msg( + last_msg.msg.ssr_gridded_correction_bounds.tropo_v_hydro_bound_mu == + 150, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.tropo_v_hydro_bound_mu, " + "expected 150, is %d", + last_msg.msg.ssr_gridded_correction_bounds.tropo_v_hydro_bound_mu); + + ck_assert_msg( + last_msg.msg.ssr_gridded_correction_bounds.tropo_v_hydro_bound_sig == + 100, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.tropo_v_hydro_bound_sig, " + "expected 100, is %d", + last_msg.msg.ssr_gridded_correction_bounds.tropo_v_hydro_bound_sig); + + ck_assert_msg( + last_msg.msg.ssr_gridded_correction_bounds.tropo_v_wet_bound_mu == 150, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.tropo_v_wet_bound_mu, " + "expected 150, is %d", + last_msg.msg.ssr_gridded_correction_bounds.tropo_v_wet_bound_mu); + + ck_assert_msg( + last_msg.msg.ssr_gridded_correction_bounds.tropo_v_wet_bound_sig == 100, + "incorrect value for " + "last_msg.msg.ssr_gridded_correction_bounds.tropo_v_wet_bound_sig, " + "expected 100, is %d", + last_msg.msg.ssr_gridded_correction_bounds.tropo_v_wet_bound_sig); } } END_TEST diff --git a/c/test/auto_check_sbp_ssr_MsgSsrOrbitClockBounds.c b/c/test/auto_check_sbp_ssr_MsgSsrOrbitClockBounds.c index 6e0484c228..49ae024d2a 100644 --- a/c/test/auto_check_sbp_ssr_MsgSsrOrbitClockBounds.c +++ b/c/test/auto_check_sbp_ssr_MsgSsrOrbitClockBounds.c @@ -104,69 +104,71 @@ START_TEST(test_auto_check_sbp_ssr_MsgSsrOrbitClockBounds) { sbp_msg_t test_msg; memset(&test_msg, 0, sizeof(test_msg)); - test_msg.ssr_orbit_clock_bounds.n_stub = 31; + test_msg.ssr_orbit_clock_bounds.const_id = 1; - test_msg.ssr_orbit_clock_bounds.stub[0] = 180; + test_msg.ssr_orbit_clock_bounds.header.num_msgs = 1; - test_msg.ssr_orbit_clock_bounds.stub[1] = 0; + test_msg.ssr_orbit_clock_bounds.header.seq_num = 2; - test_msg.ssr_orbit_clock_bounds.stub[2] = 0; + test_msg.ssr_orbit_clock_bounds.header.sol_id = 48; - test_msg.ssr_orbit_clock_bounds.stub[3] = 0; + test_msg.ssr_orbit_clock_bounds.header.time.tow = 180; - test_msg.ssr_orbit_clock_bounds.stub[4] = 3; + test_msg.ssr_orbit_clock_bounds.header.time.wn = 3; - test_msg.ssr_orbit_clock_bounds.stub[5] = 0; + test_msg.ssr_orbit_clock_bounds.header.update_interval = 3; - test_msg.ssr_orbit_clock_bounds.stub[6] = 1; + test_msg.ssr_orbit_clock_bounds.n_sats = 2; - test_msg.ssr_orbit_clock_bounds.stub[7] = 2; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0].clock_bound_mu = 39; - test_msg.ssr_orbit_clock_bounds.stub[8] = 3; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0].clock_bound_sig = 1; - test_msg.ssr_orbit_clock_bounds.stub[9] = 48; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0].orb_along_bound_mu = + 38; - test_msg.ssr_orbit_clock_bounds.stub[10] = 15; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0].orb_along_bound_sig = + 2; - test_msg.ssr_orbit_clock_bounds.stub[11] = 1; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0].orb_cross_bound_mu = + 37; - test_msg.ssr_orbit_clock_bounds.stub[12] = 2; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0].orb_cross_bound_sig = + 3; - test_msg.ssr_orbit_clock_bounds.stub[13] = 24; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0].orb_radial_bound_mu = + 39; - test_msg.ssr_orbit_clock_bounds.stub[14] = 39; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0].orb_radial_bound_sig = + 1; - test_msg.ssr_orbit_clock_bounds.stub[15] = 38; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0].sat_id = 24; - test_msg.ssr_orbit_clock_bounds.stub[16] = 37; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1].clock_bound_mu = 39; - test_msg.ssr_orbit_clock_bounds.stub[17] = 1; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1].clock_bound_sig = 1; - test_msg.ssr_orbit_clock_bounds.stub[18] = 2; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1].orb_along_bound_mu = + 38; - test_msg.ssr_orbit_clock_bounds.stub[19] = 3; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1].orb_along_bound_sig = + 2; - test_msg.ssr_orbit_clock_bounds.stub[20] = 39; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1].orb_cross_bound_mu = + 37; - test_msg.ssr_orbit_clock_bounds.stub[21] = 1; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1].orb_cross_bound_sig = + 3; - test_msg.ssr_orbit_clock_bounds.stub[22] = 3; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1].orb_radial_bound_mu = + 39; - test_msg.ssr_orbit_clock_bounds.stub[23] = 39; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1].orb_radial_bound_sig = + 1; - test_msg.ssr_orbit_clock_bounds.stub[24] = 38; + test_msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1].sat_id = 3; - test_msg.ssr_orbit_clock_bounds.stub[25] = 37; - - test_msg.ssr_orbit_clock_bounds.stub[26] = 1; - - test_msg.ssr_orbit_clock_bounds.stub[27] = 2; - - test_msg.ssr_orbit_clock_bounds.stub[28] = 3; - - test_msg.ssr_orbit_clock_bounds.stub[29] = 39; - - test_msg.ssr_orbit_clock_bounds.stub[30] = 1; + test_msg.ssr_orbit_clock_bounds.ssr_iod = 15; sbp_message_send(&sbp_state, SbpMsgSsrOrbitClockBounds, 66, &test_msg, &dummy_write); @@ -193,166 +195,201 @@ START_TEST(test_auto_check_sbp_ssr_MsgSsrOrbitClockBounds) { "Sent and received messages did not compare equal"); ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.n_stub == 31, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.n_stub, " - "expected 31, is %d", - last_msg.msg.ssr_orbit_clock_bounds.n_stub); - - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[0] == 180, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[0], " - "expected 180, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[0]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[1] == 0, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[1], " - "expected 0, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[1]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[2] == 0, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[2], " - "expected 0, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[2]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[3] == 0, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[3], " - "expected 0, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[3]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[4] == 3, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[4], " - "expected 3, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[4]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[5] == 0, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[5], " - "expected 0, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[5]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[6] == 1, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[6], " + last_msg.msg.ssr_orbit_clock_bounds.const_id == 1, + "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.const_id, " "expected 1, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[6]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[7] == 2, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[7], " - "expected 2, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[7]); + last_msg.msg.ssr_orbit_clock_bounds.const_id); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.header.num_msgs == 1, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.header.num_msgs, " + "expected 1, is %d", + last_msg.msg.ssr_orbit_clock_bounds.header.num_msgs); + ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[8] == 3, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[8], " - "expected 3, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[8]); + last_msg.msg.ssr_orbit_clock_bounds.header.seq_num == 2, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.header.seq_num, expected 2, is %d", + last_msg.msg.ssr_orbit_clock_bounds.header.seq_num); + ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[9] == 48, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[9], " - "expected 48, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[9]); + last_msg.msg.ssr_orbit_clock_bounds.header.sol_id == 48, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.header.sol_id, expected 48, is %d", + last_msg.msg.ssr_orbit_clock_bounds.header.sol_id); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.header.time.tow == 180, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.header.time.tow, " + "expected 180, is %d", + last_msg.msg.ssr_orbit_clock_bounds.header.time.tow); + ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[10] == 15, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[10], " - "expected 15, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[10]); + last_msg.msg.ssr_orbit_clock_bounds.header.time.wn == 3, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.header.time.wn, expected 3, is %d", + last_msg.msg.ssr_orbit_clock_bounds.header.time.wn); + ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[11] == 1, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[11], " - "expected 1, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[11]); + last_msg.msg.ssr_orbit_clock_bounds.header.update_interval == 3, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.header.update_interval, expected " + "3, is %d", + last_msg.msg.ssr_orbit_clock_bounds.header.update_interval); + ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[12] == 2, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[12], " + last_msg.msg.ssr_orbit_clock_bounds.n_sats == 2, + "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.n_sats, " "expected 2, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[12]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[13] == 24, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[13], " + last_msg.msg.ssr_orbit_clock_bounds.n_sats); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0] + .clock_bound_mu == 39, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0]." + "clock_bound_mu, expected 39, is %d", + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0] + .clock_bound_mu); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0] + .clock_bound_sig == 1, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0]." + "clock_bound_sig, expected 1, is %d", + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0] + .clock_bound_sig); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0] + .orb_along_bound_mu == 38, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0]." + "orb_along_bound_mu, expected 38, is %d", + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0] + .orb_along_bound_mu); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0] + .orb_along_bound_sig == 2, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0]." + "orb_along_bound_sig, expected 2, is %d", + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0] + .orb_along_bound_sig); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0] + .orb_cross_bound_mu == 37, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0]." + "orb_cross_bound_mu, expected 37, is %d", + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0] + .orb_cross_bound_mu); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0] + .orb_cross_bound_sig == 3, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0]." + "orb_cross_bound_sig, expected 3, is %d", + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0] + .orb_cross_bound_sig); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0] + .orb_radial_bound_mu == 39, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0]." + "orb_radial_bound_mu, expected 39, is %d", + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0] + .orb_radial_bound_mu); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0] + .orb_radial_bound_sig == 1, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0]." + "orb_radial_bound_sig, expected 1, is %d", + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0] + .orb_radial_bound_sig); + + ck_assert_msg( + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0].sat_id == 24, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0].sat_id, " "expected 24, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[13]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[14] == 39, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[14], " - "expected 39, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[14]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[15] == 38, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[15], " - "expected 38, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[15]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[16] == 37, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[16], " - "expected 37, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[16]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[17] == 1, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[17], " - "expected 1, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[17]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[18] == 2, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[18], " - "expected 2, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[18]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[19] == 3, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[19], " - "expected 3, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[19]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[20] == 39, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[20], " - "expected 39, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[20]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[21] == 1, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[21], " - "expected 1, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[21]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[22] == 3, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[22], " + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[0].sat_id); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1] + .clock_bound_mu == 39, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1]." + "clock_bound_mu, expected 39, is %d", + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1] + .clock_bound_mu); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1] + .clock_bound_sig == 1, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1]." + "clock_bound_sig, expected 1, is %d", + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1] + .clock_bound_sig); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1] + .orb_along_bound_mu == 38, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1]." + "orb_along_bound_mu, expected 38, is %d", + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1] + .orb_along_bound_mu); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1] + .orb_along_bound_sig == 2, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1]." + "orb_along_bound_sig, expected 2, is %d", + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1] + .orb_along_bound_sig); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1] + .orb_cross_bound_mu == 37, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1]." + "orb_cross_bound_mu, expected 37, is %d", + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1] + .orb_cross_bound_mu); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1] + .orb_cross_bound_sig == 3, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1]." + "orb_cross_bound_sig, expected 3, is %d", + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1] + .orb_cross_bound_sig); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1] + .orb_radial_bound_mu == 39, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1]." + "orb_radial_bound_mu, expected 39, is %d", + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1] + .orb_radial_bound_mu); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1] + .orb_radial_bound_sig == 1, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1]." + "orb_radial_bound_sig, expected 1, is %d", + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1] + .orb_radial_bound_sig); + + ck_assert_msg( + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1].sat_id == 3, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1].sat_id, " "expected 3, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[22]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[23] == 39, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[23], " - "expected 39, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[23]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[24] == 38, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[24], " - "expected 38, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[24]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[25] == 37, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[25], " - "expected 37, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[25]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[26] == 1, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[26], " - "expected 1, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[26]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[27] == 2, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[27], " - "expected 2, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[27]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[28] == 3, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[28], " - "expected 3, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[28]); - ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[29] == 39, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[29], " - "expected 39, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[29]); + last_msg.msg.ssr_orbit_clock_bounds.orbit_clock_bounds[1].sat_id); + ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds.stub[30] == 1, - "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.stub[30], " - "expected 1, is %d", - last_msg.msg.ssr_orbit_clock_bounds.stub[30]); + last_msg.msg.ssr_orbit_clock_bounds.ssr_iod == 15, + "incorrect value for last_msg.msg.ssr_orbit_clock_bounds.ssr_iod, " + "expected 15, is %d", + last_msg.msg.ssr_orbit_clock_bounds.ssr_iod); } } END_TEST diff --git a/c/test/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation.c b/c/test/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation.c index 44fa3140e3..f890bc4c25 100644 --- a/c/test/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation.c +++ b/c/test/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation.c @@ -104,63 +104,47 @@ START_TEST(test_auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation) { sbp_msg_t test_msg; memset(&test_msg, 0, sizeof(test_msg)); - test_msg.ssr_orbit_clock_bounds_degradation.n_stub = 28; + test_msg.ssr_orbit_clock_bounds_degradation.const_id = 1; - test_msg.ssr_orbit_clock_bounds_degradation.stub[0] = 180; + test_msg.ssr_orbit_clock_bounds_degradation.header.num_msgs = 1; - test_msg.ssr_orbit_clock_bounds_degradation.stub[1] = 0; + test_msg.ssr_orbit_clock_bounds_degradation.header.seq_num = 2; - test_msg.ssr_orbit_clock_bounds_degradation.stub[2] = 0; + test_msg.ssr_orbit_clock_bounds_degradation.header.sol_id = 48; - test_msg.ssr_orbit_clock_bounds_degradation.stub[3] = 0; + test_msg.ssr_orbit_clock_bounds_degradation.header.time.tow = 180; - test_msg.ssr_orbit_clock_bounds_degradation.stub[4] = 3; + test_msg.ssr_orbit_clock_bounds_degradation.header.time.wn = 3; - test_msg.ssr_orbit_clock_bounds_degradation.stub[5] = 0; + test_msg.ssr_orbit_clock_bounds_degradation.header.update_interval = 3; - test_msg.ssr_orbit_clock_bounds_degradation.stub[6] = 1; + test_msg.ssr_orbit_clock_bounds_degradation.orbit_clock_bounds_degradation + .clock_bound_mu_dot = 194; - test_msg.ssr_orbit_clock_bounds_degradation.stub[7] = 2; + test_msg.ssr_orbit_clock_bounds_degradation.orbit_clock_bounds_degradation + .clock_bound_sig_dot = 193; - test_msg.ssr_orbit_clock_bounds_degradation.stub[8] = 3; + test_msg.ssr_orbit_clock_bounds_degradation.orbit_clock_bounds_degradation + .orb_along_bound_mu_dot = 199; - test_msg.ssr_orbit_clock_bounds_degradation.stub[9] = 48; + test_msg.ssr_orbit_clock_bounds_degradation.orbit_clock_bounds_degradation + .orb_along_bound_sig_dot = 196; - test_msg.ssr_orbit_clock_bounds_degradation.stub[10] = 15; + test_msg.ssr_orbit_clock_bounds_degradation.orbit_clock_bounds_degradation + .orb_cross_bound_mu_dot = 198; - test_msg.ssr_orbit_clock_bounds_degradation.stub[11] = 1; + test_msg.ssr_orbit_clock_bounds_degradation.orbit_clock_bounds_degradation + .orb_cross_bound_sig_dot = 195; - test_msg.ssr_orbit_clock_bounds_degradation.stub[12] = 10; + test_msg.ssr_orbit_clock_bounds_degradation.orbit_clock_bounds_degradation + .orb_radial_bound_mu_dot = 200; - test_msg.ssr_orbit_clock_bounds_degradation.stub[13] = 0; + test_msg.ssr_orbit_clock_bounds_degradation.orbit_clock_bounds_degradation + .orb_radial_bound_sig_dot = 197; - test_msg.ssr_orbit_clock_bounds_degradation.stub[14] = 0; + test_msg.ssr_orbit_clock_bounds_degradation.sat_bitmask = 10; - test_msg.ssr_orbit_clock_bounds_degradation.stub[15] = 0; - - test_msg.ssr_orbit_clock_bounds_degradation.stub[16] = 0; - - test_msg.ssr_orbit_clock_bounds_degradation.stub[17] = 0; - - test_msg.ssr_orbit_clock_bounds_degradation.stub[18] = 0; - - test_msg.ssr_orbit_clock_bounds_degradation.stub[19] = 0; - - test_msg.ssr_orbit_clock_bounds_degradation.stub[20] = 200; - - test_msg.ssr_orbit_clock_bounds_degradation.stub[21] = 199; - - test_msg.ssr_orbit_clock_bounds_degradation.stub[22] = 198; - - test_msg.ssr_orbit_clock_bounds_degradation.stub[23] = 197; - - test_msg.ssr_orbit_clock_bounds_degradation.stub[24] = 196; - - test_msg.ssr_orbit_clock_bounds_degradation.stub[25] = 195; - - test_msg.ssr_orbit_clock_bounds_degradation.stub[26] = 194; - - test_msg.ssr_orbit_clock_bounds_degradation.stub[27] = 193; + test_msg.ssr_orbit_clock_bounds_degradation.ssr_iod = 15; sbp_message_send(&sbp_state, SbpMsgSsrOrbitClockBoundsDegradation, 66, &test_msg, &dummy_write); @@ -186,163 +170,139 @@ START_TEST(test_auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation) { &last_msg.msg, &test_msg) == 0, "Sent and received messages did not compare equal"); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.n_stub == 28, + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.const_id == 1, "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.n_stub, " - "expected 28, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.n_stub); + "last_msg.msg.ssr_orbit_clock_bounds_degradation.const_id, " + "expected 1, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation.const_id); ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[0] == 180, + last_msg.msg.ssr_orbit_clock_bounds_degradation.header.num_msgs == 1, "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[0], expected " - "180, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[0]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[1] == 0, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[1], " - "expected 0, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[1]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[2] == 0, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[2], " - "expected 0, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[2]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[3] == 0, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[3], " - "expected 0, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[3]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[4] == 3, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[4], " - "expected 3, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[4]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[5] == 0, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[5], " - "expected 0, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[5]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[6] == 1, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[6], " - "expected 1, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[6]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[7] == 2, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[7], " - "expected 2, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[7]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[8] == 3, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[8], " - "expected 3, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[8]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[9] == 48, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[9], " - "expected 48, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[9]); + "last_msg.msg.ssr_orbit_clock_bounds_degradation.header.num_msgs, " + "expected 1, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation.header.num_msgs); + ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[10] == 15, + last_msg.msg.ssr_orbit_clock_bounds_degradation.header.seq_num == 2, "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[10], expected " - "15, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[10]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[11] == 1, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[11], " - "expected 1, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[11]); + "last_msg.msg.ssr_orbit_clock_bounds_degradation.header.seq_num, " + "expected 2, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation.header.seq_num); + ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[12] == 10, + last_msg.msg.ssr_orbit_clock_bounds_degradation.header.sol_id == 48, "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[12], expected " - "10, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[12]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[13] == 0, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[13], " - "expected 0, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[13]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[14] == 0, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[14], " - "expected 0, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[14]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[15] == 0, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[15], " - "expected 0, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[15]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[16] == 0, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[16], " - "expected 0, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[16]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[17] == 0, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[17], " - "expected 0, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[17]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[18] == 0, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[18], " - "expected 0, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[18]); - ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[19] == 0, - "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[19], " - "expected 0, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[19]); + "last_msg.msg.ssr_orbit_clock_bounds_degradation.header.sol_id, " + "expected 48, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation.header.sol_id); + ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[20] == 200, + last_msg.msg.ssr_orbit_clock_bounds_degradation.header.time.tow == 180, "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[20], expected " - "200, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[20]); + "last_msg.msg.ssr_orbit_clock_bounds_degradation.header.time.tow, " + "expected 180, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation.header.time.tow); + ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[21] == 199, + last_msg.msg.ssr_orbit_clock_bounds_degradation.header.time.wn == 3, "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[21], expected " - "199, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[21]); + "last_msg.msg.ssr_orbit_clock_bounds_degradation.header.time.wn, " + "expected 3, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation.header.time.wn); + ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[22] == 198, + last_msg.msg.ssr_orbit_clock_bounds_degradation.header + .update_interval == 3, "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[22], expected " - "198, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[22]); + "last_msg.msg.ssr_orbit_clock_bounds_degradation.header.update_" + "interval, expected 3, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation.header.update_interval); + ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[23] == 197, + last_msg.msg.ssr_orbit_clock_bounds_degradation + .orbit_clock_bounds_degradation.clock_bound_mu_dot == 194, "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[23], expected " - "197, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[23]); + "last_msg.msg.ssr_orbit_clock_bounds_degradation.orbit_clock_bounds_" + "degradation.clock_bound_mu_dot, expected 194, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation + .orbit_clock_bounds_degradation.clock_bound_mu_dot); + ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[24] == 196, + last_msg.msg.ssr_orbit_clock_bounds_degradation + .orbit_clock_bounds_degradation.clock_bound_sig_dot == 193, "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[24], expected " - "196, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[24]); + "last_msg.msg.ssr_orbit_clock_bounds_degradation.orbit_clock_bounds_" + "degradation.clock_bound_sig_dot, expected 193, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation + .orbit_clock_bounds_degradation.clock_bound_sig_dot); + ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[25] == 195, + last_msg.msg.ssr_orbit_clock_bounds_degradation + .orbit_clock_bounds_degradation.orb_along_bound_mu_dot == 199, "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[25], expected " - "195, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[25]); + "last_msg.msg.ssr_orbit_clock_bounds_degradation.orbit_clock_bounds_" + "degradation.orb_along_bound_mu_dot, expected 199, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation + .orbit_clock_bounds_degradation.orb_along_bound_mu_dot); + ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[26] == 194, + last_msg.msg.ssr_orbit_clock_bounds_degradation + .orbit_clock_bounds_degradation.orb_along_bound_sig_dot == 196, "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[26], expected " - "194, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[26]); + "last_msg.msg.ssr_orbit_clock_bounds_degradation.orbit_clock_bounds_" + "degradation.orb_along_bound_sig_dot, expected 196, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation + .orbit_clock_bounds_degradation.orb_along_bound_sig_dot); + ck_assert_msg( - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[27] == 193, + last_msg.msg.ssr_orbit_clock_bounds_degradation + .orbit_clock_bounds_degradation.orb_cross_bound_mu_dot == 198, "incorrect value for " - "last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[27], expected " - "193, is %d", - last_msg.msg.ssr_orbit_clock_bounds_degradation.stub[27]); + "last_msg.msg.ssr_orbit_clock_bounds_degradation.orbit_clock_bounds_" + "degradation.orb_cross_bound_mu_dot, expected 198, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation + .orbit_clock_bounds_degradation.orb_cross_bound_mu_dot); + + ck_assert_msg( + last_msg.msg.ssr_orbit_clock_bounds_degradation + .orbit_clock_bounds_degradation.orb_cross_bound_sig_dot == 195, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds_degradation.orbit_clock_bounds_" + "degradation.orb_cross_bound_sig_dot, expected 195, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation + .orbit_clock_bounds_degradation.orb_cross_bound_sig_dot); + + ck_assert_msg( + last_msg.msg.ssr_orbit_clock_bounds_degradation + .orbit_clock_bounds_degradation.orb_radial_bound_mu_dot == 200, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds_degradation.orbit_clock_bounds_" + "degradation.orb_radial_bound_mu_dot, expected 200, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation + .orbit_clock_bounds_degradation.orb_radial_bound_mu_dot); + + ck_assert_msg( + last_msg.msg.ssr_orbit_clock_bounds_degradation + .orbit_clock_bounds_degradation.orb_radial_bound_sig_dot == 197, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds_degradation.orbit_clock_bounds_" + "degradation.orb_radial_bound_sig_dot, expected 197, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation + .orbit_clock_bounds_degradation.orb_radial_bound_sig_dot); + + ck_assert_msg( + last_msg.msg.ssr_orbit_clock_bounds_degradation.sat_bitmask == 10, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds_degradation.sat_bitmask, expected " + "10, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation.sat_bitmask); + + ck_assert_msg(last_msg.msg.ssr_orbit_clock_bounds_degradation.ssr_iod == 15, + "incorrect value for " + "last_msg.msg.ssr_orbit_clock_bounds_degradation.ssr_iod, " + "expected 15, is %d", + last_msg.msg.ssr_orbit_clock_bounds_degradation.ssr_iod); } } END_TEST diff --git a/c/test/auto_check_sbp_ssr_MsgSsrStecCorrection.c b/c/test/auto_check_sbp_ssr_MsgSsrStecCorrection.c index 46192a65e2..0614e5844b 100644 --- a/c/test/auto_check_sbp_ssr_MsgSsrStecCorrection.c +++ b/c/test/auto_check_sbp_ssr_MsgSsrStecCorrection.c @@ -104,83 +104,53 @@ START_TEST(test_auto_check_sbp_ssr_MsgSsrStecCorrection) { sbp_msg_t test_msg; memset(&test_msg, 0, sizeof(test_msg)); - test_msg.ssr_stec_correction.n_stub = 38; + test_msg.ssr_stec_correction.header.num_msgs = 1; - test_msg.ssr_stec_correction.stub[0] = 180; + test_msg.ssr_stec_correction.header.seq_num = 1; - test_msg.ssr_stec_correction.stub[1] = 0; + test_msg.ssr_stec_correction.header.sol_id = 0; - test_msg.ssr_stec_correction.stub[2] = 0; + test_msg.ssr_stec_correction.header.time.tow = 180; - test_msg.ssr_stec_correction.stub[3] = 0; + test_msg.ssr_stec_correction.header.time.wn = 3; - test_msg.ssr_stec_correction.stub[4] = 3; + test_msg.ssr_stec_correction.header.update_interval = 10; - test_msg.ssr_stec_correction.stub[5] = 0; + test_msg.ssr_stec_correction.n_sats = 2; - test_msg.ssr_stec_correction.stub[6] = 1; + test_msg.ssr_stec_correction.ssr_iod_atmo = 15; - test_msg.ssr_stec_correction.stub[7] = 1; + test_msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[0] = 63; - test_msg.ssr_stec_correction.stub[8] = 10; + test_msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[1] = 62; - test_msg.ssr_stec_correction.stub[9] = 0; + test_msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[2] = 61; - test_msg.ssr_stec_correction.stub[10] = 15; + test_msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[3] = 60; - test_msg.ssr_stec_correction.stub[11] = 1; + test_msg.ssr_stec_correction.stec_sat_list[0].stec_quality_indicator = 1; - test_msg.ssr_stec_correction.stub[12] = 0; + test_msg.ssr_stec_correction.stec_sat_list[0].sv_id.constellation = 1; - test_msg.ssr_stec_correction.stub[13] = 10; + test_msg.ssr_stec_correction.stec_sat_list[0].sv_id.satId = 1; - test_msg.ssr_stec_correction.stub[14] = 0; + test_msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[0] = 63; - test_msg.ssr_stec_correction.stub[15] = 2; + test_msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[1] = 64; - test_msg.ssr_stec_correction.stub[16] = 1; + test_msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[2] = 65; - test_msg.ssr_stec_correction.stub[17] = 1; + test_msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[3] = 66; - test_msg.ssr_stec_correction.stub[18] = 1; + test_msg.ssr_stec_correction.stec_sat_list[1].stec_quality_indicator = 5; - test_msg.ssr_stec_correction.stub[19] = 63; + test_msg.ssr_stec_correction.stec_sat_list[1].sv_id.constellation = 15; - test_msg.ssr_stec_correction.stub[20] = 0; + test_msg.ssr_stec_correction.stec_sat_list[1].sv_id.satId = 31; - test_msg.ssr_stec_correction.stub[21] = 62; + test_msg.ssr_stec_correction.tile_id = 10; - test_msg.ssr_stec_correction.stub[22] = 0; - - test_msg.ssr_stec_correction.stub[23] = 61; - - test_msg.ssr_stec_correction.stub[24] = 0; - - test_msg.ssr_stec_correction.stub[25] = 60; - - test_msg.ssr_stec_correction.stub[26] = 0; - - test_msg.ssr_stec_correction.stub[27] = 31; - - test_msg.ssr_stec_correction.stub[28] = 15; - - test_msg.ssr_stec_correction.stub[29] = 5; - - test_msg.ssr_stec_correction.stub[30] = 63; - - test_msg.ssr_stec_correction.stub[31] = 0; - - test_msg.ssr_stec_correction.stub[32] = 64; - - test_msg.ssr_stec_correction.stub[33] = 0; - - test_msg.ssr_stec_correction.stub[34] = 65; - - test_msg.ssr_stec_correction.stub[35] = 0; - - test_msg.ssr_stec_correction.stub[36] = 66; - - test_msg.ssr_stec_correction.stub[37] = 0; + test_msg.ssr_stec_correction.tile_set_id = 1; sbp_message_send(&sbp_state, SbpMsgSsrStecCorrection, 66, &test_msg, &dummy_write); @@ -206,193 +176,160 @@ START_TEST(test_auto_check_sbp_ssr_MsgSsrStecCorrection) { 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.n_stub == 38, - "incorrect value for " - "last_msg.msg.ssr_stec_correction.n_stub, expected 38, is %d", - last_msg.msg.ssr_stec_correction.n_stub); - - ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[0] == 180, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[0], " - "expected 180, is %d", - last_msg.msg.ssr_stec_correction.stub[0]); - ck_assert_msg(last_msg.msg.ssr_stec_correction.stub[1] == 0, - "incorrect value for " - "last_msg.msg.ssr_stec_correction.stub[1], expected 0, is %d", - last_msg.msg.ssr_stec_correction.stub[1]); - ck_assert_msg(last_msg.msg.ssr_stec_correction.stub[2] == 0, - "incorrect value for " - "last_msg.msg.ssr_stec_correction.stub[2], expected 0, is %d", - last_msg.msg.ssr_stec_correction.stub[2]); - ck_assert_msg(last_msg.msg.ssr_stec_correction.stub[3] == 0, - "incorrect value for " - "last_msg.msg.ssr_stec_correction.stub[3], expected 0, is %d", - last_msg.msg.ssr_stec_correction.stub[3]); - ck_assert_msg(last_msg.msg.ssr_stec_correction.stub[4] == 3, - "incorrect value for " - "last_msg.msg.ssr_stec_correction.stub[4], expected 3, is %d", - last_msg.msg.ssr_stec_correction.stub[4]); - ck_assert_msg(last_msg.msg.ssr_stec_correction.stub[5] == 0, - "incorrect value for " - "last_msg.msg.ssr_stec_correction.stub[5], expected 0, is %d", - last_msg.msg.ssr_stec_correction.stub[5]); - ck_assert_msg(last_msg.msg.ssr_stec_correction.stub[6] == 1, - "incorrect value for " - "last_msg.msg.ssr_stec_correction.stub[6], expected 1, is %d", - last_msg.msg.ssr_stec_correction.stub[6]); - ck_assert_msg(last_msg.msg.ssr_stec_correction.stub[7] == 1, - "incorrect value for " - "last_msg.msg.ssr_stec_correction.stub[7], expected 1, is %d", - last_msg.msg.ssr_stec_correction.stub[7]); ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[8] == 10, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[8], " - "expected 10, is %d", - last_msg.msg.ssr_stec_correction.stub[8]); - ck_assert_msg(last_msg.msg.ssr_stec_correction.stub[9] == 0, - "incorrect value for " - "last_msg.msg.ssr_stec_correction.stub[9], expected 0, is %d", - last_msg.msg.ssr_stec_correction.stub[9]); - ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[10] == 15, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[10], " - "expected 15, is %d", - last_msg.msg.ssr_stec_correction.stub[10]); - ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[11] == 1, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[11], " + 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.stub[11]); - ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[12] == 0, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[12], " - "expected 0, is %d", - last_msg.msg.ssr_stec_correction.stub[12]); + last_msg.msg.ssr_stec_correction.header.num_msgs); + ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[13] == 10, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[13], " - "expected 10, is %d", - last_msg.msg.ssr_stec_correction.stub[13]); + 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.stub[14] == 0, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[14], " + 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.stub[14]); - ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[15] == 2, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[15], " - "expected 2, is %d", - last_msg.msg.ssr_stec_correction.stub[15]); + last_msg.msg.ssr_stec_correction.header.sol_id); + ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[16] == 1, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[16], " - "expected 1, is %d", - last_msg.msg.ssr_stec_correction.stub[16]); + 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.stub[17] == 1, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[17], " - "expected 1, is %d", - last_msg.msg.ssr_stec_correction.stub[17]); + 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.stub[18] == 1, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[18], " - "expected 1, is %d", - last_msg.msg.ssr_stec_correction.stub[18]); + 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.stub[19] == 63, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[19], " + 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.stub[19]); - ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[20] == 0, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[20], " - "expected 0, is %d", - last_msg.msg.ssr_stec_correction.stub[20]); + last_msg.msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[0]); ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[21] == 62, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[21], " + 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.stub[21]); - ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[22] == 0, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[22], " - "expected 0, is %d", - last_msg.msg.ssr_stec_correction.stub[22]); + last_msg.msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[1]); ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[23] == 61, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[23], " + 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.stub[23]); + last_msg.msg.ssr_stec_correction.stec_sat_list[0].stec_coeff[2]); ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[24] == 0, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[24], " - "expected 0, is %d", - last_msg.msg.ssr_stec_correction.stub[24]); - ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[25] == 60, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[25], " + 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.stub[25]); - ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[26] == 0, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[26], " - "expected 0, is %d", - last_msg.msg.ssr_stec_correction.stub[26]); - ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[27] == 31, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[27], " - "expected 31, is %d", - last_msg.msg.ssr_stec_correction.stub[27]); + 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.stub[28] == 15, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[28], " - "expected 15, is %d", - last_msg.msg.ssr_stec_correction.stub[28]); + 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.stub[29] == 5, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[29], " - "expected 5, is %d", - last_msg.msg.ssr_stec_correction.stub[29]); + 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.stub[30] == 63, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[30], " + 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.stub[30]); - ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[31] == 0, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[31], " - "expected 0, is %d", - last_msg.msg.ssr_stec_correction.stub[31]); + last_msg.msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[0]); ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[32] == 64, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[32], " + 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.stub[32]); - ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[33] == 0, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[33], " - "expected 0, is %d", - last_msg.msg.ssr_stec_correction.stub[33]); + last_msg.msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[1]); ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[34] == 65, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[34], " + 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.stub[34]); + last_msg.msg.ssr_stec_correction.stec_sat_list[1].stec_coeff[2]); ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[35] == 0, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[35], " - "expected 0, is %d", - last_msg.msg.ssr_stec_correction.stub[35]); - ck_assert_msg( - last_msg.msg.ssr_stec_correction.stub[36] == 66, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[36], " + 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.stub[36]); + 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.stub[37] == 0, - "incorrect value for last_msg.msg.ssr_stec_correction.stub[37], " - "expected 0, is %d", - last_msg.msg.ssr_stec_correction.stub[37]); + 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 diff --git a/c/test/auto_check_sbp_ssr_MsgSsrTileDefinition.c b/c/test/auto_check_sbp_ssr_MsgSsrTileDefinition.c index c3ddd9e78a..d705b2d803 100644 --- a/c/test/auto_check_sbp_ssr_MsgSsrTileDefinition.c +++ b/c/test/auto_check_sbp_ssr_MsgSsrTileDefinition.c @@ -103,57 +103,25 @@ START_TEST(test_auto_check_sbp_ssr_MsgSsrTileDefinition) { sbp_msg_t test_msg; memset(&test_msg, 0, sizeof(test_msg)); - test_msg.ssr_tile_definition.n_stub = 25; + test_msg.ssr_tile_definition.bitmask = 1234567890; - test_msg.ssr_tile_definition.stub[0] = 31; + test_msg.ssr_tile_definition.cols = 32768; - test_msg.ssr_tile_definition.stub[1] = 0; + test_msg.ssr_tile_definition.corner_nw_lat = 1024; - test_msg.ssr_tile_definition.stub[2] = 1; + test_msg.ssr_tile_definition.corner_nw_lon = 2048; - test_msg.ssr_tile_definition.stub[3] = 0; + test_msg.ssr_tile_definition.rows = 16384; - test_msg.ssr_tile_definition.stub[4] = 2; + test_msg.ssr_tile_definition.spacing_lat = 4096; - test_msg.ssr_tile_definition.stub[5] = 0; + test_msg.ssr_tile_definition.spacing_lon = 8192; - test_msg.ssr_tile_definition.stub[6] = 4; + test_msg.ssr_tile_definition.ssr_sol_id = 31; - test_msg.ssr_tile_definition.stub[7] = 0; + test_msg.ssr_tile_definition.tile_id = 512; - test_msg.ssr_tile_definition.stub[8] = 8; - - test_msg.ssr_tile_definition.stub[9] = 0; - - test_msg.ssr_tile_definition.stub[10] = 16; - - test_msg.ssr_tile_definition.stub[11] = 0; - - test_msg.ssr_tile_definition.stub[12] = 32; - - test_msg.ssr_tile_definition.stub[13] = 0; - - test_msg.ssr_tile_definition.stub[14] = 64; - - test_msg.ssr_tile_definition.stub[15] = 0; - - test_msg.ssr_tile_definition.stub[16] = 128; - - test_msg.ssr_tile_definition.stub[17] = 210; - - test_msg.ssr_tile_definition.stub[18] = 2; - - test_msg.ssr_tile_definition.stub[19] = 150; - - test_msg.ssr_tile_definition.stub[20] = 73; - - test_msg.ssr_tile_definition.stub[21] = 0; - - test_msg.ssr_tile_definition.stub[22] = 0; - - test_msg.ssr_tile_definition.stub[23] = 0; - - test_msg.ssr_tile_definition.stub[24] = 0; + test_msg.ssr_tile_definition.tile_set_id = 256; sbp_message_send(&sbp_state, SbpMsgSsrTileDefinition, 66, &test_msg, &dummy_write); @@ -179,127 +147,63 @@ START_TEST(test_auto_check_sbp_ssr_MsgSsrTileDefinition) { 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.n_stub == 25, - "incorrect value for " - "last_msg.msg.ssr_tile_definition.n_stub, expected 25, is %d", - last_msg.msg.ssr_tile_definition.n_stub); - - ck_assert_msg( - last_msg.msg.ssr_tile_definition.stub[0] == 31, - "incorrect value for last_msg.msg.ssr_tile_definition.stub[0], " - "expected 31, is %d", - last_msg.msg.ssr_tile_definition.stub[0]); - ck_assert_msg(last_msg.msg.ssr_tile_definition.stub[1] == 0, - "incorrect value for " - "last_msg.msg.ssr_tile_definition.stub[1], expected 0, is %d", - last_msg.msg.ssr_tile_definition.stub[1]); - ck_assert_msg(last_msg.msg.ssr_tile_definition.stub[2] == 1, - "incorrect value for " - "last_msg.msg.ssr_tile_definition.stub[2], expected 1, is %d", - last_msg.msg.ssr_tile_definition.stub[2]); - ck_assert_msg(last_msg.msg.ssr_tile_definition.stub[3] == 0, - "incorrect value for " - "last_msg.msg.ssr_tile_definition.stub[3], expected 0, is %d", - last_msg.msg.ssr_tile_definition.stub[3]); - ck_assert_msg(last_msg.msg.ssr_tile_definition.stub[4] == 2, - "incorrect value for " - "last_msg.msg.ssr_tile_definition.stub[4], expected 2, is %d", - last_msg.msg.ssr_tile_definition.stub[4]); - ck_assert_msg(last_msg.msg.ssr_tile_definition.stub[5] == 0, - "incorrect value for " - "last_msg.msg.ssr_tile_definition.stub[5], expected 0, is %d", - last_msg.msg.ssr_tile_definition.stub[5]); - ck_assert_msg(last_msg.msg.ssr_tile_definition.stub[6] == 4, - "incorrect value for " - "last_msg.msg.ssr_tile_definition.stub[6], expected 4, is %d", - last_msg.msg.ssr_tile_definition.stub[6]); - ck_assert_msg(last_msg.msg.ssr_tile_definition.stub[7] == 0, - "incorrect value for " - "last_msg.msg.ssr_tile_definition.stub[7], expected 0, is %d", - last_msg.msg.ssr_tile_definition.stub[7]); - ck_assert_msg(last_msg.msg.ssr_tile_definition.stub[8] == 8, - "incorrect value for " - "last_msg.msg.ssr_tile_definition.stub[8], expected 8, is %d", - last_msg.msg.ssr_tile_definition.stub[8]); - ck_assert_msg(last_msg.msg.ssr_tile_definition.stub[9] == 0, - "incorrect value for " - "last_msg.msg.ssr_tile_definition.stub[9], expected 0, is %d", - last_msg.msg.ssr_tile_definition.stub[9]); - ck_assert_msg( - last_msg.msg.ssr_tile_definition.stub[10] == 16, - "incorrect value for last_msg.msg.ssr_tile_definition.stub[10], " - "expected 16, is %d", - last_msg.msg.ssr_tile_definition.stub[10]); - ck_assert_msg( - last_msg.msg.ssr_tile_definition.stub[11] == 0, - "incorrect value for last_msg.msg.ssr_tile_definition.stub[11], " - "expected 0, is %d", - last_msg.msg.ssr_tile_definition.stub[11]); - ck_assert_msg( - last_msg.msg.ssr_tile_definition.stub[12] == 32, - "incorrect value for last_msg.msg.ssr_tile_definition.stub[12], " - "expected 32, is %d", - last_msg.msg.ssr_tile_definition.stub[12]); - ck_assert_msg( - last_msg.msg.ssr_tile_definition.stub[13] == 0, - "incorrect value for last_msg.msg.ssr_tile_definition.stub[13], " - "expected 0, is %d", - last_msg.msg.ssr_tile_definition.stub[13]); ck_assert_msg( - last_msg.msg.ssr_tile_definition.stub[14] == 64, - "incorrect value for last_msg.msg.ssr_tile_definition.stub[14], " - "expected 64, is %d", - last_msg.msg.ssr_tile_definition.stub[14]); - ck_assert_msg( - last_msg.msg.ssr_tile_definition.stub[15] == 0, - "incorrect value for last_msg.msg.ssr_tile_definition.stub[15], " - "expected 0, is %d", - last_msg.msg.ssr_tile_definition.stub[15]); - ck_assert_msg( - last_msg.msg.ssr_tile_definition.stub[16] == 128, - "incorrect value for last_msg.msg.ssr_tile_definition.stub[16], " - "expected 128, is %d", - last_msg.msg.ssr_tile_definition.stub[16]); - ck_assert_msg( - last_msg.msg.ssr_tile_definition.stub[17] == 210, - "incorrect value for last_msg.msg.ssr_tile_definition.stub[17], " - "expected 210, is %d", - last_msg.msg.ssr_tile_definition.stub[17]); + 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.stub[18] == 2, - "incorrect value for last_msg.msg.ssr_tile_definition.stub[18], " - "expected 2, is %d", - last_msg.msg.ssr_tile_definition.stub[18]); + 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.stub[19] == 150, - "incorrect value for last_msg.msg.ssr_tile_definition.stub[19], " - "expected 150, is %d", - last_msg.msg.ssr_tile_definition.stub[19]); + 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.stub[20] == 73, - "incorrect value for last_msg.msg.ssr_tile_definition.stub[20], " - "expected 73, is %d", - last_msg.msg.ssr_tile_definition.stub[20]); + 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.stub[21] == 0, - "incorrect value for last_msg.msg.ssr_tile_definition.stub[21], " - "expected 0, is %d", - last_msg.msg.ssr_tile_definition.stub[21]); + 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.stub[22] == 0, - "incorrect value for last_msg.msg.ssr_tile_definition.stub[22], " - "expected 0, is %d", - last_msg.msg.ssr_tile_definition.stub[22]); + 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.stub[23] == 0, - "incorrect value for last_msg.msg.ssr_tile_definition.stub[23], " - "expected 0, is %d", - last_msg.msg.ssr_tile_definition.stub[23]); + 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.stub[24] == 0, - "incorrect value for last_msg.msg.ssr_tile_definition.stub[24], " - "expected 0, is %d", - last_msg.msg.ssr_tile_definition.stub[24]); + 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 diff --git a/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagHighLevel.cc b/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagHighLevel.cc index d6cef43281..21dfbfe29c 100644 --- a/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagHighLevel.cc +++ b/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagHighLevel.cc @@ -81,69 +81,33 @@ TEST_F(Test_auto_check_sbp_integrity_MsgSsrFlagHighLevel0, Test) { }; sbp_msg_ssr_flag_high_level_t test_msg{}; - test_msg.n_stub = 31; + test_msg.chain_id = 40; + test_msg.corr_time.tow = 360; + test_msg.corr_time.wn = 6; + test_msg.obs_time.tow = 180; + test_msg.obs_time.wn = 3; - test_msg.stub[0] = 180; + test_msg.reserved[0] = 0; - test_msg.stub[1] = 0; + test_msg.reserved[1] = 0; - test_msg.stub[2] = 0; + test_msg.reserved[2] = 0; - test_msg.stub[3] = 0; + test_msg.reserved[3] = 0; - test_msg.stub[4] = 3; + test_msg.reserved[4] = 0; - test_msg.stub[5] = 0; - - test_msg.stub[6] = 104; - - test_msg.stub[7] = 1; - - test_msg.stub[8] = 0; - - test_msg.stub[9] = 0; - - test_msg.stub[10] = 6; - - test_msg.stub[11] = 0; - - test_msg.stub[12] = 10; - - test_msg.stub[13] = 20; - - test_msg.stub[14] = 0; - - test_msg.stub[15] = 30; - - test_msg.stub[16] = 0; - - test_msg.stub[17] = 40; - - test_msg.stub[18] = 1; - - test_msg.stub[19] = 2; - - test_msg.stub[20] = 3; - - test_msg.stub[21] = 0; - - test_msg.stub[22] = 0; - - test_msg.stub[23] = 0; - - test_msg.stub[24] = 0; - - test_msg.stub[25] = 0; - - test_msg.stub[26] = 0; - - test_msg.stub[27] = 4; - - test_msg.stub[28] = 5; - - test_msg.stub[29] = 6; - - test_msg.stub[30] = 7; + test_msg.reserved[5] = 0; + test_msg.ssr_sol_id = 10; + test_msg.tile_id = 30; + test_msg.tile_set_id = 20; + test_msg.use_bds_sat = 3; + test_msg.use_gal_sat = 2; + test_msg.use_gps_sat = 1; + test_msg.use_iono_grid_point_sat_los = 7; + test_msg.use_iono_grid_points = 5; + test_msg.use_iono_tile_sat_los = 6; + test_msg.use_tropo_grid_points = 4; EXPECT_EQ(send_message(66, test_msg), SBP_OK); @@ -157,100 +121,68 @@ TEST_F(Test_auto_check_sbp_integrity_MsgSsrFlagHighLevel0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_, test_msg); - EXPECT_EQ(last_msg_.n_stub, 31) - << "incorrect value for last_msg_.n_stub, expected 31, is " - << last_msg_.n_stub; - EXPECT_EQ(last_msg_.stub[0], 180) - << "incorrect value for last_msg_.stub[0], expected 180, is " - << last_msg_.stub[0]; - EXPECT_EQ(last_msg_.stub[1], 0) - << "incorrect value for last_msg_.stub[1], expected 0, is " - << last_msg_.stub[1]; - EXPECT_EQ(last_msg_.stub[2], 0) - << "incorrect value for last_msg_.stub[2], expected 0, is " - << last_msg_.stub[2]; - EXPECT_EQ(last_msg_.stub[3], 0) - << "incorrect value for last_msg_.stub[3], expected 0, is " - << last_msg_.stub[3]; - EXPECT_EQ(last_msg_.stub[4], 3) - << "incorrect value for last_msg_.stub[4], expected 3, is " - << last_msg_.stub[4]; - EXPECT_EQ(last_msg_.stub[5], 0) - << "incorrect value for last_msg_.stub[5], expected 0, is " - << last_msg_.stub[5]; - EXPECT_EQ(last_msg_.stub[6], 104) - << "incorrect value for last_msg_.stub[6], expected 104, is " - << last_msg_.stub[6]; - EXPECT_EQ(last_msg_.stub[7], 1) - << "incorrect value for last_msg_.stub[7], expected 1, is " - << last_msg_.stub[7]; - EXPECT_EQ(last_msg_.stub[8], 0) - << "incorrect value for last_msg_.stub[8], expected 0, is " - << last_msg_.stub[8]; - EXPECT_EQ(last_msg_.stub[9], 0) - << "incorrect value for last_msg_.stub[9], expected 0, is " - << last_msg_.stub[9]; - EXPECT_EQ(last_msg_.stub[10], 6) - << "incorrect value for last_msg_.stub[10], expected 6, is " - << last_msg_.stub[10]; - EXPECT_EQ(last_msg_.stub[11], 0) - << "incorrect value for last_msg_.stub[11], expected 0, is " - << last_msg_.stub[11]; - EXPECT_EQ(last_msg_.stub[12], 10) - << "incorrect value for last_msg_.stub[12], expected 10, is " - << last_msg_.stub[12]; - EXPECT_EQ(last_msg_.stub[13], 20) - << "incorrect value for last_msg_.stub[13], expected 20, is " - << last_msg_.stub[13]; - EXPECT_EQ(last_msg_.stub[14], 0) - << "incorrect value for last_msg_.stub[14], expected 0, is " - << last_msg_.stub[14]; - EXPECT_EQ(last_msg_.stub[15], 30) - << "incorrect value for last_msg_.stub[15], expected 30, is " - << last_msg_.stub[15]; - EXPECT_EQ(last_msg_.stub[16], 0) - << "incorrect value for last_msg_.stub[16], expected 0, is " - << last_msg_.stub[16]; - EXPECT_EQ(last_msg_.stub[17], 40) - << "incorrect value for last_msg_.stub[17], expected 40, is " - << last_msg_.stub[17]; - EXPECT_EQ(last_msg_.stub[18], 1) - << "incorrect value for last_msg_.stub[18], expected 1, is " - << last_msg_.stub[18]; - EXPECT_EQ(last_msg_.stub[19], 2) - << "incorrect value for last_msg_.stub[19], expected 2, is " - << last_msg_.stub[19]; - EXPECT_EQ(last_msg_.stub[20], 3) - << "incorrect value for last_msg_.stub[20], expected 3, is " - << last_msg_.stub[20]; - EXPECT_EQ(last_msg_.stub[21], 0) - << "incorrect value for last_msg_.stub[21], expected 0, is " - << last_msg_.stub[21]; - EXPECT_EQ(last_msg_.stub[22], 0) - << "incorrect value for last_msg_.stub[22], expected 0, is " - << last_msg_.stub[22]; - EXPECT_EQ(last_msg_.stub[23], 0) - << "incorrect value for last_msg_.stub[23], expected 0, is " - << last_msg_.stub[23]; - EXPECT_EQ(last_msg_.stub[24], 0) - << "incorrect value for last_msg_.stub[24], expected 0, is " - << last_msg_.stub[24]; - EXPECT_EQ(last_msg_.stub[25], 0) - << "incorrect value for last_msg_.stub[25], expected 0, is " - << last_msg_.stub[25]; - EXPECT_EQ(last_msg_.stub[26], 0) - << "incorrect value for last_msg_.stub[26], expected 0, is " - << last_msg_.stub[26]; - EXPECT_EQ(last_msg_.stub[27], 4) - << "incorrect value for last_msg_.stub[27], expected 4, is " - << last_msg_.stub[27]; - EXPECT_EQ(last_msg_.stub[28], 5) - << "incorrect value for last_msg_.stub[28], expected 5, is " - << last_msg_.stub[28]; - EXPECT_EQ(last_msg_.stub[29], 6) - << "incorrect value for last_msg_.stub[29], expected 6, is " - << last_msg_.stub[29]; - EXPECT_EQ(last_msg_.stub[30], 7) - << "incorrect value for last_msg_.stub[30], expected 7, is " - << last_msg_.stub[30]; + EXPECT_EQ(last_msg_.chain_id, 40) + << "incorrect value for last_msg_.chain_id, expected 40, is " + << last_msg_.chain_id; + EXPECT_EQ(last_msg_.corr_time.tow, 360) + << "incorrect value for last_msg_.corr_time.tow, expected 360, is " + << last_msg_.corr_time.tow; + EXPECT_EQ(last_msg_.corr_time.wn, 6) + << "incorrect value for last_msg_.corr_time.wn, expected 6, is " + << last_msg_.corr_time.wn; + EXPECT_EQ(last_msg_.obs_time.tow, 180) + << "incorrect value for last_msg_.obs_time.tow, expected 180, is " + << last_msg_.obs_time.tow; + EXPECT_EQ(last_msg_.obs_time.wn, 3) + << "incorrect value for last_msg_.obs_time.wn, expected 3, is " + << last_msg_.obs_time.wn; + EXPECT_EQ(last_msg_.reserved[0], 0) + << "incorrect value for last_msg_.reserved[0], expected 0, is " + << last_msg_.reserved[0]; + EXPECT_EQ(last_msg_.reserved[1], 0) + << "incorrect value for last_msg_.reserved[1], expected 0, is " + << last_msg_.reserved[1]; + EXPECT_EQ(last_msg_.reserved[2], 0) + << "incorrect value for last_msg_.reserved[2], expected 0, is " + << last_msg_.reserved[2]; + EXPECT_EQ(last_msg_.reserved[3], 0) + << "incorrect value for last_msg_.reserved[3], expected 0, is " + << last_msg_.reserved[3]; + EXPECT_EQ(last_msg_.reserved[4], 0) + << "incorrect value for last_msg_.reserved[4], expected 0, is " + << last_msg_.reserved[4]; + EXPECT_EQ(last_msg_.reserved[5], 0) + << "incorrect value for last_msg_.reserved[5], expected 0, is " + << last_msg_.reserved[5]; + EXPECT_EQ(last_msg_.ssr_sol_id, 10) + << "incorrect value for last_msg_.ssr_sol_id, expected 10, is " + << last_msg_.ssr_sol_id; + EXPECT_EQ(last_msg_.tile_id, 30) + << "incorrect value for last_msg_.tile_id, expected 30, is " + << last_msg_.tile_id; + EXPECT_EQ(last_msg_.tile_set_id, 20) + << "incorrect value for last_msg_.tile_set_id, expected 20, is " + << last_msg_.tile_set_id; + EXPECT_EQ(last_msg_.use_bds_sat, 3) + << "incorrect value for last_msg_.use_bds_sat, expected 3, is " + << last_msg_.use_bds_sat; + EXPECT_EQ(last_msg_.use_gal_sat, 2) + << "incorrect value for last_msg_.use_gal_sat, expected 2, is " + << last_msg_.use_gal_sat; + EXPECT_EQ(last_msg_.use_gps_sat, 1) + << "incorrect value for last_msg_.use_gps_sat, expected 1, is " + << last_msg_.use_gps_sat; + EXPECT_EQ(last_msg_.use_iono_grid_point_sat_los, 7) + << "incorrect value for last_msg_.use_iono_grid_point_sat_los, expected " + "7, is " + << last_msg_.use_iono_grid_point_sat_los; + EXPECT_EQ(last_msg_.use_iono_grid_points, 5) + << "incorrect value for last_msg_.use_iono_grid_points, expected 5, is " + << last_msg_.use_iono_grid_points; + EXPECT_EQ(last_msg_.use_iono_tile_sat_los, 6) + << "incorrect value for last_msg_.use_iono_tile_sat_los, expected 6, is " + << last_msg_.use_iono_tile_sat_los; + EXPECT_EQ(last_msg_.use_tropo_grid_points, 4) + << "incorrect value for last_msg_.use_tropo_grid_points, expected 4, is " + << last_msg_.use_tropo_grid_points; } diff --git a/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos.cc b/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos.cc index 0bf2ad4b37..2dd620d95c 100644 --- a/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos.cc +++ b/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos.cc @@ -82,49 +82,22 @@ TEST_F(Test_auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos0, Test) { }; sbp_msg_ssr_flag_iono_grid_point_sat_los_t test_msg{}; - test_msg.n_stub = 21; - test_msg.stub[0] = 180; - - test_msg.stub[1] = 0; - - test_msg.stub[2] = 0; - - test_msg.stub[3] = 0; - - test_msg.stub[4] = 3; - - test_msg.stub[5] = 0; - - test_msg.stub[6] = 1; - - test_msg.stub[7] = 2; - - test_msg.stub[8] = 3; - - test_msg.stub[9] = 4; - - test_msg.stub[10] = 0; - - test_msg.stub[11] = 5; - - test_msg.stub[12] = 0; - - test_msg.stub[13] = 6; - - test_msg.stub[14] = 30; - - test_msg.stub[15] = 0; - - test_msg.stub[16] = 2; - - test_msg.stub[17] = 10; - - test_msg.stub[18] = 11; - - test_msg.stub[19] = 15; - - test_msg.stub[20] = 14; + test_msg.faulty_los[0].constellation = 11; + test_msg.faulty_los[0].satId = 10; + + test_msg.faulty_los[1].constellation = 14; + test_msg.faulty_los[1].satId = 15; + test_msg.grid_point_id = 30; + test_msg.header.chain_id = 6; + test_msg.header.num_msgs = 1; + test_msg.header.obs_time.tow = 180; + test_msg.header.obs_time.wn = 3; + test_msg.header.seq_num = 2; + test_msg.header.ssr_sol_id = 3; + test_msg.header.tile_id = 5; + test_msg.header.tile_set_id = 4; + test_msg.n_faulty_los = 2; EXPECT_EQ(send_message(66, test_msg), SBP_OK); @@ -138,70 +111,48 @@ TEST_F(Test_auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_, test_msg); - EXPECT_EQ(last_msg_.n_stub, 21) - << "incorrect value for last_msg_.n_stub, expected 21, is " - << last_msg_.n_stub; - EXPECT_EQ(last_msg_.stub[0], 180) - << "incorrect value for last_msg_.stub[0], expected 180, is " - << last_msg_.stub[0]; - EXPECT_EQ(last_msg_.stub[1], 0) - << "incorrect value for last_msg_.stub[1], expected 0, is " - << last_msg_.stub[1]; - EXPECT_EQ(last_msg_.stub[2], 0) - << "incorrect value for last_msg_.stub[2], expected 0, is " - << last_msg_.stub[2]; - EXPECT_EQ(last_msg_.stub[3], 0) - << "incorrect value for last_msg_.stub[3], expected 0, is " - << last_msg_.stub[3]; - EXPECT_EQ(last_msg_.stub[4], 3) - << "incorrect value for last_msg_.stub[4], expected 3, is " - << last_msg_.stub[4]; - EXPECT_EQ(last_msg_.stub[5], 0) - << "incorrect value for last_msg_.stub[5], expected 0, is " - << last_msg_.stub[5]; - EXPECT_EQ(last_msg_.stub[6], 1) - << "incorrect value for last_msg_.stub[6], expected 1, is " - << last_msg_.stub[6]; - EXPECT_EQ(last_msg_.stub[7], 2) - << "incorrect value for last_msg_.stub[7], expected 2, is " - << last_msg_.stub[7]; - EXPECT_EQ(last_msg_.stub[8], 3) - << "incorrect value for last_msg_.stub[8], expected 3, is " - << last_msg_.stub[8]; - EXPECT_EQ(last_msg_.stub[9], 4) - << "incorrect value for last_msg_.stub[9], expected 4, is " - << last_msg_.stub[9]; - EXPECT_EQ(last_msg_.stub[10], 0) - << "incorrect value for last_msg_.stub[10], expected 0, is " - << last_msg_.stub[10]; - EXPECT_EQ(last_msg_.stub[11], 5) - << "incorrect value for last_msg_.stub[11], expected 5, is " - << last_msg_.stub[11]; - EXPECT_EQ(last_msg_.stub[12], 0) - << "incorrect value for last_msg_.stub[12], expected 0, is " - << last_msg_.stub[12]; - EXPECT_EQ(last_msg_.stub[13], 6) - << "incorrect value for last_msg_.stub[13], expected 6, is " - << last_msg_.stub[13]; - EXPECT_EQ(last_msg_.stub[14], 30) - << "incorrect value for last_msg_.stub[14], expected 30, is " - << last_msg_.stub[14]; - EXPECT_EQ(last_msg_.stub[15], 0) - << "incorrect value for last_msg_.stub[15], expected 0, is " - << last_msg_.stub[15]; - EXPECT_EQ(last_msg_.stub[16], 2) - << "incorrect value for last_msg_.stub[16], expected 2, is " - << last_msg_.stub[16]; - EXPECT_EQ(last_msg_.stub[17], 10) - << "incorrect value for last_msg_.stub[17], expected 10, is " - << last_msg_.stub[17]; - EXPECT_EQ(last_msg_.stub[18], 11) - << "incorrect value for last_msg_.stub[18], expected 11, is " - << last_msg_.stub[18]; - EXPECT_EQ(last_msg_.stub[19], 15) - << "incorrect value for last_msg_.stub[19], expected 15, is " - << last_msg_.stub[19]; - EXPECT_EQ(last_msg_.stub[20], 14) - << "incorrect value for last_msg_.stub[20], expected 14, is " - << last_msg_.stub[20]; + EXPECT_EQ(last_msg_.faulty_los[0].constellation, 11) + << "incorrect value for last_msg_.faulty_los[0].constellation, expected " + "11, is " + << last_msg_.faulty_los[0].constellation; + EXPECT_EQ(last_msg_.faulty_los[0].satId, 10) + << "incorrect value for last_msg_.faulty_los[0].satId, expected 10, is " + << last_msg_.faulty_los[0].satId; + EXPECT_EQ(last_msg_.faulty_los[1].constellation, 14) + << "incorrect value for last_msg_.faulty_los[1].constellation, expected " + "14, is " + << last_msg_.faulty_los[1].constellation; + EXPECT_EQ(last_msg_.faulty_los[1].satId, 15) + << "incorrect value for last_msg_.faulty_los[1].satId, expected 15, is " + << last_msg_.faulty_los[1].satId; + EXPECT_EQ(last_msg_.grid_point_id, 30) + << "incorrect value for last_msg_.grid_point_id, expected 30, is " + << last_msg_.grid_point_id; + EXPECT_EQ(last_msg_.header.chain_id, 6) + << "incorrect value for last_msg_.header.chain_id, expected 6, is " + << last_msg_.header.chain_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.obs_time.tow, 180) + << "incorrect value for last_msg_.header.obs_time.tow, expected 180, is " + << last_msg_.header.obs_time.tow; + EXPECT_EQ(last_msg_.header.obs_time.wn, 3) + << "incorrect value for last_msg_.header.obs_time.wn, expected 3, is " + << last_msg_.header.obs_time.wn; + EXPECT_EQ(last_msg_.header.seq_num, 2) + << "incorrect value for last_msg_.header.seq_num, expected 2, is " + << last_msg_.header.seq_num; + EXPECT_EQ(last_msg_.header.ssr_sol_id, 3) + << "incorrect value for last_msg_.header.ssr_sol_id, expected 3, is " + << last_msg_.header.ssr_sol_id; + EXPECT_EQ(last_msg_.header.tile_id, 5) + << "incorrect value for last_msg_.header.tile_id, expected 5, is " + << last_msg_.header.tile_id; + EXPECT_EQ(last_msg_.header.tile_set_id, 4) + << "incorrect value for last_msg_.header.tile_set_id, expected 4, is " + << last_msg_.header.tile_set_id; + EXPECT_EQ(last_msg_.n_faulty_los, 2) + << "incorrect value for last_msg_.n_faulty_los, expected 2, is " + << last_msg_.n_faulty_los; } diff --git a/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints.cc b/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints.cc index dcc61b7748..d0077dee23 100644 --- a/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints.cc +++ b/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints.cc @@ -81,49 +81,21 @@ TEST_F(Test_auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints0, Test) { }; sbp_msg_ssr_flag_iono_grid_points_t test_msg{}; - test_msg.n_stub = 21; - test_msg.stub[0] = 180; + test_msg.faulty_points[0] = 10; - test_msg.stub[1] = 0; + test_msg.faulty_points[1] = 11; - test_msg.stub[2] = 0; - - test_msg.stub[3] = 0; - - test_msg.stub[4] = 3; - - test_msg.stub[5] = 0; - - test_msg.stub[6] = 1; - - test_msg.stub[7] = 2; - - test_msg.stub[8] = 3; - - test_msg.stub[9] = 4; - - test_msg.stub[10] = 0; - - test_msg.stub[11] = 5; - - test_msg.stub[12] = 0; - - test_msg.stub[13] = 6; - - test_msg.stub[14] = 3; - - test_msg.stub[15] = 10; - - test_msg.stub[16] = 0; - - test_msg.stub[17] = 11; - - test_msg.stub[18] = 0; - - test_msg.stub[19] = 12; - - test_msg.stub[20] = 0; + test_msg.faulty_points[2] = 12; + test_msg.header.chain_id = 6; + test_msg.header.num_msgs = 1; + test_msg.header.obs_time.tow = 180; + test_msg.header.obs_time.wn = 3; + test_msg.header.seq_num = 2; + test_msg.header.ssr_sol_id = 3; + test_msg.header.tile_id = 5; + test_msg.header.tile_set_id = 4; + test_msg.n_faulty_points = 3; EXPECT_EQ(send_message(66, test_msg), SBP_OK); @@ -137,70 +109,40 @@ TEST_F(Test_auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_, test_msg); - EXPECT_EQ(last_msg_.n_stub, 21) - << "incorrect value for last_msg_.n_stub, expected 21, is " - << last_msg_.n_stub; - EXPECT_EQ(last_msg_.stub[0], 180) - << "incorrect value for last_msg_.stub[0], expected 180, is " - << last_msg_.stub[0]; - EXPECT_EQ(last_msg_.stub[1], 0) - << "incorrect value for last_msg_.stub[1], expected 0, is " - << last_msg_.stub[1]; - EXPECT_EQ(last_msg_.stub[2], 0) - << "incorrect value for last_msg_.stub[2], expected 0, is " - << last_msg_.stub[2]; - EXPECT_EQ(last_msg_.stub[3], 0) - << "incorrect value for last_msg_.stub[3], expected 0, is " - << last_msg_.stub[3]; - EXPECT_EQ(last_msg_.stub[4], 3) - << "incorrect value for last_msg_.stub[4], expected 3, is " - << last_msg_.stub[4]; - EXPECT_EQ(last_msg_.stub[5], 0) - << "incorrect value for last_msg_.stub[5], expected 0, is " - << last_msg_.stub[5]; - EXPECT_EQ(last_msg_.stub[6], 1) - << "incorrect value for last_msg_.stub[6], expected 1, is " - << last_msg_.stub[6]; - EXPECT_EQ(last_msg_.stub[7], 2) - << "incorrect value for last_msg_.stub[7], expected 2, is " - << last_msg_.stub[7]; - EXPECT_EQ(last_msg_.stub[8], 3) - << "incorrect value for last_msg_.stub[8], expected 3, is " - << last_msg_.stub[8]; - EXPECT_EQ(last_msg_.stub[9], 4) - << "incorrect value for last_msg_.stub[9], expected 4, is " - << last_msg_.stub[9]; - EXPECT_EQ(last_msg_.stub[10], 0) - << "incorrect value for last_msg_.stub[10], expected 0, is " - << last_msg_.stub[10]; - EXPECT_EQ(last_msg_.stub[11], 5) - << "incorrect value for last_msg_.stub[11], expected 5, is " - << last_msg_.stub[11]; - EXPECT_EQ(last_msg_.stub[12], 0) - << "incorrect value for last_msg_.stub[12], expected 0, is " - << last_msg_.stub[12]; - EXPECT_EQ(last_msg_.stub[13], 6) - << "incorrect value for last_msg_.stub[13], expected 6, is " - << last_msg_.stub[13]; - EXPECT_EQ(last_msg_.stub[14], 3) - << "incorrect value for last_msg_.stub[14], expected 3, is " - << last_msg_.stub[14]; - EXPECT_EQ(last_msg_.stub[15], 10) - << "incorrect value for last_msg_.stub[15], expected 10, is " - << last_msg_.stub[15]; - EXPECT_EQ(last_msg_.stub[16], 0) - << "incorrect value for last_msg_.stub[16], expected 0, is " - << last_msg_.stub[16]; - EXPECT_EQ(last_msg_.stub[17], 11) - << "incorrect value for last_msg_.stub[17], expected 11, is " - << last_msg_.stub[17]; - EXPECT_EQ(last_msg_.stub[18], 0) - << "incorrect value for last_msg_.stub[18], expected 0, is " - << last_msg_.stub[18]; - EXPECT_EQ(last_msg_.stub[19], 12) - << "incorrect value for last_msg_.stub[19], expected 12, is " - << last_msg_.stub[19]; - EXPECT_EQ(last_msg_.stub[20], 0) - << "incorrect value for last_msg_.stub[20], expected 0, is " - << last_msg_.stub[20]; + EXPECT_EQ(last_msg_.faulty_points[0], 10) + << "incorrect value for last_msg_.faulty_points[0], expected 10, is " + << last_msg_.faulty_points[0]; + EXPECT_EQ(last_msg_.faulty_points[1], 11) + << "incorrect value for last_msg_.faulty_points[1], expected 11, is " + << last_msg_.faulty_points[1]; + EXPECT_EQ(last_msg_.faulty_points[2], 12) + << "incorrect value for last_msg_.faulty_points[2], expected 12, is " + << last_msg_.faulty_points[2]; + EXPECT_EQ(last_msg_.header.chain_id, 6) + << "incorrect value for last_msg_.header.chain_id, expected 6, is " + << last_msg_.header.chain_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.obs_time.tow, 180) + << "incorrect value for last_msg_.header.obs_time.tow, expected 180, is " + << last_msg_.header.obs_time.tow; + EXPECT_EQ(last_msg_.header.obs_time.wn, 3) + << "incorrect value for last_msg_.header.obs_time.wn, expected 3, is " + << last_msg_.header.obs_time.wn; + EXPECT_EQ(last_msg_.header.seq_num, 2) + << "incorrect value for last_msg_.header.seq_num, expected 2, is " + << last_msg_.header.seq_num; + EXPECT_EQ(last_msg_.header.ssr_sol_id, 3) + << "incorrect value for last_msg_.header.ssr_sol_id, expected 3, is " + << last_msg_.header.ssr_sol_id; + EXPECT_EQ(last_msg_.header.tile_id, 5) + << "incorrect value for last_msg_.header.tile_id, expected 5, is " + << last_msg_.header.tile_id; + EXPECT_EQ(last_msg_.header.tile_set_id, 4) + << "incorrect value for last_msg_.header.tile_set_id, expected 4, is " + << last_msg_.header.tile_set_id; + EXPECT_EQ(last_msg_.n_faulty_points, 3) + << "incorrect value for last_msg_.n_faulty_points, expected 3, is " + << last_msg_.n_faulty_points; } diff --git a/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos.cc b/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos.cc index 5458c42075..91580ed51f 100644 --- a/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos.cc +++ b/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos.cc @@ -82,45 +82,21 @@ TEST_F(Test_auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos0, Test) { }; sbp_msg_ssr_flag_iono_tile_sat_los_t test_msg{}; - test_msg.n_stub = 19; - test_msg.stub[0] = 180; - - test_msg.stub[1] = 0; - - test_msg.stub[2] = 0; - - test_msg.stub[3] = 0; - - test_msg.stub[4] = 3; - - test_msg.stub[5] = 0; - - test_msg.stub[6] = 1; - - test_msg.stub[7] = 2; - - test_msg.stub[8] = 3; - - test_msg.stub[9] = 4; - - test_msg.stub[10] = 0; - - test_msg.stub[11] = 5; - - test_msg.stub[12] = 0; - - test_msg.stub[13] = 6; - - test_msg.stub[14] = 2; - - test_msg.stub[15] = 10; - - test_msg.stub[16] = 11; - - test_msg.stub[17] = 15; - - test_msg.stub[18] = 14; + test_msg.faulty_los[0].constellation = 11; + test_msg.faulty_los[0].satId = 10; + + test_msg.faulty_los[1].constellation = 14; + test_msg.faulty_los[1].satId = 15; + test_msg.header.chain_id = 6; + test_msg.header.num_msgs = 1; + test_msg.header.obs_time.tow = 180; + test_msg.header.obs_time.wn = 3; + test_msg.header.seq_num = 2; + test_msg.header.ssr_sol_id = 3; + test_msg.header.tile_id = 5; + test_msg.header.tile_set_id = 4; + test_msg.n_faulty_los = 2; EXPECT_EQ(send_message(66, test_msg), SBP_OK); @@ -134,64 +110,45 @@ TEST_F(Test_auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_, test_msg); - EXPECT_EQ(last_msg_.n_stub, 19) - << "incorrect value for last_msg_.n_stub, expected 19, is " - << last_msg_.n_stub; - EXPECT_EQ(last_msg_.stub[0], 180) - << "incorrect value for last_msg_.stub[0], expected 180, is " - << last_msg_.stub[0]; - EXPECT_EQ(last_msg_.stub[1], 0) - << "incorrect value for last_msg_.stub[1], expected 0, is " - << last_msg_.stub[1]; - EXPECT_EQ(last_msg_.stub[2], 0) - << "incorrect value for last_msg_.stub[2], expected 0, is " - << last_msg_.stub[2]; - EXPECT_EQ(last_msg_.stub[3], 0) - << "incorrect value for last_msg_.stub[3], expected 0, is " - << last_msg_.stub[3]; - EXPECT_EQ(last_msg_.stub[4], 3) - << "incorrect value for last_msg_.stub[4], expected 3, is " - << last_msg_.stub[4]; - EXPECT_EQ(last_msg_.stub[5], 0) - << "incorrect value for last_msg_.stub[5], expected 0, is " - << last_msg_.stub[5]; - EXPECT_EQ(last_msg_.stub[6], 1) - << "incorrect value for last_msg_.stub[6], expected 1, is " - << last_msg_.stub[6]; - EXPECT_EQ(last_msg_.stub[7], 2) - << "incorrect value for last_msg_.stub[7], expected 2, is " - << last_msg_.stub[7]; - EXPECT_EQ(last_msg_.stub[8], 3) - << "incorrect value for last_msg_.stub[8], expected 3, is " - << last_msg_.stub[8]; - EXPECT_EQ(last_msg_.stub[9], 4) - << "incorrect value for last_msg_.stub[9], expected 4, is " - << last_msg_.stub[9]; - EXPECT_EQ(last_msg_.stub[10], 0) - << "incorrect value for last_msg_.stub[10], expected 0, is " - << last_msg_.stub[10]; - EXPECT_EQ(last_msg_.stub[11], 5) - << "incorrect value for last_msg_.stub[11], expected 5, is " - << last_msg_.stub[11]; - EXPECT_EQ(last_msg_.stub[12], 0) - << "incorrect value for last_msg_.stub[12], expected 0, is " - << last_msg_.stub[12]; - EXPECT_EQ(last_msg_.stub[13], 6) - << "incorrect value for last_msg_.stub[13], expected 6, is " - << last_msg_.stub[13]; - EXPECT_EQ(last_msg_.stub[14], 2) - << "incorrect value for last_msg_.stub[14], expected 2, is " - << last_msg_.stub[14]; - EXPECT_EQ(last_msg_.stub[15], 10) - << "incorrect value for last_msg_.stub[15], expected 10, is " - << last_msg_.stub[15]; - EXPECT_EQ(last_msg_.stub[16], 11) - << "incorrect value for last_msg_.stub[16], expected 11, is " - << last_msg_.stub[16]; - EXPECT_EQ(last_msg_.stub[17], 15) - << "incorrect value for last_msg_.stub[17], expected 15, is " - << last_msg_.stub[17]; - EXPECT_EQ(last_msg_.stub[18], 14) - << "incorrect value for last_msg_.stub[18], expected 14, is " - << last_msg_.stub[18]; + EXPECT_EQ(last_msg_.faulty_los[0].constellation, 11) + << "incorrect value for last_msg_.faulty_los[0].constellation, expected " + "11, is " + << last_msg_.faulty_los[0].constellation; + EXPECT_EQ(last_msg_.faulty_los[0].satId, 10) + << "incorrect value for last_msg_.faulty_los[0].satId, expected 10, is " + << last_msg_.faulty_los[0].satId; + EXPECT_EQ(last_msg_.faulty_los[1].constellation, 14) + << "incorrect value for last_msg_.faulty_los[1].constellation, expected " + "14, is " + << last_msg_.faulty_los[1].constellation; + EXPECT_EQ(last_msg_.faulty_los[1].satId, 15) + << "incorrect value for last_msg_.faulty_los[1].satId, expected 15, is " + << last_msg_.faulty_los[1].satId; + EXPECT_EQ(last_msg_.header.chain_id, 6) + << "incorrect value for last_msg_.header.chain_id, expected 6, is " + << last_msg_.header.chain_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.obs_time.tow, 180) + << "incorrect value for last_msg_.header.obs_time.tow, expected 180, is " + << last_msg_.header.obs_time.tow; + EXPECT_EQ(last_msg_.header.obs_time.wn, 3) + << "incorrect value for last_msg_.header.obs_time.wn, expected 3, is " + << last_msg_.header.obs_time.wn; + EXPECT_EQ(last_msg_.header.seq_num, 2) + << "incorrect value for last_msg_.header.seq_num, expected 2, is " + << last_msg_.header.seq_num; + EXPECT_EQ(last_msg_.header.ssr_sol_id, 3) + << "incorrect value for last_msg_.header.ssr_sol_id, expected 3, is " + << last_msg_.header.ssr_sol_id; + EXPECT_EQ(last_msg_.header.tile_id, 5) + << "incorrect value for last_msg_.header.tile_id, expected 5, is " + << last_msg_.header.tile_id; + EXPECT_EQ(last_msg_.header.tile_set_id, 4) + << "incorrect value for last_msg_.header.tile_set_id, expected 4, is " + << last_msg_.header.tile_set_id; + EXPECT_EQ(last_msg_.n_faulty_los, 2) + << "incorrect value for last_msg_.n_faulty_los, expected 2, is " + << last_msg_.n_faulty_los; } diff --git a/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagSatellites.cc b/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagSatellites.cc index c12ee07271..6f2f141fb3 100644 --- a/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagSatellites.cc +++ b/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagSatellites.cc @@ -81,37 +81,20 @@ TEST_F(Test_auto_check_sbp_integrity_MsgSsrFlagSatellites0, Test) { }; sbp_msg_ssr_flag_satellites_t test_msg{}; - test_msg.n_stub = 15; + test_msg.chain_id = 4; + test_msg.const_id = 5; - test_msg.stub[0] = 180; + test_msg.faulty_sats[0] = 10; - test_msg.stub[1] = 0; + test_msg.faulty_sats[1] = 11; - test_msg.stub[2] = 0; - - test_msg.stub[3] = 0; - - test_msg.stub[4] = 3; - - test_msg.stub[5] = 0; - - test_msg.stub[6] = 1; - - test_msg.stub[7] = 2; - - test_msg.stub[8] = 3; - - test_msg.stub[9] = 4; - - test_msg.stub[10] = 5; - - test_msg.stub[11] = 3; - - test_msg.stub[12] = 10; - - test_msg.stub[13] = 11; - - test_msg.stub[14] = 12; + test_msg.faulty_sats[2] = 12; + test_msg.n_faulty_sats = 3; + test_msg.num_msgs = 1; + test_msg.obs_time.tow = 180; + test_msg.obs_time.wn = 3; + test_msg.seq_num = 2; + test_msg.ssr_sol_id = 3; EXPECT_EQ(send_message(66, test_msg), SBP_OK); @@ -125,52 +108,37 @@ TEST_F(Test_auto_check_sbp_integrity_MsgSsrFlagSatellites0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_, test_msg); - EXPECT_EQ(last_msg_.n_stub, 15) - << "incorrect value for last_msg_.n_stub, expected 15, is " - << last_msg_.n_stub; - EXPECT_EQ(last_msg_.stub[0], 180) - << "incorrect value for last_msg_.stub[0], expected 180, is " - << last_msg_.stub[0]; - EXPECT_EQ(last_msg_.stub[1], 0) - << "incorrect value for last_msg_.stub[1], expected 0, is " - << last_msg_.stub[1]; - EXPECT_EQ(last_msg_.stub[2], 0) - << "incorrect value for last_msg_.stub[2], expected 0, is " - << last_msg_.stub[2]; - EXPECT_EQ(last_msg_.stub[3], 0) - << "incorrect value for last_msg_.stub[3], expected 0, is " - << last_msg_.stub[3]; - EXPECT_EQ(last_msg_.stub[4], 3) - << "incorrect value for last_msg_.stub[4], expected 3, is " - << last_msg_.stub[4]; - EXPECT_EQ(last_msg_.stub[5], 0) - << "incorrect value for last_msg_.stub[5], expected 0, is " - << last_msg_.stub[5]; - EXPECT_EQ(last_msg_.stub[6], 1) - << "incorrect value for last_msg_.stub[6], expected 1, is " - << last_msg_.stub[6]; - EXPECT_EQ(last_msg_.stub[7], 2) - << "incorrect value for last_msg_.stub[7], expected 2, is " - << last_msg_.stub[7]; - EXPECT_EQ(last_msg_.stub[8], 3) - << "incorrect value for last_msg_.stub[8], expected 3, is " - << last_msg_.stub[8]; - EXPECT_EQ(last_msg_.stub[9], 4) - << "incorrect value for last_msg_.stub[9], expected 4, is " - << last_msg_.stub[9]; - EXPECT_EQ(last_msg_.stub[10], 5) - << "incorrect value for last_msg_.stub[10], expected 5, is " - << last_msg_.stub[10]; - EXPECT_EQ(last_msg_.stub[11], 3) - << "incorrect value for last_msg_.stub[11], expected 3, is " - << last_msg_.stub[11]; - EXPECT_EQ(last_msg_.stub[12], 10) - << "incorrect value for last_msg_.stub[12], expected 10, is " - << last_msg_.stub[12]; - EXPECT_EQ(last_msg_.stub[13], 11) - << "incorrect value for last_msg_.stub[13], expected 11, is " - << last_msg_.stub[13]; - EXPECT_EQ(last_msg_.stub[14], 12) - << "incorrect value for last_msg_.stub[14], expected 12, is " - << last_msg_.stub[14]; + EXPECT_EQ(last_msg_.chain_id, 4) + << "incorrect value for last_msg_.chain_id, expected 4, is " + << last_msg_.chain_id; + EXPECT_EQ(last_msg_.const_id, 5) + << "incorrect value for last_msg_.const_id, expected 5, is " + << last_msg_.const_id; + EXPECT_EQ(last_msg_.faulty_sats[0], 10) + << "incorrect value for last_msg_.faulty_sats[0], expected 10, is " + << last_msg_.faulty_sats[0]; + EXPECT_EQ(last_msg_.faulty_sats[1], 11) + << "incorrect value for last_msg_.faulty_sats[1], expected 11, is " + << last_msg_.faulty_sats[1]; + EXPECT_EQ(last_msg_.faulty_sats[2], 12) + << "incorrect value for last_msg_.faulty_sats[2], expected 12, is " + << last_msg_.faulty_sats[2]; + EXPECT_EQ(last_msg_.n_faulty_sats, 3) + << "incorrect value for last_msg_.n_faulty_sats, expected 3, is " + << last_msg_.n_faulty_sats; + EXPECT_EQ(last_msg_.num_msgs, 1) + << "incorrect value for last_msg_.num_msgs, expected 1, is " + << last_msg_.num_msgs; + EXPECT_EQ(last_msg_.obs_time.tow, 180) + << "incorrect value for last_msg_.obs_time.tow, expected 180, is " + << last_msg_.obs_time.tow; + EXPECT_EQ(last_msg_.obs_time.wn, 3) + << "incorrect value for last_msg_.obs_time.wn, expected 3, is " + << last_msg_.obs_time.wn; + EXPECT_EQ(last_msg_.seq_num, 2) + << "incorrect value for last_msg_.seq_num, expected 2, is " + << last_msg_.seq_num; + EXPECT_EQ(last_msg_.ssr_sol_id, 3) + << "incorrect value for last_msg_.ssr_sol_id, expected 3, is " + << last_msg_.ssr_sol_id; } diff --git a/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints.cc b/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints.cc index 068d523805..061cd6e850 100644 --- a/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints.cc +++ b/c/test/cpp/auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints.cc @@ -82,49 +82,21 @@ TEST_F(Test_auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints0, Test) { }; sbp_msg_ssr_flag_tropo_grid_points_t test_msg{}; - test_msg.n_stub = 21; - test_msg.stub[0] = 180; + test_msg.faulty_points[0] = 10; - test_msg.stub[1] = 0; + test_msg.faulty_points[1] = 11; - test_msg.stub[2] = 0; - - test_msg.stub[3] = 0; - - test_msg.stub[4] = 3; - - test_msg.stub[5] = 0; - - test_msg.stub[6] = 1; - - test_msg.stub[7] = 2; - - test_msg.stub[8] = 3; - - test_msg.stub[9] = 4; - - test_msg.stub[10] = 0; - - test_msg.stub[11] = 5; - - test_msg.stub[12] = 0; - - test_msg.stub[13] = 6; - - test_msg.stub[14] = 3; - - test_msg.stub[15] = 10; - - test_msg.stub[16] = 0; - - test_msg.stub[17] = 11; - - test_msg.stub[18] = 0; - - test_msg.stub[19] = 12; - - test_msg.stub[20] = 0; + test_msg.faulty_points[2] = 12; + test_msg.header.chain_id = 6; + test_msg.header.num_msgs = 1; + test_msg.header.obs_time.tow = 180; + test_msg.header.obs_time.wn = 3; + test_msg.header.seq_num = 2; + test_msg.header.ssr_sol_id = 3; + test_msg.header.tile_id = 5; + test_msg.header.tile_set_id = 4; + test_msg.n_faulty_points = 3; EXPECT_EQ(send_message(66, test_msg), SBP_OK); @@ -138,70 +110,40 @@ TEST_F(Test_auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_, test_msg); - EXPECT_EQ(last_msg_.n_stub, 21) - << "incorrect value for last_msg_.n_stub, expected 21, is " - << last_msg_.n_stub; - EXPECT_EQ(last_msg_.stub[0], 180) - << "incorrect value for last_msg_.stub[0], expected 180, is " - << last_msg_.stub[0]; - EXPECT_EQ(last_msg_.stub[1], 0) - << "incorrect value for last_msg_.stub[1], expected 0, is " - << last_msg_.stub[1]; - EXPECT_EQ(last_msg_.stub[2], 0) - << "incorrect value for last_msg_.stub[2], expected 0, is " - << last_msg_.stub[2]; - EXPECT_EQ(last_msg_.stub[3], 0) - << "incorrect value for last_msg_.stub[3], expected 0, is " - << last_msg_.stub[3]; - EXPECT_EQ(last_msg_.stub[4], 3) - << "incorrect value for last_msg_.stub[4], expected 3, is " - << last_msg_.stub[4]; - EXPECT_EQ(last_msg_.stub[5], 0) - << "incorrect value for last_msg_.stub[5], expected 0, is " - << last_msg_.stub[5]; - EXPECT_EQ(last_msg_.stub[6], 1) - << "incorrect value for last_msg_.stub[6], expected 1, is " - << last_msg_.stub[6]; - EXPECT_EQ(last_msg_.stub[7], 2) - << "incorrect value for last_msg_.stub[7], expected 2, is " - << last_msg_.stub[7]; - EXPECT_EQ(last_msg_.stub[8], 3) - << "incorrect value for last_msg_.stub[8], expected 3, is " - << last_msg_.stub[8]; - EXPECT_EQ(last_msg_.stub[9], 4) - << "incorrect value for last_msg_.stub[9], expected 4, is " - << last_msg_.stub[9]; - EXPECT_EQ(last_msg_.stub[10], 0) - << "incorrect value for last_msg_.stub[10], expected 0, is " - << last_msg_.stub[10]; - EXPECT_EQ(last_msg_.stub[11], 5) - << "incorrect value for last_msg_.stub[11], expected 5, is " - << last_msg_.stub[11]; - EXPECT_EQ(last_msg_.stub[12], 0) - << "incorrect value for last_msg_.stub[12], expected 0, is " - << last_msg_.stub[12]; - EXPECT_EQ(last_msg_.stub[13], 6) - << "incorrect value for last_msg_.stub[13], expected 6, is " - << last_msg_.stub[13]; - EXPECT_EQ(last_msg_.stub[14], 3) - << "incorrect value for last_msg_.stub[14], expected 3, is " - << last_msg_.stub[14]; - EXPECT_EQ(last_msg_.stub[15], 10) - << "incorrect value for last_msg_.stub[15], expected 10, is " - << last_msg_.stub[15]; - EXPECT_EQ(last_msg_.stub[16], 0) - << "incorrect value for last_msg_.stub[16], expected 0, is " - << last_msg_.stub[16]; - EXPECT_EQ(last_msg_.stub[17], 11) - << "incorrect value for last_msg_.stub[17], expected 11, is " - << last_msg_.stub[17]; - EXPECT_EQ(last_msg_.stub[18], 0) - << "incorrect value for last_msg_.stub[18], expected 0, is " - << last_msg_.stub[18]; - EXPECT_EQ(last_msg_.stub[19], 12) - << "incorrect value for last_msg_.stub[19], expected 12, is " - << last_msg_.stub[19]; - EXPECT_EQ(last_msg_.stub[20], 0) - << "incorrect value for last_msg_.stub[20], expected 0, is " - << last_msg_.stub[20]; + EXPECT_EQ(last_msg_.faulty_points[0], 10) + << "incorrect value for last_msg_.faulty_points[0], expected 10, is " + << last_msg_.faulty_points[0]; + EXPECT_EQ(last_msg_.faulty_points[1], 11) + << "incorrect value for last_msg_.faulty_points[1], expected 11, is " + << last_msg_.faulty_points[1]; + EXPECT_EQ(last_msg_.faulty_points[2], 12) + << "incorrect value for last_msg_.faulty_points[2], expected 12, is " + << last_msg_.faulty_points[2]; + EXPECT_EQ(last_msg_.header.chain_id, 6) + << "incorrect value for last_msg_.header.chain_id, expected 6, is " + << last_msg_.header.chain_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.obs_time.tow, 180) + << "incorrect value for last_msg_.header.obs_time.tow, expected 180, is " + << last_msg_.header.obs_time.tow; + EXPECT_EQ(last_msg_.header.obs_time.wn, 3) + << "incorrect value for last_msg_.header.obs_time.wn, expected 3, is " + << last_msg_.header.obs_time.wn; + EXPECT_EQ(last_msg_.header.seq_num, 2) + << "incorrect value for last_msg_.header.seq_num, expected 2, is " + << last_msg_.header.seq_num; + EXPECT_EQ(last_msg_.header.ssr_sol_id, 3) + << "incorrect value for last_msg_.header.ssr_sol_id, expected 3, is " + << last_msg_.header.ssr_sol_id; + EXPECT_EQ(last_msg_.header.tile_id, 5) + << "incorrect value for last_msg_.header.tile_id, expected 5, is " + << last_msg_.header.tile_id; + EXPECT_EQ(last_msg_.header.tile_set_id, 4) + << "incorrect value for last_msg_.header.tile_set_id, expected 4, is " + << last_msg_.header.tile_set_id; + EXPECT_EQ(last_msg_.n_faulty_points, 3) + << "incorrect value for last_msg_.n_faulty_points, expected 3, is " + << last_msg_.n_faulty_points; } diff --git a/c/test/cpp/auto_check_sbp_navigation_MsgReferenceFrameParam.cc b/c/test/cpp/auto_check_sbp_navigation_MsgReferenceFrameParam.cc index 105c6389d0..5b11ca773a 100644 --- a/c/test/cpp/auto_check_sbp_navigation_MsgReferenceFrameParam.cc +++ b/c/test/cpp/auto_check_sbp_navigation_MsgReferenceFrameParam.cc @@ -76,266 +76,53 @@ class Test_auto_check_sbp_navigation_MsgReferenceFrameParam0 TEST_F(Test_auto_check_sbp_navigation_MsgReferenceFrameParam0, Test) { uint8_t encoded_frame[] = { - 85, 68, 2, 66, 0, 124, 1, 2, 102, 111, 111, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 5, 0, 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, - 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, - 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, - 0, 18, 0, 0, 0, 19, 0, 0, 0, 20, 0, 66, 126, + 85, 68, 2, 66, 0, 124, 1, 102, 111, 111, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 5, 0, 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, + 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, + 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, + 0, 18, 0, 0, 0, 19, 0, 0, 0, 20, 0, 6, 161, }; sbp_msg_reference_frame_param_t test_msg{}; - test_msg.n_stub = 124; - - test_msg.stub[0] = 1; - - test_msg.stub[1] = 2; - - test_msg.stub[2] = 102; - - test_msg.stub[3] = 111; - - test_msg.stub[4] = 111; - - test_msg.stub[5] = 0; - - test_msg.stub[6] = 0; - - test_msg.stub[7] = 0; - - test_msg.stub[8] = 0; - - test_msg.stub[9] = 0; - - test_msg.stub[10] = 0; - - test_msg.stub[11] = 0; - - test_msg.stub[12] = 0; - - test_msg.stub[13] = 0; - - test_msg.stub[14] = 0; - - test_msg.stub[15] = 0; - - test_msg.stub[16] = 0; - - test_msg.stub[17] = 0; - - test_msg.stub[18] = 0; - - test_msg.stub[19] = 0; - - test_msg.stub[20] = 0; - - test_msg.stub[21] = 0; - - test_msg.stub[22] = 0; - - test_msg.stub[23] = 0; - - test_msg.stub[24] = 0; - - test_msg.stub[25] = 0; - - test_msg.stub[26] = 0; - - test_msg.stub[27] = 0; - - test_msg.stub[28] = 0; - - test_msg.stub[29] = 0; - - test_msg.stub[30] = 0; - - test_msg.stub[31] = 0; - - test_msg.stub[32] = 0; - - test_msg.stub[33] = 3; - - test_msg.stub[34] = 98; - - test_msg.stub[35] = 97; - - test_msg.stub[36] = 114; - - test_msg.stub[37] = 0; - - test_msg.stub[38] = 0; - - test_msg.stub[39] = 0; - - test_msg.stub[40] = 0; - - test_msg.stub[41] = 0; - - test_msg.stub[42] = 0; - - test_msg.stub[43] = 0; - - test_msg.stub[44] = 0; - - test_msg.stub[45] = 0; - - test_msg.stub[46] = 0; - - test_msg.stub[47] = 0; - - test_msg.stub[48] = 0; - - test_msg.stub[49] = 0; - - test_msg.stub[50] = 0; - - test_msg.stub[51] = 0; - - test_msg.stub[52] = 0; - - test_msg.stub[53] = 0; - - test_msg.stub[54] = 0; - - test_msg.stub[55] = 0; - - test_msg.stub[56] = 0; - - test_msg.stub[57] = 0; - - test_msg.stub[58] = 0; - - test_msg.stub[59] = 0; - - test_msg.stub[60] = 0; - - test_msg.stub[61] = 0; - - test_msg.stub[62] = 0; - - test_msg.stub[63] = 0; - - test_msg.stub[64] = 0; - - test_msg.stub[65] = 4; - - test_msg.stub[66] = 5; - - test_msg.stub[67] = 0; - - test_msg.stub[68] = 6; - - test_msg.stub[69] = 0; - - test_msg.stub[70] = 7; - - test_msg.stub[71] = 0; - - test_msg.stub[72] = 0; - - test_msg.stub[73] = 0; - - test_msg.stub[74] = 8; - - test_msg.stub[75] = 0; - - test_msg.stub[76] = 0; - - test_msg.stub[77] = 0; - - test_msg.stub[78] = 9; - - test_msg.stub[79] = 0; - - test_msg.stub[80] = 0; - - test_msg.stub[81] = 0; - - test_msg.stub[82] = 10; - - test_msg.stub[83] = 0; - - test_msg.stub[84] = 0; - - test_msg.stub[85] = 0; - - test_msg.stub[86] = 11; - - test_msg.stub[87] = 0; - - test_msg.stub[88] = 0; - - test_msg.stub[89] = 0; - - test_msg.stub[90] = 12; - - test_msg.stub[91] = 0; - - test_msg.stub[92] = 0; - - test_msg.stub[93] = 0; - - test_msg.stub[94] = 13; - - test_msg.stub[95] = 0; - - test_msg.stub[96] = 0; - - test_msg.stub[97] = 0; - - test_msg.stub[98] = 14; - - test_msg.stub[99] = 0; - - test_msg.stub[100] = 0; - - test_msg.stub[101] = 0; - - test_msg.stub[102] = 15; - - test_msg.stub[103] = 0; - - test_msg.stub[104] = 0; - - test_msg.stub[105] = 0; - - test_msg.stub[106] = 16; - - test_msg.stub[107] = 0; - - test_msg.stub[108] = 0; - - test_msg.stub[109] = 0; - - test_msg.stub[110] = 17; - - test_msg.stub[111] = 0; - - test_msg.stub[112] = 0; - - test_msg.stub[113] = 0; - - test_msg.stub[114] = 18; - - test_msg.stub[115] = 0; - - test_msg.stub[116] = 0; - - test_msg.stub[117] = 0; - - test_msg.stub[118] = 19; - - test_msg.stub[119] = 0; - - test_msg.stub[120] = 0; - - test_msg.stub[121] = 0; - - test_msg.stub[122] = 20; - - test_msg.stub[123] = 0; + test_msg.delta_X0 = 7; + test_msg.delta_Y0 = 8; + test_msg.delta_Z0 = 9; + test_msg.dot_delta_X0 = 14; + test_msg.dot_delta_Y0 = 15; + test_msg.dot_delta_Z0 = 16; + test_msg.dot_scale = 20; + test_msg.dot_theta_01 = 17; + test_msg.dot_theta_02 = 18; + test_msg.dot_theta_03 = 19; + test_msg.re_t0 = 6; + test_msg.scale = 13; + test_msg.sin = 4; + { + const char assign_string[] = { + (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0}; + memcpy(test_msg.sn, assign_string, sizeof(assign_string)); + } + test_msg.ssr_iod = 1; + test_msg.theta_01 = 10; + test_msg.theta_02 = 11; + test_msg.theta_03 = 12; + { + const char assign_string[] = { + (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0}; + memcpy(test_msg.tn, assign_string, sizeof(assign_string)); + } + test_msg.utn = 5; EXPECT_EQ(send_message(66, test_msg), SBP_OK); @@ -349,379 +136,78 @@ TEST_F(Test_auto_check_sbp_navigation_MsgReferenceFrameParam0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_, test_msg); - EXPECT_EQ(last_msg_.n_stub, 124) - << "incorrect value for last_msg_.n_stub, expected 124, is " - << last_msg_.n_stub; - EXPECT_EQ(last_msg_.stub[0], 1) - << "incorrect value for last_msg_.stub[0], expected 1, is " - << last_msg_.stub[0]; - EXPECT_EQ(last_msg_.stub[1], 2) - << "incorrect value for last_msg_.stub[1], expected 2, is " - << last_msg_.stub[1]; - EXPECT_EQ(last_msg_.stub[2], 102) - << "incorrect value for last_msg_.stub[2], expected 102, is " - << last_msg_.stub[2]; - EXPECT_EQ(last_msg_.stub[3], 111) - << "incorrect value for last_msg_.stub[3], expected 111, is " - << last_msg_.stub[3]; - EXPECT_EQ(last_msg_.stub[4], 111) - << "incorrect value for last_msg_.stub[4], expected 111, is " - << last_msg_.stub[4]; - EXPECT_EQ(last_msg_.stub[5], 0) - << "incorrect value for last_msg_.stub[5], expected 0, is " - << last_msg_.stub[5]; - EXPECT_EQ(last_msg_.stub[6], 0) - << "incorrect value for last_msg_.stub[6], expected 0, is " - << last_msg_.stub[6]; - EXPECT_EQ(last_msg_.stub[7], 0) - << "incorrect value for last_msg_.stub[7], expected 0, is " - << last_msg_.stub[7]; - EXPECT_EQ(last_msg_.stub[8], 0) - << "incorrect value for last_msg_.stub[8], expected 0, is " - << last_msg_.stub[8]; - EXPECT_EQ(last_msg_.stub[9], 0) - << "incorrect value for last_msg_.stub[9], expected 0, is " - << last_msg_.stub[9]; - EXPECT_EQ(last_msg_.stub[10], 0) - << "incorrect value for last_msg_.stub[10], expected 0, is " - << last_msg_.stub[10]; - EXPECT_EQ(last_msg_.stub[11], 0) - << "incorrect value for last_msg_.stub[11], expected 0, is " - << last_msg_.stub[11]; - EXPECT_EQ(last_msg_.stub[12], 0) - << "incorrect value for last_msg_.stub[12], expected 0, is " - << last_msg_.stub[12]; - EXPECT_EQ(last_msg_.stub[13], 0) - << "incorrect value for last_msg_.stub[13], expected 0, is " - << last_msg_.stub[13]; - EXPECT_EQ(last_msg_.stub[14], 0) - << "incorrect value for last_msg_.stub[14], expected 0, is " - << last_msg_.stub[14]; - EXPECT_EQ(last_msg_.stub[15], 0) - << "incorrect value for last_msg_.stub[15], expected 0, is " - << last_msg_.stub[15]; - EXPECT_EQ(last_msg_.stub[16], 0) - << "incorrect value for last_msg_.stub[16], expected 0, is " - << last_msg_.stub[16]; - EXPECT_EQ(last_msg_.stub[17], 0) - << "incorrect value for last_msg_.stub[17], expected 0, is " - << last_msg_.stub[17]; - EXPECT_EQ(last_msg_.stub[18], 0) - << "incorrect value for last_msg_.stub[18], expected 0, is " - << last_msg_.stub[18]; - EXPECT_EQ(last_msg_.stub[19], 0) - << "incorrect value for last_msg_.stub[19], expected 0, is " - << last_msg_.stub[19]; - EXPECT_EQ(last_msg_.stub[20], 0) - << "incorrect value for last_msg_.stub[20], expected 0, is " - << last_msg_.stub[20]; - EXPECT_EQ(last_msg_.stub[21], 0) - << "incorrect value for last_msg_.stub[21], expected 0, is " - << last_msg_.stub[21]; - EXPECT_EQ(last_msg_.stub[22], 0) - << "incorrect value for last_msg_.stub[22], expected 0, is " - << last_msg_.stub[22]; - EXPECT_EQ(last_msg_.stub[23], 0) - << "incorrect value for last_msg_.stub[23], expected 0, is " - << last_msg_.stub[23]; - EXPECT_EQ(last_msg_.stub[24], 0) - << "incorrect value for last_msg_.stub[24], expected 0, is " - << last_msg_.stub[24]; - EXPECT_EQ(last_msg_.stub[25], 0) - << "incorrect value for last_msg_.stub[25], expected 0, is " - << last_msg_.stub[25]; - EXPECT_EQ(last_msg_.stub[26], 0) - << "incorrect value for last_msg_.stub[26], expected 0, is " - << last_msg_.stub[26]; - EXPECT_EQ(last_msg_.stub[27], 0) - << "incorrect value for last_msg_.stub[27], expected 0, is " - << last_msg_.stub[27]; - EXPECT_EQ(last_msg_.stub[28], 0) - << "incorrect value for last_msg_.stub[28], expected 0, is " - << last_msg_.stub[28]; - EXPECT_EQ(last_msg_.stub[29], 0) - << "incorrect value for last_msg_.stub[29], expected 0, is " - << last_msg_.stub[29]; - EXPECT_EQ(last_msg_.stub[30], 0) - << "incorrect value for last_msg_.stub[30], expected 0, is " - << last_msg_.stub[30]; - EXPECT_EQ(last_msg_.stub[31], 0) - << "incorrect value for last_msg_.stub[31], expected 0, is " - << last_msg_.stub[31]; - EXPECT_EQ(last_msg_.stub[32], 0) - << "incorrect value for last_msg_.stub[32], expected 0, is " - << last_msg_.stub[32]; - EXPECT_EQ(last_msg_.stub[33], 3) - << "incorrect value for last_msg_.stub[33], expected 3, is " - << last_msg_.stub[33]; - EXPECT_EQ(last_msg_.stub[34], 98) - << "incorrect value for last_msg_.stub[34], expected 98, is " - << last_msg_.stub[34]; - EXPECT_EQ(last_msg_.stub[35], 97) - << "incorrect value for last_msg_.stub[35], expected 97, is " - << last_msg_.stub[35]; - EXPECT_EQ(last_msg_.stub[36], 114) - << "incorrect value for last_msg_.stub[36], expected 114, is " - << last_msg_.stub[36]; - EXPECT_EQ(last_msg_.stub[37], 0) - << "incorrect value for last_msg_.stub[37], expected 0, is " - << last_msg_.stub[37]; - EXPECT_EQ(last_msg_.stub[38], 0) - << "incorrect value for last_msg_.stub[38], expected 0, is " - << last_msg_.stub[38]; - EXPECT_EQ(last_msg_.stub[39], 0) - << "incorrect value for last_msg_.stub[39], expected 0, is " - << last_msg_.stub[39]; - EXPECT_EQ(last_msg_.stub[40], 0) - << "incorrect value for last_msg_.stub[40], expected 0, is " - << last_msg_.stub[40]; - EXPECT_EQ(last_msg_.stub[41], 0) - << "incorrect value for last_msg_.stub[41], expected 0, is " - << last_msg_.stub[41]; - EXPECT_EQ(last_msg_.stub[42], 0) - << "incorrect value for last_msg_.stub[42], expected 0, is " - << last_msg_.stub[42]; - EXPECT_EQ(last_msg_.stub[43], 0) - << "incorrect value for last_msg_.stub[43], expected 0, is " - << last_msg_.stub[43]; - EXPECT_EQ(last_msg_.stub[44], 0) - << "incorrect value for last_msg_.stub[44], expected 0, is " - << last_msg_.stub[44]; - EXPECT_EQ(last_msg_.stub[45], 0) - << "incorrect value for last_msg_.stub[45], expected 0, is " - << last_msg_.stub[45]; - EXPECT_EQ(last_msg_.stub[46], 0) - << "incorrect value for last_msg_.stub[46], expected 0, is " - << last_msg_.stub[46]; - EXPECT_EQ(last_msg_.stub[47], 0) - << "incorrect value for last_msg_.stub[47], expected 0, is " - << last_msg_.stub[47]; - EXPECT_EQ(last_msg_.stub[48], 0) - << "incorrect value for last_msg_.stub[48], expected 0, is " - << last_msg_.stub[48]; - EXPECT_EQ(last_msg_.stub[49], 0) - << "incorrect value for last_msg_.stub[49], expected 0, is " - << last_msg_.stub[49]; - EXPECT_EQ(last_msg_.stub[50], 0) - << "incorrect value for last_msg_.stub[50], expected 0, is " - << last_msg_.stub[50]; - EXPECT_EQ(last_msg_.stub[51], 0) - << "incorrect value for last_msg_.stub[51], expected 0, is " - << last_msg_.stub[51]; - EXPECT_EQ(last_msg_.stub[52], 0) - << "incorrect value for last_msg_.stub[52], expected 0, is " - << last_msg_.stub[52]; - EXPECT_EQ(last_msg_.stub[53], 0) - << "incorrect value for last_msg_.stub[53], expected 0, is " - << last_msg_.stub[53]; - EXPECT_EQ(last_msg_.stub[54], 0) - << "incorrect value for last_msg_.stub[54], expected 0, is " - << last_msg_.stub[54]; - EXPECT_EQ(last_msg_.stub[55], 0) - << "incorrect value for last_msg_.stub[55], expected 0, is " - << last_msg_.stub[55]; - EXPECT_EQ(last_msg_.stub[56], 0) - << "incorrect value for last_msg_.stub[56], expected 0, is " - << last_msg_.stub[56]; - EXPECT_EQ(last_msg_.stub[57], 0) - << "incorrect value for last_msg_.stub[57], expected 0, is " - << last_msg_.stub[57]; - EXPECT_EQ(last_msg_.stub[58], 0) - << "incorrect value for last_msg_.stub[58], expected 0, is " - << last_msg_.stub[58]; - EXPECT_EQ(last_msg_.stub[59], 0) - << "incorrect value for last_msg_.stub[59], expected 0, is " - << last_msg_.stub[59]; - EXPECT_EQ(last_msg_.stub[60], 0) - << "incorrect value for last_msg_.stub[60], expected 0, is " - << last_msg_.stub[60]; - EXPECT_EQ(last_msg_.stub[61], 0) - << "incorrect value for last_msg_.stub[61], expected 0, is " - << last_msg_.stub[61]; - EXPECT_EQ(last_msg_.stub[62], 0) - << "incorrect value for last_msg_.stub[62], expected 0, is " - << last_msg_.stub[62]; - EXPECT_EQ(last_msg_.stub[63], 0) - << "incorrect value for last_msg_.stub[63], expected 0, is " - << last_msg_.stub[63]; - EXPECT_EQ(last_msg_.stub[64], 0) - << "incorrect value for last_msg_.stub[64], expected 0, is " - << last_msg_.stub[64]; - EXPECT_EQ(last_msg_.stub[65], 4) - << "incorrect value for last_msg_.stub[65], expected 4, is " - << last_msg_.stub[65]; - EXPECT_EQ(last_msg_.stub[66], 5) - << "incorrect value for last_msg_.stub[66], expected 5, is " - << last_msg_.stub[66]; - EXPECT_EQ(last_msg_.stub[67], 0) - << "incorrect value for last_msg_.stub[67], expected 0, is " - << last_msg_.stub[67]; - EXPECT_EQ(last_msg_.stub[68], 6) - << "incorrect value for last_msg_.stub[68], expected 6, is " - << last_msg_.stub[68]; - EXPECT_EQ(last_msg_.stub[69], 0) - << "incorrect value for last_msg_.stub[69], expected 0, is " - << last_msg_.stub[69]; - EXPECT_EQ(last_msg_.stub[70], 7) - << "incorrect value for last_msg_.stub[70], expected 7, is " - << last_msg_.stub[70]; - EXPECT_EQ(last_msg_.stub[71], 0) - << "incorrect value for last_msg_.stub[71], expected 0, is " - << last_msg_.stub[71]; - EXPECT_EQ(last_msg_.stub[72], 0) - << "incorrect value for last_msg_.stub[72], expected 0, is " - << last_msg_.stub[72]; - EXPECT_EQ(last_msg_.stub[73], 0) - << "incorrect value for last_msg_.stub[73], expected 0, is " - << last_msg_.stub[73]; - EXPECT_EQ(last_msg_.stub[74], 8) - << "incorrect value for last_msg_.stub[74], expected 8, is " - << last_msg_.stub[74]; - EXPECT_EQ(last_msg_.stub[75], 0) - << "incorrect value for last_msg_.stub[75], expected 0, is " - << last_msg_.stub[75]; - EXPECT_EQ(last_msg_.stub[76], 0) - << "incorrect value for last_msg_.stub[76], expected 0, is " - << last_msg_.stub[76]; - EXPECT_EQ(last_msg_.stub[77], 0) - << "incorrect value for last_msg_.stub[77], expected 0, is " - << last_msg_.stub[77]; - EXPECT_EQ(last_msg_.stub[78], 9) - << "incorrect value for last_msg_.stub[78], expected 9, is " - << last_msg_.stub[78]; - EXPECT_EQ(last_msg_.stub[79], 0) - << "incorrect value for last_msg_.stub[79], expected 0, is " - << last_msg_.stub[79]; - EXPECT_EQ(last_msg_.stub[80], 0) - << "incorrect value for last_msg_.stub[80], expected 0, is " - << last_msg_.stub[80]; - EXPECT_EQ(last_msg_.stub[81], 0) - << "incorrect value for last_msg_.stub[81], expected 0, is " - << last_msg_.stub[81]; - EXPECT_EQ(last_msg_.stub[82], 10) - << "incorrect value for last_msg_.stub[82], expected 10, is " - << last_msg_.stub[82]; - EXPECT_EQ(last_msg_.stub[83], 0) - << "incorrect value for last_msg_.stub[83], expected 0, is " - << last_msg_.stub[83]; - EXPECT_EQ(last_msg_.stub[84], 0) - << "incorrect value for last_msg_.stub[84], expected 0, is " - << last_msg_.stub[84]; - EXPECT_EQ(last_msg_.stub[85], 0) - << "incorrect value for last_msg_.stub[85], expected 0, is " - << last_msg_.stub[85]; - EXPECT_EQ(last_msg_.stub[86], 11) - << "incorrect value for last_msg_.stub[86], expected 11, is " - << last_msg_.stub[86]; - EXPECT_EQ(last_msg_.stub[87], 0) - << "incorrect value for last_msg_.stub[87], expected 0, is " - << last_msg_.stub[87]; - EXPECT_EQ(last_msg_.stub[88], 0) - << "incorrect value for last_msg_.stub[88], expected 0, is " - << last_msg_.stub[88]; - EXPECT_EQ(last_msg_.stub[89], 0) - << "incorrect value for last_msg_.stub[89], expected 0, is " - << last_msg_.stub[89]; - EXPECT_EQ(last_msg_.stub[90], 12) - << "incorrect value for last_msg_.stub[90], expected 12, is " - << last_msg_.stub[90]; - EXPECT_EQ(last_msg_.stub[91], 0) - << "incorrect value for last_msg_.stub[91], expected 0, is " - << last_msg_.stub[91]; - EXPECT_EQ(last_msg_.stub[92], 0) - << "incorrect value for last_msg_.stub[92], expected 0, is " - << last_msg_.stub[92]; - EXPECT_EQ(last_msg_.stub[93], 0) - << "incorrect value for last_msg_.stub[93], expected 0, is " - << last_msg_.stub[93]; - EXPECT_EQ(last_msg_.stub[94], 13) - << "incorrect value for last_msg_.stub[94], expected 13, is " - << last_msg_.stub[94]; - EXPECT_EQ(last_msg_.stub[95], 0) - << "incorrect value for last_msg_.stub[95], expected 0, is " - << last_msg_.stub[95]; - EXPECT_EQ(last_msg_.stub[96], 0) - << "incorrect value for last_msg_.stub[96], expected 0, is " - << last_msg_.stub[96]; - EXPECT_EQ(last_msg_.stub[97], 0) - << "incorrect value for last_msg_.stub[97], expected 0, is " - << last_msg_.stub[97]; - EXPECT_EQ(last_msg_.stub[98], 14) - << "incorrect value for last_msg_.stub[98], expected 14, is " - << last_msg_.stub[98]; - EXPECT_EQ(last_msg_.stub[99], 0) - << "incorrect value for last_msg_.stub[99], expected 0, is " - << last_msg_.stub[99]; - EXPECT_EQ(last_msg_.stub[100], 0) - << "incorrect value for last_msg_.stub[100], expected 0, is " - << last_msg_.stub[100]; - EXPECT_EQ(last_msg_.stub[101], 0) - << "incorrect value for last_msg_.stub[101], expected 0, is " - << last_msg_.stub[101]; - EXPECT_EQ(last_msg_.stub[102], 15) - << "incorrect value for last_msg_.stub[102], expected 15, is " - << last_msg_.stub[102]; - EXPECT_EQ(last_msg_.stub[103], 0) - << "incorrect value for last_msg_.stub[103], expected 0, is " - << last_msg_.stub[103]; - EXPECT_EQ(last_msg_.stub[104], 0) - << "incorrect value for last_msg_.stub[104], expected 0, is " - << last_msg_.stub[104]; - EXPECT_EQ(last_msg_.stub[105], 0) - << "incorrect value for last_msg_.stub[105], expected 0, is " - << last_msg_.stub[105]; - EXPECT_EQ(last_msg_.stub[106], 16) - << "incorrect value for last_msg_.stub[106], expected 16, is " - << last_msg_.stub[106]; - EXPECT_EQ(last_msg_.stub[107], 0) - << "incorrect value for last_msg_.stub[107], expected 0, is " - << last_msg_.stub[107]; - EXPECT_EQ(last_msg_.stub[108], 0) - << "incorrect value for last_msg_.stub[108], expected 0, is " - << last_msg_.stub[108]; - EXPECT_EQ(last_msg_.stub[109], 0) - << "incorrect value for last_msg_.stub[109], expected 0, is " - << last_msg_.stub[109]; - EXPECT_EQ(last_msg_.stub[110], 17) - << "incorrect value for last_msg_.stub[110], expected 17, is " - << last_msg_.stub[110]; - EXPECT_EQ(last_msg_.stub[111], 0) - << "incorrect value for last_msg_.stub[111], expected 0, is " - << last_msg_.stub[111]; - EXPECT_EQ(last_msg_.stub[112], 0) - << "incorrect value for last_msg_.stub[112], expected 0, is " - << last_msg_.stub[112]; - EXPECT_EQ(last_msg_.stub[113], 0) - << "incorrect value for last_msg_.stub[113], expected 0, is " - << last_msg_.stub[113]; - EXPECT_EQ(last_msg_.stub[114], 18) - << "incorrect value for last_msg_.stub[114], expected 18, is " - << last_msg_.stub[114]; - EXPECT_EQ(last_msg_.stub[115], 0) - << "incorrect value for last_msg_.stub[115], expected 0, is " - << last_msg_.stub[115]; - EXPECT_EQ(last_msg_.stub[116], 0) - << "incorrect value for last_msg_.stub[116], expected 0, is " - << last_msg_.stub[116]; - EXPECT_EQ(last_msg_.stub[117], 0) - << "incorrect value for last_msg_.stub[117], expected 0, is " - << last_msg_.stub[117]; - EXPECT_EQ(last_msg_.stub[118], 19) - << "incorrect value for last_msg_.stub[118], expected 19, is " - << last_msg_.stub[118]; - EXPECT_EQ(last_msg_.stub[119], 0) - << "incorrect value for last_msg_.stub[119], expected 0, is " - << last_msg_.stub[119]; - EXPECT_EQ(last_msg_.stub[120], 0) - << "incorrect value for last_msg_.stub[120], expected 0, is " - << last_msg_.stub[120]; - EXPECT_EQ(last_msg_.stub[121], 0) - << "incorrect value for last_msg_.stub[121], expected 0, is " - << last_msg_.stub[121]; - EXPECT_EQ(last_msg_.stub[122], 20) - << "incorrect value for last_msg_.stub[122], expected 20, is " - << last_msg_.stub[122]; - EXPECT_EQ(last_msg_.stub[123], 0) - << "incorrect value for last_msg_.stub[123], expected 0, is " - << last_msg_.stub[123]; + EXPECT_EQ(last_msg_.delta_X0, 7) + << "incorrect value for last_msg_.delta_X0, expected 7, is " + << last_msg_.delta_X0; + EXPECT_EQ(last_msg_.delta_Y0, 8) + << "incorrect value for last_msg_.delta_Y0, expected 8, is " + << last_msg_.delta_Y0; + EXPECT_EQ(last_msg_.delta_Z0, 9) + << "incorrect value for last_msg_.delta_Z0, expected 9, is " + << last_msg_.delta_Z0; + EXPECT_EQ(last_msg_.dot_delta_X0, 14) + << "incorrect value for last_msg_.dot_delta_X0, expected 14, is " + << last_msg_.dot_delta_X0; + EXPECT_EQ(last_msg_.dot_delta_Y0, 15) + << "incorrect value for last_msg_.dot_delta_Y0, expected 15, is " + << last_msg_.dot_delta_Y0; + EXPECT_EQ(last_msg_.dot_delta_Z0, 16) + << "incorrect value for last_msg_.dot_delta_Z0, expected 16, is " + << last_msg_.dot_delta_Z0; + EXPECT_EQ(last_msg_.dot_scale, 20) + << "incorrect value for last_msg_.dot_scale, expected 20, is " + << last_msg_.dot_scale; + EXPECT_EQ(last_msg_.dot_theta_01, 17) + << "incorrect value for last_msg_.dot_theta_01, expected 17, is " + << last_msg_.dot_theta_01; + EXPECT_EQ(last_msg_.dot_theta_02, 18) + << "incorrect value for last_msg_.dot_theta_02, expected 18, is " + << last_msg_.dot_theta_02; + EXPECT_EQ(last_msg_.dot_theta_03, 19) + << "incorrect value for last_msg_.dot_theta_03, expected 19, is " + << last_msg_.dot_theta_03; + EXPECT_EQ(last_msg_.re_t0, 6) + << "incorrect value for last_msg_.re_t0, expected 6, is " + << last_msg_.re_t0; + EXPECT_EQ(last_msg_.scale, 13) + << "incorrect value for last_msg_.scale, expected 13, is " + << last_msg_.scale; + EXPECT_EQ(last_msg_.sin, 4) + << "incorrect value for last_msg_.sin, expected 4, is " << last_msg_.sin; + { + const char check_string[] = { + (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0}; + EXPECT_EQ(memcmp(last_msg_.sn, check_string, sizeof(check_string)), 0) + << "incorrect value for last_msg_.sn, expected string '" << check_string + << "', is '" << last_msg_.sn << "'"; + } + EXPECT_EQ(last_msg_.ssr_iod, 1) + << "incorrect value for last_msg_.ssr_iod, expected 1, is " + << last_msg_.ssr_iod; + EXPECT_EQ(last_msg_.theta_01, 10) + << "incorrect value for last_msg_.theta_01, expected 10, is " + << last_msg_.theta_01; + EXPECT_EQ(last_msg_.theta_02, 11) + << "incorrect value for last_msg_.theta_02, expected 11, is " + << last_msg_.theta_02; + EXPECT_EQ(last_msg_.theta_03, 12) + << "incorrect value for last_msg_.theta_03, expected 12, is " + << last_msg_.theta_03; + { + const char check_string[] = { + (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0}; + EXPECT_EQ(memcmp(last_msg_.tn, check_string, sizeof(check_string)), 0) + << "incorrect value for last_msg_.tn, expected string '" << check_string + << "', is '" << last_msg_.tn << "'"; + } + EXPECT_EQ(last_msg_.utn, 5) + << "incorrect value for last_msg_.utn, expected 5, is " << last_msg_.utn; } diff --git a/c/test/cpp/auto_check_sbp_navigation_MsgUTCLeapSecond.cc b/c/test/cpp/auto_check_sbp_navigation_MsgUTCLeapSecond.cc index a1e1d45100..b498fc569d 100644 --- a/c/test/cpp/auto_check_sbp_navigation_MsgUTCLeapSecond.cc +++ b/c/test/cpp/auto_check_sbp_navigation_MsgUTCLeapSecond.cc @@ -80,35 +80,15 @@ TEST_F(Test_auto_check_sbp_navigation_MsgUTCLeapSecond0, Test) { }; sbp_msg_utc_leap_second_t test_msg{}; - test_msg.n_stub = 14; - - test_msg.stub[0] = 1; - - test_msg.stub[1] = 0; - - test_msg.stub[2] = 2; - - test_msg.stub[3] = 0; - - test_msg.stub[4] = 3; - - test_msg.stub[5] = 4; - - test_msg.stub[6] = 5; - - test_msg.stub[7] = 0; - - test_msg.stub[8] = 6; - - test_msg.stub[9] = 0; - - test_msg.stub[10] = 7; - - test_msg.stub[11] = 0; - - test_msg.stub[12] = 8; - - test_msg.stub[13] = 9; + test_msg.bias_coeff = 1; + test_msg.count_after = 9; + test_msg.count_before = 4; + test_msg.drift_coeff = 2; + test_msg.drift_rate_coeff = 3; + test_msg.ref_dn = 8; + test_msg.ref_wn = 7; + test_msg.tow_s = 5; + test_msg.wn = 6; EXPECT_EQ(send_message(66, test_msg), SBP_OK); @@ -122,49 +102,30 @@ TEST_F(Test_auto_check_sbp_navigation_MsgUTCLeapSecond0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_, test_msg); - EXPECT_EQ(last_msg_.n_stub, 14) - << "incorrect value for last_msg_.n_stub, expected 14, is " - << last_msg_.n_stub; - EXPECT_EQ(last_msg_.stub[0], 1) - << "incorrect value for last_msg_.stub[0], expected 1, is " - << last_msg_.stub[0]; - EXPECT_EQ(last_msg_.stub[1], 0) - << "incorrect value for last_msg_.stub[1], expected 0, is " - << last_msg_.stub[1]; - EXPECT_EQ(last_msg_.stub[2], 2) - << "incorrect value for last_msg_.stub[2], expected 2, is " - << last_msg_.stub[2]; - EXPECT_EQ(last_msg_.stub[3], 0) - << "incorrect value for last_msg_.stub[3], expected 0, is " - << last_msg_.stub[3]; - EXPECT_EQ(last_msg_.stub[4], 3) - << "incorrect value for last_msg_.stub[4], expected 3, is " - << last_msg_.stub[4]; - EXPECT_EQ(last_msg_.stub[5], 4) - << "incorrect value for last_msg_.stub[5], expected 4, is " - << last_msg_.stub[5]; - EXPECT_EQ(last_msg_.stub[6], 5) - << "incorrect value for last_msg_.stub[6], expected 5, is " - << last_msg_.stub[6]; - EXPECT_EQ(last_msg_.stub[7], 0) - << "incorrect value for last_msg_.stub[7], expected 0, is " - << last_msg_.stub[7]; - EXPECT_EQ(last_msg_.stub[8], 6) - << "incorrect value for last_msg_.stub[8], expected 6, is " - << last_msg_.stub[8]; - EXPECT_EQ(last_msg_.stub[9], 0) - << "incorrect value for last_msg_.stub[9], expected 0, is " - << last_msg_.stub[9]; - EXPECT_EQ(last_msg_.stub[10], 7) - << "incorrect value for last_msg_.stub[10], expected 7, is " - << last_msg_.stub[10]; - EXPECT_EQ(last_msg_.stub[11], 0) - << "incorrect value for last_msg_.stub[11], expected 0, is " - << last_msg_.stub[11]; - EXPECT_EQ(last_msg_.stub[12], 8) - << "incorrect value for last_msg_.stub[12], expected 8, is " - << last_msg_.stub[12]; - EXPECT_EQ(last_msg_.stub[13], 9) - << "incorrect value for last_msg_.stub[13], expected 9, is " - << last_msg_.stub[13]; + EXPECT_EQ(last_msg_.bias_coeff, 1) + << "incorrect value for last_msg_.bias_coeff, expected 1, is " + << last_msg_.bias_coeff; + EXPECT_EQ(last_msg_.count_after, 9) + << "incorrect value for last_msg_.count_after, expected 9, is " + << last_msg_.count_after; + EXPECT_EQ(last_msg_.count_before, 4) + << "incorrect value for last_msg_.count_before, expected 4, is " + << last_msg_.count_before; + EXPECT_EQ(last_msg_.drift_coeff, 2) + << "incorrect value for last_msg_.drift_coeff, expected 2, is " + << last_msg_.drift_coeff; + EXPECT_EQ(last_msg_.drift_rate_coeff, 3) + << "incorrect value for last_msg_.drift_rate_coeff, expected 3, is " + << last_msg_.drift_rate_coeff; + EXPECT_EQ(last_msg_.ref_dn, 8) + << "incorrect value for last_msg_.ref_dn, expected 8, is " + << last_msg_.ref_dn; + EXPECT_EQ(last_msg_.ref_wn, 7) + << "incorrect value for last_msg_.ref_wn, expected 7, is " + << last_msg_.ref_wn; + EXPECT_EQ(last_msg_.tow_s, 5) + << "incorrect value for last_msg_.tow_s, expected 5, is " + << last_msg_.tow_s; + EXPECT_EQ(last_msg_.wn, 6) + << "incorrect value for last_msg_.wn, expected 6, is " << last_msg_.wn; } diff --git a/c/test/cpp/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds.cc b/c/test/cpp/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds.cc index b9c5abf982..0547f18f26 100644 --- a/c/test/cpp/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds.cc +++ b/c/test/cpp/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds.cc @@ -82,69 +82,36 @@ TEST_F(Test_auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds0, Test) { }; sbp_msg_ssr_code_phase_biases_bounds_t test_msg{}; - test_msg.n_stub = 31; - - test_msg.stub[0] = 180; - - test_msg.stub[1] = 0; - - test_msg.stub[2] = 0; - - test_msg.stub[3] = 0; - - test_msg.stub[4] = 3; - - test_msg.stub[5] = 0; - - test_msg.stub[6] = 1; - - test_msg.stub[7] = 2; - - test_msg.stub[8] = 1; - - test_msg.stub[9] = 14; - - test_msg.stub[10] = 15; - - test_msg.stub[11] = 1; - - test_msg.stub[12] = 3; - - test_msg.stub[13] = 0; - - test_msg.stub[14] = 3; - - test_msg.stub[15] = 39; - - test_msg.stub[16] = 1; - - test_msg.stub[17] = 39; - - test_msg.stub[18] = 1; - - test_msg.stub[19] = 1; - - test_msg.stub[20] = 3; - - test_msg.stub[21] = 39; - - test_msg.stub[22] = 1; - - test_msg.stub[23] = 39; - - test_msg.stub[24] = 1; - - test_msg.stub[25] = 1; - - test_msg.stub[26] = 1; - - test_msg.stub[27] = 39; - - test_msg.stub[28] = 1; - - test_msg.stub[29] = 39; - - test_msg.stub[30] = 1; + test_msg.const_id = 1; + test_msg.header.num_msgs = 1; + test_msg.header.seq_num = 2; + test_msg.header.sol_id = 14; + test_msg.header.time.tow = 180; + test_msg.header.time.wn = 3; + test_msg.header.update_interval = 1; + test_msg.n_sats_signals = 3; + + test_msg.satellites_signals[0].code_bias_bound_mu = 39; + test_msg.satellites_signals[0].code_bias_bound_sig = 1; + test_msg.satellites_signals[0].phase_bias_bound_mu = 39; + test_msg.satellites_signals[0].phase_bias_bound_sig = 1; + test_msg.satellites_signals[0].sat_id = 0; + test_msg.satellites_signals[0].signal_id = 3; + + test_msg.satellites_signals[1].code_bias_bound_mu = 39; + test_msg.satellites_signals[1].code_bias_bound_sig = 1; + test_msg.satellites_signals[1].phase_bias_bound_mu = 39; + test_msg.satellites_signals[1].phase_bias_bound_sig = 1; + test_msg.satellites_signals[1].sat_id = 1; + test_msg.satellites_signals[1].signal_id = 3; + + test_msg.satellites_signals[2].code_bias_bound_mu = 39; + test_msg.satellites_signals[2].code_bias_bound_sig = 1; + test_msg.satellites_signals[2].phase_bias_bound_mu = 39; + test_msg.satellites_signals[2].phase_bias_bound_sig = 1; + test_msg.satellites_signals[2].sat_id = 1; + test_msg.satellites_signals[2].signal_id = 1; + test_msg.ssr_iod = 15; EXPECT_EQ(send_message(66, test_msg), SBP_OK); @@ -158,100 +125,103 @@ TEST_F(Test_auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_, test_msg); - EXPECT_EQ(last_msg_.n_stub, 31) - << "incorrect value for last_msg_.n_stub, expected 31, is " - << last_msg_.n_stub; - EXPECT_EQ(last_msg_.stub[0], 180) - << "incorrect value for last_msg_.stub[0], expected 180, is " - << last_msg_.stub[0]; - EXPECT_EQ(last_msg_.stub[1], 0) - << "incorrect value for last_msg_.stub[1], expected 0, is " - << last_msg_.stub[1]; - EXPECT_EQ(last_msg_.stub[2], 0) - << "incorrect value for last_msg_.stub[2], expected 0, is " - << last_msg_.stub[2]; - EXPECT_EQ(last_msg_.stub[3], 0) - << "incorrect value for last_msg_.stub[3], expected 0, is " - << last_msg_.stub[3]; - EXPECT_EQ(last_msg_.stub[4], 3) - << "incorrect value for last_msg_.stub[4], expected 3, is " - << last_msg_.stub[4]; - EXPECT_EQ(last_msg_.stub[5], 0) - << "incorrect value for last_msg_.stub[5], expected 0, is " - << last_msg_.stub[5]; - EXPECT_EQ(last_msg_.stub[6], 1) - << "incorrect value for last_msg_.stub[6], expected 1, is " - << last_msg_.stub[6]; - EXPECT_EQ(last_msg_.stub[7], 2) - << "incorrect value for last_msg_.stub[7], expected 2, is " - << last_msg_.stub[7]; - EXPECT_EQ(last_msg_.stub[8], 1) - << "incorrect value for last_msg_.stub[8], expected 1, is " - << last_msg_.stub[8]; - EXPECT_EQ(last_msg_.stub[9], 14) - << "incorrect value for last_msg_.stub[9], expected 14, is " - << last_msg_.stub[9]; - EXPECT_EQ(last_msg_.stub[10], 15) - << "incorrect value for last_msg_.stub[10], expected 15, is " - << last_msg_.stub[10]; - EXPECT_EQ(last_msg_.stub[11], 1) - << "incorrect value for last_msg_.stub[11], expected 1, is " - << last_msg_.stub[11]; - EXPECT_EQ(last_msg_.stub[12], 3) - << "incorrect value for last_msg_.stub[12], expected 3, is " - << last_msg_.stub[12]; - EXPECT_EQ(last_msg_.stub[13], 0) - << "incorrect value for last_msg_.stub[13], expected 0, is " - << last_msg_.stub[13]; - EXPECT_EQ(last_msg_.stub[14], 3) - << "incorrect value for last_msg_.stub[14], expected 3, is " - << last_msg_.stub[14]; - EXPECT_EQ(last_msg_.stub[15], 39) - << "incorrect value for last_msg_.stub[15], expected 39, is " - << last_msg_.stub[15]; - EXPECT_EQ(last_msg_.stub[16], 1) - << "incorrect value for last_msg_.stub[16], expected 1, is " - << last_msg_.stub[16]; - EXPECT_EQ(last_msg_.stub[17], 39) - << "incorrect value for last_msg_.stub[17], expected 39, is " - << last_msg_.stub[17]; - EXPECT_EQ(last_msg_.stub[18], 1) - << "incorrect value for last_msg_.stub[18], expected 1, is " - << last_msg_.stub[18]; - EXPECT_EQ(last_msg_.stub[19], 1) - << "incorrect value for last_msg_.stub[19], expected 1, is " - << last_msg_.stub[19]; - EXPECT_EQ(last_msg_.stub[20], 3) - << "incorrect value for last_msg_.stub[20], expected 3, is " - << last_msg_.stub[20]; - EXPECT_EQ(last_msg_.stub[21], 39) - << "incorrect value for last_msg_.stub[21], expected 39, is " - << last_msg_.stub[21]; - EXPECT_EQ(last_msg_.stub[22], 1) - << "incorrect value for last_msg_.stub[22], expected 1, is " - << last_msg_.stub[22]; - EXPECT_EQ(last_msg_.stub[23], 39) - << "incorrect value for last_msg_.stub[23], expected 39, is " - << last_msg_.stub[23]; - EXPECT_EQ(last_msg_.stub[24], 1) - << "incorrect value for last_msg_.stub[24], expected 1, is " - << last_msg_.stub[24]; - EXPECT_EQ(last_msg_.stub[25], 1) - << "incorrect value for last_msg_.stub[25], expected 1, is " - << last_msg_.stub[25]; - EXPECT_EQ(last_msg_.stub[26], 1) - << "incorrect value for last_msg_.stub[26], expected 1, is " - << last_msg_.stub[26]; - EXPECT_EQ(last_msg_.stub[27], 39) - << "incorrect value for last_msg_.stub[27], expected 39, is " - << last_msg_.stub[27]; - EXPECT_EQ(last_msg_.stub[28], 1) - << "incorrect value for last_msg_.stub[28], expected 1, is " - << last_msg_.stub[28]; - EXPECT_EQ(last_msg_.stub[29], 39) - << "incorrect value for last_msg_.stub[29], expected 39, is " - << last_msg_.stub[29]; - EXPECT_EQ(last_msg_.stub[30], 1) - << "incorrect value for last_msg_.stub[30], expected 1, is " - << last_msg_.stub[30]; + EXPECT_EQ(last_msg_.const_id, 1) + << "incorrect value for last_msg_.const_id, expected 1, is " + << last_msg_.const_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, 2) + << "incorrect value for last_msg_.header.seq_num, expected 2, is " + << last_msg_.header.seq_num; + EXPECT_EQ(last_msg_.header.sol_id, 14) + << "incorrect value for last_msg_.header.sol_id, expected 14, 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, 1) + << "incorrect value for last_msg_.header.update_interval, expected 1, is " + << last_msg_.header.update_interval; + EXPECT_EQ(last_msg_.n_sats_signals, 3) + << "incorrect value for last_msg_.n_sats_signals, expected 3, is " + << last_msg_.n_sats_signals; + EXPECT_EQ(last_msg_.satellites_signals[0].code_bias_bound_mu, 39) + << "incorrect value for " + "last_msg_.satellites_signals[0].code_bias_bound_mu, expected 39, is " + << last_msg_.satellites_signals[0].code_bias_bound_mu; + EXPECT_EQ(last_msg_.satellites_signals[0].code_bias_bound_sig, 1) + << "incorrect value for " + "last_msg_.satellites_signals[0].code_bias_bound_sig, expected 1, is " + << last_msg_.satellites_signals[0].code_bias_bound_sig; + EXPECT_EQ(last_msg_.satellites_signals[0].phase_bias_bound_mu, 39) + << "incorrect value for " + "last_msg_.satellites_signals[0].phase_bias_bound_mu, expected 39, is " + << last_msg_.satellites_signals[0].phase_bias_bound_mu; + EXPECT_EQ(last_msg_.satellites_signals[0].phase_bias_bound_sig, 1) + << "incorrect value for " + "last_msg_.satellites_signals[0].phase_bias_bound_sig, expected 1, is " + << last_msg_.satellites_signals[0].phase_bias_bound_sig; + EXPECT_EQ(last_msg_.satellites_signals[0].sat_id, 0) + << "incorrect value for last_msg_.satellites_signals[0].sat_id, expected " + "0, is " + << last_msg_.satellites_signals[0].sat_id; + EXPECT_EQ(last_msg_.satellites_signals[0].signal_id, 3) + << "incorrect value for last_msg_.satellites_signals[0].signal_id, " + "expected 3, is " + << last_msg_.satellites_signals[0].signal_id; + EXPECT_EQ(last_msg_.satellites_signals[1].code_bias_bound_mu, 39) + << "incorrect value for " + "last_msg_.satellites_signals[1].code_bias_bound_mu, expected 39, is " + << last_msg_.satellites_signals[1].code_bias_bound_mu; + EXPECT_EQ(last_msg_.satellites_signals[1].code_bias_bound_sig, 1) + << "incorrect value for " + "last_msg_.satellites_signals[1].code_bias_bound_sig, expected 1, is " + << last_msg_.satellites_signals[1].code_bias_bound_sig; + EXPECT_EQ(last_msg_.satellites_signals[1].phase_bias_bound_mu, 39) + << "incorrect value for " + "last_msg_.satellites_signals[1].phase_bias_bound_mu, expected 39, is " + << last_msg_.satellites_signals[1].phase_bias_bound_mu; + EXPECT_EQ(last_msg_.satellites_signals[1].phase_bias_bound_sig, 1) + << "incorrect value for " + "last_msg_.satellites_signals[1].phase_bias_bound_sig, expected 1, is " + << last_msg_.satellites_signals[1].phase_bias_bound_sig; + EXPECT_EQ(last_msg_.satellites_signals[1].sat_id, 1) + << "incorrect value for last_msg_.satellites_signals[1].sat_id, expected " + "1, is " + << last_msg_.satellites_signals[1].sat_id; + EXPECT_EQ(last_msg_.satellites_signals[1].signal_id, 3) + << "incorrect value for last_msg_.satellites_signals[1].signal_id, " + "expected 3, is " + << last_msg_.satellites_signals[1].signal_id; + EXPECT_EQ(last_msg_.satellites_signals[2].code_bias_bound_mu, 39) + << "incorrect value for " + "last_msg_.satellites_signals[2].code_bias_bound_mu, expected 39, is " + << last_msg_.satellites_signals[2].code_bias_bound_mu; + EXPECT_EQ(last_msg_.satellites_signals[2].code_bias_bound_sig, 1) + << "incorrect value for " + "last_msg_.satellites_signals[2].code_bias_bound_sig, expected 1, is " + << last_msg_.satellites_signals[2].code_bias_bound_sig; + EXPECT_EQ(last_msg_.satellites_signals[2].phase_bias_bound_mu, 39) + << "incorrect value for " + "last_msg_.satellites_signals[2].phase_bias_bound_mu, expected 39, is " + << last_msg_.satellites_signals[2].phase_bias_bound_mu; + EXPECT_EQ(last_msg_.satellites_signals[2].phase_bias_bound_sig, 1) + << "incorrect value for " + "last_msg_.satellites_signals[2].phase_bias_bound_sig, expected 1, is " + << last_msg_.satellites_signals[2].phase_bias_bound_sig; + EXPECT_EQ(last_msg_.satellites_signals[2].sat_id, 1) + << "incorrect value for last_msg_.satellites_signals[2].sat_id, expected " + "1, is " + << last_msg_.satellites_signals[2].sat_id; + EXPECT_EQ(last_msg_.satellites_signals[2].signal_id, 1) + << "incorrect value for last_msg_.satellites_signals[2].signal_id, " + "expected 1, is " + << last_msg_.satellites_signals[2].signal_id; + EXPECT_EQ(last_msg_.ssr_iod, 15) + << "incorrect value for last_msg_.ssr_iod, expected 15, is " + << last_msg_.ssr_iod; } diff --git a/c/test/cpp/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc b/c/test/cpp/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc index e63007acea..fd4ed69348 100644 --- a/c/test/cpp/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc +++ b/c/test/cpp/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc @@ -77,100 +77,50 @@ class Test_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds0 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, + 85, 254, 5, 66, 0, 45, 180, 0, 0, 0, 3, 0, 1, 1, + 10, 0, 15, 1, 0, 10, 0, 39, 232, 3, 244, 1, 100, 200, + 150, 100, 150, 100, 2, 5, 10, 16, 0, 17, 18, 19, 20, 21, + 6, 10, 22, 0, 23, 24, 25, 26, 27, 119, 82, }; sbp_msg_ssr_gridded_correction_bounds_t test_msg{}; - test_msg.n_stub = 43; - - test_msg.stub[0] = 180; - - test_msg.stub[1] = 0; - - test_msg.stub[2] = 0; - - test_msg.stub[3] = 0; - - test_msg.stub[4] = 3; - - test_msg.stub[5] = 0; - - test_msg.stub[6] = 1; - - test_msg.stub[7] = 1; - - test_msg.stub[8] = 10; - - test_msg.stub[9] = 0; - - test_msg.stub[10] = 15; - - test_msg.stub[11] = 1; - - test_msg.stub[12] = 0; - - test_msg.stub[13] = 10; - - test_msg.stub[14] = 0; - - test_msg.stub[15] = 39; - - test_msg.stub[16] = 232; - - test_msg.stub[17] = 3; - - test_msg.stub[18] = 244; - - test_msg.stub[19] = 1; - - test_msg.stub[20] = 100; - - test_msg.stub[21] = 200; - - test_msg.stub[22] = 150; - - test_msg.stub[23] = 100; - - test_msg.stub[24] = 2; - - test_msg.stub[25] = 5; - - test_msg.stub[26] = 10; - - test_msg.stub[27] = 16; - - test_msg.stub[28] = 0; - - test_msg.stub[29] = 17; - - test_msg.stub[30] = 18; - - test_msg.stub[31] = 19; - - test_msg.stub[32] = 20; - - test_msg.stub[33] = 21; - - test_msg.stub[34] = 6; - - test_msg.stub[35] = 10; - - test_msg.stub[36] = 22; - - test_msg.stub[37] = 0; - - test_msg.stub[38] = 23; - - test_msg.stub[39] = 24; - - test_msg.stub[40] = 25; - - test_msg.stub[41] = 26; - - test_msg.stub[42] = 27; + 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_delay_correction.hydro = 500; + test_msg.tropo_delay_correction.stddev = 200; + test_msg.tropo_delay_correction.wet = 100; + test_msg.tropo_qi = 39; + test_msg.tropo_v_hydro_bound_mu = 150; + test_msg.tropo_v_hydro_bound_sig = 100; + test_msg.tropo_v_wet_bound_mu = 150; + test_msg.tropo_v_wet_bound_sig = 100; EXPECT_EQ(send_message(66, test_msg), SBP_OK); @@ -184,136 +134,134 @@ TEST_F(Test_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_, test_msg); - EXPECT_EQ(last_msg_.n_stub, 43) - << "incorrect value for last_msg_.n_stub, expected 43, is " - << last_msg_.n_stub; - EXPECT_EQ(last_msg_.stub[0], 180) - << "incorrect value for last_msg_.stub[0], expected 180, is " - << last_msg_.stub[0]; - EXPECT_EQ(last_msg_.stub[1], 0) - << "incorrect value for last_msg_.stub[1], expected 0, is " - << last_msg_.stub[1]; - EXPECT_EQ(last_msg_.stub[2], 0) - << "incorrect value for last_msg_.stub[2], expected 0, is " - << last_msg_.stub[2]; - EXPECT_EQ(last_msg_.stub[3], 0) - << "incorrect value for last_msg_.stub[3], expected 0, is " - << last_msg_.stub[3]; - EXPECT_EQ(last_msg_.stub[4], 3) - << "incorrect value for last_msg_.stub[4], expected 3, is " - << last_msg_.stub[4]; - EXPECT_EQ(last_msg_.stub[5], 0) - << "incorrect value for last_msg_.stub[5], expected 0, is " - << last_msg_.stub[5]; - EXPECT_EQ(last_msg_.stub[6], 1) - << "incorrect value for last_msg_.stub[6], expected 1, is " - << last_msg_.stub[6]; - EXPECT_EQ(last_msg_.stub[7], 1) - << "incorrect value for last_msg_.stub[7], expected 1, is " - << last_msg_.stub[7]; - EXPECT_EQ(last_msg_.stub[8], 10) - << "incorrect value for last_msg_.stub[8], expected 10, is " - << last_msg_.stub[8]; - EXPECT_EQ(last_msg_.stub[9], 0) - << "incorrect value for last_msg_.stub[9], expected 0, is " - << last_msg_.stub[9]; - EXPECT_EQ(last_msg_.stub[10], 15) - << "incorrect value for last_msg_.stub[10], expected 15, is " - << last_msg_.stub[10]; - EXPECT_EQ(last_msg_.stub[11], 1) - << "incorrect value for last_msg_.stub[11], expected 1, is " - << last_msg_.stub[11]; - EXPECT_EQ(last_msg_.stub[12], 0) - << "incorrect value for last_msg_.stub[12], expected 0, is " - << last_msg_.stub[12]; - EXPECT_EQ(last_msg_.stub[13], 10) - << "incorrect value for last_msg_.stub[13], expected 10, is " - << last_msg_.stub[13]; - EXPECT_EQ(last_msg_.stub[14], 0) - << "incorrect value for last_msg_.stub[14], expected 0, is " - << last_msg_.stub[14]; - EXPECT_EQ(last_msg_.stub[15], 39) - << "incorrect value for last_msg_.stub[15], expected 39, is " - << last_msg_.stub[15]; - EXPECT_EQ(last_msg_.stub[16], 232) - << "incorrect value for last_msg_.stub[16], expected 232, is " - << last_msg_.stub[16]; - EXPECT_EQ(last_msg_.stub[17], 3) - << "incorrect value for last_msg_.stub[17], expected 3, is " - << last_msg_.stub[17]; - EXPECT_EQ(last_msg_.stub[18], 244) - << "incorrect value for last_msg_.stub[18], expected 244, is " - << last_msg_.stub[18]; - EXPECT_EQ(last_msg_.stub[19], 1) - << "incorrect value for last_msg_.stub[19], expected 1, is " - << last_msg_.stub[19]; - EXPECT_EQ(last_msg_.stub[20], 100) - << "incorrect value for last_msg_.stub[20], expected 100, is " - << last_msg_.stub[20]; - EXPECT_EQ(last_msg_.stub[21], 200) - << "incorrect value for last_msg_.stub[21], expected 200, is " - << last_msg_.stub[21]; - EXPECT_EQ(last_msg_.stub[22], 150) - << "incorrect value for last_msg_.stub[22], expected 150, is " - << last_msg_.stub[22]; - EXPECT_EQ(last_msg_.stub[23], 100) - << "incorrect value for last_msg_.stub[23], expected 100, is " - << last_msg_.stub[23]; - EXPECT_EQ(last_msg_.stub[24], 2) - << "incorrect value for last_msg_.stub[24], expected 2, is " - << last_msg_.stub[24]; - EXPECT_EQ(last_msg_.stub[25], 5) - << "incorrect value for last_msg_.stub[25], expected 5, is " - << last_msg_.stub[25]; - EXPECT_EQ(last_msg_.stub[26], 10) - << "incorrect value for last_msg_.stub[26], expected 10, is " - << last_msg_.stub[26]; - EXPECT_EQ(last_msg_.stub[27], 16) - << "incorrect value for last_msg_.stub[27], expected 16, is " - << last_msg_.stub[27]; - EXPECT_EQ(last_msg_.stub[28], 0) - << "incorrect value for last_msg_.stub[28], expected 0, is " - << last_msg_.stub[28]; - EXPECT_EQ(last_msg_.stub[29], 17) - << "incorrect value for last_msg_.stub[29], expected 17, is " - << last_msg_.stub[29]; - EXPECT_EQ(last_msg_.stub[30], 18) - << "incorrect value for last_msg_.stub[30], expected 18, is " - << last_msg_.stub[30]; - EXPECT_EQ(last_msg_.stub[31], 19) - << "incorrect value for last_msg_.stub[31], expected 19, is " - << last_msg_.stub[31]; - EXPECT_EQ(last_msg_.stub[32], 20) - << "incorrect value for last_msg_.stub[32], expected 20, is " - << last_msg_.stub[32]; - EXPECT_EQ(last_msg_.stub[33], 21) - << "incorrect value for last_msg_.stub[33], expected 21, is " - << last_msg_.stub[33]; - EXPECT_EQ(last_msg_.stub[34], 6) - << "incorrect value for last_msg_.stub[34], expected 6, is " - << last_msg_.stub[34]; - EXPECT_EQ(last_msg_.stub[35], 10) - << "incorrect value for last_msg_.stub[35], expected 10, is " - << last_msg_.stub[35]; - EXPECT_EQ(last_msg_.stub[36], 22) - << "incorrect value for last_msg_.stub[36], expected 22, is " - << last_msg_.stub[36]; - EXPECT_EQ(last_msg_.stub[37], 0) - << "incorrect value for last_msg_.stub[37], expected 0, is " - << last_msg_.stub[37]; - EXPECT_EQ(last_msg_.stub[38], 23) - << "incorrect value for last_msg_.stub[38], expected 23, is " - << last_msg_.stub[38]; - EXPECT_EQ(last_msg_.stub[39], 24) - << "incorrect value for last_msg_.stub[39], expected 24, is " - << last_msg_.stub[39]; - EXPECT_EQ(last_msg_.stub[40], 25) - << "incorrect value for last_msg_.stub[40], expected 25, is " - << last_msg_.stub[40]; - EXPECT_EQ(last_msg_.stub[41], 26) - << "incorrect value for last_msg_.stub[41], expected 26, is " - << last_msg_.stub[41]; - EXPECT_EQ(last_msg_.stub[42], 27) - << "incorrect value for last_msg_.stub[42], expected 27, is " - << last_msg_.stub[42]; + 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_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; + EXPECT_EQ(last_msg_.tropo_v_hydro_bound_mu, 150) + << "incorrect value for last_msg_.tropo_v_hydro_bound_mu, expected 150, " + "is " + << last_msg_.tropo_v_hydro_bound_mu; + EXPECT_EQ(last_msg_.tropo_v_hydro_bound_sig, 100) + << "incorrect value for last_msg_.tropo_v_hydro_bound_sig, expected 100, " + "is " + << last_msg_.tropo_v_hydro_bound_sig; + EXPECT_EQ(last_msg_.tropo_v_wet_bound_mu, 150) + << "incorrect value for last_msg_.tropo_v_wet_bound_mu, expected 150, is " + << last_msg_.tropo_v_wet_bound_mu; + EXPECT_EQ(last_msg_.tropo_v_wet_bound_sig, 100) + << "incorrect value for last_msg_.tropo_v_wet_bound_sig, expected 100, " + "is " + << last_msg_.tropo_v_wet_bound_sig; } diff --git a/c/test/cpp/auto_check_sbp_ssr_MsgSsrOrbitClockBounds.cc b/c/test/cpp/auto_check_sbp_ssr_MsgSsrOrbitClockBounds.cc index 2e4674515a..adc02bcbcf 100644 --- a/c/test/cpp/auto_check_sbp_ssr_MsgSsrOrbitClockBounds.cc +++ b/c/test/cpp/auto_check_sbp_ssr_MsgSsrOrbitClockBounds.cc @@ -82,69 +82,35 @@ TEST_F(Test_auto_check_sbp_ssr_MsgSsrOrbitClockBounds0, Test) { }; sbp_msg_ssr_orbit_clock_bounds_t test_msg{}; - test_msg.n_stub = 31; - - test_msg.stub[0] = 180; - - test_msg.stub[1] = 0; - - test_msg.stub[2] = 0; - - test_msg.stub[3] = 0; - - test_msg.stub[4] = 3; - - test_msg.stub[5] = 0; - - test_msg.stub[6] = 1; - - test_msg.stub[7] = 2; - - test_msg.stub[8] = 3; - - test_msg.stub[9] = 48; - - test_msg.stub[10] = 15; - - test_msg.stub[11] = 1; - - test_msg.stub[12] = 2; - - test_msg.stub[13] = 24; - - test_msg.stub[14] = 39; - - test_msg.stub[15] = 38; - - test_msg.stub[16] = 37; - - test_msg.stub[17] = 1; - - test_msg.stub[18] = 2; - - test_msg.stub[19] = 3; - - test_msg.stub[20] = 39; - - test_msg.stub[21] = 1; - - test_msg.stub[22] = 3; - - test_msg.stub[23] = 39; - - test_msg.stub[24] = 38; - - test_msg.stub[25] = 37; - - test_msg.stub[26] = 1; - - test_msg.stub[27] = 2; - - test_msg.stub[28] = 3; - - test_msg.stub[29] = 39; - - test_msg.stub[30] = 1; + test_msg.const_id = 1; + test_msg.header.num_msgs = 1; + test_msg.header.seq_num = 2; + test_msg.header.sol_id = 48; + test_msg.header.time.tow = 180; + test_msg.header.time.wn = 3; + test_msg.header.update_interval = 3; + test_msg.n_sats = 2; + + test_msg.orbit_clock_bounds[0].clock_bound_mu = 39; + test_msg.orbit_clock_bounds[0].clock_bound_sig = 1; + test_msg.orbit_clock_bounds[0].orb_along_bound_mu = 38; + test_msg.orbit_clock_bounds[0].orb_along_bound_sig = 2; + test_msg.orbit_clock_bounds[0].orb_cross_bound_mu = 37; + test_msg.orbit_clock_bounds[0].orb_cross_bound_sig = 3; + test_msg.orbit_clock_bounds[0].orb_radial_bound_mu = 39; + test_msg.orbit_clock_bounds[0].orb_radial_bound_sig = 1; + test_msg.orbit_clock_bounds[0].sat_id = 24; + + test_msg.orbit_clock_bounds[1].clock_bound_mu = 39; + test_msg.orbit_clock_bounds[1].clock_bound_sig = 1; + test_msg.orbit_clock_bounds[1].orb_along_bound_mu = 38; + test_msg.orbit_clock_bounds[1].orb_along_bound_sig = 2; + test_msg.orbit_clock_bounds[1].orb_cross_bound_mu = 37; + test_msg.orbit_clock_bounds[1].orb_cross_bound_sig = 3; + test_msg.orbit_clock_bounds[1].orb_radial_bound_mu = 39; + test_msg.orbit_clock_bounds[1].orb_radial_bound_sig = 1; + test_msg.orbit_clock_bounds[1].sat_id = 3; + test_msg.ssr_iod = 15; EXPECT_EQ(send_message(66, test_msg), SBP_OK); @@ -158,100 +124,103 @@ TEST_F(Test_auto_check_sbp_ssr_MsgSsrOrbitClockBounds0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_, test_msg); - EXPECT_EQ(last_msg_.n_stub, 31) - << "incorrect value for last_msg_.n_stub, expected 31, is " - << last_msg_.n_stub; - EXPECT_EQ(last_msg_.stub[0], 180) - << "incorrect value for last_msg_.stub[0], expected 180, is " - << last_msg_.stub[0]; - EXPECT_EQ(last_msg_.stub[1], 0) - << "incorrect value for last_msg_.stub[1], expected 0, is " - << last_msg_.stub[1]; - EXPECT_EQ(last_msg_.stub[2], 0) - << "incorrect value for last_msg_.stub[2], expected 0, is " - << last_msg_.stub[2]; - EXPECT_EQ(last_msg_.stub[3], 0) - << "incorrect value for last_msg_.stub[3], expected 0, is " - << last_msg_.stub[3]; - EXPECT_EQ(last_msg_.stub[4], 3) - << "incorrect value for last_msg_.stub[4], expected 3, is " - << last_msg_.stub[4]; - EXPECT_EQ(last_msg_.stub[5], 0) - << "incorrect value for last_msg_.stub[5], expected 0, is " - << last_msg_.stub[5]; - EXPECT_EQ(last_msg_.stub[6], 1) - << "incorrect value for last_msg_.stub[6], expected 1, is " - << last_msg_.stub[6]; - EXPECT_EQ(last_msg_.stub[7], 2) - << "incorrect value for last_msg_.stub[7], expected 2, is " - << last_msg_.stub[7]; - EXPECT_EQ(last_msg_.stub[8], 3) - << "incorrect value for last_msg_.stub[8], expected 3, is " - << last_msg_.stub[8]; - EXPECT_EQ(last_msg_.stub[9], 48) - << "incorrect value for last_msg_.stub[9], expected 48, is " - << last_msg_.stub[9]; - EXPECT_EQ(last_msg_.stub[10], 15) - << "incorrect value for last_msg_.stub[10], expected 15, is " - << last_msg_.stub[10]; - EXPECT_EQ(last_msg_.stub[11], 1) - << "incorrect value for last_msg_.stub[11], expected 1, is " - << last_msg_.stub[11]; - EXPECT_EQ(last_msg_.stub[12], 2) - << "incorrect value for last_msg_.stub[12], expected 2, is " - << last_msg_.stub[12]; - EXPECT_EQ(last_msg_.stub[13], 24) - << "incorrect value for last_msg_.stub[13], expected 24, is " - << last_msg_.stub[13]; - EXPECT_EQ(last_msg_.stub[14], 39) - << "incorrect value for last_msg_.stub[14], expected 39, is " - << last_msg_.stub[14]; - EXPECT_EQ(last_msg_.stub[15], 38) - << "incorrect value for last_msg_.stub[15], expected 38, is " - << last_msg_.stub[15]; - EXPECT_EQ(last_msg_.stub[16], 37) - << "incorrect value for last_msg_.stub[16], expected 37, is " - << last_msg_.stub[16]; - EXPECT_EQ(last_msg_.stub[17], 1) - << "incorrect value for last_msg_.stub[17], expected 1, is " - << last_msg_.stub[17]; - EXPECT_EQ(last_msg_.stub[18], 2) - << "incorrect value for last_msg_.stub[18], expected 2, is " - << last_msg_.stub[18]; - EXPECT_EQ(last_msg_.stub[19], 3) - << "incorrect value for last_msg_.stub[19], expected 3, is " - << last_msg_.stub[19]; - EXPECT_EQ(last_msg_.stub[20], 39) - << "incorrect value for last_msg_.stub[20], expected 39, is " - << last_msg_.stub[20]; - EXPECT_EQ(last_msg_.stub[21], 1) - << "incorrect value for last_msg_.stub[21], expected 1, is " - << last_msg_.stub[21]; - EXPECT_EQ(last_msg_.stub[22], 3) - << "incorrect value for last_msg_.stub[22], expected 3, is " - << last_msg_.stub[22]; - EXPECT_EQ(last_msg_.stub[23], 39) - << "incorrect value for last_msg_.stub[23], expected 39, is " - << last_msg_.stub[23]; - EXPECT_EQ(last_msg_.stub[24], 38) - << "incorrect value for last_msg_.stub[24], expected 38, is " - << last_msg_.stub[24]; - EXPECT_EQ(last_msg_.stub[25], 37) - << "incorrect value for last_msg_.stub[25], expected 37, is " - << last_msg_.stub[25]; - EXPECT_EQ(last_msg_.stub[26], 1) - << "incorrect value for last_msg_.stub[26], expected 1, is " - << last_msg_.stub[26]; - EXPECT_EQ(last_msg_.stub[27], 2) - << "incorrect value for last_msg_.stub[27], expected 2, is " - << last_msg_.stub[27]; - EXPECT_EQ(last_msg_.stub[28], 3) - << "incorrect value for last_msg_.stub[28], expected 3, is " - << last_msg_.stub[28]; - EXPECT_EQ(last_msg_.stub[29], 39) - << "incorrect value for last_msg_.stub[29], expected 39, is " - << last_msg_.stub[29]; - EXPECT_EQ(last_msg_.stub[30], 1) - << "incorrect value for last_msg_.stub[30], expected 1, is " - << last_msg_.stub[30]; + EXPECT_EQ(last_msg_.const_id, 1) + << "incorrect value for last_msg_.const_id, expected 1, is " + << last_msg_.const_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, 2) + << "incorrect value for last_msg_.header.seq_num, expected 2, is " + << last_msg_.header.seq_num; + EXPECT_EQ(last_msg_.header.sol_id, 48) + << "incorrect value for last_msg_.header.sol_id, expected 48, 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, 3) + << "incorrect value for last_msg_.header.update_interval, expected 3, 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_.orbit_clock_bounds[0].clock_bound_mu, 39) + << "incorrect value for last_msg_.orbit_clock_bounds[0].clock_bound_mu, " + "expected 39, is " + << last_msg_.orbit_clock_bounds[0].clock_bound_mu; + EXPECT_EQ(last_msg_.orbit_clock_bounds[0].clock_bound_sig, 1) + << "incorrect value for last_msg_.orbit_clock_bounds[0].clock_bound_sig, " + "expected 1, is " + << last_msg_.orbit_clock_bounds[0].clock_bound_sig; + EXPECT_EQ(last_msg_.orbit_clock_bounds[0].orb_along_bound_mu, 38) + << "incorrect value for " + "last_msg_.orbit_clock_bounds[0].orb_along_bound_mu, expected 38, is " + << last_msg_.orbit_clock_bounds[0].orb_along_bound_mu; + EXPECT_EQ(last_msg_.orbit_clock_bounds[0].orb_along_bound_sig, 2) + << "incorrect value for " + "last_msg_.orbit_clock_bounds[0].orb_along_bound_sig, expected 2, is " + << last_msg_.orbit_clock_bounds[0].orb_along_bound_sig; + EXPECT_EQ(last_msg_.orbit_clock_bounds[0].orb_cross_bound_mu, 37) + << "incorrect value for " + "last_msg_.orbit_clock_bounds[0].orb_cross_bound_mu, expected 37, is " + << last_msg_.orbit_clock_bounds[0].orb_cross_bound_mu; + EXPECT_EQ(last_msg_.orbit_clock_bounds[0].orb_cross_bound_sig, 3) + << "incorrect value for " + "last_msg_.orbit_clock_bounds[0].orb_cross_bound_sig, expected 3, is " + << last_msg_.orbit_clock_bounds[0].orb_cross_bound_sig; + EXPECT_EQ(last_msg_.orbit_clock_bounds[0].orb_radial_bound_mu, 39) + << "incorrect value for " + "last_msg_.orbit_clock_bounds[0].orb_radial_bound_mu, expected 39, is " + << last_msg_.orbit_clock_bounds[0].orb_radial_bound_mu; + EXPECT_EQ(last_msg_.orbit_clock_bounds[0].orb_radial_bound_sig, 1) + << "incorrect value for " + "last_msg_.orbit_clock_bounds[0].orb_radial_bound_sig, expected 1, is " + << last_msg_.orbit_clock_bounds[0].orb_radial_bound_sig; + EXPECT_EQ(last_msg_.orbit_clock_bounds[0].sat_id, 24) + << "incorrect value for last_msg_.orbit_clock_bounds[0].sat_id, expected " + "24, is " + << last_msg_.orbit_clock_bounds[0].sat_id; + EXPECT_EQ(last_msg_.orbit_clock_bounds[1].clock_bound_mu, 39) + << "incorrect value for last_msg_.orbit_clock_bounds[1].clock_bound_mu, " + "expected 39, is " + << last_msg_.orbit_clock_bounds[1].clock_bound_mu; + EXPECT_EQ(last_msg_.orbit_clock_bounds[1].clock_bound_sig, 1) + << "incorrect value for last_msg_.orbit_clock_bounds[1].clock_bound_sig, " + "expected 1, is " + << last_msg_.orbit_clock_bounds[1].clock_bound_sig; + EXPECT_EQ(last_msg_.orbit_clock_bounds[1].orb_along_bound_mu, 38) + << "incorrect value for " + "last_msg_.orbit_clock_bounds[1].orb_along_bound_mu, expected 38, is " + << last_msg_.orbit_clock_bounds[1].orb_along_bound_mu; + EXPECT_EQ(last_msg_.orbit_clock_bounds[1].orb_along_bound_sig, 2) + << "incorrect value for " + "last_msg_.orbit_clock_bounds[1].orb_along_bound_sig, expected 2, is " + << last_msg_.orbit_clock_bounds[1].orb_along_bound_sig; + EXPECT_EQ(last_msg_.orbit_clock_bounds[1].orb_cross_bound_mu, 37) + << "incorrect value for " + "last_msg_.orbit_clock_bounds[1].orb_cross_bound_mu, expected 37, is " + << last_msg_.orbit_clock_bounds[1].orb_cross_bound_mu; + EXPECT_EQ(last_msg_.orbit_clock_bounds[1].orb_cross_bound_sig, 3) + << "incorrect value for " + "last_msg_.orbit_clock_bounds[1].orb_cross_bound_sig, expected 3, is " + << last_msg_.orbit_clock_bounds[1].orb_cross_bound_sig; + EXPECT_EQ(last_msg_.orbit_clock_bounds[1].orb_radial_bound_mu, 39) + << "incorrect value for " + "last_msg_.orbit_clock_bounds[1].orb_radial_bound_mu, expected 39, is " + << last_msg_.orbit_clock_bounds[1].orb_radial_bound_mu; + EXPECT_EQ(last_msg_.orbit_clock_bounds[1].orb_radial_bound_sig, 1) + << "incorrect value for " + "last_msg_.orbit_clock_bounds[1].orb_radial_bound_sig, expected 1, is " + << last_msg_.orbit_clock_bounds[1].orb_radial_bound_sig; + EXPECT_EQ(last_msg_.orbit_clock_bounds[1].sat_id, 3) + << "incorrect value for last_msg_.orbit_clock_bounds[1].sat_id, expected " + "3, is " + << last_msg_.orbit_clock_bounds[1].sat_id; + EXPECT_EQ(last_msg_.ssr_iod, 15) + << "incorrect value for last_msg_.ssr_iod, expected 15, is " + << last_msg_.ssr_iod; } diff --git a/c/test/cpp/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation.cc b/c/test/cpp/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation.cc index 09b4e7f671..eaeb52f6e8 100644 --- a/c/test/cpp/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation.cc +++ b/c/test/cpp/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation.cc @@ -83,63 +83,23 @@ TEST_F(Test_auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation0, Test) { }; sbp_msg_ssr_orbit_clock_bounds_degradation_t test_msg{}; - test_msg.n_stub = 28; - - test_msg.stub[0] = 180; - - test_msg.stub[1] = 0; - - test_msg.stub[2] = 0; - - test_msg.stub[3] = 0; - - test_msg.stub[4] = 3; - - test_msg.stub[5] = 0; - - test_msg.stub[6] = 1; - - test_msg.stub[7] = 2; - - test_msg.stub[8] = 3; - - test_msg.stub[9] = 48; - - test_msg.stub[10] = 15; - - test_msg.stub[11] = 1; - - test_msg.stub[12] = 10; - - test_msg.stub[13] = 0; - - test_msg.stub[14] = 0; - - test_msg.stub[15] = 0; - - test_msg.stub[16] = 0; - - test_msg.stub[17] = 0; - - test_msg.stub[18] = 0; - - test_msg.stub[19] = 0; - - test_msg.stub[20] = 200; - - test_msg.stub[21] = 199; - - test_msg.stub[22] = 198; - - test_msg.stub[23] = 197; - - test_msg.stub[24] = 196; - - test_msg.stub[25] = 195; - - test_msg.stub[26] = 194; - - test_msg.stub[27] = 193; + test_msg.const_id = 1; + test_msg.header.num_msgs = 1; + test_msg.header.seq_num = 2; + test_msg.header.sol_id = 48; + test_msg.header.time.tow = 180; + test_msg.header.time.wn = 3; + test_msg.header.update_interval = 3; + test_msg.orbit_clock_bounds_degradation.clock_bound_mu_dot = 194; + test_msg.orbit_clock_bounds_degradation.clock_bound_sig_dot = 193; + test_msg.orbit_clock_bounds_degradation.orb_along_bound_mu_dot = 199; + test_msg.orbit_clock_bounds_degradation.orb_along_bound_sig_dot = 196; + test_msg.orbit_clock_bounds_degradation.orb_cross_bound_mu_dot = 198; + test_msg.orbit_clock_bounds_degradation.orb_cross_bound_sig_dot = 195; + test_msg.orbit_clock_bounds_degradation.orb_radial_bound_mu_dot = 200; + test_msg.orbit_clock_bounds_degradation.orb_radial_bound_sig_dot = 197; + test_msg.sat_bitmask = 10; + test_msg.ssr_iod = 15; EXPECT_EQ(send_message(66, test_msg), SBP_OK); @@ -153,91 +113,77 @@ TEST_F(Test_auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_, test_msg); - EXPECT_EQ(last_msg_.n_stub, 28) - << "incorrect value for last_msg_.n_stub, expected 28, is " - << last_msg_.n_stub; - EXPECT_EQ(last_msg_.stub[0], 180) - << "incorrect value for last_msg_.stub[0], expected 180, is " - << last_msg_.stub[0]; - EXPECT_EQ(last_msg_.stub[1], 0) - << "incorrect value for last_msg_.stub[1], expected 0, is " - << last_msg_.stub[1]; - EXPECT_EQ(last_msg_.stub[2], 0) - << "incorrect value for last_msg_.stub[2], expected 0, is " - << last_msg_.stub[2]; - EXPECT_EQ(last_msg_.stub[3], 0) - << "incorrect value for last_msg_.stub[3], expected 0, is " - << last_msg_.stub[3]; - EXPECT_EQ(last_msg_.stub[4], 3) - << "incorrect value for last_msg_.stub[4], expected 3, is " - << last_msg_.stub[4]; - EXPECT_EQ(last_msg_.stub[5], 0) - << "incorrect value for last_msg_.stub[5], expected 0, is " - << last_msg_.stub[5]; - EXPECT_EQ(last_msg_.stub[6], 1) - << "incorrect value for last_msg_.stub[6], expected 1, is " - << last_msg_.stub[6]; - EXPECT_EQ(last_msg_.stub[7], 2) - << "incorrect value for last_msg_.stub[7], expected 2, is " - << last_msg_.stub[7]; - EXPECT_EQ(last_msg_.stub[8], 3) - << "incorrect value for last_msg_.stub[8], expected 3, is " - << last_msg_.stub[8]; - EXPECT_EQ(last_msg_.stub[9], 48) - << "incorrect value for last_msg_.stub[9], expected 48, is " - << last_msg_.stub[9]; - EXPECT_EQ(last_msg_.stub[10], 15) - << "incorrect value for last_msg_.stub[10], expected 15, is " - << last_msg_.stub[10]; - EXPECT_EQ(last_msg_.stub[11], 1) - << "incorrect value for last_msg_.stub[11], expected 1, is " - << last_msg_.stub[11]; - EXPECT_EQ(last_msg_.stub[12], 10) - << "incorrect value for last_msg_.stub[12], expected 10, is " - << last_msg_.stub[12]; - EXPECT_EQ(last_msg_.stub[13], 0) - << "incorrect value for last_msg_.stub[13], expected 0, is " - << last_msg_.stub[13]; - EXPECT_EQ(last_msg_.stub[14], 0) - << "incorrect value for last_msg_.stub[14], expected 0, is " - << last_msg_.stub[14]; - EXPECT_EQ(last_msg_.stub[15], 0) - << "incorrect value for last_msg_.stub[15], expected 0, is " - << last_msg_.stub[15]; - EXPECT_EQ(last_msg_.stub[16], 0) - << "incorrect value for last_msg_.stub[16], expected 0, is " - << last_msg_.stub[16]; - EXPECT_EQ(last_msg_.stub[17], 0) - << "incorrect value for last_msg_.stub[17], expected 0, is " - << last_msg_.stub[17]; - EXPECT_EQ(last_msg_.stub[18], 0) - << "incorrect value for last_msg_.stub[18], expected 0, is " - << last_msg_.stub[18]; - EXPECT_EQ(last_msg_.stub[19], 0) - << "incorrect value for last_msg_.stub[19], expected 0, is " - << last_msg_.stub[19]; - EXPECT_EQ(last_msg_.stub[20], 200) - << "incorrect value for last_msg_.stub[20], expected 200, is " - << last_msg_.stub[20]; - EXPECT_EQ(last_msg_.stub[21], 199) - << "incorrect value for last_msg_.stub[21], expected 199, is " - << last_msg_.stub[21]; - EXPECT_EQ(last_msg_.stub[22], 198) - << "incorrect value for last_msg_.stub[22], expected 198, is " - << last_msg_.stub[22]; - EXPECT_EQ(last_msg_.stub[23], 197) - << "incorrect value for last_msg_.stub[23], expected 197, is " - << last_msg_.stub[23]; - EXPECT_EQ(last_msg_.stub[24], 196) - << "incorrect value for last_msg_.stub[24], expected 196, is " - << last_msg_.stub[24]; - EXPECT_EQ(last_msg_.stub[25], 195) - << "incorrect value for last_msg_.stub[25], expected 195, is " - << last_msg_.stub[25]; - EXPECT_EQ(last_msg_.stub[26], 194) - << "incorrect value for last_msg_.stub[26], expected 194, is " - << last_msg_.stub[26]; - EXPECT_EQ(last_msg_.stub[27], 193) - << "incorrect value for last_msg_.stub[27], expected 193, is " - << last_msg_.stub[27]; + EXPECT_EQ(last_msg_.const_id, 1) + << "incorrect value for last_msg_.const_id, expected 1, is " + << last_msg_.const_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, 2) + << "incorrect value for last_msg_.header.seq_num, expected 2, is " + << last_msg_.header.seq_num; + EXPECT_EQ(last_msg_.header.sol_id, 48) + << "incorrect value for last_msg_.header.sol_id, expected 48, 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, 3) + << "incorrect value for last_msg_.header.update_interval, expected 3, is " + << last_msg_.header.update_interval; + EXPECT_EQ(last_msg_.orbit_clock_bounds_degradation.clock_bound_mu_dot, 194) + << "incorrect value for " + "last_msg_.orbit_clock_bounds_degradation.clock_bound_mu_dot, " + "expected 194, is " + << last_msg_.orbit_clock_bounds_degradation.clock_bound_mu_dot; + EXPECT_EQ(last_msg_.orbit_clock_bounds_degradation.clock_bound_sig_dot, 193) + << "incorrect value for " + "last_msg_.orbit_clock_bounds_degradation.clock_bound_sig_dot, " + "expected 193, is " + << last_msg_.orbit_clock_bounds_degradation.clock_bound_sig_dot; + EXPECT_EQ(last_msg_.orbit_clock_bounds_degradation.orb_along_bound_mu_dot, + 199) + << "incorrect value for " + "last_msg_.orbit_clock_bounds_degradation.orb_along_bound_mu_dot, " + "expected 199, is " + << last_msg_.orbit_clock_bounds_degradation.orb_along_bound_mu_dot; + EXPECT_EQ(last_msg_.orbit_clock_bounds_degradation.orb_along_bound_sig_dot, + 196) + << "incorrect value for " + "last_msg_.orbit_clock_bounds_degradation.orb_along_bound_sig_dot, " + "expected 196, is " + << last_msg_.orbit_clock_bounds_degradation.orb_along_bound_sig_dot; + EXPECT_EQ(last_msg_.orbit_clock_bounds_degradation.orb_cross_bound_mu_dot, + 198) + << "incorrect value for " + "last_msg_.orbit_clock_bounds_degradation.orb_cross_bound_mu_dot, " + "expected 198, is " + << last_msg_.orbit_clock_bounds_degradation.orb_cross_bound_mu_dot; + EXPECT_EQ(last_msg_.orbit_clock_bounds_degradation.orb_cross_bound_sig_dot, + 195) + << "incorrect value for " + "last_msg_.orbit_clock_bounds_degradation.orb_cross_bound_sig_dot, " + "expected 195, is " + << last_msg_.orbit_clock_bounds_degradation.orb_cross_bound_sig_dot; + EXPECT_EQ(last_msg_.orbit_clock_bounds_degradation.orb_radial_bound_mu_dot, + 200) + << "incorrect value for " + "last_msg_.orbit_clock_bounds_degradation.orb_radial_bound_mu_dot, " + "expected 200, is " + << last_msg_.orbit_clock_bounds_degradation.orb_radial_bound_mu_dot; + EXPECT_EQ(last_msg_.orbit_clock_bounds_degradation.orb_radial_bound_sig_dot, + 197) + << "incorrect value for " + "last_msg_.orbit_clock_bounds_degradation.orb_radial_bound_sig_dot, " + "expected 197, is " + << last_msg_.orbit_clock_bounds_degradation.orb_radial_bound_sig_dot; + EXPECT_EQ(last_msg_.sat_bitmask, 10) + << "incorrect value for last_msg_.sat_bitmask, expected 10, is " + << last_msg_.sat_bitmask; + EXPECT_EQ(last_msg_.ssr_iod, 15) + << "incorrect value for last_msg_.ssr_iod, expected 15, is " + << last_msg_.ssr_iod; } diff --git a/c/test/cpp/auto_check_sbp_ssr_MsgSsrStecCorrection.cc b/c/test/cpp/auto_check_sbp_ssr_MsgSsrStecCorrection.cc index 79577772b9..70a61b2b86 100644 --- a/c/test/cpp/auto_check_sbp_ssr_MsgSsrStecCorrection.cc +++ b/c/test/cpp/auto_check_sbp_ssr_MsgSsrStecCorrection.cc @@ -82,83 +82,38 @@ TEST_F(Test_auto_check_sbp_ssr_MsgSsrStecCorrection0, Test) { }; sbp_msg_ssr_stec_correction_t test_msg{}; - test_msg.n_stub = 38; + 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.stub[0] = 180; + test_msg.stec_sat_list[0].stec_coeff[0] = 63; - test_msg.stub[1] = 0; + test_msg.stec_sat_list[0].stec_coeff[1] = 62; - test_msg.stub[2] = 0; + test_msg.stec_sat_list[0].stec_coeff[2] = 61; - test_msg.stub[3] = 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; - test_msg.stub[4] = 3; + test_msg.stec_sat_list[1].stec_coeff[0] = 63; - test_msg.stub[5] = 0; + test_msg.stec_sat_list[1].stec_coeff[1] = 64; - test_msg.stub[6] = 1; + test_msg.stec_sat_list[1].stec_coeff[2] = 65; - test_msg.stub[7] = 1; - - test_msg.stub[8] = 10; - - test_msg.stub[9] = 0; - - test_msg.stub[10] = 15; - - test_msg.stub[11] = 1; - - test_msg.stub[12] = 0; - - test_msg.stub[13] = 10; - - test_msg.stub[14] = 0; - - test_msg.stub[15] = 2; - - test_msg.stub[16] = 1; - - test_msg.stub[17] = 1; - - test_msg.stub[18] = 1; - - test_msg.stub[19] = 63; - - test_msg.stub[20] = 0; - - test_msg.stub[21] = 62; - - test_msg.stub[22] = 0; - - test_msg.stub[23] = 61; - - test_msg.stub[24] = 0; - - test_msg.stub[25] = 60; - - test_msg.stub[26] = 0; - - test_msg.stub[27] = 31; - - test_msg.stub[28] = 15; - - test_msg.stub[29] = 5; - - test_msg.stub[30] = 63; - - test_msg.stub[31] = 0; - - test_msg.stub[32] = 64; - - test_msg.stub[33] = 0; - - test_msg.stub[34] = 65; - - test_msg.stub[35] = 0; - - test_msg.stub[36] = 66; - - test_msg.stub[37] = 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(66, test_msg), SBP_OK); @@ -172,121 +127,91 @@ TEST_F(Test_auto_check_sbp_ssr_MsgSsrStecCorrection0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_, test_msg); - EXPECT_EQ(last_msg_.n_stub, 38) - << "incorrect value for last_msg_.n_stub, expected 38, is " - << last_msg_.n_stub; - EXPECT_EQ(last_msg_.stub[0], 180) - << "incorrect value for last_msg_.stub[0], expected 180, is " - << last_msg_.stub[0]; - EXPECT_EQ(last_msg_.stub[1], 0) - << "incorrect value for last_msg_.stub[1], expected 0, is " - << last_msg_.stub[1]; - EXPECT_EQ(last_msg_.stub[2], 0) - << "incorrect value for last_msg_.stub[2], expected 0, is " - << last_msg_.stub[2]; - EXPECT_EQ(last_msg_.stub[3], 0) - << "incorrect value for last_msg_.stub[3], expected 0, is " - << last_msg_.stub[3]; - EXPECT_EQ(last_msg_.stub[4], 3) - << "incorrect value for last_msg_.stub[4], expected 3, is " - << last_msg_.stub[4]; - EXPECT_EQ(last_msg_.stub[5], 0) - << "incorrect value for last_msg_.stub[5], expected 0, is " - << last_msg_.stub[5]; - EXPECT_EQ(last_msg_.stub[6], 1) - << "incorrect value for last_msg_.stub[6], expected 1, is " - << last_msg_.stub[6]; - EXPECT_EQ(last_msg_.stub[7], 1) - << "incorrect value for last_msg_.stub[7], expected 1, is " - << last_msg_.stub[7]; - EXPECT_EQ(last_msg_.stub[8], 10) - << "incorrect value for last_msg_.stub[8], expected 10, is " - << last_msg_.stub[8]; - EXPECT_EQ(last_msg_.stub[9], 0) - << "incorrect value for last_msg_.stub[9], expected 0, is " - << last_msg_.stub[9]; - EXPECT_EQ(last_msg_.stub[10], 15) - << "incorrect value for last_msg_.stub[10], expected 15, is " - << last_msg_.stub[10]; - EXPECT_EQ(last_msg_.stub[11], 1) - << "incorrect value for last_msg_.stub[11], expected 1, is " - << last_msg_.stub[11]; - EXPECT_EQ(last_msg_.stub[12], 0) - << "incorrect value for last_msg_.stub[12], expected 0, is " - << last_msg_.stub[12]; - EXPECT_EQ(last_msg_.stub[13], 10) - << "incorrect value for last_msg_.stub[13], expected 10, is " - << last_msg_.stub[13]; - EXPECT_EQ(last_msg_.stub[14], 0) - << "incorrect value for last_msg_.stub[14], expected 0, is " - << last_msg_.stub[14]; - EXPECT_EQ(last_msg_.stub[15], 2) - << "incorrect value for last_msg_.stub[15], expected 2, is " - << last_msg_.stub[15]; - EXPECT_EQ(last_msg_.stub[16], 1) - << "incorrect value for last_msg_.stub[16], expected 1, is " - << last_msg_.stub[16]; - EXPECT_EQ(last_msg_.stub[17], 1) - << "incorrect value for last_msg_.stub[17], expected 1, is " - << last_msg_.stub[17]; - EXPECT_EQ(last_msg_.stub[18], 1) - << "incorrect value for last_msg_.stub[18], expected 1, is " - << last_msg_.stub[18]; - EXPECT_EQ(last_msg_.stub[19], 63) - << "incorrect value for last_msg_.stub[19], expected 63, is " - << last_msg_.stub[19]; - EXPECT_EQ(last_msg_.stub[20], 0) - << "incorrect value for last_msg_.stub[20], expected 0, is " - << last_msg_.stub[20]; - EXPECT_EQ(last_msg_.stub[21], 62) - << "incorrect value for last_msg_.stub[21], expected 62, is " - << last_msg_.stub[21]; - EXPECT_EQ(last_msg_.stub[22], 0) - << "incorrect value for last_msg_.stub[22], expected 0, is " - << last_msg_.stub[22]; - EXPECT_EQ(last_msg_.stub[23], 61) - << "incorrect value for last_msg_.stub[23], expected 61, is " - << last_msg_.stub[23]; - EXPECT_EQ(last_msg_.stub[24], 0) - << "incorrect value for last_msg_.stub[24], expected 0, is " - << last_msg_.stub[24]; - EXPECT_EQ(last_msg_.stub[25], 60) - << "incorrect value for last_msg_.stub[25], expected 60, is " - << last_msg_.stub[25]; - EXPECT_EQ(last_msg_.stub[26], 0) - << "incorrect value for last_msg_.stub[26], expected 0, is " - << last_msg_.stub[26]; - EXPECT_EQ(last_msg_.stub[27], 31) - << "incorrect value for last_msg_.stub[27], expected 31, is " - << last_msg_.stub[27]; - EXPECT_EQ(last_msg_.stub[28], 15) - << "incorrect value for last_msg_.stub[28], expected 15, is " - << last_msg_.stub[28]; - EXPECT_EQ(last_msg_.stub[29], 5) - << "incorrect value for last_msg_.stub[29], expected 5, is " - << last_msg_.stub[29]; - EXPECT_EQ(last_msg_.stub[30], 63) - << "incorrect value for last_msg_.stub[30], expected 63, is " - << last_msg_.stub[30]; - EXPECT_EQ(last_msg_.stub[31], 0) - << "incorrect value for last_msg_.stub[31], expected 0, is " - << last_msg_.stub[31]; - EXPECT_EQ(last_msg_.stub[32], 64) - << "incorrect value for last_msg_.stub[32], expected 64, is " - << last_msg_.stub[32]; - EXPECT_EQ(last_msg_.stub[33], 0) - << "incorrect value for last_msg_.stub[33], expected 0, is " - << last_msg_.stub[33]; - EXPECT_EQ(last_msg_.stub[34], 65) - << "incorrect value for last_msg_.stub[34], expected 65, is " - << last_msg_.stub[34]; - EXPECT_EQ(last_msg_.stub[35], 0) - << "incorrect value for last_msg_.stub[35], expected 0, is " - << last_msg_.stub[35]; - EXPECT_EQ(last_msg_.stub[36], 66) - << "incorrect value for last_msg_.stub[36], expected 66, is " - << last_msg_.stub[36]; - EXPECT_EQ(last_msg_.stub[37], 0) - << "incorrect value for last_msg_.stub[37], expected 0, is " - << last_msg_.stub[37]; + 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 index abe2ff0ce0..47500d79b7 100644 --- a/c/test/cpp/auto_check_sbp_ssr_MsgSsrTileDefinition.cc +++ b/c/test/cpp/auto_check_sbp_ssr_MsgSsrTileDefinition.cc @@ -81,57 +81,16 @@ TEST_F(Test_auto_check_sbp_ssr_MsgSsrTileDefinition0, Test) { }; sbp_msg_ssr_tile_definition_t test_msg{}; - test_msg.n_stub = 25; - - test_msg.stub[0] = 31; - - test_msg.stub[1] = 0; - - test_msg.stub[2] = 1; - - test_msg.stub[3] = 0; - - test_msg.stub[4] = 2; - - test_msg.stub[5] = 0; - - test_msg.stub[6] = 4; - - test_msg.stub[7] = 0; - - test_msg.stub[8] = 8; - - test_msg.stub[9] = 0; - - test_msg.stub[10] = 16; - - test_msg.stub[11] = 0; - - test_msg.stub[12] = 32; - - test_msg.stub[13] = 0; - - test_msg.stub[14] = 64; - - test_msg.stub[15] = 0; - - test_msg.stub[16] = 128; - - test_msg.stub[17] = 210; - - test_msg.stub[18] = 2; - - test_msg.stub[19] = 150; - - test_msg.stub[20] = 73; - - test_msg.stub[21] = 0; - - test_msg.stub[22] = 0; - - test_msg.stub[23] = 0; - - test_msg.stub[24] = 0; + 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); @@ -145,82 +104,34 @@ TEST_F(Test_auto_check_sbp_ssr_MsgSsrTileDefinition0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_, test_msg); - EXPECT_EQ(last_msg_.n_stub, 25) - << "incorrect value for last_msg_.n_stub, expected 25, is " - << last_msg_.n_stub; - EXPECT_EQ(last_msg_.stub[0], 31) - << "incorrect value for last_msg_.stub[0], expected 31, is " - << last_msg_.stub[0]; - EXPECT_EQ(last_msg_.stub[1], 0) - << "incorrect value for last_msg_.stub[1], expected 0, is " - << last_msg_.stub[1]; - EXPECT_EQ(last_msg_.stub[2], 1) - << "incorrect value for last_msg_.stub[2], expected 1, is " - << last_msg_.stub[2]; - EXPECT_EQ(last_msg_.stub[3], 0) - << "incorrect value for last_msg_.stub[3], expected 0, is " - << last_msg_.stub[3]; - EXPECT_EQ(last_msg_.stub[4], 2) - << "incorrect value for last_msg_.stub[4], expected 2, is " - << last_msg_.stub[4]; - EXPECT_EQ(last_msg_.stub[5], 0) - << "incorrect value for last_msg_.stub[5], expected 0, is " - << last_msg_.stub[5]; - EXPECT_EQ(last_msg_.stub[6], 4) - << "incorrect value for last_msg_.stub[6], expected 4, is " - << last_msg_.stub[6]; - EXPECT_EQ(last_msg_.stub[7], 0) - << "incorrect value for last_msg_.stub[7], expected 0, is " - << last_msg_.stub[7]; - EXPECT_EQ(last_msg_.stub[8], 8) - << "incorrect value for last_msg_.stub[8], expected 8, is " - << last_msg_.stub[8]; - EXPECT_EQ(last_msg_.stub[9], 0) - << "incorrect value for last_msg_.stub[9], expected 0, is " - << last_msg_.stub[9]; - EXPECT_EQ(last_msg_.stub[10], 16) - << "incorrect value for last_msg_.stub[10], expected 16, is " - << last_msg_.stub[10]; - EXPECT_EQ(last_msg_.stub[11], 0) - << "incorrect value for last_msg_.stub[11], expected 0, is " - << last_msg_.stub[11]; - EXPECT_EQ(last_msg_.stub[12], 32) - << "incorrect value for last_msg_.stub[12], expected 32, is " - << last_msg_.stub[12]; - EXPECT_EQ(last_msg_.stub[13], 0) - << "incorrect value for last_msg_.stub[13], expected 0, is " - << last_msg_.stub[13]; - EXPECT_EQ(last_msg_.stub[14], 64) - << "incorrect value for last_msg_.stub[14], expected 64, is " - << last_msg_.stub[14]; - EXPECT_EQ(last_msg_.stub[15], 0) - << "incorrect value for last_msg_.stub[15], expected 0, is " - << last_msg_.stub[15]; - EXPECT_EQ(last_msg_.stub[16], 128) - << "incorrect value for last_msg_.stub[16], expected 128, is " - << last_msg_.stub[16]; - EXPECT_EQ(last_msg_.stub[17], 210) - << "incorrect value for last_msg_.stub[17], expected 210, is " - << last_msg_.stub[17]; - EXPECT_EQ(last_msg_.stub[18], 2) - << "incorrect value for last_msg_.stub[18], expected 2, is " - << last_msg_.stub[18]; - EXPECT_EQ(last_msg_.stub[19], 150) - << "incorrect value for last_msg_.stub[19], expected 150, is " - << last_msg_.stub[19]; - EXPECT_EQ(last_msg_.stub[20], 73) - << "incorrect value for last_msg_.stub[20], expected 73, is " - << last_msg_.stub[20]; - EXPECT_EQ(last_msg_.stub[21], 0) - << "incorrect value for last_msg_.stub[21], expected 0, is " - << last_msg_.stub[21]; - EXPECT_EQ(last_msg_.stub[22], 0) - << "incorrect value for last_msg_.stub[22], expected 0, is " - << last_msg_.stub[22]; - EXPECT_EQ(last_msg_.stub[23], 0) - << "incorrect value for last_msg_.stub[23], expected 0, is " - << last_msg_.stub[23]; - EXPECT_EQ(last_msg_.stub[24], 0) - << "incorrect value for last_msg_.stub[24], expected 0, is " - << last_msg_.stub[24]; + 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_integrity_MsgSsrFlagHighLevel.c b/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagHighLevel.c index e621df5a6d..b9f870cec6 100644 --- a/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagHighLevel.c +++ b/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagHighLevel.c @@ -135,161 +135,51 @@ START_TEST(test_legacy_auto_check_sbp_integrity_MsgSsrFlagHighLevel) { msg_ssr_flag_high_level_t *test_msg = (msg_ssr_flag_high_level_t *)test_msg_storage; test_msg_len = sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { + test_msg->chain_id = 40; + test_msg->corr_time.tow = 360; + test_msg->corr_time.wn = 6; + test_msg->obs_time.tow = 180; + test_msg->obs_time.wn = 3; + if (sizeof(test_msg->reserved) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->reserved[0]); } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { + test_msg->reserved[0] = 0; + if (sizeof(test_msg->reserved) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->reserved[0]); } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { + test_msg->reserved[1] = 0; + if (sizeof(test_msg->reserved) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->reserved[0]); } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { + test_msg->reserved[2] = 0; + if (sizeof(test_msg->reserved) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->reserved[0]); } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { + test_msg->reserved[3] = 0; + if (sizeof(test_msg->reserved) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->reserved[0]); } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { + test_msg->reserved[4] = 0; + if (sizeof(test_msg->reserved) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[6] = 104; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[7] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[8] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[9] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[10] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[11] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[12] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[13] = 20; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[14] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[15] = 30; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[16] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[17] = 40; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[18] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[19] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[20] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[21] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[22] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[23] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[24] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[25] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[26] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[27] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[28] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[29] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[30] = 7; + test_msg_len += sizeof(test_msg->reserved[0]); + } + test_msg->reserved[5] = 0; + test_msg->ssr_sol_id = 10; + test_msg->tile_id = 30; + test_msg->tile_set_id = 20; + test_msg->use_bds_sat = 3; + test_msg->use_gal_sat = 2; + test_msg->use_gps_sat = 1; + test_msg->use_iono_grid_point_sat_los = 7; + test_msg->use_iono_grid_points = 5; + test_msg->use_iono_tile_sat_los = 6; + test_msg->use_tropo_grid_points = 4; sbp_payload_send(&sbp_state, 3001, 66, test_msg_len, test_msg_storage, &dummy_write); @@ -345,99 +235,72 @@ START_TEST(test_legacy_auto_check_sbp_integrity_MsgSsrFlagHighLevel) { (msg_ssr_flag_high_level_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->stub[0] == 180, - "incorrect value for stub[0], expected 180, is %d", - check_msg->stub[0]); - ck_assert_msg(check_msg->stub[1] == 0, - "incorrect value for stub[1], expected 0, is %d", - check_msg->stub[1]); - ck_assert_msg(check_msg->stub[2] == 0, - "incorrect value for stub[2], expected 0, is %d", - check_msg->stub[2]); - ck_assert_msg(check_msg->stub[3] == 0, - "incorrect value for stub[3], expected 0, is %d", - check_msg->stub[3]); - ck_assert_msg(check_msg->stub[4] == 3, - "incorrect value for stub[4], expected 3, is %d", - check_msg->stub[4]); - ck_assert_msg(check_msg->stub[5] == 0, - "incorrect value for stub[5], expected 0, is %d", - check_msg->stub[5]); - ck_assert_msg(check_msg->stub[6] == 104, - "incorrect value for stub[6], expected 104, is %d", - check_msg->stub[6]); - ck_assert_msg(check_msg->stub[7] == 1, - "incorrect value for stub[7], expected 1, is %d", - check_msg->stub[7]); - ck_assert_msg(check_msg->stub[8] == 0, - "incorrect value for stub[8], expected 0, is %d", - check_msg->stub[8]); - ck_assert_msg(check_msg->stub[9] == 0, - "incorrect value for stub[9], expected 0, is %d", - check_msg->stub[9]); - ck_assert_msg(check_msg->stub[10] == 6, - "incorrect value for stub[10], expected 6, is %d", - check_msg->stub[10]); - ck_assert_msg(check_msg->stub[11] == 0, - "incorrect value for stub[11], expected 0, is %d", - check_msg->stub[11]); - ck_assert_msg(check_msg->stub[12] == 10, - "incorrect value for stub[12], expected 10, is %d", - check_msg->stub[12]); - ck_assert_msg(check_msg->stub[13] == 20, - "incorrect value for stub[13], expected 20, is %d", - check_msg->stub[13]); - ck_assert_msg(check_msg->stub[14] == 0, - "incorrect value for stub[14], expected 0, is %d", - check_msg->stub[14]); - ck_assert_msg(check_msg->stub[15] == 30, - "incorrect value for stub[15], expected 30, is %d", - check_msg->stub[15]); - ck_assert_msg(check_msg->stub[16] == 0, - "incorrect value for stub[16], expected 0, is %d", - check_msg->stub[16]); - ck_assert_msg(check_msg->stub[17] == 40, - "incorrect value for stub[17], expected 40, is %d", - check_msg->stub[17]); - ck_assert_msg(check_msg->stub[18] == 1, - "incorrect value for stub[18], expected 1, is %d", - check_msg->stub[18]); - ck_assert_msg(check_msg->stub[19] == 2, - "incorrect value for stub[19], expected 2, is %d", - check_msg->stub[19]); - ck_assert_msg(check_msg->stub[20] == 3, - "incorrect value for stub[20], expected 3, is %d", - check_msg->stub[20]); - ck_assert_msg(check_msg->stub[21] == 0, - "incorrect value for stub[21], expected 0, is %d", - check_msg->stub[21]); - ck_assert_msg(check_msg->stub[22] == 0, - "incorrect value for stub[22], expected 0, is %d", - check_msg->stub[22]); - ck_assert_msg(check_msg->stub[23] == 0, - "incorrect value for stub[23], expected 0, is %d", - check_msg->stub[23]); - ck_assert_msg(check_msg->stub[24] == 0, - "incorrect value for stub[24], expected 0, is %d", - check_msg->stub[24]); - ck_assert_msg(check_msg->stub[25] == 0, - "incorrect value for stub[25], expected 0, is %d", - check_msg->stub[25]); - ck_assert_msg(check_msg->stub[26] == 0, - "incorrect value for stub[26], expected 0, is %d", - check_msg->stub[26]); - ck_assert_msg(check_msg->stub[27] == 4, - "incorrect value for stub[27], expected 4, is %d", - check_msg->stub[27]); - ck_assert_msg(check_msg->stub[28] == 5, - "incorrect value for stub[28], expected 5, is %d", - check_msg->stub[28]); - ck_assert_msg(check_msg->stub[29] == 6, - "incorrect value for stub[29], expected 6, is %d", - check_msg->stub[29]); - ck_assert_msg(check_msg->stub[30] == 7, - "incorrect value for stub[30], expected 7, is %d", - check_msg->stub[30]); + ck_assert_msg(check_msg->chain_id == 40, + "incorrect value for chain_id, expected 40, is %d", + check_msg->chain_id); + ck_assert_msg(check_msg->corr_time.tow == 360, + "incorrect value for corr_time.tow, expected 360, is %d", + check_msg->corr_time.tow); + ck_assert_msg(check_msg->corr_time.wn == 6, + "incorrect value for corr_time.wn, expected 6, is %d", + check_msg->corr_time.wn); + ck_assert_msg(check_msg->obs_time.tow == 180, + "incorrect value for obs_time.tow, expected 180, is %d", + check_msg->obs_time.tow); + ck_assert_msg(check_msg->obs_time.wn == 3, + "incorrect value for obs_time.wn, expected 3, is %d", + check_msg->obs_time.wn); + ck_assert_msg(check_msg->reserved[0] == 0, + "incorrect value for reserved[0], expected 0, is %d", + check_msg->reserved[0]); + ck_assert_msg(check_msg->reserved[1] == 0, + "incorrect value for reserved[1], expected 0, is %d", + check_msg->reserved[1]); + ck_assert_msg(check_msg->reserved[2] == 0, + "incorrect value for reserved[2], expected 0, is %d", + check_msg->reserved[2]); + ck_assert_msg(check_msg->reserved[3] == 0, + "incorrect value for reserved[3], expected 0, is %d", + check_msg->reserved[3]); + ck_assert_msg(check_msg->reserved[4] == 0, + "incorrect value for reserved[4], expected 0, is %d", + check_msg->reserved[4]); + ck_assert_msg(check_msg->reserved[5] == 0, + "incorrect value for reserved[5], expected 0, is %d", + check_msg->reserved[5]); + ck_assert_msg(check_msg->ssr_sol_id == 10, + "incorrect value for ssr_sol_id, expected 10, is %d", + check_msg->ssr_sol_id); + ck_assert_msg(check_msg->tile_id == 30, + "incorrect value for tile_id, expected 30, is %d", + check_msg->tile_id); + ck_assert_msg(check_msg->tile_set_id == 20, + "incorrect value for tile_set_id, expected 20, is %d", + check_msg->tile_set_id); + ck_assert_msg(check_msg->use_bds_sat == 3, + "incorrect value for use_bds_sat, expected 3, is %d", + check_msg->use_bds_sat); + ck_assert_msg(check_msg->use_gal_sat == 2, + "incorrect value for use_gal_sat, expected 2, is %d", + check_msg->use_gal_sat); + ck_assert_msg(check_msg->use_gps_sat == 1, + "incorrect value for use_gps_sat, expected 1, is %d", + check_msg->use_gps_sat); + ck_assert_msg( + check_msg->use_iono_grid_point_sat_los == 7, + "incorrect value for use_iono_grid_point_sat_los, expected 7, is %d", + check_msg->use_iono_grid_point_sat_los); + ck_assert_msg(check_msg->use_iono_grid_points == 5, + "incorrect value for use_iono_grid_points, expected 5, is %d", + check_msg->use_iono_grid_points); + ck_assert_msg( + check_msg->use_iono_tile_sat_los == 6, + "incorrect value for use_iono_tile_sat_los, expected 6, is %d", + check_msg->use_iono_tile_sat_los); + ck_assert_msg( + check_msg->use_tropo_grid_points == 4, + "incorrect value for use_tropo_grid_points, expected 4, is %d", + check_msg->use_tropo_grid_points); } } END_TEST diff --git a/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos.c b/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos.c index 2e494b5b0e..cdb7201f95 100644 --- a/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos.c +++ b/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos.c @@ -134,111 +134,28 @@ START_TEST(test_legacy_auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos) { msg_ssr_flag_iono_grid_point_sat_los_t *test_msg = (msg_ssr_flag_iono_grid_point_sat_los_t *)test_msg_storage; test_msg_len = sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { + if (sizeof(test_msg->faulty_los) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->faulty_los[0]); } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { + test_msg->faulty_los[0].constellation = 11; + test_msg->faulty_los[0].satId = 10; + if (sizeof(test_msg->faulty_los) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->faulty_los[0]); } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[7] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[8] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[9] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[10] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[11] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[12] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[13] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[14] = 30; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[15] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[16] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[17] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[18] = 11; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[19] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[20] = 14; + test_msg->faulty_los[1].constellation = 14; + test_msg->faulty_los[1].satId = 15; + test_msg->grid_point_id = 30; + test_msg->header.chain_id = 6; + test_msg->header.num_msgs = 1; + test_msg->header.obs_time.tow = 180; + test_msg->header.obs_time.wn = 3; + test_msg->header.seq_num = 2; + test_msg->header.ssr_sol_id = 3; + test_msg->header.tile_id = 5; + test_msg->header.tile_set_id = 4; + test_msg->n_faulty_los = 2; sbp_payload_send(&sbp_state, 3025, 66, test_msg_len, test_msg_storage, &dummy_write); @@ -294,69 +211,51 @@ START_TEST(test_legacy_auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos) { (msg_ssr_flag_iono_grid_point_sat_los_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->stub[0] == 180, - "incorrect value for stub[0], expected 180, is %d", - check_msg->stub[0]); - ck_assert_msg(check_msg->stub[1] == 0, - "incorrect value for stub[1], expected 0, is %d", - check_msg->stub[1]); - ck_assert_msg(check_msg->stub[2] == 0, - "incorrect value for stub[2], expected 0, is %d", - check_msg->stub[2]); - ck_assert_msg(check_msg->stub[3] == 0, - "incorrect value for stub[3], expected 0, is %d", - check_msg->stub[3]); - ck_assert_msg(check_msg->stub[4] == 3, - "incorrect value for stub[4], expected 3, is %d", - check_msg->stub[4]); - ck_assert_msg(check_msg->stub[5] == 0, - "incorrect value for stub[5], expected 0, is %d", - check_msg->stub[5]); - ck_assert_msg(check_msg->stub[6] == 1, - "incorrect value for stub[6], expected 1, is %d", - check_msg->stub[6]); - ck_assert_msg(check_msg->stub[7] == 2, - "incorrect value for stub[7], expected 2, is %d", - check_msg->stub[7]); - ck_assert_msg(check_msg->stub[8] == 3, - "incorrect value for stub[8], expected 3, is %d", - check_msg->stub[8]); - ck_assert_msg(check_msg->stub[9] == 4, - "incorrect value for stub[9], expected 4, is %d", - check_msg->stub[9]); - ck_assert_msg(check_msg->stub[10] == 0, - "incorrect value for stub[10], expected 0, is %d", - check_msg->stub[10]); - ck_assert_msg(check_msg->stub[11] == 5, - "incorrect value for stub[11], expected 5, is %d", - check_msg->stub[11]); - ck_assert_msg(check_msg->stub[12] == 0, - "incorrect value for stub[12], expected 0, is %d", - check_msg->stub[12]); - ck_assert_msg(check_msg->stub[13] == 6, - "incorrect value for stub[13], expected 6, is %d", - check_msg->stub[13]); - ck_assert_msg(check_msg->stub[14] == 30, - "incorrect value for stub[14], expected 30, is %d", - check_msg->stub[14]); - ck_assert_msg(check_msg->stub[15] == 0, - "incorrect value for stub[15], expected 0, is %d", - check_msg->stub[15]); - ck_assert_msg(check_msg->stub[16] == 2, - "incorrect value for stub[16], expected 2, is %d", - check_msg->stub[16]); - ck_assert_msg(check_msg->stub[17] == 10, - "incorrect value for stub[17], expected 10, is %d", - check_msg->stub[17]); - ck_assert_msg(check_msg->stub[18] == 11, - "incorrect value for stub[18], expected 11, is %d", - check_msg->stub[18]); - ck_assert_msg(check_msg->stub[19] == 15, - "incorrect value for stub[19], expected 15, is %d", - check_msg->stub[19]); - ck_assert_msg(check_msg->stub[20] == 14, - "incorrect value for stub[20], expected 14, is %d", - check_msg->stub[20]); + ck_assert_msg( + check_msg->faulty_los[0].constellation == 11, + "incorrect value for faulty_los[0].constellation, expected 11, is %d", + check_msg->faulty_los[0].constellation); + ck_assert_msg(check_msg->faulty_los[0].satId == 10, + "incorrect value for faulty_los[0].satId, expected 10, is %d", + check_msg->faulty_los[0].satId); + ck_assert_msg( + check_msg->faulty_los[1].constellation == 14, + "incorrect value for faulty_los[1].constellation, expected 14, is %d", + check_msg->faulty_los[1].constellation); + ck_assert_msg(check_msg->faulty_los[1].satId == 15, + "incorrect value for faulty_los[1].satId, expected 15, is %d", + check_msg->faulty_los[1].satId); + ck_assert_msg(check_msg->grid_point_id == 30, + "incorrect value for grid_point_id, expected 30, is %d", + check_msg->grid_point_id); + ck_assert_msg(check_msg->header.chain_id == 6, + "incorrect value for header.chain_id, expected 6, is %d", + check_msg->header.chain_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.obs_time.tow == 180, + "incorrect value for header.obs_time.tow, expected 180, is %d", + check_msg->header.obs_time.tow); + ck_assert_msg(check_msg->header.obs_time.wn == 3, + "incorrect value for header.obs_time.wn, expected 3, is %d", + check_msg->header.obs_time.wn); + ck_assert_msg(check_msg->header.seq_num == 2, + "incorrect value for header.seq_num, expected 2, is %d", + check_msg->header.seq_num); + ck_assert_msg(check_msg->header.ssr_sol_id == 3, + "incorrect value for header.ssr_sol_id, expected 3, is %d", + check_msg->header.ssr_sol_id); + ck_assert_msg(check_msg->header.tile_id == 5, + "incorrect value for header.tile_id, expected 5, is %d", + check_msg->header.tile_id); + ck_assert_msg(check_msg->header.tile_set_id == 4, + "incorrect value for header.tile_set_id, expected 4, is %d", + check_msg->header.tile_set_id); + ck_assert_msg(check_msg->n_faulty_los == 2, + "incorrect value for n_faulty_los, expected 2, is %d", + check_msg->n_faulty_los); } } END_TEST diff --git a/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints.c b/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints.c index 535e902584..cb3bc241f9 100644 --- a/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints.c +++ b/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints.c @@ -134,111 +134,30 @@ START_TEST(test_legacy_auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints) { msg_ssr_flag_iono_grid_points_t *test_msg = (msg_ssr_flag_iono_grid_points_t *)test_msg_storage; test_msg_len = sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { + if (sizeof(test_msg->faulty_points) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->faulty_points[0]); } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { + test_msg->faulty_points[0] = 10; + if (sizeof(test_msg->faulty_points) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->faulty_points[0]); } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { + test_msg->faulty_points[1] = 11; + if (sizeof(test_msg->faulty_points) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->faulty_points[0]); } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[7] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[8] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[9] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[10] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[11] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[12] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[13] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[14] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[15] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[16] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[17] = 11; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[18] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[19] = 12; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[20] = 0; + test_msg->faulty_points[2] = 12; + test_msg->header.chain_id = 6; + test_msg->header.num_msgs = 1; + test_msg->header.obs_time.tow = 180; + test_msg->header.obs_time.wn = 3; + test_msg->header.seq_num = 2; + test_msg->header.ssr_sol_id = 3; + test_msg->header.tile_id = 5; + test_msg->header.tile_set_id = 4; + test_msg->n_faulty_points = 3; sbp_payload_send(&sbp_state, 3015, 66, test_msg_len, test_msg_storage, &dummy_write); @@ -294,69 +213,43 @@ START_TEST(test_legacy_auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints) { (msg_ssr_flag_iono_grid_points_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->stub[0] == 180, - "incorrect value for stub[0], expected 180, is %d", - check_msg->stub[0]); - ck_assert_msg(check_msg->stub[1] == 0, - "incorrect value for stub[1], expected 0, is %d", - check_msg->stub[1]); - ck_assert_msg(check_msg->stub[2] == 0, - "incorrect value for stub[2], expected 0, is %d", - check_msg->stub[2]); - ck_assert_msg(check_msg->stub[3] == 0, - "incorrect value for stub[3], expected 0, is %d", - check_msg->stub[3]); - ck_assert_msg(check_msg->stub[4] == 3, - "incorrect value for stub[4], expected 3, is %d", - check_msg->stub[4]); - ck_assert_msg(check_msg->stub[5] == 0, - "incorrect value for stub[5], expected 0, is %d", - check_msg->stub[5]); - ck_assert_msg(check_msg->stub[6] == 1, - "incorrect value for stub[6], expected 1, is %d", - check_msg->stub[6]); - ck_assert_msg(check_msg->stub[7] == 2, - "incorrect value for stub[7], expected 2, is %d", - check_msg->stub[7]); - ck_assert_msg(check_msg->stub[8] == 3, - "incorrect value for stub[8], expected 3, is %d", - check_msg->stub[8]); - ck_assert_msg(check_msg->stub[9] == 4, - "incorrect value for stub[9], expected 4, is %d", - check_msg->stub[9]); - ck_assert_msg(check_msg->stub[10] == 0, - "incorrect value for stub[10], expected 0, is %d", - check_msg->stub[10]); - ck_assert_msg(check_msg->stub[11] == 5, - "incorrect value for stub[11], expected 5, is %d", - check_msg->stub[11]); - ck_assert_msg(check_msg->stub[12] == 0, - "incorrect value for stub[12], expected 0, is %d", - check_msg->stub[12]); - ck_assert_msg(check_msg->stub[13] == 6, - "incorrect value for stub[13], expected 6, is %d", - check_msg->stub[13]); - ck_assert_msg(check_msg->stub[14] == 3, - "incorrect value for stub[14], expected 3, is %d", - check_msg->stub[14]); - ck_assert_msg(check_msg->stub[15] == 10, - "incorrect value for stub[15], expected 10, is %d", - check_msg->stub[15]); - ck_assert_msg(check_msg->stub[16] == 0, - "incorrect value for stub[16], expected 0, is %d", - check_msg->stub[16]); - ck_assert_msg(check_msg->stub[17] == 11, - "incorrect value for stub[17], expected 11, is %d", - check_msg->stub[17]); - ck_assert_msg(check_msg->stub[18] == 0, - "incorrect value for stub[18], expected 0, is %d", - check_msg->stub[18]); - ck_assert_msg(check_msg->stub[19] == 12, - "incorrect value for stub[19], expected 12, is %d", - check_msg->stub[19]); - ck_assert_msg(check_msg->stub[20] == 0, - "incorrect value for stub[20], expected 0, is %d", - check_msg->stub[20]); + ck_assert_msg(check_msg->faulty_points[0] == 10, + "incorrect value for faulty_points[0], expected 10, is %d", + check_msg->faulty_points[0]); + ck_assert_msg(check_msg->faulty_points[1] == 11, + "incorrect value for faulty_points[1], expected 11, is %d", + check_msg->faulty_points[1]); + ck_assert_msg(check_msg->faulty_points[2] == 12, + "incorrect value for faulty_points[2], expected 12, is %d", + check_msg->faulty_points[2]); + ck_assert_msg(check_msg->header.chain_id == 6, + "incorrect value for header.chain_id, expected 6, is %d", + check_msg->header.chain_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.obs_time.tow == 180, + "incorrect value for header.obs_time.tow, expected 180, is %d", + check_msg->header.obs_time.tow); + ck_assert_msg(check_msg->header.obs_time.wn == 3, + "incorrect value for header.obs_time.wn, expected 3, is %d", + check_msg->header.obs_time.wn); + ck_assert_msg(check_msg->header.seq_num == 2, + "incorrect value for header.seq_num, expected 2, is %d", + check_msg->header.seq_num); + ck_assert_msg(check_msg->header.ssr_sol_id == 3, + "incorrect value for header.ssr_sol_id, expected 3, is %d", + check_msg->header.ssr_sol_id); + ck_assert_msg(check_msg->header.tile_id == 5, + "incorrect value for header.tile_id, expected 5, is %d", + check_msg->header.tile_id); + ck_assert_msg(check_msg->header.tile_set_id == 4, + "incorrect value for header.tile_set_id, expected 4, is %d", + check_msg->header.tile_set_id); + ck_assert_msg(check_msg->n_faulty_points == 3, + "incorrect value for n_faulty_points, expected 3, is %d", + check_msg->n_faulty_points); } } END_TEST diff --git a/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos.c b/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos.c index bcc8f85291..f4450330d8 100644 --- a/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos.c +++ b/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos.c @@ -134,101 +134,27 @@ START_TEST(test_legacy_auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos) { msg_ssr_flag_iono_tile_sat_los_t *test_msg = (msg_ssr_flag_iono_tile_sat_los_t *)test_msg_storage; test_msg_len = sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { + if (sizeof(test_msg->faulty_los) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->faulty_los[0]); } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { + test_msg->faulty_los[0].constellation = 11; + test_msg->faulty_los[0].satId = 10; + if (sizeof(test_msg->faulty_los) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->faulty_los[0]); } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[7] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[8] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[9] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[10] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[11] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[12] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[13] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[14] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[15] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[16] = 11; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[17] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[18] = 14; + test_msg->faulty_los[1].constellation = 14; + test_msg->faulty_los[1].satId = 15; + test_msg->header.chain_id = 6; + test_msg->header.num_msgs = 1; + test_msg->header.obs_time.tow = 180; + test_msg->header.obs_time.wn = 3; + test_msg->header.seq_num = 2; + test_msg->header.ssr_sol_id = 3; + test_msg->header.tile_id = 5; + test_msg->header.tile_set_id = 4; + test_msg->n_faulty_los = 2; sbp_payload_send(&sbp_state, 3021, 66, test_msg_len, test_msg_storage, &dummy_write); @@ -284,63 +210,48 @@ START_TEST(test_legacy_auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos) { (msg_ssr_flag_iono_tile_sat_los_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->stub[0] == 180, - "incorrect value for stub[0], expected 180, is %d", - check_msg->stub[0]); - ck_assert_msg(check_msg->stub[1] == 0, - "incorrect value for stub[1], expected 0, is %d", - check_msg->stub[1]); - ck_assert_msg(check_msg->stub[2] == 0, - "incorrect value for stub[2], expected 0, is %d", - check_msg->stub[2]); - ck_assert_msg(check_msg->stub[3] == 0, - "incorrect value for stub[3], expected 0, is %d", - check_msg->stub[3]); - ck_assert_msg(check_msg->stub[4] == 3, - "incorrect value for stub[4], expected 3, is %d", - check_msg->stub[4]); - ck_assert_msg(check_msg->stub[5] == 0, - "incorrect value for stub[5], expected 0, is %d", - check_msg->stub[5]); - ck_assert_msg(check_msg->stub[6] == 1, - "incorrect value for stub[6], expected 1, is %d", - check_msg->stub[6]); - ck_assert_msg(check_msg->stub[7] == 2, - "incorrect value for stub[7], expected 2, is %d", - check_msg->stub[7]); - ck_assert_msg(check_msg->stub[8] == 3, - "incorrect value for stub[8], expected 3, is %d", - check_msg->stub[8]); - ck_assert_msg(check_msg->stub[9] == 4, - "incorrect value for stub[9], expected 4, is %d", - check_msg->stub[9]); - ck_assert_msg(check_msg->stub[10] == 0, - "incorrect value for stub[10], expected 0, is %d", - check_msg->stub[10]); - ck_assert_msg(check_msg->stub[11] == 5, - "incorrect value for stub[11], expected 5, is %d", - check_msg->stub[11]); - ck_assert_msg(check_msg->stub[12] == 0, - "incorrect value for stub[12], expected 0, is %d", - check_msg->stub[12]); - ck_assert_msg(check_msg->stub[13] == 6, - "incorrect value for stub[13], expected 6, is %d", - check_msg->stub[13]); - ck_assert_msg(check_msg->stub[14] == 2, - "incorrect value for stub[14], expected 2, is %d", - check_msg->stub[14]); - ck_assert_msg(check_msg->stub[15] == 10, - "incorrect value for stub[15], expected 10, is %d", - check_msg->stub[15]); - ck_assert_msg(check_msg->stub[16] == 11, - "incorrect value for stub[16], expected 11, is %d", - check_msg->stub[16]); - ck_assert_msg(check_msg->stub[17] == 15, - "incorrect value for stub[17], expected 15, is %d", - check_msg->stub[17]); - ck_assert_msg(check_msg->stub[18] == 14, - "incorrect value for stub[18], expected 14, is %d", - check_msg->stub[18]); + ck_assert_msg( + check_msg->faulty_los[0].constellation == 11, + "incorrect value for faulty_los[0].constellation, expected 11, is %d", + check_msg->faulty_los[0].constellation); + ck_assert_msg(check_msg->faulty_los[0].satId == 10, + "incorrect value for faulty_los[0].satId, expected 10, is %d", + check_msg->faulty_los[0].satId); + ck_assert_msg( + check_msg->faulty_los[1].constellation == 14, + "incorrect value for faulty_los[1].constellation, expected 14, is %d", + check_msg->faulty_los[1].constellation); + ck_assert_msg(check_msg->faulty_los[1].satId == 15, + "incorrect value for faulty_los[1].satId, expected 15, is %d", + check_msg->faulty_los[1].satId); + ck_assert_msg(check_msg->header.chain_id == 6, + "incorrect value for header.chain_id, expected 6, is %d", + check_msg->header.chain_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.obs_time.tow == 180, + "incorrect value for header.obs_time.tow, expected 180, is %d", + check_msg->header.obs_time.tow); + ck_assert_msg(check_msg->header.obs_time.wn == 3, + "incorrect value for header.obs_time.wn, expected 3, is %d", + check_msg->header.obs_time.wn); + ck_assert_msg(check_msg->header.seq_num == 2, + "incorrect value for header.seq_num, expected 2, is %d", + check_msg->header.seq_num); + ck_assert_msg(check_msg->header.ssr_sol_id == 3, + "incorrect value for header.ssr_sol_id, expected 3, is %d", + check_msg->header.ssr_sol_id); + ck_assert_msg(check_msg->header.tile_id == 5, + "incorrect value for header.tile_id, expected 5, is %d", + check_msg->header.tile_id); + ck_assert_msg(check_msg->header.tile_set_id == 4, + "incorrect value for header.tile_set_id, expected 4, is %d", + check_msg->header.tile_set_id); + ck_assert_msg(check_msg->n_faulty_los == 2, + "incorrect value for n_faulty_los, expected 2, is %d", + check_msg->n_faulty_los); } } END_TEST diff --git a/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagSatellites.c b/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagSatellites.c index aa96c0fe3c..19811e095d 100644 --- a/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagSatellites.c +++ b/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagSatellites.c @@ -134,81 +134,29 @@ START_TEST(test_legacy_auto_check_sbp_integrity_MsgSsrFlagSatellites) { msg_ssr_flag_satellites_t *test_msg = (msg_ssr_flag_satellites_t *)test_msg_storage; test_msg_len = sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { + test_msg->chain_id = 4; + test_msg->const_id = 5; + if (sizeof(test_msg->faulty_sats) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->faulty_sats[0]); } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { + test_msg->faulty_sats[0] = 10; + if (sizeof(test_msg->faulty_sats) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->faulty_sats[0]); } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { + test_msg->faulty_sats[1] = 11; + if (sizeof(test_msg->faulty_sats) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->faulty_sats[0]); } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[7] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[8] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[9] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[10] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[11] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[12] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[13] = 11; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[14] = 12; + test_msg->faulty_sats[2] = 12; + test_msg->n_faulty_sats = 3; + test_msg->num_msgs = 1; + test_msg->obs_time.tow = 180; + test_msg->obs_time.wn = 3; + test_msg->seq_num = 2; + test_msg->ssr_sol_id = 3; sbp_payload_send(&sbp_state, 3005, 66, test_msg_len, test_msg_storage, &dummy_write); @@ -264,51 +212,39 @@ START_TEST(test_legacy_auto_check_sbp_integrity_MsgSsrFlagSatellites) { (msg_ssr_flag_satellites_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->stub[0] == 180, - "incorrect value for stub[0], expected 180, is %d", - check_msg->stub[0]); - ck_assert_msg(check_msg->stub[1] == 0, - "incorrect value for stub[1], expected 0, is %d", - check_msg->stub[1]); - ck_assert_msg(check_msg->stub[2] == 0, - "incorrect value for stub[2], expected 0, is %d", - check_msg->stub[2]); - ck_assert_msg(check_msg->stub[3] == 0, - "incorrect value for stub[3], expected 0, is %d", - check_msg->stub[3]); - ck_assert_msg(check_msg->stub[4] == 3, - "incorrect value for stub[4], expected 3, is %d", - check_msg->stub[4]); - ck_assert_msg(check_msg->stub[5] == 0, - "incorrect value for stub[5], expected 0, is %d", - check_msg->stub[5]); - ck_assert_msg(check_msg->stub[6] == 1, - "incorrect value for stub[6], expected 1, is %d", - check_msg->stub[6]); - ck_assert_msg(check_msg->stub[7] == 2, - "incorrect value for stub[7], expected 2, is %d", - check_msg->stub[7]); - ck_assert_msg(check_msg->stub[8] == 3, - "incorrect value for stub[8], expected 3, is %d", - check_msg->stub[8]); - ck_assert_msg(check_msg->stub[9] == 4, - "incorrect value for stub[9], expected 4, is %d", - check_msg->stub[9]); - ck_assert_msg(check_msg->stub[10] == 5, - "incorrect value for stub[10], expected 5, is %d", - check_msg->stub[10]); - ck_assert_msg(check_msg->stub[11] == 3, - "incorrect value for stub[11], expected 3, is %d", - check_msg->stub[11]); - ck_assert_msg(check_msg->stub[12] == 10, - "incorrect value for stub[12], expected 10, is %d", - check_msg->stub[12]); - ck_assert_msg(check_msg->stub[13] == 11, - "incorrect value for stub[13], expected 11, is %d", - check_msg->stub[13]); - ck_assert_msg(check_msg->stub[14] == 12, - "incorrect value for stub[14], expected 12, is %d", - check_msg->stub[14]); + ck_assert_msg(check_msg->chain_id == 4, + "incorrect value for chain_id, expected 4, is %d", + check_msg->chain_id); + ck_assert_msg(check_msg->const_id == 5, + "incorrect value for const_id, expected 5, is %d", + check_msg->const_id); + ck_assert_msg(check_msg->faulty_sats[0] == 10, + "incorrect value for faulty_sats[0], expected 10, is %d", + check_msg->faulty_sats[0]); + ck_assert_msg(check_msg->faulty_sats[1] == 11, + "incorrect value for faulty_sats[1], expected 11, is %d", + check_msg->faulty_sats[1]); + ck_assert_msg(check_msg->faulty_sats[2] == 12, + "incorrect value for faulty_sats[2], expected 12, is %d", + check_msg->faulty_sats[2]); + ck_assert_msg(check_msg->n_faulty_sats == 3, + "incorrect value for n_faulty_sats, expected 3, is %d", + check_msg->n_faulty_sats); + ck_assert_msg(check_msg->num_msgs == 1, + "incorrect value for num_msgs, expected 1, is %d", + check_msg->num_msgs); + ck_assert_msg(check_msg->obs_time.tow == 180, + "incorrect value for obs_time.tow, expected 180, is %d", + check_msg->obs_time.tow); + ck_assert_msg(check_msg->obs_time.wn == 3, + "incorrect value for obs_time.wn, expected 3, is %d", + check_msg->obs_time.wn); + ck_assert_msg(check_msg->seq_num == 2, + "incorrect value for seq_num, expected 2, is %d", + check_msg->seq_num); + ck_assert_msg(check_msg->ssr_sol_id == 3, + "incorrect value for ssr_sol_id, expected 3, is %d", + check_msg->ssr_sol_id); } } END_TEST diff --git a/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints.c b/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints.c index e32977679e..40a15c68a7 100644 --- a/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints.c +++ b/c/test/legacy/auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints.c @@ -134,111 +134,30 @@ START_TEST(test_legacy_auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints) { msg_ssr_flag_tropo_grid_points_t *test_msg = (msg_ssr_flag_tropo_grid_points_t *)test_msg_storage; test_msg_len = sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { + if (sizeof(test_msg->faulty_points) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->faulty_points[0]); } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { + test_msg->faulty_points[0] = 10; + if (sizeof(test_msg->faulty_points) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->faulty_points[0]); } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { + test_msg->faulty_points[1] = 11; + if (sizeof(test_msg->faulty_points) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->faulty_points[0]); } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[7] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[8] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[9] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[10] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[11] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[12] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[13] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[14] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[15] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[16] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[17] = 11; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[18] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[19] = 12; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[20] = 0; + test_msg->faulty_points[2] = 12; + test_msg->header.chain_id = 6; + test_msg->header.num_msgs = 1; + test_msg->header.obs_time.tow = 180; + test_msg->header.obs_time.wn = 3; + test_msg->header.seq_num = 2; + test_msg->header.ssr_sol_id = 3; + test_msg->header.tile_id = 5; + test_msg->header.tile_set_id = 4; + test_msg->n_faulty_points = 3; sbp_payload_send(&sbp_state, 3011, 66, test_msg_len, test_msg_storage, &dummy_write); @@ -294,69 +213,43 @@ START_TEST(test_legacy_auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints) { (msg_ssr_flag_tropo_grid_points_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->stub[0] == 180, - "incorrect value for stub[0], expected 180, is %d", - check_msg->stub[0]); - ck_assert_msg(check_msg->stub[1] == 0, - "incorrect value for stub[1], expected 0, is %d", - check_msg->stub[1]); - ck_assert_msg(check_msg->stub[2] == 0, - "incorrect value for stub[2], expected 0, is %d", - check_msg->stub[2]); - ck_assert_msg(check_msg->stub[3] == 0, - "incorrect value for stub[3], expected 0, is %d", - check_msg->stub[3]); - ck_assert_msg(check_msg->stub[4] == 3, - "incorrect value for stub[4], expected 3, is %d", - check_msg->stub[4]); - ck_assert_msg(check_msg->stub[5] == 0, - "incorrect value for stub[5], expected 0, is %d", - check_msg->stub[5]); - ck_assert_msg(check_msg->stub[6] == 1, - "incorrect value for stub[6], expected 1, is %d", - check_msg->stub[6]); - ck_assert_msg(check_msg->stub[7] == 2, - "incorrect value for stub[7], expected 2, is %d", - check_msg->stub[7]); - ck_assert_msg(check_msg->stub[8] == 3, - "incorrect value for stub[8], expected 3, is %d", - check_msg->stub[8]); - ck_assert_msg(check_msg->stub[9] == 4, - "incorrect value for stub[9], expected 4, is %d", - check_msg->stub[9]); - ck_assert_msg(check_msg->stub[10] == 0, - "incorrect value for stub[10], expected 0, is %d", - check_msg->stub[10]); - ck_assert_msg(check_msg->stub[11] == 5, - "incorrect value for stub[11], expected 5, is %d", - check_msg->stub[11]); - ck_assert_msg(check_msg->stub[12] == 0, - "incorrect value for stub[12], expected 0, is %d", - check_msg->stub[12]); - ck_assert_msg(check_msg->stub[13] == 6, - "incorrect value for stub[13], expected 6, is %d", - check_msg->stub[13]); - ck_assert_msg(check_msg->stub[14] == 3, - "incorrect value for stub[14], expected 3, is %d", - check_msg->stub[14]); - ck_assert_msg(check_msg->stub[15] == 10, - "incorrect value for stub[15], expected 10, is %d", - check_msg->stub[15]); - ck_assert_msg(check_msg->stub[16] == 0, - "incorrect value for stub[16], expected 0, is %d", - check_msg->stub[16]); - ck_assert_msg(check_msg->stub[17] == 11, - "incorrect value for stub[17], expected 11, is %d", - check_msg->stub[17]); - ck_assert_msg(check_msg->stub[18] == 0, - "incorrect value for stub[18], expected 0, is %d", - check_msg->stub[18]); - ck_assert_msg(check_msg->stub[19] == 12, - "incorrect value for stub[19], expected 12, is %d", - check_msg->stub[19]); - ck_assert_msg(check_msg->stub[20] == 0, - "incorrect value for stub[20], expected 0, is %d", - check_msg->stub[20]); + ck_assert_msg(check_msg->faulty_points[0] == 10, + "incorrect value for faulty_points[0], expected 10, is %d", + check_msg->faulty_points[0]); + ck_assert_msg(check_msg->faulty_points[1] == 11, + "incorrect value for faulty_points[1], expected 11, is %d", + check_msg->faulty_points[1]); + ck_assert_msg(check_msg->faulty_points[2] == 12, + "incorrect value for faulty_points[2], expected 12, is %d", + check_msg->faulty_points[2]); + ck_assert_msg(check_msg->header.chain_id == 6, + "incorrect value for header.chain_id, expected 6, is %d", + check_msg->header.chain_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.obs_time.tow == 180, + "incorrect value for header.obs_time.tow, expected 180, is %d", + check_msg->header.obs_time.tow); + ck_assert_msg(check_msg->header.obs_time.wn == 3, + "incorrect value for header.obs_time.wn, expected 3, is %d", + check_msg->header.obs_time.wn); + ck_assert_msg(check_msg->header.seq_num == 2, + "incorrect value for header.seq_num, expected 2, is %d", + check_msg->header.seq_num); + ck_assert_msg(check_msg->header.ssr_sol_id == 3, + "incorrect value for header.ssr_sol_id, expected 3, is %d", + check_msg->header.ssr_sol_id); + ck_assert_msg(check_msg->header.tile_id == 5, + "incorrect value for header.tile_id, expected 5, is %d", + check_msg->header.tile_id); + ck_assert_msg(check_msg->header.tile_set_id == 4, + "incorrect value for header.tile_set_id, expected 4, is %d", + check_msg->header.tile_set_id); + ck_assert_msg(check_msg->n_faulty_points == 3, + "incorrect value for n_faulty_points, expected 3, is %d", + check_msg->n_faulty_points); } } END_TEST diff --git a/c/test/legacy/auto_check_sbp_navigation_MsgReferenceFrameParam.c b/c/test/legacy/auto_check_sbp_navigation_MsgReferenceFrameParam.c index 3cc6c80e81..dc4d02e759 100644 --- a/c/test/legacy/auto_check_sbp_navigation_MsgReferenceFrameParam.c +++ b/c/test/legacy/auto_check_sbp_navigation_MsgReferenceFrameParam.c @@ -122,14 +122,14 @@ START_TEST(test_legacy_auto_check_sbp_navigation_MsgReferenceFrameParam) { &DUMMY_MEMORY_FOR_CALLBACKS, &n2); u8 encoded_frame[] = { - 85, 68, 2, 66, 0, 124, 1, 2, 102, 111, 111, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 5, 0, 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, - 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, - 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, - 0, 18, 0, 0, 0, 19, 0, 0, 0, 20, 0, 66, 126, + 85, 68, 2, 66, 0, 124, 1, 102, 111, 111, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 5, 0, 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, + 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, + 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, + 0, 18, 0, 0, 0, 19, 0, 0, 0, 20, 0, 6, 161, }; dummy_reset(); @@ -140,626 +140,48 @@ START_TEST(test_legacy_auto_check_sbp_navigation_MsgReferenceFrameParam) { msg_reference_frame_param_t *test_msg = (msg_reference_frame_param_t *)test_msg_storage; test_msg_len = sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[0] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[1] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[2] = 102; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[3] = 111; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[4] = 111; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[6] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[7] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[8] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[9] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[10] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[11] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[12] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[13] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[14] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[15] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[16] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[17] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[18] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[19] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[20] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[21] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[22] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[23] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[24] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[25] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[26] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[27] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[28] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[29] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[30] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[31] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[32] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[33] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[34] = 98; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[35] = 97; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[36] = 114; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[37] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[38] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[39] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[40] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[41] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[42] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[43] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[44] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[45] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[46] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[47] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[48] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[49] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[50] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[51] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[52] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[53] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[54] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[55] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[56] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[57] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[58] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[59] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[60] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[61] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[62] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[63] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[64] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[65] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[66] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[67] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[68] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[69] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[70] = 7; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[71] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[72] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[73] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[74] = 8; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[75] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[76] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[77] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[78] = 9; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[79] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[80] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[81] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[82] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[83] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[84] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[85] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[86] = 11; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[87] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[88] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[89] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[90] = 12; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[91] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[92] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[93] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[94] = 13; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[95] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[96] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[97] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[98] = 14; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[99] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[100] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[101] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[102] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[103] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[104] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[105] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[106] = 16; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[107] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[108] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[109] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[110] = 17; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[111] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[112] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[113] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[114] = 18; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[115] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[116] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[117] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[118] = 19; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[119] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[120] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[121] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[122] = 20; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[123] = 0; + test_msg->delta_X0 = 7; + test_msg->delta_Y0 = 8; + test_msg->delta_Z0 = 9; + test_msg->dot_delta_X0 = 14; + test_msg->dot_delta_Y0 = 15; + test_msg->dot_delta_Z0 = 16; + test_msg->dot_scale = 20; + test_msg->dot_theta_01 = 17; + test_msg->dot_theta_02 = 18; + test_msg->dot_theta_03 = 19; + test_msg->re_t0 = 6; + test_msg->scale = 13; + test_msg->sin = 4; + { + const char assign_string[] = { + (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0}; + memcpy(test_msg->sn, assign_string, sizeof(assign_string)); + if (sizeof(test_msg->sn) == 0) { + test_msg_len += sizeof(assign_string); + } + } + test_msg->ssr_iod = 1; + test_msg->theta_01 = 10; + test_msg->theta_02 = 11; + test_msg->theta_03 = 12; + { + const char assign_string[] = { + (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0}; + memcpy(test_msg->tn, assign_string, sizeof(assign_string)); + if (sizeof(test_msg->tn) == 0) { + test_msg_len += sizeof(assign_string); + } + } + test_msg->utn = 5; sbp_payload_send(&sbp_state, 580, 66, test_msg_len, test_msg_storage, &dummy_write); @@ -815,378 +237,82 @@ START_TEST(test_legacy_auto_check_sbp_navigation_MsgReferenceFrameParam) { (msg_reference_frame_param_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->stub[0] == 1, - "incorrect value for stub[0], expected 1, is %d", - check_msg->stub[0]); - ck_assert_msg(check_msg->stub[1] == 2, - "incorrect value for stub[1], expected 2, is %d", - check_msg->stub[1]); - ck_assert_msg(check_msg->stub[2] == 102, - "incorrect value for stub[2], expected 102, is %d", - check_msg->stub[2]); - ck_assert_msg(check_msg->stub[3] == 111, - "incorrect value for stub[3], expected 111, is %d", - check_msg->stub[3]); - ck_assert_msg(check_msg->stub[4] == 111, - "incorrect value for stub[4], expected 111, is %d", - check_msg->stub[4]); - ck_assert_msg(check_msg->stub[5] == 0, - "incorrect value for stub[5], expected 0, is %d", - check_msg->stub[5]); - ck_assert_msg(check_msg->stub[6] == 0, - "incorrect value for stub[6], expected 0, is %d", - check_msg->stub[6]); - ck_assert_msg(check_msg->stub[7] == 0, - "incorrect value for stub[7], expected 0, is %d", - check_msg->stub[7]); - ck_assert_msg(check_msg->stub[8] == 0, - "incorrect value for stub[8], expected 0, is %d", - check_msg->stub[8]); - ck_assert_msg(check_msg->stub[9] == 0, - "incorrect value for stub[9], expected 0, is %d", - check_msg->stub[9]); - ck_assert_msg(check_msg->stub[10] == 0, - "incorrect value for stub[10], expected 0, is %d", - check_msg->stub[10]); - ck_assert_msg(check_msg->stub[11] == 0, - "incorrect value for stub[11], expected 0, is %d", - check_msg->stub[11]); - ck_assert_msg(check_msg->stub[12] == 0, - "incorrect value for stub[12], expected 0, is %d", - check_msg->stub[12]); - ck_assert_msg(check_msg->stub[13] == 0, - "incorrect value for stub[13], expected 0, is %d", - check_msg->stub[13]); - ck_assert_msg(check_msg->stub[14] == 0, - "incorrect value for stub[14], expected 0, is %d", - check_msg->stub[14]); - ck_assert_msg(check_msg->stub[15] == 0, - "incorrect value for stub[15], expected 0, is %d", - check_msg->stub[15]); - ck_assert_msg(check_msg->stub[16] == 0, - "incorrect value for stub[16], expected 0, is %d", - check_msg->stub[16]); - ck_assert_msg(check_msg->stub[17] == 0, - "incorrect value for stub[17], expected 0, is %d", - check_msg->stub[17]); - ck_assert_msg(check_msg->stub[18] == 0, - "incorrect value for stub[18], expected 0, is %d", - check_msg->stub[18]); - ck_assert_msg(check_msg->stub[19] == 0, - "incorrect value for stub[19], expected 0, is %d", - check_msg->stub[19]); - ck_assert_msg(check_msg->stub[20] == 0, - "incorrect value for stub[20], expected 0, is %d", - check_msg->stub[20]); - ck_assert_msg(check_msg->stub[21] == 0, - "incorrect value for stub[21], expected 0, is %d", - check_msg->stub[21]); - ck_assert_msg(check_msg->stub[22] == 0, - "incorrect value for stub[22], expected 0, is %d", - check_msg->stub[22]); - ck_assert_msg(check_msg->stub[23] == 0, - "incorrect value for stub[23], expected 0, is %d", - check_msg->stub[23]); - ck_assert_msg(check_msg->stub[24] == 0, - "incorrect value for stub[24], expected 0, is %d", - check_msg->stub[24]); - ck_assert_msg(check_msg->stub[25] == 0, - "incorrect value for stub[25], expected 0, is %d", - check_msg->stub[25]); - ck_assert_msg(check_msg->stub[26] == 0, - "incorrect value for stub[26], expected 0, is %d", - check_msg->stub[26]); - ck_assert_msg(check_msg->stub[27] == 0, - "incorrect value for stub[27], expected 0, is %d", - check_msg->stub[27]); - ck_assert_msg(check_msg->stub[28] == 0, - "incorrect value for stub[28], expected 0, is %d", - check_msg->stub[28]); - ck_assert_msg(check_msg->stub[29] == 0, - "incorrect value for stub[29], expected 0, is %d", - check_msg->stub[29]); - ck_assert_msg(check_msg->stub[30] == 0, - "incorrect value for stub[30], expected 0, is %d", - check_msg->stub[30]); - ck_assert_msg(check_msg->stub[31] == 0, - "incorrect value for stub[31], expected 0, is %d", - check_msg->stub[31]); - ck_assert_msg(check_msg->stub[32] == 0, - "incorrect value for stub[32], expected 0, is %d", - check_msg->stub[32]); - ck_assert_msg(check_msg->stub[33] == 3, - "incorrect value for stub[33], expected 3, is %d", - check_msg->stub[33]); - ck_assert_msg(check_msg->stub[34] == 98, - "incorrect value for stub[34], expected 98, is %d", - check_msg->stub[34]); - ck_assert_msg(check_msg->stub[35] == 97, - "incorrect value for stub[35], expected 97, is %d", - check_msg->stub[35]); - ck_assert_msg(check_msg->stub[36] == 114, - "incorrect value for stub[36], expected 114, is %d", - check_msg->stub[36]); - ck_assert_msg(check_msg->stub[37] == 0, - "incorrect value for stub[37], expected 0, is %d", - check_msg->stub[37]); - ck_assert_msg(check_msg->stub[38] == 0, - "incorrect value for stub[38], expected 0, is %d", - check_msg->stub[38]); - ck_assert_msg(check_msg->stub[39] == 0, - "incorrect value for stub[39], expected 0, is %d", - check_msg->stub[39]); - ck_assert_msg(check_msg->stub[40] == 0, - "incorrect value for stub[40], expected 0, is %d", - check_msg->stub[40]); - ck_assert_msg(check_msg->stub[41] == 0, - "incorrect value for stub[41], expected 0, is %d", - check_msg->stub[41]); - ck_assert_msg(check_msg->stub[42] == 0, - "incorrect value for stub[42], expected 0, is %d", - check_msg->stub[42]); - ck_assert_msg(check_msg->stub[43] == 0, - "incorrect value for stub[43], expected 0, is %d", - check_msg->stub[43]); - ck_assert_msg(check_msg->stub[44] == 0, - "incorrect value for stub[44], expected 0, is %d", - check_msg->stub[44]); - ck_assert_msg(check_msg->stub[45] == 0, - "incorrect value for stub[45], expected 0, is %d", - check_msg->stub[45]); - ck_assert_msg(check_msg->stub[46] == 0, - "incorrect value for stub[46], expected 0, is %d", - check_msg->stub[46]); - ck_assert_msg(check_msg->stub[47] == 0, - "incorrect value for stub[47], expected 0, is %d", - check_msg->stub[47]); - ck_assert_msg(check_msg->stub[48] == 0, - "incorrect value for stub[48], expected 0, is %d", - check_msg->stub[48]); - ck_assert_msg(check_msg->stub[49] == 0, - "incorrect value for stub[49], expected 0, is %d", - check_msg->stub[49]); - ck_assert_msg(check_msg->stub[50] == 0, - "incorrect value for stub[50], expected 0, is %d", - check_msg->stub[50]); - ck_assert_msg(check_msg->stub[51] == 0, - "incorrect value for stub[51], expected 0, is %d", - check_msg->stub[51]); - ck_assert_msg(check_msg->stub[52] == 0, - "incorrect value for stub[52], expected 0, is %d", - check_msg->stub[52]); - ck_assert_msg(check_msg->stub[53] == 0, - "incorrect value for stub[53], expected 0, is %d", - check_msg->stub[53]); - ck_assert_msg(check_msg->stub[54] == 0, - "incorrect value for stub[54], expected 0, is %d", - check_msg->stub[54]); - ck_assert_msg(check_msg->stub[55] == 0, - "incorrect value for stub[55], expected 0, is %d", - check_msg->stub[55]); - ck_assert_msg(check_msg->stub[56] == 0, - "incorrect value for stub[56], expected 0, is %d", - check_msg->stub[56]); - ck_assert_msg(check_msg->stub[57] == 0, - "incorrect value for stub[57], expected 0, is %d", - check_msg->stub[57]); - ck_assert_msg(check_msg->stub[58] == 0, - "incorrect value for stub[58], expected 0, is %d", - check_msg->stub[58]); - ck_assert_msg(check_msg->stub[59] == 0, - "incorrect value for stub[59], expected 0, is %d", - check_msg->stub[59]); - ck_assert_msg(check_msg->stub[60] == 0, - "incorrect value for stub[60], expected 0, is %d", - check_msg->stub[60]); - ck_assert_msg(check_msg->stub[61] == 0, - "incorrect value for stub[61], expected 0, is %d", - check_msg->stub[61]); - ck_assert_msg(check_msg->stub[62] == 0, - "incorrect value for stub[62], expected 0, is %d", - check_msg->stub[62]); - ck_assert_msg(check_msg->stub[63] == 0, - "incorrect value for stub[63], expected 0, is %d", - check_msg->stub[63]); - ck_assert_msg(check_msg->stub[64] == 0, - "incorrect value for stub[64], expected 0, is %d", - check_msg->stub[64]); - ck_assert_msg(check_msg->stub[65] == 4, - "incorrect value for stub[65], expected 4, is %d", - check_msg->stub[65]); - ck_assert_msg(check_msg->stub[66] == 5, - "incorrect value for stub[66], expected 5, is %d", - check_msg->stub[66]); - ck_assert_msg(check_msg->stub[67] == 0, - "incorrect value for stub[67], expected 0, is %d", - check_msg->stub[67]); - ck_assert_msg(check_msg->stub[68] == 6, - "incorrect value for stub[68], expected 6, is %d", - check_msg->stub[68]); - ck_assert_msg(check_msg->stub[69] == 0, - "incorrect value for stub[69], expected 0, is %d", - check_msg->stub[69]); - ck_assert_msg(check_msg->stub[70] == 7, - "incorrect value for stub[70], expected 7, is %d", - check_msg->stub[70]); - ck_assert_msg(check_msg->stub[71] == 0, - "incorrect value for stub[71], expected 0, is %d", - check_msg->stub[71]); - ck_assert_msg(check_msg->stub[72] == 0, - "incorrect value for stub[72], expected 0, is %d", - check_msg->stub[72]); - ck_assert_msg(check_msg->stub[73] == 0, - "incorrect value for stub[73], expected 0, is %d", - check_msg->stub[73]); - ck_assert_msg(check_msg->stub[74] == 8, - "incorrect value for stub[74], expected 8, is %d", - check_msg->stub[74]); - ck_assert_msg(check_msg->stub[75] == 0, - "incorrect value for stub[75], expected 0, is %d", - check_msg->stub[75]); - ck_assert_msg(check_msg->stub[76] == 0, - "incorrect value for stub[76], expected 0, is %d", - check_msg->stub[76]); - ck_assert_msg(check_msg->stub[77] == 0, - "incorrect value for stub[77], expected 0, is %d", - check_msg->stub[77]); - ck_assert_msg(check_msg->stub[78] == 9, - "incorrect value for stub[78], expected 9, is %d", - check_msg->stub[78]); - ck_assert_msg(check_msg->stub[79] == 0, - "incorrect value for stub[79], expected 0, is %d", - check_msg->stub[79]); - ck_assert_msg(check_msg->stub[80] == 0, - "incorrect value for stub[80], expected 0, is %d", - check_msg->stub[80]); - ck_assert_msg(check_msg->stub[81] == 0, - "incorrect value for stub[81], expected 0, is %d", - check_msg->stub[81]); - ck_assert_msg(check_msg->stub[82] == 10, - "incorrect value for stub[82], expected 10, is %d", - check_msg->stub[82]); - ck_assert_msg(check_msg->stub[83] == 0, - "incorrect value for stub[83], expected 0, is %d", - check_msg->stub[83]); - ck_assert_msg(check_msg->stub[84] == 0, - "incorrect value for stub[84], expected 0, is %d", - check_msg->stub[84]); - ck_assert_msg(check_msg->stub[85] == 0, - "incorrect value for stub[85], expected 0, is %d", - check_msg->stub[85]); - ck_assert_msg(check_msg->stub[86] == 11, - "incorrect value for stub[86], expected 11, is %d", - check_msg->stub[86]); - ck_assert_msg(check_msg->stub[87] == 0, - "incorrect value for stub[87], expected 0, is %d", - check_msg->stub[87]); - ck_assert_msg(check_msg->stub[88] == 0, - "incorrect value for stub[88], expected 0, is %d", - check_msg->stub[88]); - ck_assert_msg(check_msg->stub[89] == 0, - "incorrect value for stub[89], expected 0, is %d", - check_msg->stub[89]); - ck_assert_msg(check_msg->stub[90] == 12, - "incorrect value for stub[90], expected 12, is %d", - check_msg->stub[90]); - ck_assert_msg(check_msg->stub[91] == 0, - "incorrect value for stub[91], expected 0, is %d", - check_msg->stub[91]); - ck_assert_msg(check_msg->stub[92] == 0, - "incorrect value for stub[92], expected 0, is %d", - check_msg->stub[92]); - ck_assert_msg(check_msg->stub[93] == 0, - "incorrect value for stub[93], expected 0, is %d", - check_msg->stub[93]); - ck_assert_msg(check_msg->stub[94] == 13, - "incorrect value for stub[94], expected 13, is %d", - check_msg->stub[94]); - ck_assert_msg(check_msg->stub[95] == 0, - "incorrect value for stub[95], expected 0, is %d", - check_msg->stub[95]); - ck_assert_msg(check_msg->stub[96] == 0, - "incorrect value for stub[96], expected 0, is %d", - check_msg->stub[96]); - ck_assert_msg(check_msg->stub[97] == 0, - "incorrect value for stub[97], expected 0, is %d", - check_msg->stub[97]); - ck_assert_msg(check_msg->stub[98] == 14, - "incorrect value for stub[98], expected 14, is %d", - check_msg->stub[98]); - ck_assert_msg(check_msg->stub[99] == 0, - "incorrect value for stub[99], expected 0, is %d", - check_msg->stub[99]); - ck_assert_msg(check_msg->stub[100] == 0, - "incorrect value for stub[100], expected 0, is %d", - check_msg->stub[100]); - ck_assert_msg(check_msg->stub[101] == 0, - "incorrect value for stub[101], expected 0, is %d", - check_msg->stub[101]); - ck_assert_msg(check_msg->stub[102] == 15, - "incorrect value for stub[102], expected 15, is %d", - check_msg->stub[102]); - ck_assert_msg(check_msg->stub[103] == 0, - "incorrect value for stub[103], expected 0, is %d", - check_msg->stub[103]); - ck_assert_msg(check_msg->stub[104] == 0, - "incorrect value for stub[104], expected 0, is %d", - check_msg->stub[104]); - ck_assert_msg(check_msg->stub[105] == 0, - "incorrect value for stub[105], expected 0, is %d", - check_msg->stub[105]); - ck_assert_msg(check_msg->stub[106] == 16, - "incorrect value for stub[106], expected 16, is %d", - check_msg->stub[106]); - ck_assert_msg(check_msg->stub[107] == 0, - "incorrect value for stub[107], expected 0, is %d", - check_msg->stub[107]); - ck_assert_msg(check_msg->stub[108] == 0, - "incorrect value for stub[108], expected 0, is %d", - check_msg->stub[108]); - ck_assert_msg(check_msg->stub[109] == 0, - "incorrect value for stub[109], expected 0, is %d", - check_msg->stub[109]); - ck_assert_msg(check_msg->stub[110] == 17, - "incorrect value for stub[110], expected 17, is %d", - check_msg->stub[110]); - ck_assert_msg(check_msg->stub[111] == 0, - "incorrect value for stub[111], expected 0, is %d", - check_msg->stub[111]); - ck_assert_msg(check_msg->stub[112] == 0, - "incorrect value for stub[112], expected 0, is %d", - check_msg->stub[112]); - ck_assert_msg(check_msg->stub[113] == 0, - "incorrect value for stub[113], expected 0, is %d", - check_msg->stub[113]); - ck_assert_msg(check_msg->stub[114] == 18, - "incorrect value for stub[114], expected 18, is %d", - check_msg->stub[114]); - ck_assert_msg(check_msg->stub[115] == 0, - "incorrect value for stub[115], expected 0, is %d", - check_msg->stub[115]); - ck_assert_msg(check_msg->stub[116] == 0, - "incorrect value for stub[116], expected 0, is %d", - check_msg->stub[116]); - ck_assert_msg(check_msg->stub[117] == 0, - "incorrect value for stub[117], expected 0, is %d", - check_msg->stub[117]); - ck_assert_msg(check_msg->stub[118] == 19, - "incorrect value for stub[118], expected 19, is %d", - check_msg->stub[118]); - ck_assert_msg(check_msg->stub[119] == 0, - "incorrect value for stub[119], expected 0, is %d", - check_msg->stub[119]); - ck_assert_msg(check_msg->stub[120] == 0, - "incorrect value for stub[120], expected 0, is %d", - check_msg->stub[120]); - ck_assert_msg(check_msg->stub[121] == 0, - "incorrect value for stub[121], expected 0, is %d", - check_msg->stub[121]); - ck_assert_msg(check_msg->stub[122] == 20, - "incorrect value for stub[122], expected 20, is %d", - check_msg->stub[122]); - ck_assert_msg(check_msg->stub[123] == 0, - "incorrect value for stub[123], expected 0, is %d", - check_msg->stub[123]); + ck_assert_msg(check_msg->delta_X0 == 7, + "incorrect value for delta_X0, expected 7, is %d", + check_msg->delta_X0); + ck_assert_msg(check_msg->delta_Y0 == 8, + "incorrect value for delta_Y0, expected 8, is %d", + check_msg->delta_Y0); + ck_assert_msg(check_msg->delta_Z0 == 9, + "incorrect value for delta_Z0, expected 9, is %d", + check_msg->delta_Z0); + ck_assert_msg(check_msg->dot_delta_X0 == 14, + "incorrect value for dot_delta_X0, expected 14, is %d", + check_msg->dot_delta_X0); + ck_assert_msg(check_msg->dot_delta_Y0 == 15, + "incorrect value for dot_delta_Y0, expected 15, is %d", + check_msg->dot_delta_Y0); + ck_assert_msg(check_msg->dot_delta_Z0 == 16, + "incorrect value for dot_delta_Z0, expected 16, is %d", + check_msg->dot_delta_Z0); + ck_assert_msg(check_msg->dot_scale == 20, + "incorrect value for dot_scale, expected 20, is %d", + check_msg->dot_scale); + ck_assert_msg(check_msg->dot_theta_01 == 17, + "incorrect value for dot_theta_01, expected 17, is %d", + check_msg->dot_theta_01); + ck_assert_msg(check_msg->dot_theta_02 == 18, + "incorrect value for dot_theta_02, expected 18, is %d", + check_msg->dot_theta_02); + ck_assert_msg(check_msg->dot_theta_03 == 19, + "incorrect value for dot_theta_03, expected 19, is %d", + check_msg->dot_theta_03); + ck_assert_msg(check_msg->re_t0 == 6, + "incorrect value for re_t0, expected 6, is %d", + check_msg->re_t0); + ck_assert_msg(check_msg->scale == 13, + "incorrect value for scale, expected 13, is %d", + check_msg->scale); + ck_assert_msg(check_msg->sin == 4, + "incorrect value for sin, expected 4, is %d", check_msg->sin); + { + const char check_string[] = { + (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0}; + ck_assert_msg( + memcmp(check_msg->sn, check_string, sizeof(check_string)) == 0, + "incorrect value for check_msg->sn, expected string '%s', is '%s'", + check_string, check_msg->sn); + } + ck_assert_msg(check_msg->ssr_iod == 1, + "incorrect value for ssr_iod, expected 1, is %d", + check_msg->ssr_iod); + ck_assert_msg(check_msg->theta_01 == 10, + "incorrect value for theta_01, expected 10, is %d", + check_msg->theta_01); + ck_assert_msg(check_msg->theta_02 == 11, + "incorrect value for theta_02, expected 11, is %d", + check_msg->theta_02); + ck_assert_msg(check_msg->theta_03 == 12, + "incorrect value for theta_03, expected 12, is %d", + check_msg->theta_03); + { + const char check_string[] = { + (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0}; + ck_assert_msg( + memcmp(check_msg->tn, check_string, sizeof(check_string)) == 0, + "incorrect value for check_msg->tn, expected string '%s', is '%s'", + check_string, check_msg->tn); + } + ck_assert_msg(check_msg->utn == 5, + "incorrect value for utn, expected 5, is %d", check_msg->utn); } } END_TEST diff --git a/c/test/legacy/auto_check_sbp_navigation_MsgUTCLeapSecond.c b/c/test/legacy/auto_check_sbp_navigation_MsgUTCLeapSecond.c index 52160574f7..5fa3afd554 100644 --- a/c/test/legacy/auto_check_sbp_navigation_MsgUTCLeapSecond.c +++ b/c/test/legacy/auto_check_sbp_navigation_MsgUTCLeapSecond.c @@ -132,76 +132,15 @@ START_TEST(test_legacy_auto_check_sbp_navigation_MsgUTCLeapSecond) { u8 test_msg_len = 0; msg_utc_leap_second_t *test_msg = (msg_utc_leap_second_t *)test_msg_storage; test_msg_len = sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[0] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[2] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[5] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[6] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[7] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[8] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[9] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[10] = 7; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[11] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[12] = 8; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[13] = 9; + test_msg->bias_coeff = 1; + test_msg->count_after = 9; + test_msg->count_before = 4; + test_msg->drift_coeff = 2; + test_msg->drift_rate_coeff = 3; + test_msg->ref_dn = 8; + test_msg->ref_wn = 7; + test_msg->tow_s = 5; + test_msg->wn = 6; sbp_payload_send(&sbp_state, 570, 66, test_msg_len, test_msg_storage, &dummy_write); @@ -257,48 +196,32 @@ START_TEST(test_legacy_auto_check_sbp_navigation_MsgUTCLeapSecond) { (msg_utc_leap_second_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->stub[0] == 1, - "incorrect value for stub[0], expected 1, is %d", - check_msg->stub[0]); - ck_assert_msg(check_msg->stub[1] == 0, - "incorrect value for stub[1], expected 0, is %d", - check_msg->stub[1]); - ck_assert_msg(check_msg->stub[2] == 2, - "incorrect value for stub[2], expected 2, is %d", - check_msg->stub[2]); - ck_assert_msg(check_msg->stub[3] == 0, - "incorrect value for stub[3], expected 0, is %d", - check_msg->stub[3]); - ck_assert_msg(check_msg->stub[4] == 3, - "incorrect value for stub[4], expected 3, is %d", - check_msg->stub[4]); - ck_assert_msg(check_msg->stub[5] == 4, - "incorrect value for stub[5], expected 4, is %d", - check_msg->stub[5]); - ck_assert_msg(check_msg->stub[6] == 5, - "incorrect value for stub[6], expected 5, is %d", - check_msg->stub[6]); - ck_assert_msg(check_msg->stub[7] == 0, - "incorrect value for stub[7], expected 0, is %d", - check_msg->stub[7]); - ck_assert_msg(check_msg->stub[8] == 6, - "incorrect value for stub[8], expected 6, is %d", - check_msg->stub[8]); - ck_assert_msg(check_msg->stub[9] == 0, - "incorrect value for stub[9], expected 0, is %d", - check_msg->stub[9]); - ck_assert_msg(check_msg->stub[10] == 7, - "incorrect value for stub[10], expected 7, is %d", - check_msg->stub[10]); - ck_assert_msg(check_msg->stub[11] == 0, - "incorrect value for stub[11], expected 0, is %d", - check_msg->stub[11]); - ck_assert_msg(check_msg->stub[12] == 8, - "incorrect value for stub[12], expected 8, is %d", - check_msg->stub[12]); - ck_assert_msg(check_msg->stub[13] == 9, - "incorrect value for stub[13], expected 9, is %d", - check_msg->stub[13]); + ck_assert_msg(check_msg->bias_coeff == 1, + "incorrect value for bias_coeff, expected 1, is %d", + check_msg->bias_coeff); + ck_assert_msg(check_msg->count_after == 9, + "incorrect value for count_after, expected 9, is %d", + check_msg->count_after); + ck_assert_msg(check_msg->count_before == 4, + "incorrect value for count_before, expected 4, is %d", + check_msg->count_before); + ck_assert_msg(check_msg->drift_coeff == 2, + "incorrect value for drift_coeff, expected 2, is %d", + check_msg->drift_coeff); + ck_assert_msg(check_msg->drift_rate_coeff == 3, + "incorrect value for drift_rate_coeff, expected 3, is %d", + check_msg->drift_rate_coeff); + ck_assert_msg(check_msg->ref_dn == 8, + "incorrect value for ref_dn, expected 8, is %d", + check_msg->ref_dn); + ck_assert_msg(check_msg->ref_wn == 7, + "incorrect value for ref_wn, expected 7, is %d", + check_msg->ref_wn); + ck_assert_msg(check_msg->tow_s == 5, + "incorrect value for tow_s, expected 5, is %d", + check_msg->tow_s); + ck_assert_msg(check_msg->wn == 6, + "incorrect value for wn, expected 6, is %d", check_msg->wn); } } END_TEST diff --git a/c/test/legacy/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds.c b/c/test/legacy/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds.c index 63ea89f63c..33dcdec313 100644 --- a/c/test/legacy/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds.c +++ b/c/test/legacy/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds.c @@ -135,161 +135,45 @@ START_TEST(test_legacy_auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds) { msg_ssr_code_phase_biases_bounds_t *test_msg = (msg_ssr_code_phase_biases_bounds_t *)test_msg_storage; test_msg_len = sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { + test_msg->const_id = 1; + test_msg->header.num_msgs = 1; + test_msg->header.seq_num = 2; + test_msg->header.sol_id = 14; + test_msg->header.time.tow = 180; + test_msg->header.time.wn = 3; + test_msg->header.update_interval = 1; + test_msg->n_sats_signals = 3; + if (sizeof(test_msg->satellites_signals) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[7] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[8] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[9] = 14; - if (sizeof(test_msg->stub) == 0) { + test_msg_len += sizeof(test_msg->satellites_signals[0]); + } + test_msg->satellites_signals[0].code_bias_bound_mu = 39; + test_msg->satellites_signals[0].code_bias_bound_sig = 1; + test_msg->satellites_signals[0].phase_bias_bound_mu = 39; + test_msg->satellites_signals[0].phase_bias_bound_sig = 1; + test_msg->satellites_signals[0].sat_id = 0; + test_msg->satellites_signals[0].signal_id = 3; + if (sizeof(test_msg->satellites_signals) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[10] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[11] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[12] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[13] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[14] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[15] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[16] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[17] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[18] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[19] = 1; - if (sizeof(test_msg->stub) == 0) { + test_msg_len += sizeof(test_msg->satellites_signals[0]); + } + test_msg->satellites_signals[1].code_bias_bound_mu = 39; + test_msg->satellites_signals[1].code_bias_bound_sig = 1; + test_msg->satellites_signals[1].phase_bias_bound_mu = 39; + test_msg->satellites_signals[1].phase_bias_bound_sig = 1; + test_msg->satellites_signals[1].sat_id = 1; + test_msg->satellites_signals[1].signal_id = 3; + if (sizeof(test_msg->satellites_signals) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[20] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[21] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[22] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[23] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[24] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[25] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[26] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[27] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[28] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[29] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[30] = 1; + test_msg_len += sizeof(test_msg->satellites_signals[0]); + } + test_msg->satellites_signals[2].code_bias_bound_mu = 39; + test_msg->satellites_signals[2].code_bias_bound_sig = 1; + test_msg->satellites_signals[2].phase_bias_bound_mu = 39; + test_msg->satellites_signals[2].phase_bias_bound_sig = 1; + test_msg->satellites_signals[2].sat_id = 1; + test_msg->satellites_signals[2].signal_id = 1; + test_msg->ssr_iod = 15; sbp_payload_send(&sbp_state, 1516, 66, test_msg_len, test_msg_storage, &dummy_write); @@ -345,99 +229,118 @@ START_TEST(test_legacy_auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds) { (msg_ssr_code_phase_biases_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->stub[0] == 180, - "incorrect value for stub[0], expected 180, is %d", - check_msg->stub[0]); - ck_assert_msg(check_msg->stub[1] == 0, - "incorrect value for stub[1], expected 0, is %d", - check_msg->stub[1]); - ck_assert_msg(check_msg->stub[2] == 0, - "incorrect value for stub[2], expected 0, is %d", - check_msg->stub[2]); - ck_assert_msg(check_msg->stub[3] == 0, - "incorrect value for stub[3], expected 0, is %d", - check_msg->stub[3]); - ck_assert_msg(check_msg->stub[4] == 3, - "incorrect value for stub[4], expected 3, is %d", - check_msg->stub[4]); - ck_assert_msg(check_msg->stub[5] == 0, - "incorrect value for stub[5], expected 0, is %d", - check_msg->stub[5]); - ck_assert_msg(check_msg->stub[6] == 1, - "incorrect value for stub[6], expected 1, is %d", - check_msg->stub[6]); - ck_assert_msg(check_msg->stub[7] == 2, - "incorrect value for stub[7], expected 2, is %d", - check_msg->stub[7]); - ck_assert_msg(check_msg->stub[8] == 1, - "incorrect value for stub[8], expected 1, is %d", - check_msg->stub[8]); - ck_assert_msg(check_msg->stub[9] == 14, - "incorrect value for stub[9], expected 14, is %d", - check_msg->stub[9]); - ck_assert_msg(check_msg->stub[10] == 15, - "incorrect value for stub[10], expected 15, is %d", - check_msg->stub[10]); - ck_assert_msg(check_msg->stub[11] == 1, - "incorrect value for stub[11], expected 1, is %d", - check_msg->stub[11]); - ck_assert_msg(check_msg->stub[12] == 3, - "incorrect value for stub[12], expected 3, is %d", - check_msg->stub[12]); - ck_assert_msg(check_msg->stub[13] == 0, - "incorrect value for stub[13], expected 0, is %d", - check_msg->stub[13]); - ck_assert_msg(check_msg->stub[14] == 3, - "incorrect value for stub[14], expected 3, is %d", - check_msg->stub[14]); - ck_assert_msg(check_msg->stub[15] == 39, - "incorrect value for stub[15], expected 39, is %d", - check_msg->stub[15]); - ck_assert_msg(check_msg->stub[16] == 1, - "incorrect value for stub[16], expected 1, is %d", - check_msg->stub[16]); - ck_assert_msg(check_msg->stub[17] == 39, - "incorrect value for stub[17], expected 39, is %d", - check_msg->stub[17]); - ck_assert_msg(check_msg->stub[18] == 1, - "incorrect value for stub[18], expected 1, is %d", - check_msg->stub[18]); - ck_assert_msg(check_msg->stub[19] == 1, - "incorrect value for stub[19], expected 1, is %d", - check_msg->stub[19]); - ck_assert_msg(check_msg->stub[20] == 3, - "incorrect value for stub[20], expected 3, is %d", - check_msg->stub[20]); - ck_assert_msg(check_msg->stub[21] == 39, - "incorrect value for stub[21], expected 39, is %d", - check_msg->stub[21]); - ck_assert_msg(check_msg->stub[22] == 1, - "incorrect value for stub[22], expected 1, is %d", - check_msg->stub[22]); - ck_assert_msg(check_msg->stub[23] == 39, - "incorrect value for stub[23], expected 39, is %d", - check_msg->stub[23]); - ck_assert_msg(check_msg->stub[24] == 1, - "incorrect value for stub[24], expected 1, is %d", - check_msg->stub[24]); - ck_assert_msg(check_msg->stub[25] == 1, - "incorrect value for stub[25], expected 1, is %d", - check_msg->stub[25]); - ck_assert_msg(check_msg->stub[26] == 1, - "incorrect value for stub[26], expected 1, is %d", - check_msg->stub[26]); - ck_assert_msg(check_msg->stub[27] == 39, - "incorrect value for stub[27], expected 39, is %d", - check_msg->stub[27]); - ck_assert_msg(check_msg->stub[28] == 1, - "incorrect value for stub[28], expected 1, is %d", - check_msg->stub[28]); - ck_assert_msg(check_msg->stub[29] == 39, - "incorrect value for stub[29], expected 39, is %d", - check_msg->stub[29]); - ck_assert_msg(check_msg->stub[30] == 1, - "incorrect value for stub[30], expected 1, is %d", - check_msg->stub[30]); + ck_assert_msg(check_msg->const_id == 1, + "incorrect value for const_id, expected 1, is %d", + check_msg->const_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 == 2, + "incorrect value for header.seq_num, expected 2, is %d", + check_msg->header.seq_num); + ck_assert_msg(check_msg->header.sol_id == 14, + "incorrect value for header.sol_id, expected 14, 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 == 1, + "incorrect value for header.update_interval, expected 1, is %d", + check_msg->header.update_interval); + ck_assert_msg(check_msg->n_sats_signals == 3, + "incorrect value for n_sats_signals, expected 3, is %d", + check_msg->n_sats_signals); + ck_assert_msg( + check_msg->satellites_signals[0].code_bias_bound_mu == 39, + "incorrect value for satellites_signals[0].code_bias_bound_mu, " + "expected 39, is %d", + check_msg->satellites_signals[0].code_bias_bound_mu); + ck_assert_msg( + check_msg->satellites_signals[0].code_bias_bound_sig == 1, + "incorrect value for satellites_signals[0].code_bias_bound_sig, " + "expected 1, is %d", + check_msg->satellites_signals[0].code_bias_bound_sig); + ck_assert_msg( + check_msg->satellites_signals[0].phase_bias_bound_mu == 39, + "incorrect value for satellites_signals[0].phase_bias_bound_mu, " + "expected 39, is %d", + check_msg->satellites_signals[0].phase_bias_bound_mu); + ck_assert_msg( + check_msg->satellites_signals[0].phase_bias_bound_sig == 1, + "incorrect value for satellites_signals[0].phase_bias_bound_sig, " + "expected 1, is %d", + check_msg->satellites_signals[0].phase_bias_bound_sig); + ck_assert_msg( + check_msg->satellites_signals[0].sat_id == 0, + "incorrect value for satellites_signals[0].sat_id, expected 0, is %d", + check_msg->satellites_signals[0].sat_id); + ck_assert_msg(check_msg->satellites_signals[0].signal_id == 3, + "incorrect value for satellites_signals[0].signal_id, " + "expected 3, is %d", + check_msg->satellites_signals[0].signal_id); + ck_assert_msg( + check_msg->satellites_signals[1].code_bias_bound_mu == 39, + "incorrect value for satellites_signals[1].code_bias_bound_mu, " + "expected 39, is %d", + check_msg->satellites_signals[1].code_bias_bound_mu); + ck_assert_msg( + check_msg->satellites_signals[1].code_bias_bound_sig == 1, + "incorrect value for satellites_signals[1].code_bias_bound_sig, " + "expected 1, is %d", + check_msg->satellites_signals[1].code_bias_bound_sig); + ck_assert_msg( + check_msg->satellites_signals[1].phase_bias_bound_mu == 39, + "incorrect value for satellites_signals[1].phase_bias_bound_mu, " + "expected 39, is %d", + check_msg->satellites_signals[1].phase_bias_bound_mu); + ck_assert_msg( + check_msg->satellites_signals[1].phase_bias_bound_sig == 1, + "incorrect value for satellites_signals[1].phase_bias_bound_sig, " + "expected 1, is %d", + check_msg->satellites_signals[1].phase_bias_bound_sig); + ck_assert_msg( + check_msg->satellites_signals[1].sat_id == 1, + "incorrect value for satellites_signals[1].sat_id, expected 1, is %d", + check_msg->satellites_signals[1].sat_id); + ck_assert_msg(check_msg->satellites_signals[1].signal_id == 3, + "incorrect value for satellites_signals[1].signal_id, " + "expected 3, is %d", + check_msg->satellites_signals[1].signal_id); + ck_assert_msg( + check_msg->satellites_signals[2].code_bias_bound_mu == 39, + "incorrect value for satellites_signals[2].code_bias_bound_mu, " + "expected 39, is %d", + check_msg->satellites_signals[2].code_bias_bound_mu); + ck_assert_msg( + check_msg->satellites_signals[2].code_bias_bound_sig == 1, + "incorrect value for satellites_signals[2].code_bias_bound_sig, " + "expected 1, is %d", + check_msg->satellites_signals[2].code_bias_bound_sig); + ck_assert_msg( + check_msg->satellites_signals[2].phase_bias_bound_mu == 39, + "incorrect value for satellites_signals[2].phase_bias_bound_mu, " + "expected 39, is %d", + check_msg->satellites_signals[2].phase_bias_bound_mu); + ck_assert_msg( + check_msg->satellites_signals[2].phase_bias_bound_sig == 1, + "incorrect value for satellites_signals[2].phase_bias_bound_sig, " + "expected 1, is %d", + check_msg->satellites_signals[2].phase_bias_bound_sig); + ck_assert_msg( + check_msg->satellites_signals[2].sat_id == 1, + "incorrect value for satellites_signals[2].sat_id, expected 1, is %d", + check_msg->satellites_signals[2].sat_id); + ck_assert_msg(check_msg->satellites_signals[2].signal_id == 1, + "incorrect value for satellites_signals[2].signal_id, " + "expected 1, is %d", + check_msg->satellites_signals[2].signal_id); + ck_assert_msg(check_msg->ssr_iod == 15, + "incorrect value for ssr_iod, expected 15, is %d", + check_msg->ssr_iod); } } END_TEST diff --git a/c/test/legacy/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.c b/c/test/legacy/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.c index 734c5651e0..9229a3e45a 100644 --- a/c/test/legacy/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.c +++ b/c/test/legacy/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.c @@ -122,10 +122,10 @@ START_TEST(test_legacy_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds) { &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, + 85, 254, 5, 66, 0, 45, 180, 0, 0, 0, 3, 0, 1, 1, + 10, 0, 15, 1, 0, 10, 0, 39, 232, 3, 244, 1, 100, 200, + 150, 100, 150, 100, 2, 5, 10, 16, 0, 17, 18, 19, 20, 21, + 6, 10, 22, 0, 23, 24, 25, 26, 27, 119, 82, }; dummy_reset(); @@ -136,221 +136,49 @@ START_TEST(test_legacy_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds) { msg_ssr_gridded_correction_bounds_t *test_msg = (msg_ssr_gridded_correction_bounds_t *)test_msg_storage; test_msg_len = sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[7] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[8] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[9] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[10] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[11] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[12] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[13] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[14] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[15] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[16] = 232; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[17] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[18] = 244; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[19] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[20] = 100; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[21] = 200; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[22] = 150; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[23] = 100; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[24] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[25] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[26] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[27] = 16; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[28] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[29] = 17; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[30] = 18; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[31] = 19; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[32] = 20; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[33] = 21; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[34] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[35] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[36] = 22; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[37] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[38] = 23; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[39] = 24; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[40] = 25; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[41] = 26; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[42] = 27; + 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_delay_correction.hydro = 500; + test_msg->tropo_delay_correction.stddev = 200; + test_msg->tropo_delay_correction.wet = 100; + test_msg->tropo_qi = 39; + test_msg->tropo_v_hydro_bound_mu = 150; + test_msg->tropo_v_hydro_bound_sig = 100; + test_msg->tropo_v_wet_bound_mu = 150; + test_msg->tropo_v_wet_bound_sig = 100; sbp_payload_send(&sbp_state, 1534, 66, test_msg_len, test_msg_storage, &dummy_write); @@ -406,135 +234,141 @@ START_TEST(test_legacy_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds) { (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->stub[0] == 180, - "incorrect value for stub[0], expected 180, is %d", - check_msg->stub[0]); - ck_assert_msg(check_msg->stub[1] == 0, - "incorrect value for stub[1], expected 0, is %d", - check_msg->stub[1]); - ck_assert_msg(check_msg->stub[2] == 0, - "incorrect value for stub[2], expected 0, is %d", - check_msg->stub[2]); - ck_assert_msg(check_msg->stub[3] == 0, - "incorrect value for stub[3], expected 0, is %d", - check_msg->stub[3]); - ck_assert_msg(check_msg->stub[4] == 3, - "incorrect value for stub[4], expected 3, is %d", - check_msg->stub[4]); - ck_assert_msg(check_msg->stub[5] == 0, - "incorrect value for stub[5], expected 0, is %d", - check_msg->stub[5]); - ck_assert_msg(check_msg->stub[6] == 1, - "incorrect value for stub[6], expected 1, is %d", - check_msg->stub[6]); - ck_assert_msg(check_msg->stub[7] == 1, - "incorrect value for stub[7], expected 1, is %d", - check_msg->stub[7]); - ck_assert_msg(check_msg->stub[8] == 10, - "incorrect value for stub[8], expected 10, is %d", - check_msg->stub[8]); - ck_assert_msg(check_msg->stub[9] == 0, - "incorrect value for stub[9], expected 0, is %d", - check_msg->stub[9]); - ck_assert_msg(check_msg->stub[10] == 15, - "incorrect value for stub[10], expected 15, is %d", - check_msg->stub[10]); - ck_assert_msg(check_msg->stub[11] == 1, - "incorrect value for stub[11], expected 1, is %d", - check_msg->stub[11]); - ck_assert_msg(check_msg->stub[12] == 0, - "incorrect value for stub[12], expected 0, is %d", - check_msg->stub[12]); - ck_assert_msg(check_msg->stub[13] == 10, - "incorrect value for stub[13], expected 10, is %d", - check_msg->stub[13]); - ck_assert_msg(check_msg->stub[14] == 0, - "incorrect value for stub[14], expected 0, is %d", - check_msg->stub[14]); - ck_assert_msg(check_msg->stub[15] == 39, - "incorrect value for stub[15], expected 39, is %d", - check_msg->stub[15]); - ck_assert_msg(check_msg->stub[16] == 232, - "incorrect value for stub[16], expected 232, is %d", - check_msg->stub[16]); - ck_assert_msg(check_msg->stub[17] == 3, - "incorrect value for stub[17], expected 3, is %d", - check_msg->stub[17]); - ck_assert_msg(check_msg->stub[18] == 244, - "incorrect value for stub[18], expected 244, is %d", - check_msg->stub[18]); - ck_assert_msg(check_msg->stub[19] == 1, - "incorrect value for stub[19], expected 1, is %d", - check_msg->stub[19]); - ck_assert_msg(check_msg->stub[20] == 100, - "incorrect value for stub[20], expected 100, is %d", - check_msg->stub[20]); - ck_assert_msg(check_msg->stub[21] == 200, - "incorrect value for stub[21], expected 200, is %d", - check_msg->stub[21]); - ck_assert_msg(check_msg->stub[22] == 150, - "incorrect value for stub[22], expected 150, is %d", - check_msg->stub[22]); - ck_assert_msg(check_msg->stub[23] == 100, - "incorrect value for stub[23], expected 100, is %d", - check_msg->stub[23]); - ck_assert_msg(check_msg->stub[24] == 2, - "incorrect value for stub[24], expected 2, is %d", - check_msg->stub[24]); - ck_assert_msg(check_msg->stub[25] == 5, - "incorrect value for stub[25], expected 5, is %d", - check_msg->stub[25]); - ck_assert_msg(check_msg->stub[26] == 10, - "incorrect value for stub[26], expected 10, is %d", - check_msg->stub[26]); - ck_assert_msg(check_msg->stub[27] == 16, - "incorrect value for stub[27], expected 16, is %d", - check_msg->stub[27]); - ck_assert_msg(check_msg->stub[28] == 0, - "incorrect value for stub[28], expected 0, is %d", - check_msg->stub[28]); - ck_assert_msg(check_msg->stub[29] == 17, - "incorrect value for stub[29], expected 17, is %d", - check_msg->stub[29]); - ck_assert_msg(check_msg->stub[30] == 18, - "incorrect value for stub[30], expected 18, is %d", - check_msg->stub[30]); - ck_assert_msg(check_msg->stub[31] == 19, - "incorrect value for stub[31], expected 19, is %d", - check_msg->stub[31]); - ck_assert_msg(check_msg->stub[32] == 20, - "incorrect value for stub[32], expected 20, is %d", - check_msg->stub[32]); - ck_assert_msg(check_msg->stub[33] == 21, - "incorrect value for stub[33], expected 21, is %d", - check_msg->stub[33]); - ck_assert_msg(check_msg->stub[34] == 6, - "incorrect value for stub[34], expected 6, is %d", - check_msg->stub[34]); - ck_assert_msg(check_msg->stub[35] == 10, - "incorrect value for stub[35], expected 10, is %d", - check_msg->stub[35]); - ck_assert_msg(check_msg->stub[36] == 22, - "incorrect value for stub[36], expected 22, is %d", - check_msg->stub[36]); - ck_assert_msg(check_msg->stub[37] == 0, - "incorrect value for stub[37], expected 0, is %d", - check_msg->stub[37]); - ck_assert_msg(check_msg->stub[38] == 23, - "incorrect value for stub[38], expected 23, is %d", - check_msg->stub[38]); - ck_assert_msg(check_msg->stub[39] == 24, - "incorrect value for stub[39], expected 24, is %d", - check_msg->stub[39]); - ck_assert_msg(check_msg->stub[40] == 25, - "incorrect value for stub[40], expected 25, is %d", - check_msg->stub[40]); - ck_assert_msg(check_msg->stub[41] == 26, - "incorrect value for stub[41], expected 26, is %d", - check_msg->stub[41]); - ck_assert_msg(check_msg->stub[42] == 27, - "incorrect value for stub[42], expected 27, is %d", - check_msg->stub[42]); + 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_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); + ck_assert_msg( + check_msg->tropo_v_hydro_bound_mu == 150, + "incorrect value for tropo_v_hydro_bound_mu, expected 150, is %d", + check_msg->tropo_v_hydro_bound_mu); + ck_assert_msg( + check_msg->tropo_v_hydro_bound_sig == 100, + "incorrect value for tropo_v_hydro_bound_sig, expected 100, is %d", + check_msg->tropo_v_hydro_bound_sig); + ck_assert_msg( + check_msg->tropo_v_wet_bound_mu == 150, + "incorrect value for tropo_v_wet_bound_mu, expected 150, is %d", + check_msg->tropo_v_wet_bound_mu); + ck_assert_msg( + check_msg->tropo_v_wet_bound_sig == 100, + "incorrect value for tropo_v_wet_bound_sig, expected 100, is %d", + check_msg->tropo_v_wet_bound_sig); } } END_TEST diff --git a/c/test/legacy/auto_check_sbp_ssr_MsgSsrOrbitClockBounds.c b/c/test/legacy/auto_check_sbp_ssr_MsgSsrOrbitClockBounds.c index ff004cec6a..7a5bec7b12 100644 --- a/c/test/legacy/auto_check_sbp_ssr_MsgSsrOrbitClockBounds.c +++ b/c/test/legacy/auto_check_sbp_ssr_MsgSsrOrbitClockBounds.c @@ -135,161 +135,41 @@ START_TEST(test_legacy_auto_check_sbp_ssr_MsgSsrOrbitClockBounds) { msg_ssr_orbit_clock_bounds_t *test_msg = (msg_ssr_orbit_clock_bounds_t *)test_msg_storage; test_msg_len = sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { + test_msg->const_id = 1; + test_msg->header.num_msgs = 1; + test_msg->header.seq_num = 2; + test_msg->header.sol_id = 48; + test_msg->header.time.tow = 180; + test_msg->header.time.wn = 3; + test_msg->header.update_interval = 3; + test_msg->n_sats = 2; + if (sizeof(test_msg->orbit_clock_bounds) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[7] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[8] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[9] = 48; - if (sizeof(test_msg->stub) == 0) { + test_msg_len += sizeof(test_msg->orbit_clock_bounds[0]); + } + test_msg->orbit_clock_bounds[0].clock_bound_mu = 39; + test_msg->orbit_clock_bounds[0].clock_bound_sig = 1; + test_msg->orbit_clock_bounds[0].orb_along_bound_mu = 38; + test_msg->orbit_clock_bounds[0].orb_along_bound_sig = 2; + test_msg->orbit_clock_bounds[0].orb_cross_bound_mu = 37; + test_msg->orbit_clock_bounds[0].orb_cross_bound_sig = 3; + test_msg->orbit_clock_bounds[0].orb_radial_bound_mu = 39; + test_msg->orbit_clock_bounds[0].orb_radial_bound_sig = 1; + test_msg->orbit_clock_bounds[0].sat_id = 24; + if (sizeof(test_msg->orbit_clock_bounds) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[10] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[11] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[12] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[13] = 24; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[14] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[15] = 38; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[16] = 37; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[17] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[18] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[19] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[20] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[21] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[22] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[23] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[24] = 38; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[25] = 37; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[26] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[27] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[28] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[29] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[30] = 1; + test_msg_len += sizeof(test_msg->orbit_clock_bounds[0]); + } + test_msg->orbit_clock_bounds[1].clock_bound_mu = 39; + test_msg->orbit_clock_bounds[1].clock_bound_sig = 1; + test_msg->orbit_clock_bounds[1].orb_along_bound_mu = 38; + test_msg->orbit_clock_bounds[1].orb_along_bound_sig = 2; + test_msg->orbit_clock_bounds[1].orb_cross_bound_mu = 37; + test_msg->orbit_clock_bounds[1].orb_cross_bound_sig = 3; + test_msg->orbit_clock_bounds[1].orb_radial_bound_mu = 39; + test_msg->orbit_clock_bounds[1].orb_radial_bound_sig = 1; + test_msg->orbit_clock_bounds[1].sat_id = 3; + test_msg->ssr_iod = 15; sbp_payload_send(&sbp_state, 1502, 66, test_msg_len, test_msg_storage, &dummy_write); @@ -345,99 +225,118 @@ START_TEST(test_legacy_auto_check_sbp_ssr_MsgSsrOrbitClockBounds) { (msg_ssr_orbit_clock_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->stub[0] == 180, - "incorrect value for stub[0], expected 180, is %d", - check_msg->stub[0]); - ck_assert_msg(check_msg->stub[1] == 0, - "incorrect value for stub[1], expected 0, is %d", - check_msg->stub[1]); - ck_assert_msg(check_msg->stub[2] == 0, - "incorrect value for stub[2], expected 0, is %d", - check_msg->stub[2]); - ck_assert_msg(check_msg->stub[3] == 0, - "incorrect value for stub[3], expected 0, is %d", - check_msg->stub[3]); - ck_assert_msg(check_msg->stub[4] == 3, - "incorrect value for stub[4], expected 3, is %d", - check_msg->stub[4]); - ck_assert_msg(check_msg->stub[5] == 0, - "incorrect value for stub[5], expected 0, is %d", - check_msg->stub[5]); - ck_assert_msg(check_msg->stub[6] == 1, - "incorrect value for stub[6], expected 1, is %d", - check_msg->stub[6]); - ck_assert_msg(check_msg->stub[7] == 2, - "incorrect value for stub[7], expected 2, is %d", - check_msg->stub[7]); - ck_assert_msg(check_msg->stub[8] == 3, - "incorrect value for stub[8], expected 3, is %d", - check_msg->stub[8]); - ck_assert_msg(check_msg->stub[9] == 48, - "incorrect value for stub[9], expected 48, is %d", - check_msg->stub[9]); - ck_assert_msg(check_msg->stub[10] == 15, - "incorrect value for stub[10], expected 15, is %d", - check_msg->stub[10]); - ck_assert_msg(check_msg->stub[11] == 1, - "incorrect value for stub[11], expected 1, is %d", - check_msg->stub[11]); - ck_assert_msg(check_msg->stub[12] == 2, - "incorrect value for stub[12], expected 2, is %d", - check_msg->stub[12]); - ck_assert_msg(check_msg->stub[13] == 24, - "incorrect value for stub[13], expected 24, is %d", - check_msg->stub[13]); - ck_assert_msg(check_msg->stub[14] == 39, - "incorrect value for stub[14], expected 39, is %d", - check_msg->stub[14]); - ck_assert_msg(check_msg->stub[15] == 38, - "incorrect value for stub[15], expected 38, is %d", - check_msg->stub[15]); - ck_assert_msg(check_msg->stub[16] == 37, - "incorrect value for stub[16], expected 37, is %d", - check_msg->stub[16]); - ck_assert_msg(check_msg->stub[17] == 1, - "incorrect value for stub[17], expected 1, is %d", - check_msg->stub[17]); - ck_assert_msg(check_msg->stub[18] == 2, - "incorrect value for stub[18], expected 2, is %d", - check_msg->stub[18]); - ck_assert_msg(check_msg->stub[19] == 3, - "incorrect value for stub[19], expected 3, is %d", - check_msg->stub[19]); - ck_assert_msg(check_msg->stub[20] == 39, - "incorrect value for stub[20], expected 39, is %d", - check_msg->stub[20]); - ck_assert_msg(check_msg->stub[21] == 1, - "incorrect value for stub[21], expected 1, is %d", - check_msg->stub[21]); - ck_assert_msg(check_msg->stub[22] == 3, - "incorrect value for stub[22], expected 3, is %d", - check_msg->stub[22]); - ck_assert_msg(check_msg->stub[23] == 39, - "incorrect value for stub[23], expected 39, is %d", - check_msg->stub[23]); - ck_assert_msg(check_msg->stub[24] == 38, - "incorrect value for stub[24], expected 38, is %d", - check_msg->stub[24]); - ck_assert_msg(check_msg->stub[25] == 37, - "incorrect value for stub[25], expected 37, is %d", - check_msg->stub[25]); - ck_assert_msg(check_msg->stub[26] == 1, - "incorrect value for stub[26], expected 1, is %d", - check_msg->stub[26]); - ck_assert_msg(check_msg->stub[27] == 2, - "incorrect value for stub[27], expected 2, is %d", - check_msg->stub[27]); - ck_assert_msg(check_msg->stub[28] == 3, - "incorrect value for stub[28], expected 3, is %d", - check_msg->stub[28]); - ck_assert_msg(check_msg->stub[29] == 39, - "incorrect value for stub[29], expected 39, is %d", - check_msg->stub[29]); - ck_assert_msg(check_msg->stub[30] == 1, - "incorrect value for stub[30], expected 1, is %d", - check_msg->stub[30]); + ck_assert_msg(check_msg->const_id == 1, + "incorrect value for const_id, expected 1, is %d", + check_msg->const_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 == 2, + "incorrect value for header.seq_num, expected 2, is %d", + check_msg->header.seq_num); + ck_assert_msg(check_msg->header.sol_id == 48, + "incorrect value for header.sol_id, expected 48, 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 == 3, + "incorrect value for header.update_interval, expected 3, 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->orbit_clock_bounds[0].clock_bound_mu == 39, + "incorrect value for orbit_clock_bounds[0].clock_bound_mu, " + "expected 39, is %d", + check_msg->orbit_clock_bounds[0].clock_bound_mu); + ck_assert_msg(check_msg->orbit_clock_bounds[0].clock_bound_sig == 1, + "incorrect value for orbit_clock_bounds[0].clock_bound_sig, " + "expected 1, is %d", + check_msg->orbit_clock_bounds[0].clock_bound_sig); + ck_assert_msg( + check_msg->orbit_clock_bounds[0].orb_along_bound_mu == 38, + "incorrect value for orbit_clock_bounds[0].orb_along_bound_mu, " + "expected 38, is %d", + check_msg->orbit_clock_bounds[0].orb_along_bound_mu); + ck_assert_msg( + check_msg->orbit_clock_bounds[0].orb_along_bound_sig == 2, + "incorrect value for orbit_clock_bounds[0].orb_along_bound_sig, " + "expected 2, is %d", + check_msg->orbit_clock_bounds[0].orb_along_bound_sig); + ck_assert_msg( + check_msg->orbit_clock_bounds[0].orb_cross_bound_mu == 37, + "incorrect value for orbit_clock_bounds[0].orb_cross_bound_mu, " + "expected 37, is %d", + check_msg->orbit_clock_bounds[0].orb_cross_bound_mu); + ck_assert_msg( + check_msg->orbit_clock_bounds[0].orb_cross_bound_sig == 3, + "incorrect value for orbit_clock_bounds[0].orb_cross_bound_sig, " + "expected 3, is %d", + check_msg->orbit_clock_bounds[0].orb_cross_bound_sig); + ck_assert_msg( + check_msg->orbit_clock_bounds[0].orb_radial_bound_mu == 39, + "incorrect value for orbit_clock_bounds[0].orb_radial_bound_mu, " + "expected 39, is %d", + check_msg->orbit_clock_bounds[0].orb_radial_bound_mu); + ck_assert_msg( + check_msg->orbit_clock_bounds[0].orb_radial_bound_sig == 1, + "incorrect value for orbit_clock_bounds[0].orb_radial_bound_sig, " + "expected 1, is %d", + check_msg->orbit_clock_bounds[0].orb_radial_bound_sig); + ck_assert_msg( + check_msg->orbit_clock_bounds[0].sat_id == 24, + "incorrect value for orbit_clock_bounds[0].sat_id, expected 24, is %d", + check_msg->orbit_clock_bounds[0].sat_id); + ck_assert_msg(check_msg->orbit_clock_bounds[1].clock_bound_mu == 39, + "incorrect value for orbit_clock_bounds[1].clock_bound_mu, " + "expected 39, is %d", + check_msg->orbit_clock_bounds[1].clock_bound_mu); + ck_assert_msg(check_msg->orbit_clock_bounds[1].clock_bound_sig == 1, + "incorrect value for orbit_clock_bounds[1].clock_bound_sig, " + "expected 1, is %d", + check_msg->orbit_clock_bounds[1].clock_bound_sig); + ck_assert_msg( + check_msg->orbit_clock_bounds[1].orb_along_bound_mu == 38, + "incorrect value for orbit_clock_bounds[1].orb_along_bound_mu, " + "expected 38, is %d", + check_msg->orbit_clock_bounds[1].orb_along_bound_mu); + ck_assert_msg( + check_msg->orbit_clock_bounds[1].orb_along_bound_sig == 2, + "incorrect value for orbit_clock_bounds[1].orb_along_bound_sig, " + "expected 2, is %d", + check_msg->orbit_clock_bounds[1].orb_along_bound_sig); + ck_assert_msg( + check_msg->orbit_clock_bounds[1].orb_cross_bound_mu == 37, + "incorrect value for orbit_clock_bounds[1].orb_cross_bound_mu, " + "expected 37, is %d", + check_msg->orbit_clock_bounds[1].orb_cross_bound_mu); + ck_assert_msg( + check_msg->orbit_clock_bounds[1].orb_cross_bound_sig == 3, + "incorrect value for orbit_clock_bounds[1].orb_cross_bound_sig, " + "expected 3, is %d", + check_msg->orbit_clock_bounds[1].orb_cross_bound_sig); + ck_assert_msg( + check_msg->orbit_clock_bounds[1].orb_radial_bound_mu == 39, + "incorrect value for orbit_clock_bounds[1].orb_radial_bound_mu, " + "expected 39, is %d", + check_msg->orbit_clock_bounds[1].orb_radial_bound_mu); + ck_assert_msg( + check_msg->orbit_clock_bounds[1].orb_radial_bound_sig == 1, + "incorrect value for orbit_clock_bounds[1].orb_radial_bound_sig, " + "expected 1, is %d", + check_msg->orbit_clock_bounds[1].orb_radial_bound_sig); + ck_assert_msg( + check_msg->orbit_clock_bounds[1].sat_id == 3, + "incorrect value for orbit_clock_bounds[1].sat_id, expected 3, is %d", + check_msg->orbit_clock_bounds[1].sat_id); + ck_assert_msg(check_msg->ssr_iod == 15, + "incorrect value for ssr_iod, expected 15, is %d", + check_msg->ssr_iod); } } END_TEST diff --git a/c/test/legacy/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation.c b/c/test/legacy/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation.c index e19dff19de..329635f3fd 100644 --- a/c/test/legacy/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation.c +++ b/c/test/legacy/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation.c @@ -135,146 +135,23 @@ START_TEST(test_legacy_auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation) { msg_ssr_orbit_clock_bounds_degradation_t *test_msg = (msg_ssr_orbit_clock_bounds_degradation_t *)test_msg_storage; test_msg_len = sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[7] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[8] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[9] = 48; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[10] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[11] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[12] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[13] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[14] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[15] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[16] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[17] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[18] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[19] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[20] = 200; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[21] = 199; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[22] = 198; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[23] = 197; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[24] = 196; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[25] = 195; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[26] = 194; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[27] = 193; + test_msg->const_id = 1; + test_msg->header.num_msgs = 1; + test_msg->header.seq_num = 2; + test_msg->header.sol_id = 48; + test_msg->header.time.tow = 180; + test_msg->header.time.wn = 3; + test_msg->header.update_interval = 3; + test_msg->orbit_clock_bounds_degradation.clock_bound_mu_dot = 194; + test_msg->orbit_clock_bounds_degradation.clock_bound_sig_dot = 193; + test_msg->orbit_clock_bounds_degradation.orb_along_bound_mu_dot = 199; + test_msg->orbit_clock_bounds_degradation.orb_along_bound_sig_dot = 196; + test_msg->orbit_clock_bounds_degradation.orb_cross_bound_mu_dot = 198; + test_msg->orbit_clock_bounds_degradation.orb_cross_bound_sig_dot = 195; + test_msg->orbit_clock_bounds_degradation.orb_radial_bound_mu_dot = 200; + test_msg->orbit_clock_bounds_degradation.orb_radial_bound_sig_dot = 197; + test_msg->sat_bitmask = 10; + test_msg->ssr_iod = 15; sbp_payload_send(&sbp_state, 1503, 66, test_msg_len, test_msg_storage, &dummy_write); @@ -330,90 +207,86 @@ START_TEST(test_legacy_auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation) { (msg_ssr_orbit_clock_bounds_degradation_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->stub[0] == 180, - "incorrect value for stub[0], expected 180, is %d", - check_msg->stub[0]); - ck_assert_msg(check_msg->stub[1] == 0, - "incorrect value for stub[1], expected 0, is %d", - check_msg->stub[1]); - ck_assert_msg(check_msg->stub[2] == 0, - "incorrect value for stub[2], expected 0, is %d", - check_msg->stub[2]); - ck_assert_msg(check_msg->stub[3] == 0, - "incorrect value for stub[3], expected 0, is %d", - check_msg->stub[3]); - ck_assert_msg(check_msg->stub[4] == 3, - "incorrect value for stub[4], expected 3, is %d", - check_msg->stub[4]); - ck_assert_msg(check_msg->stub[5] == 0, - "incorrect value for stub[5], expected 0, is %d", - check_msg->stub[5]); - ck_assert_msg(check_msg->stub[6] == 1, - "incorrect value for stub[6], expected 1, is %d", - check_msg->stub[6]); - ck_assert_msg(check_msg->stub[7] == 2, - "incorrect value for stub[7], expected 2, is %d", - check_msg->stub[7]); - ck_assert_msg(check_msg->stub[8] == 3, - "incorrect value for stub[8], expected 3, is %d", - check_msg->stub[8]); - ck_assert_msg(check_msg->stub[9] == 48, - "incorrect value for stub[9], expected 48, is %d", - check_msg->stub[9]); - ck_assert_msg(check_msg->stub[10] == 15, - "incorrect value for stub[10], expected 15, is %d", - check_msg->stub[10]); - ck_assert_msg(check_msg->stub[11] == 1, - "incorrect value for stub[11], expected 1, is %d", - check_msg->stub[11]); - ck_assert_msg(check_msg->stub[12] == 10, - "incorrect value for stub[12], expected 10, is %d", - check_msg->stub[12]); - ck_assert_msg(check_msg->stub[13] == 0, - "incorrect value for stub[13], expected 0, is %d", - check_msg->stub[13]); - ck_assert_msg(check_msg->stub[14] == 0, - "incorrect value for stub[14], expected 0, is %d", - check_msg->stub[14]); - ck_assert_msg(check_msg->stub[15] == 0, - "incorrect value for stub[15], expected 0, is %d", - check_msg->stub[15]); - ck_assert_msg(check_msg->stub[16] == 0, - "incorrect value for stub[16], expected 0, is %d", - check_msg->stub[16]); - ck_assert_msg(check_msg->stub[17] == 0, - "incorrect value for stub[17], expected 0, is %d", - check_msg->stub[17]); - ck_assert_msg(check_msg->stub[18] == 0, - "incorrect value for stub[18], expected 0, is %d", - check_msg->stub[18]); - ck_assert_msg(check_msg->stub[19] == 0, - "incorrect value for stub[19], expected 0, is %d", - check_msg->stub[19]); - ck_assert_msg(check_msg->stub[20] == 200, - "incorrect value for stub[20], expected 200, is %d", - check_msg->stub[20]); - ck_assert_msg(check_msg->stub[21] == 199, - "incorrect value for stub[21], expected 199, is %d", - check_msg->stub[21]); - ck_assert_msg(check_msg->stub[22] == 198, - "incorrect value for stub[22], expected 198, is %d", - check_msg->stub[22]); - ck_assert_msg(check_msg->stub[23] == 197, - "incorrect value for stub[23], expected 197, is %d", - check_msg->stub[23]); - ck_assert_msg(check_msg->stub[24] == 196, - "incorrect value for stub[24], expected 196, is %d", - check_msg->stub[24]); - ck_assert_msg(check_msg->stub[25] == 195, - "incorrect value for stub[25], expected 195, is %d", - check_msg->stub[25]); - ck_assert_msg(check_msg->stub[26] == 194, - "incorrect value for stub[26], expected 194, is %d", - check_msg->stub[26]); - ck_assert_msg(check_msg->stub[27] == 193, - "incorrect value for stub[27], expected 193, is %d", - check_msg->stub[27]); + ck_assert_msg(check_msg->const_id == 1, + "incorrect value for const_id, expected 1, is %d", + check_msg->const_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 == 2, + "incorrect value for header.seq_num, expected 2, is %d", + check_msg->header.seq_num); + ck_assert_msg(check_msg->header.sol_id == 48, + "incorrect value for header.sol_id, expected 48, 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 == 3, + "incorrect value for header.update_interval, expected 3, is %d", + check_msg->header.update_interval); + ck_assert_msg( + check_msg->orbit_clock_bounds_degradation.clock_bound_mu_dot == 194, + "incorrect value for " + "orbit_clock_bounds_degradation.clock_bound_mu_dot, expected 194, is " + "%d", + check_msg->orbit_clock_bounds_degradation.clock_bound_mu_dot); + ck_assert_msg( + check_msg->orbit_clock_bounds_degradation.clock_bound_sig_dot == 193, + "incorrect value for " + "orbit_clock_bounds_degradation.clock_bound_sig_dot, expected 193, is " + "%d", + check_msg->orbit_clock_bounds_degradation.clock_bound_sig_dot); + ck_assert_msg( + check_msg->orbit_clock_bounds_degradation.orb_along_bound_mu_dot == 199, + "incorrect value for " + "orbit_clock_bounds_degradation.orb_along_bound_mu_dot, expected 199, " + "is %d", + check_msg->orbit_clock_bounds_degradation.orb_along_bound_mu_dot); + ck_assert_msg( + check_msg->orbit_clock_bounds_degradation.orb_along_bound_sig_dot == + 196, + "incorrect value for " + "orbit_clock_bounds_degradation.orb_along_bound_sig_dot, expected 196, " + "is %d", + check_msg->orbit_clock_bounds_degradation.orb_along_bound_sig_dot); + ck_assert_msg( + check_msg->orbit_clock_bounds_degradation.orb_cross_bound_mu_dot == 198, + "incorrect value for " + "orbit_clock_bounds_degradation.orb_cross_bound_mu_dot, expected 198, " + "is %d", + check_msg->orbit_clock_bounds_degradation.orb_cross_bound_mu_dot); + ck_assert_msg( + check_msg->orbit_clock_bounds_degradation.orb_cross_bound_sig_dot == + 195, + "incorrect value for " + "orbit_clock_bounds_degradation.orb_cross_bound_sig_dot, expected 195, " + "is %d", + check_msg->orbit_clock_bounds_degradation.orb_cross_bound_sig_dot); + ck_assert_msg( + check_msg->orbit_clock_bounds_degradation.orb_radial_bound_mu_dot == + 200, + "incorrect value for " + "orbit_clock_bounds_degradation.orb_radial_bound_mu_dot, expected 200, " + "is %d", + check_msg->orbit_clock_bounds_degradation.orb_radial_bound_mu_dot); + ck_assert_msg( + check_msg->orbit_clock_bounds_degradation.orb_radial_bound_sig_dot == + 197, + "incorrect value for " + "orbit_clock_bounds_degradation.orb_radial_bound_sig_dot, expected " + "197, is %d", + check_msg->orbit_clock_bounds_degradation.orb_radial_bound_sig_dot); + ck_assert_msg(check_msg->sat_bitmask == 10, + "incorrect value for sat_bitmask, expected 10, is %d", + check_msg->sat_bitmask); + ck_assert_msg(check_msg->ssr_iod == 15, + "incorrect value for ssr_iod, expected 15, is %d", + check_msg->ssr_iod); } } END_TEST diff --git a/c/test/legacy/auto_check_sbp_ssr_MsgSsrStecCorrection.c b/c/test/legacy/auto_check_sbp_ssr_MsgSsrStecCorrection.c index 09ef22c1f8..1c1b35a394 100644 --- a/c/test/legacy/auto_check_sbp_ssr_MsgSsrStecCorrection.c +++ b/c/test/legacy/auto_check_sbp_ssr_MsgSsrStecCorrection.c @@ -135,196 +135,70 @@ START_TEST(test_legacy_auto_check_sbp_ssr_MsgSsrStecCorrection) { msg_ssr_stec_correction_t *test_msg = (msg_ssr_stec_correction_t *)test_msg_storage; test_msg_len = sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { + 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->stub[0]); + test_msg_len += sizeof(test_msg->stec_sat_list[0]); } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { + if (sizeof(test_msg->stec_sat_list[0].stec_coeff) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->stec_sat_list[0].stec_coeff[0]); } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 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->stub[0]); + test_msg_len += sizeof(test_msg->stec_sat_list[0].stec_coeff[0]); } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 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->stub[0]); + test_msg_len += sizeof(test_msg->stec_sat_list[0].stec_coeff[0]); } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 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->stub[0]); + test_msg_len += sizeof(test_msg->stec_sat_list[0].stec_coeff[0]); } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 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->stub[0]); + test_msg_len += sizeof(test_msg->stec_sat_list[0]); } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { + if (sizeof(test_msg->stec_sat_list[1].stec_coeff) == 0) { // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); + test_msg_len += sizeof(test_msg->stec_sat_list[1].stec_coeff[0]); } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 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->stub[0]); + test_msg_len += sizeof(test_msg->stec_sat_list[1].stec_coeff[0]); } - test_msg->stub[7] = 1; - if (sizeof(test_msg->stub) == 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->stub[0]); + test_msg_len += sizeof(test_msg->stec_sat_list[1].stec_coeff[0]); } - test_msg->stub[8] = 10; - if (sizeof(test_msg->stub) == 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->stub[0]); + test_msg_len += sizeof(test_msg->stec_sat_list[1].stec_coeff[0]); } - test_msg->stub[9] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[10] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[11] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[12] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[13] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[14] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[15] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[16] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[17] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[18] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[19] = 63; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[20] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[21] = 62; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[22] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[23] = 61; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[24] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[25] = 60; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[26] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[27] = 31; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[28] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[29] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[30] = 63; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[31] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[32] = 64; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[33] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[34] = 65; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[35] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[36] = 66; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[37] = 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); @@ -380,120 +254,93 @@ START_TEST(test_legacy_auto_check_sbp_ssr_MsgSsrStecCorrection) { (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->stub[0] == 180, - "incorrect value for stub[0], expected 180, is %d", - check_msg->stub[0]); - ck_assert_msg(check_msg->stub[1] == 0, - "incorrect value for stub[1], expected 0, is %d", - check_msg->stub[1]); - ck_assert_msg(check_msg->stub[2] == 0, - "incorrect value for stub[2], expected 0, is %d", - check_msg->stub[2]); - ck_assert_msg(check_msg->stub[3] == 0, - "incorrect value for stub[3], expected 0, is %d", - check_msg->stub[3]); - ck_assert_msg(check_msg->stub[4] == 3, - "incorrect value for stub[4], expected 3, is %d", - check_msg->stub[4]); - ck_assert_msg(check_msg->stub[5] == 0, - "incorrect value for stub[5], expected 0, is %d", - check_msg->stub[5]); - ck_assert_msg(check_msg->stub[6] == 1, - "incorrect value for stub[6], expected 1, is %d", - check_msg->stub[6]); - ck_assert_msg(check_msg->stub[7] == 1, - "incorrect value for stub[7], expected 1, is %d", - check_msg->stub[7]); - ck_assert_msg(check_msg->stub[8] == 10, - "incorrect value for stub[8], expected 10, is %d", - check_msg->stub[8]); - ck_assert_msg(check_msg->stub[9] == 0, - "incorrect value for stub[9], expected 0, is %d", - check_msg->stub[9]); - ck_assert_msg(check_msg->stub[10] == 15, - "incorrect value for stub[10], expected 15, is %d", - check_msg->stub[10]); - ck_assert_msg(check_msg->stub[11] == 1, - "incorrect value for stub[11], expected 1, is %d", - check_msg->stub[11]); - ck_assert_msg(check_msg->stub[12] == 0, - "incorrect value for stub[12], expected 0, is %d", - check_msg->stub[12]); - ck_assert_msg(check_msg->stub[13] == 10, - "incorrect value for stub[13], expected 10, is %d", - check_msg->stub[13]); - ck_assert_msg(check_msg->stub[14] == 0, - "incorrect value for stub[14], expected 0, is %d", - check_msg->stub[14]); - ck_assert_msg(check_msg->stub[15] == 2, - "incorrect value for stub[15], expected 2, is %d", - check_msg->stub[15]); - ck_assert_msg(check_msg->stub[16] == 1, - "incorrect value for stub[16], expected 1, is %d", - check_msg->stub[16]); - ck_assert_msg(check_msg->stub[17] == 1, - "incorrect value for stub[17], expected 1, is %d", - check_msg->stub[17]); - ck_assert_msg(check_msg->stub[18] == 1, - "incorrect value for stub[18], expected 1, is %d", - check_msg->stub[18]); - ck_assert_msg(check_msg->stub[19] == 63, - "incorrect value for stub[19], expected 63, is %d", - check_msg->stub[19]); - ck_assert_msg(check_msg->stub[20] == 0, - "incorrect value for stub[20], expected 0, is %d", - check_msg->stub[20]); - ck_assert_msg(check_msg->stub[21] == 62, - "incorrect value for stub[21], expected 62, is %d", - check_msg->stub[21]); - ck_assert_msg(check_msg->stub[22] == 0, - "incorrect value for stub[22], expected 0, is %d", - check_msg->stub[22]); - ck_assert_msg(check_msg->stub[23] == 61, - "incorrect value for stub[23], expected 61, is %d", - check_msg->stub[23]); - ck_assert_msg(check_msg->stub[24] == 0, - "incorrect value for stub[24], expected 0, is %d", - check_msg->stub[24]); - ck_assert_msg(check_msg->stub[25] == 60, - "incorrect value for stub[25], expected 60, is %d", - check_msg->stub[25]); - ck_assert_msg(check_msg->stub[26] == 0, - "incorrect value for stub[26], expected 0, is %d", - check_msg->stub[26]); - ck_assert_msg(check_msg->stub[27] == 31, - "incorrect value for stub[27], expected 31, is %d", - check_msg->stub[27]); - ck_assert_msg(check_msg->stub[28] == 15, - "incorrect value for stub[28], expected 15, is %d", - check_msg->stub[28]); - ck_assert_msg(check_msg->stub[29] == 5, - "incorrect value for stub[29], expected 5, is %d", - check_msg->stub[29]); - ck_assert_msg(check_msg->stub[30] == 63, - "incorrect value for stub[30], expected 63, is %d", - check_msg->stub[30]); - ck_assert_msg(check_msg->stub[31] == 0, - "incorrect value for stub[31], expected 0, is %d", - check_msg->stub[31]); - ck_assert_msg(check_msg->stub[32] == 64, - "incorrect value for stub[32], expected 64, is %d", - check_msg->stub[32]); - ck_assert_msg(check_msg->stub[33] == 0, - "incorrect value for stub[33], expected 0, is %d", - check_msg->stub[33]); - ck_assert_msg(check_msg->stub[34] == 65, - "incorrect value for stub[34], expected 65, is %d", - check_msg->stub[34]); - ck_assert_msg(check_msg->stub[35] == 0, - "incorrect value for stub[35], expected 0, is %d", - check_msg->stub[35]); - ck_assert_msg(check_msg->stub[36] == 66, - "incorrect value for stub[36], expected 66, is %d", - check_msg->stub[36]); - ck_assert_msg(check_msg->stub[37] == 0, - "incorrect value for stub[37], expected 0, is %d", - check_msg->stub[37]); + 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 diff --git a/c/test/legacy/auto_check_sbp_ssr_MsgSsrTileDefinition.c b/c/test/legacy/auto_check_sbp_ssr_MsgSsrTileDefinition.c index 5c30cd22c8..af108f61da 100644 --- a/c/test/legacy/auto_check_sbp_ssr_MsgSsrTileDefinition.c +++ b/c/test/legacy/auto_check_sbp_ssr_MsgSsrTileDefinition.c @@ -134,131 +134,16 @@ START_TEST(test_legacy_auto_check_sbp_ssr_MsgSsrTileDefinition) { msg_ssr_tile_definition_t *test_msg = (msg_ssr_tile_definition_t *)test_msg_storage; test_msg_len = sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[0] = 31; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[2] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[4] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[6] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[7] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[8] = 8; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[9] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[10] = 16; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[11] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[12] = 32; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[13] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[14] = 64; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[15] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[16] = 128; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[17] = 210; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[18] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[19] = 150; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[20] = 73; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[21] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[22] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[23] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len += sizeof(test_msg->stub[0]); - } - test_msg->stub[24] = 0; + 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); @@ -314,81 +199,36 @@ START_TEST(test_legacy_auto_check_sbp_ssr_MsgSsrTileDefinition) { (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->stub[0] == 31, - "incorrect value for stub[0], expected 31, is %d", - check_msg->stub[0]); - ck_assert_msg(check_msg->stub[1] == 0, - "incorrect value for stub[1], expected 0, is %d", - check_msg->stub[1]); - ck_assert_msg(check_msg->stub[2] == 1, - "incorrect value for stub[2], expected 1, is %d", - check_msg->stub[2]); - ck_assert_msg(check_msg->stub[3] == 0, - "incorrect value for stub[3], expected 0, is %d", - check_msg->stub[3]); - ck_assert_msg(check_msg->stub[4] == 2, - "incorrect value for stub[4], expected 2, is %d", - check_msg->stub[4]); - ck_assert_msg(check_msg->stub[5] == 0, - "incorrect value for stub[5], expected 0, is %d", - check_msg->stub[5]); - ck_assert_msg(check_msg->stub[6] == 4, - "incorrect value for stub[6], expected 4, is %d", - check_msg->stub[6]); - ck_assert_msg(check_msg->stub[7] == 0, - "incorrect value for stub[7], expected 0, is %d", - check_msg->stub[7]); - ck_assert_msg(check_msg->stub[8] == 8, - "incorrect value for stub[8], expected 8, is %d", - check_msg->stub[8]); - ck_assert_msg(check_msg->stub[9] == 0, - "incorrect value for stub[9], expected 0, is %d", - check_msg->stub[9]); - ck_assert_msg(check_msg->stub[10] == 16, - "incorrect value for stub[10], expected 16, is %d", - check_msg->stub[10]); - ck_assert_msg(check_msg->stub[11] == 0, - "incorrect value for stub[11], expected 0, is %d", - check_msg->stub[11]); - ck_assert_msg(check_msg->stub[12] == 32, - "incorrect value for stub[12], expected 32, is %d", - check_msg->stub[12]); - ck_assert_msg(check_msg->stub[13] == 0, - "incorrect value for stub[13], expected 0, is %d", - check_msg->stub[13]); - ck_assert_msg(check_msg->stub[14] == 64, - "incorrect value for stub[14], expected 64, is %d", - check_msg->stub[14]); - ck_assert_msg(check_msg->stub[15] == 0, - "incorrect value for stub[15], expected 0, is %d", - check_msg->stub[15]); - ck_assert_msg(check_msg->stub[16] == 128, - "incorrect value for stub[16], expected 128, is %d", - check_msg->stub[16]); - ck_assert_msg(check_msg->stub[17] == 210, - "incorrect value for stub[17], expected 210, is %d", - check_msg->stub[17]); - ck_assert_msg(check_msg->stub[18] == 2, - "incorrect value for stub[18], expected 2, is %d", - check_msg->stub[18]); - ck_assert_msg(check_msg->stub[19] == 150, - "incorrect value for stub[19], expected 150, is %d", - check_msg->stub[19]); - ck_assert_msg(check_msg->stub[20] == 73, - "incorrect value for stub[20], expected 73, is %d", - check_msg->stub[20]); - ck_assert_msg(check_msg->stub[21] == 0, - "incorrect value for stub[21], expected 0, is %d", - check_msg->stub[21]); - ck_assert_msg(check_msg->stub[22] == 0, - "incorrect value for stub[22], expected 0, is %d", - check_msg->stub[22]); - ck_assert_msg(check_msg->stub[23] == 0, - "incorrect value for stub[23], expected 0, is %d", - check_msg->stub[23]); - ck_assert_msg(check_msg->stub[24] == 0, - "incorrect value for stub[24], expected 0, is %d", - check_msg->stub[24]); + 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 diff --git a/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagHighLevel.cc b/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagHighLevel.cc index f5f6b05b9e..68a8ae01f4 100644 --- a/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagHighLevel.cc +++ b/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagHighLevel.cc @@ -88,161 +88,51 @@ TEST_F(Test_legacy_auto_check_sbp_integrity_MsgSsrFlagHighLevel0, Test) { msg_ssr_flag_high_level_t *test_msg = (msg_ssr_flag_high_level_t *)test_msg_storage; test_msg_len = (uint8_t)sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { + test_msg->chain_id = 40; + test_msg->corr_time.tow = 360; + test_msg->corr_time.wn = 6; + test_msg->obs_time.tow = 180; + test_msg->obs_time.wn = 3; + if (sizeof(test_msg->reserved) == 0) { // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->reserved[0])); } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { + test_msg->reserved[0] = 0; + if (sizeof(test_msg->reserved) == 0) { // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->reserved[0])); } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { + test_msg->reserved[1] = 0; + if (sizeof(test_msg->reserved) == 0) { // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->reserved[0])); } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { + test_msg->reserved[2] = 0; + if (sizeof(test_msg->reserved) == 0) { // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->reserved[0])); } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { + test_msg->reserved[3] = 0; + if (sizeof(test_msg->reserved) == 0) { // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->reserved[0])); } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { + test_msg->reserved[4] = 0; + if (sizeof(test_msg->reserved) == 0) { // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->reserved[0])); } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[6] = 104; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[7] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[8] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[9] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[10] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[11] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[12] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[13] = 20; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[14] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[15] = 30; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[16] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[17] = 40; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[18] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[19] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[20] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[21] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[22] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[23] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[24] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[25] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[26] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[27] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[28] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[29] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[30] = 7; + test_msg->reserved[5] = 0; + test_msg->ssr_sol_id = 10; + test_msg->tile_id = 30; + test_msg->tile_set_id = 20; + test_msg->use_bds_sat = 3; + test_msg->use_gal_sat = 2; + test_msg->use_gps_sat = 1; + test_msg->use_iono_grid_point_sat_los = 7; + test_msg->use_iono_grid_points = 5; + test_msg->use_iono_tile_sat_los = 6; + test_msg->use_tropo_grid_points = 4; EXPECT_EQ(send_message(3001, 66, test_msg_len, test_msg_storage), SBP_OK); @@ -256,70 +146,66 @@ TEST_F(Test_legacy_auto_check_sbp_integrity_MsgSsrFlagHighLevel0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_len_, test_msg_len); - EXPECT_EQ(last_msg_->stub[0], 180) - << "incorrect value for stub[0], expected 180, is " << last_msg_->stub[0]; - EXPECT_EQ(last_msg_->stub[1], 0) - << "incorrect value for stub[1], expected 0, is " << last_msg_->stub[1]; - EXPECT_EQ(last_msg_->stub[2], 0) - << "incorrect value for stub[2], expected 0, is " << last_msg_->stub[2]; - EXPECT_EQ(last_msg_->stub[3], 0) - << "incorrect value for stub[3], expected 0, is " << last_msg_->stub[3]; - EXPECT_EQ(last_msg_->stub[4], 3) - << "incorrect value for stub[4], expected 3, is " << last_msg_->stub[4]; - EXPECT_EQ(last_msg_->stub[5], 0) - << "incorrect value for stub[5], expected 0, is " << last_msg_->stub[5]; - EXPECT_EQ(last_msg_->stub[6], 104) - << "incorrect value for stub[6], expected 104, is " << last_msg_->stub[6]; - EXPECT_EQ(last_msg_->stub[7], 1) - << "incorrect value for stub[7], expected 1, is " << last_msg_->stub[7]; - EXPECT_EQ(last_msg_->stub[8], 0) - << "incorrect value for stub[8], expected 0, is " << last_msg_->stub[8]; - EXPECT_EQ(last_msg_->stub[9], 0) - << "incorrect value for stub[9], expected 0, is " << last_msg_->stub[9]; - EXPECT_EQ(last_msg_->stub[10], 6) - << "incorrect value for stub[10], expected 6, is " << last_msg_->stub[10]; - EXPECT_EQ(last_msg_->stub[11], 0) - << "incorrect value for stub[11], expected 0, is " << last_msg_->stub[11]; - EXPECT_EQ(last_msg_->stub[12], 10) - << "incorrect value for stub[12], expected 10, is " - << last_msg_->stub[12]; - EXPECT_EQ(last_msg_->stub[13], 20) - << "incorrect value for stub[13], expected 20, is " - << last_msg_->stub[13]; - EXPECT_EQ(last_msg_->stub[14], 0) - << "incorrect value for stub[14], expected 0, is " << last_msg_->stub[14]; - EXPECT_EQ(last_msg_->stub[15], 30) - << "incorrect value for stub[15], expected 30, is " - << last_msg_->stub[15]; - EXPECT_EQ(last_msg_->stub[16], 0) - << "incorrect value for stub[16], expected 0, is " << last_msg_->stub[16]; - EXPECT_EQ(last_msg_->stub[17], 40) - << "incorrect value for stub[17], expected 40, is " - << last_msg_->stub[17]; - EXPECT_EQ(last_msg_->stub[18], 1) - << "incorrect value for stub[18], expected 1, is " << last_msg_->stub[18]; - EXPECT_EQ(last_msg_->stub[19], 2) - << "incorrect value for stub[19], expected 2, is " << last_msg_->stub[19]; - EXPECT_EQ(last_msg_->stub[20], 3) - << "incorrect value for stub[20], expected 3, is " << last_msg_->stub[20]; - EXPECT_EQ(last_msg_->stub[21], 0) - << "incorrect value for stub[21], expected 0, is " << last_msg_->stub[21]; - EXPECT_EQ(last_msg_->stub[22], 0) - << "incorrect value for stub[22], expected 0, is " << last_msg_->stub[22]; - EXPECT_EQ(last_msg_->stub[23], 0) - << "incorrect value for stub[23], expected 0, is " << last_msg_->stub[23]; - EXPECT_EQ(last_msg_->stub[24], 0) - << "incorrect value for stub[24], expected 0, is " << last_msg_->stub[24]; - EXPECT_EQ(last_msg_->stub[25], 0) - << "incorrect value for stub[25], expected 0, is " << last_msg_->stub[25]; - EXPECT_EQ(last_msg_->stub[26], 0) - << "incorrect value for stub[26], expected 0, is " << last_msg_->stub[26]; - EXPECT_EQ(last_msg_->stub[27], 4) - << "incorrect value for stub[27], expected 4, is " << last_msg_->stub[27]; - EXPECT_EQ(last_msg_->stub[28], 5) - << "incorrect value for stub[28], expected 5, is " << last_msg_->stub[28]; - EXPECT_EQ(last_msg_->stub[29], 6) - << "incorrect value for stub[29], expected 6, is " << last_msg_->stub[29]; - EXPECT_EQ(last_msg_->stub[30], 7) - << "incorrect value for stub[30], expected 7, is " << last_msg_->stub[30]; + EXPECT_EQ(last_msg_->chain_id, 40) + << "incorrect value for chain_id, expected 40, is " + << last_msg_->chain_id; + EXPECT_EQ(last_msg_->corr_time.tow, 360) + << "incorrect value for corr_time.tow, expected 360, is " + << last_msg_->corr_time.tow; + EXPECT_EQ(last_msg_->corr_time.wn, 6) + << "incorrect value for corr_time.wn, expected 6, is " + << last_msg_->corr_time.wn; + EXPECT_EQ(last_msg_->obs_time.tow, 180) + << "incorrect value for obs_time.tow, expected 180, is " + << last_msg_->obs_time.tow; + EXPECT_EQ(last_msg_->obs_time.wn, 3) + << "incorrect value for obs_time.wn, expected 3, is " + << last_msg_->obs_time.wn; + EXPECT_EQ(last_msg_->reserved[0], 0) + << "incorrect value for reserved[0], expected 0, is " + << last_msg_->reserved[0]; + EXPECT_EQ(last_msg_->reserved[1], 0) + << "incorrect value for reserved[1], expected 0, is " + << last_msg_->reserved[1]; + EXPECT_EQ(last_msg_->reserved[2], 0) + << "incorrect value for reserved[2], expected 0, is " + << last_msg_->reserved[2]; + EXPECT_EQ(last_msg_->reserved[3], 0) + << "incorrect value for reserved[3], expected 0, is " + << last_msg_->reserved[3]; + EXPECT_EQ(last_msg_->reserved[4], 0) + << "incorrect value for reserved[4], expected 0, is " + << last_msg_->reserved[4]; + EXPECT_EQ(last_msg_->reserved[5], 0) + << "incorrect value for reserved[5], expected 0, is " + << last_msg_->reserved[5]; + EXPECT_EQ(last_msg_->ssr_sol_id, 10) + << "incorrect value for ssr_sol_id, expected 10, is " + << last_msg_->ssr_sol_id; + EXPECT_EQ(last_msg_->tile_id, 30) + << "incorrect value for tile_id, expected 30, is " << last_msg_->tile_id; + EXPECT_EQ(last_msg_->tile_set_id, 20) + << "incorrect value for tile_set_id, expected 20, is " + << last_msg_->tile_set_id; + EXPECT_EQ(last_msg_->use_bds_sat, 3) + << "incorrect value for use_bds_sat, expected 3, is " + << last_msg_->use_bds_sat; + EXPECT_EQ(last_msg_->use_gal_sat, 2) + << "incorrect value for use_gal_sat, expected 2, is " + << last_msg_->use_gal_sat; + EXPECT_EQ(last_msg_->use_gps_sat, 1) + << "incorrect value for use_gps_sat, expected 1, is " + << last_msg_->use_gps_sat; + EXPECT_EQ(last_msg_->use_iono_grid_point_sat_los, 7) + << "incorrect value for use_iono_grid_point_sat_los, expected 7, is " + << last_msg_->use_iono_grid_point_sat_los; + EXPECT_EQ(last_msg_->use_iono_grid_points, 5) + << "incorrect value for use_iono_grid_points, expected 5, is " + << last_msg_->use_iono_grid_points; + EXPECT_EQ(last_msg_->use_iono_tile_sat_los, 6) + << "incorrect value for use_iono_tile_sat_los, expected 6, is " + << last_msg_->use_iono_tile_sat_los; + EXPECT_EQ(last_msg_->use_tropo_grid_points, 4) + << "incorrect value for use_tropo_grid_points, expected 4, is " + << last_msg_->use_tropo_grid_points; } diff --git a/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos.cc b/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos.cc index 7d41edf293..786ec69d4d 100644 --- a/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos.cc +++ b/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos.cc @@ -90,111 +90,28 @@ TEST_F(Test_legacy_auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos0, msg_ssr_flag_iono_grid_point_sat_los_t *test_msg = (msg_ssr_flag_iono_grid_point_sat_los_t *)test_msg_storage; test_msg_len = (uint8_t)sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[7] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[8] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[9] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[10] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[11] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[12] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[13] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[14] = 30; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[15] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[16] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[17] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[18] = 11; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[19] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[20] = 14; + if (sizeof(test_msg->faulty_los) == 0) { + // Cope with variable length arrays + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->faulty_los[0])); + } + test_msg->faulty_los[0].constellation = 11; + test_msg->faulty_los[0].satId = 10; + if (sizeof(test_msg->faulty_los) == 0) { + // Cope with variable length arrays + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->faulty_los[0])); + } + test_msg->faulty_los[1].constellation = 14; + test_msg->faulty_los[1].satId = 15; + test_msg->grid_point_id = 30; + test_msg->header.chain_id = 6; + test_msg->header.num_msgs = 1; + test_msg->header.obs_time.tow = 180; + test_msg->header.obs_time.wn = 3; + test_msg->header.seq_num = 2; + test_msg->header.ssr_sol_id = 3; + test_msg->header.tile_id = 5; + test_msg->header.tile_set_id = 4; + test_msg->n_faulty_los = 2; EXPECT_EQ(send_message(3025, 66, test_msg_len, test_msg_storage), SBP_OK); @@ -208,51 +125,46 @@ TEST_F(Test_legacy_auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLos0, EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_len_, test_msg_len); - EXPECT_EQ(last_msg_->stub[0], 180) - << "incorrect value for stub[0], expected 180, is " << last_msg_->stub[0]; - EXPECT_EQ(last_msg_->stub[1], 0) - << "incorrect value for stub[1], expected 0, is " << last_msg_->stub[1]; - EXPECT_EQ(last_msg_->stub[2], 0) - << "incorrect value for stub[2], expected 0, is " << last_msg_->stub[2]; - EXPECT_EQ(last_msg_->stub[3], 0) - << "incorrect value for stub[3], expected 0, is " << last_msg_->stub[3]; - EXPECT_EQ(last_msg_->stub[4], 3) - << "incorrect value for stub[4], expected 3, is " << last_msg_->stub[4]; - EXPECT_EQ(last_msg_->stub[5], 0) - << "incorrect value for stub[5], expected 0, is " << last_msg_->stub[5]; - EXPECT_EQ(last_msg_->stub[6], 1) - << "incorrect value for stub[6], expected 1, is " << last_msg_->stub[6]; - EXPECT_EQ(last_msg_->stub[7], 2) - << "incorrect value for stub[7], expected 2, is " << last_msg_->stub[7]; - EXPECT_EQ(last_msg_->stub[8], 3) - << "incorrect value for stub[8], expected 3, is " << last_msg_->stub[8]; - EXPECT_EQ(last_msg_->stub[9], 4) - << "incorrect value for stub[9], expected 4, is " << last_msg_->stub[9]; - EXPECT_EQ(last_msg_->stub[10], 0) - << "incorrect value for stub[10], expected 0, is " << last_msg_->stub[10]; - EXPECT_EQ(last_msg_->stub[11], 5) - << "incorrect value for stub[11], expected 5, is " << last_msg_->stub[11]; - EXPECT_EQ(last_msg_->stub[12], 0) - << "incorrect value for stub[12], expected 0, is " << last_msg_->stub[12]; - EXPECT_EQ(last_msg_->stub[13], 6) - << "incorrect value for stub[13], expected 6, is " << last_msg_->stub[13]; - EXPECT_EQ(last_msg_->stub[14], 30) - << "incorrect value for stub[14], expected 30, is " - << last_msg_->stub[14]; - EXPECT_EQ(last_msg_->stub[15], 0) - << "incorrect value for stub[15], expected 0, is " << last_msg_->stub[15]; - EXPECT_EQ(last_msg_->stub[16], 2) - << "incorrect value for stub[16], expected 2, is " << last_msg_->stub[16]; - EXPECT_EQ(last_msg_->stub[17], 10) - << "incorrect value for stub[17], expected 10, is " - << last_msg_->stub[17]; - EXPECT_EQ(last_msg_->stub[18], 11) - << "incorrect value for stub[18], expected 11, is " - << last_msg_->stub[18]; - EXPECT_EQ(last_msg_->stub[19], 15) - << "incorrect value for stub[19], expected 15, is " - << last_msg_->stub[19]; - EXPECT_EQ(last_msg_->stub[20], 14) - << "incorrect value for stub[20], expected 14, is " - << last_msg_->stub[20]; + EXPECT_EQ(last_msg_->faulty_los[0].constellation, 11) + << "incorrect value for faulty_los[0].constellation, expected 11, is " + << last_msg_->faulty_los[0].constellation; + EXPECT_EQ(last_msg_->faulty_los[0].satId, 10) + << "incorrect value for faulty_los[0].satId, expected 10, is " + << last_msg_->faulty_los[0].satId; + EXPECT_EQ(last_msg_->faulty_los[1].constellation, 14) + << "incorrect value for faulty_los[1].constellation, expected 14, is " + << last_msg_->faulty_los[1].constellation; + EXPECT_EQ(last_msg_->faulty_los[1].satId, 15) + << "incorrect value for faulty_los[1].satId, expected 15, is " + << last_msg_->faulty_los[1].satId; + EXPECT_EQ(last_msg_->grid_point_id, 30) + << "incorrect value for grid_point_id, expected 30, is " + << last_msg_->grid_point_id; + EXPECT_EQ(last_msg_->header.chain_id, 6) + << "incorrect value for header.chain_id, expected 6, is " + << last_msg_->header.chain_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.obs_time.tow, 180) + << "incorrect value for header.obs_time.tow, expected 180, is " + << last_msg_->header.obs_time.tow; + EXPECT_EQ(last_msg_->header.obs_time.wn, 3) + << "incorrect value for header.obs_time.wn, expected 3, is " + << last_msg_->header.obs_time.wn; + EXPECT_EQ(last_msg_->header.seq_num, 2) + << "incorrect value for header.seq_num, expected 2, is " + << last_msg_->header.seq_num; + EXPECT_EQ(last_msg_->header.ssr_sol_id, 3) + << "incorrect value for header.ssr_sol_id, expected 3, is " + << last_msg_->header.ssr_sol_id; + EXPECT_EQ(last_msg_->header.tile_id, 5) + << "incorrect value for header.tile_id, expected 5, is " + << last_msg_->header.tile_id; + EXPECT_EQ(last_msg_->header.tile_set_id, 4) + << "incorrect value for header.tile_set_id, expected 4, is " + << last_msg_->header.tile_set_id; + EXPECT_EQ(last_msg_->n_faulty_los, 2) + << "incorrect value for n_faulty_los, expected 2, is " + << last_msg_->n_faulty_los; } diff --git a/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints.cc b/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints.cc index 3417f1c682..67f9790b02 100644 --- a/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints.cc +++ b/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints.cc @@ -88,111 +88,30 @@ TEST_F(Test_legacy_auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints0, Test) { msg_ssr_flag_iono_grid_points_t *test_msg = (msg_ssr_flag_iono_grid_points_t *)test_msg_storage; test_msg_len = (uint8_t)sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { + if (sizeof(test_msg->faulty_points) == 0) { // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->faulty_points[0])); } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { + test_msg->faulty_points[0] = 10; + if (sizeof(test_msg->faulty_points) == 0) { // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->faulty_points[0])); } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { + test_msg->faulty_points[1] = 11; + if (sizeof(test_msg->faulty_points) == 0) { // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->faulty_points[0])); } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[7] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[8] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[9] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[10] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[11] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[12] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[13] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[14] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[15] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[16] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[17] = 11; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[18] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[19] = 12; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[20] = 0; + test_msg->faulty_points[2] = 12; + test_msg->header.chain_id = 6; + test_msg->header.num_msgs = 1; + test_msg->header.obs_time.tow = 180; + test_msg->header.obs_time.wn = 3; + test_msg->header.seq_num = 2; + test_msg->header.ssr_sol_id = 3; + test_msg->header.tile_id = 5; + test_msg->header.tile_set_id = 4; + test_msg->n_faulty_points = 3; EXPECT_EQ(send_message(3015, 66, test_msg_len, test_msg_storage), SBP_OK); @@ -206,49 +125,40 @@ TEST_F(Test_legacy_auto_check_sbp_integrity_MsgSsrFlagIonoGridPoints0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_len_, test_msg_len); - EXPECT_EQ(last_msg_->stub[0], 180) - << "incorrect value for stub[0], expected 180, is " << last_msg_->stub[0]; - EXPECT_EQ(last_msg_->stub[1], 0) - << "incorrect value for stub[1], expected 0, is " << last_msg_->stub[1]; - EXPECT_EQ(last_msg_->stub[2], 0) - << "incorrect value for stub[2], expected 0, is " << last_msg_->stub[2]; - EXPECT_EQ(last_msg_->stub[3], 0) - << "incorrect value for stub[3], expected 0, is " << last_msg_->stub[3]; - EXPECT_EQ(last_msg_->stub[4], 3) - << "incorrect value for stub[4], expected 3, is " << last_msg_->stub[4]; - EXPECT_EQ(last_msg_->stub[5], 0) - << "incorrect value for stub[5], expected 0, is " << last_msg_->stub[5]; - EXPECT_EQ(last_msg_->stub[6], 1) - << "incorrect value for stub[6], expected 1, is " << last_msg_->stub[6]; - EXPECT_EQ(last_msg_->stub[7], 2) - << "incorrect value for stub[7], expected 2, is " << last_msg_->stub[7]; - EXPECT_EQ(last_msg_->stub[8], 3) - << "incorrect value for stub[8], expected 3, is " << last_msg_->stub[8]; - EXPECT_EQ(last_msg_->stub[9], 4) - << "incorrect value for stub[9], expected 4, is " << last_msg_->stub[9]; - EXPECT_EQ(last_msg_->stub[10], 0) - << "incorrect value for stub[10], expected 0, is " << last_msg_->stub[10]; - EXPECT_EQ(last_msg_->stub[11], 5) - << "incorrect value for stub[11], expected 5, is " << last_msg_->stub[11]; - EXPECT_EQ(last_msg_->stub[12], 0) - << "incorrect value for stub[12], expected 0, is " << last_msg_->stub[12]; - EXPECT_EQ(last_msg_->stub[13], 6) - << "incorrect value for stub[13], expected 6, is " << last_msg_->stub[13]; - EXPECT_EQ(last_msg_->stub[14], 3) - << "incorrect value for stub[14], expected 3, is " << last_msg_->stub[14]; - EXPECT_EQ(last_msg_->stub[15], 10) - << "incorrect value for stub[15], expected 10, is " - << last_msg_->stub[15]; - EXPECT_EQ(last_msg_->stub[16], 0) - << "incorrect value for stub[16], expected 0, is " << last_msg_->stub[16]; - EXPECT_EQ(last_msg_->stub[17], 11) - << "incorrect value for stub[17], expected 11, is " - << last_msg_->stub[17]; - EXPECT_EQ(last_msg_->stub[18], 0) - << "incorrect value for stub[18], expected 0, is " << last_msg_->stub[18]; - EXPECT_EQ(last_msg_->stub[19], 12) - << "incorrect value for stub[19], expected 12, is " - << last_msg_->stub[19]; - EXPECT_EQ(last_msg_->stub[20], 0) - << "incorrect value for stub[20], expected 0, is " << last_msg_->stub[20]; + EXPECT_EQ(last_msg_->faulty_points[0], 10) + << "incorrect value for faulty_points[0], expected 10, is " + << last_msg_->faulty_points[0]; + EXPECT_EQ(last_msg_->faulty_points[1], 11) + << "incorrect value for faulty_points[1], expected 11, is " + << last_msg_->faulty_points[1]; + EXPECT_EQ(last_msg_->faulty_points[2], 12) + << "incorrect value for faulty_points[2], expected 12, is " + << last_msg_->faulty_points[2]; + EXPECT_EQ(last_msg_->header.chain_id, 6) + << "incorrect value for header.chain_id, expected 6, is " + << last_msg_->header.chain_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.obs_time.tow, 180) + << "incorrect value for header.obs_time.tow, expected 180, is " + << last_msg_->header.obs_time.tow; + EXPECT_EQ(last_msg_->header.obs_time.wn, 3) + << "incorrect value for header.obs_time.wn, expected 3, is " + << last_msg_->header.obs_time.wn; + EXPECT_EQ(last_msg_->header.seq_num, 2) + << "incorrect value for header.seq_num, expected 2, is " + << last_msg_->header.seq_num; + EXPECT_EQ(last_msg_->header.ssr_sol_id, 3) + << "incorrect value for header.ssr_sol_id, expected 3, is " + << last_msg_->header.ssr_sol_id; + EXPECT_EQ(last_msg_->header.tile_id, 5) + << "incorrect value for header.tile_id, expected 5, is " + << last_msg_->header.tile_id; + EXPECT_EQ(last_msg_->header.tile_set_id, 4) + << "incorrect value for header.tile_set_id, expected 4, is " + << last_msg_->header.tile_set_id; + EXPECT_EQ(last_msg_->n_faulty_points, 3) + << "incorrect value for n_faulty_points, expected 3, is " + << last_msg_->n_faulty_points; } diff --git a/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos.cc b/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos.cc index 0d5fff7a47..d03b0e04d0 100644 --- a/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos.cc +++ b/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos.cc @@ -88,101 +88,27 @@ TEST_F(Test_legacy_auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos0, Test) { msg_ssr_flag_iono_tile_sat_los_t *test_msg = (msg_ssr_flag_iono_tile_sat_los_t *)test_msg_storage; test_msg_len = (uint8_t)sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[7] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[8] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[9] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[10] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[11] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[12] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[13] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[14] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[15] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[16] = 11; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[17] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[18] = 14; + if (sizeof(test_msg->faulty_los) == 0) { + // Cope with variable length arrays + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->faulty_los[0])); + } + test_msg->faulty_los[0].constellation = 11; + test_msg->faulty_los[0].satId = 10; + if (sizeof(test_msg->faulty_los) == 0) { + // Cope with variable length arrays + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->faulty_los[0])); + } + test_msg->faulty_los[1].constellation = 14; + test_msg->faulty_los[1].satId = 15; + test_msg->header.chain_id = 6; + test_msg->header.num_msgs = 1; + test_msg->header.obs_time.tow = 180; + test_msg->header.obs_time.wn = 3; + test_msg->header.seq_num = 2; + test_msg->header.ssr_sol_id = 3; + test_msg->header.tile_id = 5; + test_msg->header.tile_set_id = 4; + test_msg->n_faulty_los = 2; EXPECT_EQ(send_message(3021, 66, test_msg_len, test_msg_storage), SBP_OK); @@ -196,46 +122,43 @@ TEST_F(Test_legacy_auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLos0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_len_, test_msg_len); - EXPECT_EQ(last_msg_->stub[0], 180) - << "incorrect value for stub[0], expected 180, is " << last_msg_->stub[0]; - EXPECT_EQ(last_msg_->stub[1], 0) - << "incorrect value for stub[1], expected 0, is " << last_msg_->stub[1]; - EXPECT_EQ(last_msg_->stub[2], 0) - << "incorrect value for stub[2], expected 0, is " << last_msg_->stub[2]; - EXPECT_EQ(last_msg_->stub[3], 0) - << "incorrect value for stub[3], expected 0, is " << last_msg_->stub[3]; - EXPECT_EQ(last_msg_->stub[4], 3) - << "incorrect value for stub[4], expected 3, is " << last_msg_->stub[4]; - EXPECT_EQ(last_msg_->stub[5], 0) - << "incorrect value for stub[5], expected 0, is " << last_msg_->stub[5]; - EXPECT_EQ(last_msg_->stub[6], 1) - << "incorrect value for stub[6], expected 1, is " << last_msg_->stub[6]; - EXPECT_EQ(last_msg_->stub[7], 2) - << "incorrect value for stub[7], expected 2, is " << last_msg_->stub[7]; - EXPECT_EQ(last_msg_->stub[8], 3) - << "incorrect value for stub[8], expected 3, is " << last_msg_->stub[8]; - EXPECT_EQ(last_msg_->stub[9], 4) - << "incorrect value for stub[9], expected 4, is " << last_msg_->stub[9]; - EXPECT_EQ(last_msg_->stub[10], 0) - << "incorrect value for stub[10], expected 0, is " << last_msg_->stub[10]; - EXPECT_EQ(last_msg_->stub[11], 5) - << "incorrect value for stub[11], expected 5, is " << last_msg_->stub[11]; - EXPECT_EQ(last_msg_->stub[12], 0) - << "incorrect value for stub[12], expected 0, is " << last_msg_->stub[12]; - EXPECT_EQ(last_msg_->stub[13], 6) - << "incorrect value for stub[13], expected 6, is " << last_msg_->stub[13]; - EXPECT_EQ(last_msg_->stub[14], 2) - << "incorrect value for stub[14], expected 2, is " << last_msg_->stub[14]; - EXPECT_EQ(last_msg_->stub[15], 10) - << "incorrect value for stub[15], expected 10, is " - << last_msg_->stub[15]; - EXPECT_EQ(last_msg_->stub[16], 11) - << "incorrect value for stub[16], expected 11, is " - << last_msg_->stub[16]; - EXPECT_EQ(last_msg_->stub[17], 15) - << "incorrect value for stub[17], expected 15, is " - << last_msg_->stub[17]; - EXPECT_EQ(last_msg_->stub[18], 14) - << "incorrect value for stub[18], expected 14, is " - << last_msg_->stub[18]; + EXPECT_EQ(last_msg_->faulty_los[0].constellation, 11) + << "incorrect value for faulty_los[0].constellation, expected 11, is " + << last_msg_->faulty_los[0].constellation; + EXPECT_EQ(last_msg_->faulty_los[0].satId, 10) + << "incorrect value for faulty_los[0].satId, expected 10, is " + << last_msg_->faulty_los[0].satId; + EXPECT_EQ(last_msg_->faulty_los[1].constellation, 14) + << "incorrect value for faulty_los[1].constellation, expected 14, is " + << last_msg_->faulty_los[1].constellation; + EXPECT_EQ(last_msg_->faulty_los[1].satId, 15) + << "incorrect value for faulty_los[1].satId, expected 15, is " + << last_msg_->faulty_los[1].satId; + EXPECT_EQ(last_msg_->header.chain_id, 6) + << "incorrect value for header.chain_id, expected 6, is " + << last_msg_->header.chain_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.obs_time.tow, 180) + << "incorrect value for header.obs_time.tow, expected 180, is " + << last_msg_->header.obs_time.tow; + EXPECT_EQ(last_msg_->header.obs_time.wn, 3) + << "incorrect value for header.obs_time.wn, expected 3, is " + << last_msg_->header.obs_time.wn; + EXPECT_EQ(last_msg_->header.seq_num, 2) + << "incorrect value for header.seq_num, expected 2, is " + << last_msg_->header.seq_num; + EXPECT_EQ(last_msg_->header.ssr_sol_id, 3) + << "incorrect value for header.ssr_sol_id, expected 3, is " + << last_msg_->header.ssr_sol_id; + EXPECT_EQ(last_msg_->header.tile_id, 5) + << "incorrect value for header.tile_id, expected 5, is " + << last_msg_->header.tile_id; + EXPECT_EQ(last_msg_->header.tile_set_id, 4) + << "incorrect value for header.tile_set_id, expected 4, is " + << last_msg_->header.tile_set_id; + EXPECT_EQ(last_msg_->n_faulty_los, 2) + << "incorrect value for n_faulty_los, expected 2, is " + << last_msg_->n_faulty_los; } diff --git a/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagSatellites.cc b/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagSatellites.cc index bafc81216d..f5cefd8cd4 100644 --- a/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagSatellites.cc +++ b/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagSatellites.cc @@ -88,81 +88,29 @@ TEST_F(Test_legacy_auto_check_sbp_integrity_MsgSsrFlagSatellites0, Test) { msg_ssr_flag_satellites_t *test_msg = (msg_ssr_flag_satellites_t *)test_msg_storage; test_msg_len = (uint8_t)sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { + test_msg->chain_id = 4; + test_msg->const_id = 5; + if (sizeof(test_msg->faulty_sats) == 0) { // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->faulty_sats[0])); } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { + test_msg->faulty_sats[0] = 10; + if (sizeof(test_msg->faulty_sats) == 0) { // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->faulty_sats[0])); } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { + test_msg->faulty_sats[1] = 11; + if (sizeof(test_msg->faulty_sats) == 0) { // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[7] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[8] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[9] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[10] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[11] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[12] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[13] = 11; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[14] = 12; + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->faulty_sats[0])); + } + test_msg->faulty_sats[2] = 12; + test_msg->n_faulty_sats = 3; + test_msg->num_msgs = 1; + test_msg->obs_time.tow = 180; + test_msg->obs_time.wn = 3; + test_msg->seq_num = 2; + test_msg->ssr_sol_id = 3; EXPECT_EQ(send_message(3005, 66, test_msg_len, test_msg_storage), SBP_OK); @@ -176,37 +124,33 @@ TEST_F(Test_legacy_auto_check_sbp_integrity_MsgSsrFlagSatellites0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_len_, test_msg_len); - EXPECT_EQ(last_msg_->stub[0], 180) - << "incorrect value for stub[0], expected 180, is " << last_msg_->stub[0]; - EXPECT_EQ(last_msg_->stub[1], 0) - << "incorrect value for stub[1], expected 0, is " << last_msg_->stub[1]; - EXPECT_EQ(last_msg_->stub[2], 0) - << "incorrect value for stub[2], expected 0, is " << last_msg_->stub[2]; - EXPECT_EQ(last_msg_->stub[3], 0) - << "incorrect value for stub[3], expected 0, is " << last_msg_->stub[3]; - EXPECT_EQ(last_msg_->stub[4], 3) - << "incorrect value for stub[4], expected 3, is " << last_msg_->stub[4]; - EXPECT_EQ(last_msg_->stub[5], 0) - << "incorrect value for stub[5], expected 0, is " << last_msg_->stub[5]; - EXPECT_EQ(last_msg_->stub[6], 1) - << "incorrect value for stub[6], expected 1, is " << last_msg_->stub[6]; - EXPECT_EQ(last_msg_->stub[7], 2) - << "incorrect value for stub[7], expected 2, is " << last_msg_->stub[7]; - EXPECT_EQ(last_msg_->stub[8], 3) - << "incorrect value for stub[8], expected 3, is " << last_msg_->stub[8]; - EXPECT_EQ(last_msg_->stub[9], 4) - << "incorrect value for stub[9], expected 4, is " << last_msg_->stub[9]; - EXPECT_EQ(last_msg_->stub[10], 5) - << "incorrect value for stub[10], expected 5, is " << last_msg_->stub[10]; - EXPECT_EQ(last_msg_->stub[11], 3) - << "incorrect value for stub[11], expected 3, is " << last_msg_->stub[11]; - EXPECT_EQ(last_msg_->stub[12], 10) - << "incorrect value for stub[12], expected 10, is " - << last_msg_->stub[12]; - EXPECT_EQ(last_msg_->stub[13], 11) - << "incorrect value for stub[13], expected 11, is " - << last_msg_->stub[13]; - EXPECT_EQ(last_msg_->stub[14], 12) - << "incorrect value for stub[14], expected 12, is " - << last_msg_->stub[14]; + EXPECT_EQ(last_msg_->chain_id, 4) + << "incorrect value for chain_id, expected 4, is " << last_msg_->chain_id; + EXPECT_EQ(last_msg_->const_id, 5) + << "incorrect value for const_id, expected 5, is " << last_msg_->const_id; + EXPECT_EQ(last_msg_->faulty_sats[0], 10) + << "incorrect value for faulty_sats[0], expected 10, is " + << last_msg_->faulty_sats[0]; + EXPECT_EQ(last_msg_->faulty_sats[1], 11) + << "incorrect value for faulty_sats[1], expected 11, is " + << last_msg_->faulty_sats[1]; + EXPECT_EQ(last_msg_->faulty_sats[2], 12) + << "incorrect value for faulty_sats[2], expected 12, is " + << last_msg_->faulty_sats[2]; + EXPECT_EQ(last_msg_->n_faulty_sats, 3) + << "incorrect value for n_faulty_sats, expected 3, is " + << last_msg_->n_faulty_sats; + EXPECT_EQ(last_msg_->num_msgs, 1) + << "incorrect value for num_msgs, expected 1, is " << last_msg_->num_msgs; + EXPECT_EQ(last_msg_->obs_time.tow, 180) + << "incorrect value for obs_time.tow, expected 180, is " + << last_msg_->obs_time.tow; + EXPECT_EQ(last_msg_->obs_time.wn, 3) + << "incorrect value for obs_time.wn, expected 3, is " + << last_msg_->obs_time.wn; + EXPECT_EQ(last_msg_->seq_num, 2) + << "incorrect value for seq_num, expected 2, is " << last_msg_->seq_num; + EXPECT_EQ(last_msg_->ssr_sol_id, 3) + << "incorrect value for ssr_sol_id, expected 3, is " + << last_msg_->ssr_sol_id; } diff --git a/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints.cc b/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints.cc index f539e9b19f..109c4b1931 100644 --- a/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints.cc +++ b/c/test/legacy/cpp/auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints.cc @@ -88,111 +88,30 @@ TEST_F(Test_legacy_auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints0, Test) { msg_ssr_flag_tropo_grid_points_t *test_msg = (msg_ssr_flag_tropo_grid_points_t *)test_msg_storage; test_msg_len = (uint8_t)sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { + if (sizeof(test_msg->faulty_points) == 0) { // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->faulty_points[0])); } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { + test_msg->faulty_points[0] = 10; + if (sizeof(test_msg->faulty_points) == 0) { // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->faulty_points[0])); } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { + test_msg->faulty_points[1] = 11; + if (sizeof(test_msg->faulty_points) == 0) { // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->faulty_points[0])); } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[7] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[8] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[9] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[10] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[11] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[12] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[13] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[14] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[15] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[16] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[17] = 11; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[18] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[19] = 12; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[20] = 0; + test_msg->faulty_points[2] = 12; + test_msg->header.chain_id = 6; + test_msg->header.num_msgs = 1; + test_msg->header.obs_time.tow = 180; + test_msg->header.obs_time.wn = 3; + test_msg->header.seq_num = 2; + test_msg->header.ssr_sol_id = 3; + test_msg->header.tile_id = 5; + test_msg->header.tile_set_id = 4; + test_msg->n_faulty_points = 3; EXPECT_EQ(send_message(3011, 66, test_msg_len, test_msg_storage), SBP_OK); @@ -206,49 +125,40 @@ TEST_F(Test_legacy_auto_check_sbp_integrity_MsgSsrFlagTropoGridPoints0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_len_, test_msg_len); - EXPECT_EQ(last_msg_->stub[0], 180) - << "incorrect value for stub[0], expected 180, is " << last_msg_->stub[0]; - EXPECT_EQ(last_msg_->stub[1], 0) - << "incorrect value for stub[1], expected 0, is " << last_msg_->stub[1]; - EXPECT_EQ(last_msg_->stub[2], 0) - << "incorrect value for stub[2], expected 0, is " << last_msg_->stub[2]; - EXPECT_EQ(last_msg_->stub[3], 0) - << "incorrect value for stub[3], expected 0, is " << last_msg_->stub[3]; - EXPECT_EQ(last_msg_->stub[4], 3) - << "incorrect value for stub[4], expected 3, is " << last_msg_->stub[4]; - EXPECT_EQ(last_msg_->stub[5], 0) - << "incorrect value for stub[5], expected 0, is " << last_msg_->stub[5]; - EXPECT_EQ(last_msg_->stub[6], 1) - << "incorrect value for stub[6], expected 1, is " << last_msg_->stub[6]; - EXPECT_EQ(last_msg_->stub[7], 2) - << "incorrect value for stub[7], expected 2, is " << last_msg_->stub[7]; - EXPECT_EQ(last_msg_->stub[8], 3) - << "incorrect value for stub[8], expected 3, is " << last_msg_->stub[8]; - EXPECT_EQ(last_msg_->stub[9], 4) - << "incorrect value for stub[9], expected 4, is " << last_msg_->stub[9]; - EXPECT_EQ(last_msg_->stub[10], 0) - << "incorrect value for stub[10], expected 0, is " << last_msg_->stub[10]; - EXPECT_EQ(last_msg_->stub[11], 5) - << "incorrect value for stub[11], expected 5, is " << last_msg_->stub[11]; - EXPECT_EQ(last_msg_->stub[12], 0) - << "incorrect value for stub[12], expected 0, is " << last_msg_->stub[12]; - EXPECT_EQ(last_msg_->stub[13], 6) - << "incorrect value for stub[13], expected 6, is " << last_msg_->stub[13]; - EXPECT_EQ(last_msg_->stub[14], 3) - << "incorrect value for stub[14], expected 3, is " << last_msg_->stub[14]; - EXPECT_EQ(last_msg_->stub[15], 10) - << "incorrect value for stub[15], expected 10, is " - << last_msg_->stub[15]; - EXPECT_EQ(last_msg_->stub[16], 0) - << "incorrect value for stub[16], expected 0, is " << last_msg_->stub[16]; - EXPECT_EQ(last_msg_->stub[17], 11) - << "incorrect value for stub[17], expected 11, is " - << last_msg_->stub[17]; - EXPECT_EQ(last_msg_->stub[18], 0) - << "incorrect value for stub[18], expected 0, is " << last_msg_->stub[18]; - EXPECT_EQ(last_msg_->stub[19], 12) - << "incorrect value for stub[19], expected 12, is " - << last_msg_->stub[19]; - EXPECT_EQ(last_msg_->stub[20], 0) - << "incorrect value for stub[20], expected 0, is " << last_msg_->stub[20]; + EXPECT_EQ(last_msg_->faulty_points[0], 10) + << "incorrect value for faulty_points[0], expected 10, is " + << last_msg_->faulty_points[0]; + EXPECT_EQ(last_msg_->faulty_points[1], 11) + << "incorrect value for faulty_points[1], expected 11, is " + << last_msg_->faulty_points[1]; + EXPECT_EQ(last_msg_->faulty_points[2], 12) + << "incorrect value for faulty_points[2], expected 12, is " + << last_msg_->faulty_points[2]; + EXPECT_EQ(last_msg_->header.chain_id, 6) + << "incorrect value for header.chain_id, expected 6, is " + << last_msg_->header.chain_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.obs_time.tow, 180) + << "incorrect value for header.obs_time.tow, expected 180, is " + << last_msg_->header.obs_time.tow; + EXPECT_EQ(last_msg_->header.obs_time.wn, 3) + << "incorrect value for header.obs_time.wn, expected 3, is " + << last_msg_->header.obs_time.wn; + EXPECT_EQ(last_msg_->header.seq_num, 2) + << "incorrect value for header.seq_num, expected 2, is " + << last_msg_->header.seq_num; + EXPECT_EQ(last_msg_->header.ssr_sol_id, 3) + << "incorrect value for header.ssr_sol_id, expected 3, is " + << last_msg_->header.ssr_sol_id; + EXPECT_EQ(last_msg_->header.tile_id, 5) + << "incorrect value for header.tile_id, expected 5, is " + << last_msg_->header.tile_id; + EXPECT_EQ(last_msg_->header.tile_set_id, 4) + << "incorrect value for header.tile_set_id, expected 4, is " + << last_msg_->header.tile_set_id; + EXPECT_EQ(last_msg_->n_faulty_points, 3) + << "incorrect value for n_faulty_points, expected 3, is " + << last_msg_->n_faulty_points; } diff --git a/c/test/legacy/cpp/auto_check_sbp_navigation_MsgReferenceFrameParam.cc b/c/test/legacy/cpp/auto_check_sbp_navigation_MsgReferenceFrameParam.cc index 38d6bd8534..83582b4e87 100644 --- a/c/test/legacy/cpp/auto_check_sbp_navigation_MsgReferenceFrameParam.cc +++ b/c/test/legacy/cpp/auto_check_sbp_navigation_MsgReferenceFrameParam.cc @@ -79,14 +79,14 @@ class Test_legacy_auto_check_sbp_navigation_MsgReferenceFrameParam0 TEST_F(Test_legacy_auto_check_sbp_navigation_MsgReferenceFrameParam0, Test) { uint8_t encoded_frame[] = { - 85, 68, 2, 66, 0, 124, 1, 2, 102, 111, 111, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 5, 0, 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, - 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, - 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, - 0, 18, 0, 0, 0, 19, 0, 0, 0, 20, 0, 66, 126, + 85, 68, 2, 66, 0, 124, 1, 102, 111, 111, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 98, 97, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 5, 0, 6, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, + 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, + 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, + 0, 18, 0, 0, 0, 19, 0, 0, 0, 20, 0, 6, 161, }; uint8_t test_msg_storage[SBP_MAX_PAYLOAD_LEN]{}; @@ -94,626 +94,48 @@ TEST_F(Test_legacy_auto_check_sbp_navigation_MsgReferenceFrameParam0, Test) { msg_reference_frame_param_t *test_msg = (msg_reference_frame_param_t *)test_msg_storage; test_msg_len = (uint8_t)sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[0] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[1] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[2] = 102; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[3] = 111; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[4] = 111; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[6] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[7] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[8] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[9] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[10] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[11] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[12] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[13] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[14] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[15] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[16] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[17] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[18] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[19] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[20] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[21] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[22] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[23] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[24] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[25] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[26] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[27] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[28] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[29] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[30] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[31] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[32] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[33] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[34] = 98; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[35] = 97; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[36] = 114; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[37] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[38] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[39] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[40] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[41] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[42] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[43] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[44] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[45] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[46] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[47] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[48] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[49] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[50] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[51] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[52] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[53] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[54] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[55] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[56] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[57] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[58] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[59] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[60] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[61] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[62] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[63] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[64] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[65] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[66] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[67] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[68] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[69] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[70] = 7; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[71] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[72] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[73] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[74] = 8; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[75] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[76] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[77] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[78] = 9; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[79] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[80] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[81] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[82] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[83] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[84] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[85] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[86] = 11; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[87] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[88] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[89] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[90] = 12; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[91] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[92] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[93] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[94] = 13; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[95] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[96] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[97] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[98] = 14; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[99] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[100] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[101] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[102] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[103] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[104] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[105] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[106] = 16; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[107] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[108] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[109] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[110] = 17; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[111] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[112] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[113] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[114] = 18; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[115] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[116] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[117] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[118] = 19; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[119] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[120] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[121] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[122] = 20; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[123] = 0; + test_msg->delta_X0 = 7; + test_msg->delta_Y0 = 8; + test_msg->delta_Z0 = 9; + test_msg->dot_delta_X0 = 14; + test_msg->dot_delta_Y0 = 15; + test_msg->dot_delta_Z0 = 16; + test_msg->dot_scale = 20; + test_msg->dot_theta_01 = 17; + test_msg->dot_theta_02 = 18; + test_msg->dot_theta_03 = 19; + test_msg->re_t0 = 6; + test_msg->scale = 13; + test_msg->sin = 4; + { + const char assign_string[] = { + (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0}; + memcpy(test_msg->sn, assign_string, sizeof(assign_string)); + if (sizeof(test_msg->sn) == 0) { + test_msg_len = (uint8_t)(test_msg_len + sizeof(assign_string)); + } + } + test_msg->ssr_iod = 1; + test_msg->theta_01 = 10; + test_msg->theta_02 = 11; + test_msg->theta_03 = 12; + { + const char assign_string[] = { + (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0}; + memcpy(test_msg->tn, assign_string, sizeof(assign_string)); + if (sizeof(test_msg->tn) == 0) { + test_msg_len = (uint8_t)(test_msg_len + sizeof(assign_string)); + } + } + test_msg->utn = 5; EXPECT_EQ(send_message(580, 66, test_msg_len, test_msg_storage), SBP_OK); @@ -727,284 +149,72 @@ TEST_F(Test_legacy_auto_check_sbp_navigation_MsgReferenceFrameParam0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_len_, test_msg_len); - EXPECT_EQ(last_msg_->stub[0], 1) - << "incorrect value for stub[0], expected 1, is " << last_msg_->stub[0]; - EXPECT_EQ(last_msg_->stub[1], 2) - << "incorrect value for stub[1], expected 2, is " << last_msg_->stub[1]; - EXPECT_EQ(last_msg_->stub[2], 102) - << "incorrect value for stub[2], expected 102, is " << last_msg_->stub[2]; - EXPECT_EQ(last_msg_->stub[3], 111) - << "incorrect value for stub[3], expected 111, is " << last_msg_->stub[3]; - EXPECT_EQ(last_msg_->stub[4], 111) - << "incorrect value for stub[4], expected 111, is " << last_msg_->stub[4]; - EXPECT_EQ(last_msg_->stub[5], 0) - << "incorrect value for stub[5], expected 0, is " << last_msg_->stub[5]; - EXPECT_EQ(last_msg_->stub[6], 0) - << "incorrect value for stub[6], expected 0, is " << last_msg_->stub[6]; - EXPECT_EQ(last_msg_->stub[7], 0) - << "incorrect value for stub[7], expected 0, is " << last_msg_->stub[7]; - EXPECT_EQ(last_msg_->stub[8], 0) - << "incorrect value for stub[8], expected 0, is " << last_msg_->stub[8]; - EXPECT_EQ(last_msg_->stub[9], 0) - << "incorrect value for stub[9], expected 0, is " << last_msg_->stub[9]; - EXPECT_EQ(last_msg_->stub[10], 0) - << "incorrect value for stub[10], expected 0, is " << last_msg_->stub[10]; - EXPECT_EQ(last_msg_->stub[11], 0) - << "incorrect value for stub[11], expected 0, is " << last_msg_->stub[11]; - EXPECT_EQ(last_msg_->stub[12], 0) - << "incorrect value for stub[12], expected 0, is " << last_msg_->stub[12]; - EXPECT_EQ(last_msg_->stub[13], 0) - << "incorrect value for stub[13], expected 0, is " << last_msg_->stub[13]; - EXPECT_EQ(last_msg_->stub[14], 0) - << "incorrect value for stub[14], expected 0, is " << last_msg_->stub[14]; - EXPECT_EQ(last_msg_->stub[15], 0) - << "incorrect value for stub[15], expected 0, is " << last_msg_->stub[15]; - EXPECT_EQ(last_msg_->stub[16], 0) - << "incorrect value for stub[16], expected 0, is " << last_msg_->stub[16]; - EXPECT_EQ(last_msg_->stub[17], 0) - << "incorrect value for stub[17], expected 0, is " << last_msg_->stub[17]; - EXPECT_EQ(last_msg_->stub[18], 0) - << "incorrect value for stub[18], expected 0, is " << last_msg_->stub[18]; - EXPECT_EQ(last_msg_->stub[19], 0) - << "incorrect value for stub[19], expected 0, is " << last_msg_->stub[19]; - EXPECT_EQ(last_msg_->stub[20], 0) - << "incorrect value for stub[20], expected 0, is " << last_msg_->stub[20]; - EXPECT_EQ(last_msg_->stub[21], 0) - << "incorrect value for stub[21], expected 0, is " << last_msg_->stub[21]; - EXPECT_EQ(last_msg_->stub[22], 0) - << "incorrect value for stub[22], expected 0, is " << last_msg_->stub[22]; - EXPECT_EQ(last_msg_->stub[23], 0) - << "incorrect value for stub[23], expected 0, is " << last_msg_->stub[23]; - EXPECT_EQ(last_msg_->stub[24], 0) - << "incorrect value for stub[24], expected 0, is " << last_msg_->stub[24]; - EXPECT_EQ(last_msg_->stub[25], 0) - << "incorrect value for stub[25], expected 0, is " << last_msg_->stub[25]; - EXPECT_EQ(last_msg_->stub[26], 0) - << "incorrect value for stub[26], expected 0, is " << last_msg_->stub[26]; - EXPECT_EQ(last_msg_->stub[27], 0) - << "incorrect value for stub[27], expected 0, is " << last_msg_->stub[27]; - EXPECT_EQ(last_msg_->stub[28], 0) - << "incorrect value for stub[28], expected 0, is " << last_msg_->stub[28]; - EXPECT_EQ(last_msg_->stub[29], 0) - << "incorrect value for stub[29], expected 0, is " << last_msg_->stub[29]; - EXPECT_EQ(last_msg_->stub[30], 0) - << "incorrect value for stub[30], expected 0, is " << last_msg_->stub[30]; - EXPECT_EQ(last_msg_->stub[31], 0) - << "incorrect value for stub[31], expected 0, is " << last_msg_->stub[31]; - EXPECT_EQ(last_msg_->stub[32], 0) - << "incorrect value for stub[32], expected 0, is " << last_msg_->stub[32]; - EXPECT_EQ(last_msg_->stub[33], 3) - << "incorrect value for stub[33], expected 3, is " << last_msg_->stub[33]; - EXPECT_EQ(last_msg_->stub[34], 98) - << "incorrect value for stub[34], expected 98, is " - << last_msg_->stub[34]; - EXPECT_EQ(last_msg_->stub[35], 97) - << "incorrect value for stub[35], expected 97, is " - << last_msg_->stub[35]; - EXPECT_EQ(last_msg_->stub[36], 114) - << "incorrect value for stub[36], expected 114, is " - << last_msg_->stub[36]; - EXPECT_EQ(last_msg_->stub[37], 0) - << "incorrect value for stub[37], expected 0, is " << last_msg_->stub[37]; - EXPECT_EQ(last_msg_->stub[38], 0) - << "incorrect value for stub[38], expected 0, is " << last_msg_->stub[38]; - EXPECT_EQ(last_msg_->stub[39], 0) - << "incorrect value for stub[39], expected 0, is " << last_msg_->stub[39]; - EXPECT_EQ(last_msg_->stub[40], 0) - << "incorrect value for stub[40], expected 0, is " << last_msg_->stub[40]; - EXPECT_EQ(last_msg_->stub[41], 0) - << "incorrect value for stub[41], expected 0, is " << last_msg_->stub[41]; - EXPECT_EQ(last_msg_->stub[42], 0) - << "incorrect value for stub[42], expected 0, is " << last_msg_->stub[42]; - EXPECT_EQ(last_msg_->stub[43], 0) - << "incorrect value for stub[43], expected 0, is " << last_msg_->stub[43]; - EXPECT_EQ(last_msg_->stub[44], 0) - << "incorrect value for stub[44], expected 0, is " << last_msg_->stub[44]; - EXPECT_EQ(last_msg_->stub[45], 0) - << "incorrect value for stub[45], expected 0, is " << last_msg_->stub[45]; - EXPECT_EQ(last_msg_->stub[46], 0) - << "incorrect value for stub[46], expected 0, is " << last_msg_->stub[46]; - EXPECT_EQ(last_msg_->stub[47], 0) - << "incorrect value for stub[47], expected 0, is " << last_msg_->stub[47]; - EXPECT_EQ(last_msg_->stub[48], 0) - << "incorrect value for stub[48], expected 0, is " << last_msg_->stub[48]; - EXPECT_EQ(last_msg_->stub[49], 0) - << "incorrect value for stub[49], expected 0, is " << last_msg_->stub[49]; - EXPECT_EQ(last_msg_->stub[50], 0) - << "incorrect value for stub[50], expected 0, is " << last_msg_->stub[50]; - EXPECT_EQ(last_msg_->stub[51], 0) - << "incorrect value for stub[51], expected 0, is " << last_msg_->stub[51]; - EXPECT_EQ(last_msg_->stub[52], 0) - << "incorrect value for stub[52], expected 0, is " << last_msg_->stub[52]; - EXPECT_EQ(last_msg_->stub[53], 0) - << "incorrect value for stub[53], expected 0, is " << last_msg_->stub[53]; - EXPECT_EQ(last_msg_->stub[54], 0) - << "incorrect value for stub[54], expected 0, is " << last_msg_->stub[54]; - EXPECT_EQ(last_msg_->stub[55], 0) - << "incorrect value for stub[55], expected 0, is " << last_msg_->stub[55]; - EXPECT_EQ(last_msg_->stub[56], 0) - << "incorrect value for stub[56], expected 0, is " << last_msg_->stub[56]; - EXPECT_EQ(last_msg_->stub[57], 0) - << "incorrect value for stub[57], expected 0, is " << last_msg_->stub[57]; - EXPECT_EQ(last_msg_->stub[58], 0) - << "incorrect value for stub[58], expected 0, is " << last_msg_->stub[58]; - EXPECT_EQ(last_msg_->stub[59], 0) - << "incorrect value for stub[59], expected 0, is " << last_msg_->stub[59]; - EXPECT_EQ(last_msg_->stub[60], 0) - << "incorrect value for stub[60], expected 0, is " << last_msg_->stub[60]; - EXPECT_EQ(last_msg_->stub[61], 0) - << "incorrect value for stub[61], expected 0, is " << last_msg_->stub[61]; - EXPECT_EQ(last_msg_->stub[62], 0) - << "incorrect value for stub[62], expected 0, is " << last_msg_->stub[62]; - EXPECT_EQ(last_msg_->stub[63], 0) - << "incorrect value for stub[63], expected 0, is " << last_msg_->stub[63]; - EXPECT_EQ(last_msg_->stub[64], 0) - << "incorrect value for stub[64], expected 0, is " << last_msg_->stub[64]; - EXPECT_EQ(last_msg_->stub[65], 4) - << "incorrect value for stub[65], expected 4, is " << last_msg_->stub[65]; - EXPECT_EQ(last_msg_->stub[66], 5) - << "incorrect value for stub[66], expected 5, is " << last_msg_->stub[66]; - EXPECT_EQ(last_msg_->stub[67], 0) - << "incorrect value for stub[67], expected 0, is " << last_msg_->stub[67]; - EXPECT_EQ(last_msg_->stub[68], 6) - << "incorrect value for stub[68], expected 6, is " << last_msg_->stub[68]; - EXPECT_EQ(last_msg_->stub[69], 0) - << "incorrect value for stub[69], expected 0, is " << last_msg_->stub[69]; - EXPECT_EQ(last_msg_->stub[70], 7) - << "incorrect value for stub[70], expected 7, is " << last_msg_->stub[70]; - EXPECT_EQ(last_msg_->stub[71], 0) - << "incorrect value for stub[71], expected 0, is " << last_msg_->stub[71]; - EXPECT_EQ(last_msg_->stub[72], 0) - << "incorrect value for stub[72], expected 0, is " << last_msg_->stub[72]; - EXPECT_EQ(last_msg_->stub[73], 0) - << "incorrect value for stub[73], expected 0, is " << last_msg_->stub[73]; - EXPECT_EQ(last_msg_->stub[74], 8) - << "incorrect value for stub[74], expected 8, is " << last_msg_->stub[74]; - EXPECT_EQ(last_msg_->stub[75], 0) - << "incorrect value for stub[75], expected 0, is " << last_msg_->stub[75]; - EXPECT_EQ(last_msg_->stub[76], 0) - << "incorrect value for stub[76], expected 0, is " << last_msg_->stub[76]; - EXPECT_EQ(last_msg_->stub[77], 0) - << "incorrect value for stub[77], expected 0, is " << last_msg_->stub[77]; - EXPECT_EQ(last_msg_->stub[78], 9) - << "incorrect value for stub[78], expected 9, is " << last_msg_->stub[78]; - EXPECT_EQ(last_msg_->stub[79], 0) - << "incorrect value for stub[79], expected 0, is " << last_msg_->stub[79]; - EXPECT_EQ(last_msg_->stub[80], 0) - << "incorrect value for stub[80], expected 0, is " << last_msg_->stub[80]; - EXPECT_EQ(last_msg_->stub[81], 0) - << "incorrect value for stub[81], expected 0, is " << last_msg_->stub[81]; - EXPECT_EQ(last_msg_->stub[82], 10) - << "incorrect value for stub[82], expected 10, is " - << last_msg_->stub[82]; - EXPECT_EQ(last_msg_->stub[83], 0) - << "incorrect value for stub[83], expected 0, is " << last_msg_->stub[83]; - EXPECT_EQ(last_msg_->stub[84], 0) - << "incorrect value for stub[84], expected 0, is " << last_msg_->stub[84]; - EXPECT_EQ(last_msg_->stub[85], 0) - << "incorrect value for stub[85], expected 0, is " << last_msg_->stub[85]; - EXPECT_EQ(last_msg_->stub[86], 11) - << "incorrect value for stub[86], expected 11, is " - << last_msg_->stub[86]; - EXPECT_EQ(last_msg_->stub[87], 0) - << "incorrect value for stub[87], expected 0, is " << last_msg_->stub[87]; - EXPECT_EQ(last_msg_->stub[88], 0) - << "incorrect value for stub[88], expected 0, is " << last_msg_->stub[88]; - EXPECT_EQ(last_msg_->stub[89], 0) - << "incorrect value for stub[89], expected 0, is " << last_msg_->stub[89]; - EXPECT_EQ(last_msg_->stub[90], 12) - << "incorrect value for stub[90], expected 12, is " - << last_msg_->stub[90]; - EXPECT_EQ(last_msg_->stub[91], 0) - << "incorrect value for stub[91], expected 0, is " << last_msg_->stub[91]; - EXPECT_EQ(last_msg_->stub[92], 0) - << "incorrect value for stub[92], expected 0, is " << last_msg_->stub[92]; - EXPECT_EQ(last_msg_->stub[93], 0) - << "incorrect value for stub[93], expected 0, is " << last_msg_->stub[93]; - EXPECT_EQ(last_msg_->stub[94], 13) - << "incorrect value for stub[94], expected 13, is " - << last_msg_->stub[94]; - EXPECT_EQ(last_msg_->stub[95], 0) - << "incorrect value for stub[95], expected 0, is " << last_msg_->stub[95]; - EXPECT_EQ(last_msg_->stub[96], 0) - << "incorrect value for stub[96], expected 0, is " << last_msg_->stub[96]; - EXPECT_EQ(last_msg_->stub[97], 0) - << "incorrect value for stub[97], expected 0, is " << last_msg_->stub[97]; - EXPECT_EQ(last_msg_->stub[98], 14) - << "incorrect value for stub[98], expected 14, is " - << last_msg_->stub[98]; - EXPECT_EQ(last_msg_->stub[99], 0) - << "incorrect value for stub[99], expected 0, is " << last_msg_->stub[99]; - EXPECT_EQ(last_msg_->stub[100], 0) - << "incorrect value for stub[100], expected 0, is " - << last_msg_->stub[100]; - EXPECT_EQ(last_msg_->stub[101], 0) - << "incorrect value for stub[101], expected 0, is " - << last_msg_->stub[101]; - EXPECT_EQ(last_msg_->stub[102], 15) - << "incorrect value for stub[102], expected 15, is " - << last_msg_->stub[102]; - EXPECT_EQ(last_msg_->stub[103], 0) - << "incorrect value for stub[103], expected 0, is " - << last_msg_->stub[103]; - EXPECT_EQ(last_msg_->stub[104], 0) - << "incorrect value for stub[104], expected 0, is " - << last_msg_->stub[104]; - EXPECT_EQ(last_msg_->stub[105], 0) - << "incorrect value for stub[105], expected 0, is " - << last_msg_->stub[105]; - EXPECT_EQ(last_msg_->stub[106], 16) - << "incorrect value for stub[106], expected 16, is " - << last_msg_->stub[106]; - EXPECT_EQ(last_msg_->stub[107], 0) - << "incorrect value for stub[107], expected 0, is " - << last_msg_->stub[107]; - EXPECT_EQ(last_msg_->stub[108], 0) - << "incorrect value for stub[108], expected 0, is " - << last_msg_->stub[108]; - EXPECT_EQ(last_msg_->stub[109], 0) - << "incorrect value for stub[109], expected 0, is " - << last_msg_->stub[109]; - EXPECT_EQ(last_msg_->stub[110], 17) - << "incorrect value for stub[110], expected 17, is " - << last_msg_->stub[110]; - EXPECT_EQ(last_msg_->stub[111], 0) - << "incorrect value for stub[111], expected 0, is " - << last_msg_->stub[111]; - EXPECT_EQ(last_msg_->stub[112], 0) - << "incorrect value for stub[112], expected 0, is " - << last_msg_->stub[112]; - EXPECT_EQ(last_msg_->stub[113], 0) - << "incorrect value for stub[113], expected 0, is " - << last_msg_->stub[113]; - EXPECT_EQ(last_msg_->stub[114], 18) - << "incorrect value for stub[114], expected 18, is " - << last_msg_->stub[114]; - EXPECT_EQ(last_msg_->stub[115], 0) - << "incorrect value for stub[115], expected 0, is " - << last_msg_->stub[115]; - EXPECT_EQ(last_msg_->stub[116], 0) - << "incorrect value for stub[116], expected 0, is " - << last_msg_->stub[116]; - EXPECT_EQ(last_msg_->stub[117], 0) - << "incorrect value for stub[117], expected 0, is " - << last_msg_->stub[117]; - EXPECT_EQ(last_msg_->stub[118], 19) - << "incorrect value for stub[118], expected 19, is " - << last_msg_->stub[118]; - EXPECT_EQ(last_msg_->stub[119], 0) - << "incorrect value for stub[119], expected 0, is " - << last_msg_->stub[119]; - EXPECT_EQ(last_msg_->stub[120], 0) - << "incorrect value for stub[120], expected 0, is " - << last_msg_->stub[120]; - EXPECT_EQ(last_msg_->stub[121], 0) - << "incorrect value for stub[121], expected 0, is " - << last_msg_->stub[121]; - EXPECT_EQ(last_msg_->stub[122], 20) - << "incorrect value for stub[122], expected 20, is " - << last_msg_->stub[122]; - EXPECT_EQ(last_msg_->stub[123], 0) - << "incorrect value for stub[123], expected 0, is " - << last_msg_->stub[123]; + EXPECT_EQ(last_msg_->delta_X0, 7) + << "incorrect value for delta_X0, expected 7, is " << last_msg_->delta_X0; + EXPECT_EQ(last_msg_->delta_Y0, 8) + << "incorrect value for delta_Y0, expected 8, is " << last_msg_->delta_Y0; + EXPECT_EQ(last_msg_->delta_Z0, 9) + << "incorrect value for delta_Z0, expected 9, is " << last_msg_->delta_Z0; + EXPECT_EQ(last_msg_->dot_delta_X0, 14) + << "incorrect value for dot_delta_X0, expected 14, is " + << last_msg_->dot_delta_X0; + EXPECT_EQ(last_msg_->dot_delta_Y0, 15) + << "incorrect value for dot_delta_Y0, expected 15, is " + << last_msg_->dot_delta_Y0; + EXPECT_EQ(last_msg_->dot_delta_Z0, 16) + << "incorrect value for dot_delta_Z0, expected 16, is " + << last_msg_->dot_delta_Z0; + EXPECT_EQ(last_msg_->dot_scale, 20) + << "incorrect value for dot_scale, expected 20, is " + << last_msg_->dot_scale; + EXPECT_EQ(last_msg_->dot_theta_01, 17) + << "incorrect value for dot_theta_01, expected 17, is " + << last_msg_->dot_theta_01; + EXPECT_EQ(last_msg_->dot_theta_02, 18) + << "incorrect value for dot_theta_02, expected 18, is " + << last_msg_->dot_theta_02; + EXPECT_EQ(last_msg_->dot_theta_03, 19) + << "incorrect value for dot_theta_03, expected 19, is " + << last_msg_->dot_theta_03; + EXPECT_EQ(last_msg_->re_t0, 6) + << "incorrect value for re_t0, expected 6, is " << last_msg_->re_t0; + EXPECT_EQ(last_msg_->scale, 13) + << "incorrect value for scale, expected 13, is " << last_msg_->scale; + EXPECT_EQ(last_msg_->sin, 4) + << "incorrect value for sin, expected 4, is " << last_msg_->sin; + { + const char check_string[] = { + (char)102, (char)111, (char)111, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0}; + EXPECT_EQ(memcmp(last_msg_->sn, check_string, sizeof(check_string)), 0) + << "incorrect value for last_msg_->sn, expected string '" + << check_string << "', is '" << last_msg_->sn << "'"; + } + EXPECT_EQ(last_msg_->ssr_iod, 1) + << "incorrect value for ssr_iod, expected 1, is " << last_msg_->ssr_iod; + EXPECT_EQ(last_msg_->theta_01, 10) + << "incorrect value for theta_01, expected 10, is " + << last_msg_->theta_01; + EXPECT_EQ(last_msg_->theta_02, 11) + << "incorrect value for theta_02, expected 11, is " + << last_msg_->theta_02; + EXPECT_EQ(last_msg_->theta_03, 12) + << "incorrect value for theta_03, expected 12, is " + << last_msg_->theta_03; + { + const char check_string[] = { + (char)98, (char)97, (char)114, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, + (char)0, (char)0, (char)0, (char)0}; + EXPECT_EQ(memcmp(last_msg_->tn, check_string, sizeof(check_string)), 0) + << "incorrect value for last_msg_->tn, expected string '" + << check_string << "', is '" << last_msg_->tn << "'"; + } + EXPECT_EQ(last_msg_->utn, 5) + << "incorrect value for utn, expected 5, is " << last_msg_->utn; } diff --git a/c/test/legacy/cpp/auto_check_sbp_navigation_MsgUTCLeapSecond.cc b/c/test/legacy/cpp/auto_check_sbp_navigation_MsgUTCLeapSecond.cc index 7cc5b10c46..73a846d9d1 100644 --- a/c/test/legacy/cpp/auto_check_sbp_navigation_MsgUTCLeapSecond.cc +++ b/c/test/legacy/cpp/auto_check_sbp_navigation_MsgUTCLeapSecond.cc @@ -85,76 +85,15 @@ TEST_F(Test_legacy_auto_check_sbp_navigation_MsgUTCLeapSecond0, Test) { uint8_t test_msg_len = 0; msg_utc_leap_second_t *test_msg = (msg_utc_leap_second_t *)test_msg_storage; test_msg_len = (uint8_t)sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[0] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[2] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[5] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[6] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[7] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[8] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[9] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[10] = 7; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[11] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[12] = 8; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[13] = 9; + test_msg->bias_coeff = 1; + test_msg->count_after = 9; + test_msg->count_before = 4; + test_msg->drift_coeff = 2; + test_msg->drift_rate_coeff = 3; + test_msg->ref_dn = 8; + test_msg->ref_wn = 7; + test_msg->tow_s = 5; + test_msg->wn = 6; EXPECT_EQ(send_message(570, 66, test_msg_len, test_msg_storage), SBP_OK); @@ -168,32 +107,27 @@ TEST_F(Test_legacy_auto_check_sbp_navigation_MsgUTCLeapSecond0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_len_, test_msg_len); - EXPECT_EQ(last_msg_->stub[0], 1) - << "incorrect value for stub[0], expected 1, is " << last_msg_->stub[0]; - EXPECT_EQ(last_msg_->stub[1], 0) - << "incorrect value for stub[1], expected 0, is " << last_msg_->stub[1]; - EXPECT_EQ(last_msg_->stub[2], 2) - << "incorrect value for stub[2], expected 2, is " << last_msg_->stub[2]; - EXPECT_EQ(last_msg_->stub[3], 0) - << "incorrect value for stub[3], expected 0, is " << last_msg_->stub[3]; - EXPECT_EQ(last_msg_->stub[4], 3) - << "incorrect value for stub[4], expected 3, is " << last_msg_->stub[4]; - EXPECT_EQ(last_msg_->stub[5], 4) - << "incorrect value for stub[5], expected 4, is " << last_msg_->stub[5]; - EXPECT_EQ(last_msg_->stub[6], 5) - << "incorrect value for stub[6], expected 5, is " << last_msg_->stub[6]; - EXPECT_EQ(last_msg_->stub[7], 0) - << "incorrect value for stub[7], expected 0, is " << last_msg_->stub[7]; - EXPECT_EQ(last_msg_->stub[8], 6) - << "incorrect value for stub[8], expected 6, is " << last_msg_->stub[8]; - EXPECT_EQ(last_msg_->stub[9], 0) - << "incorrect value for stub[9], expected 0, is " << last_msg_->stub[9]; - EXPECT_EQ(last_msg_->stub[10], 7) - << "incorrect value for stub[10], expected 7, is " << last_msg_->stub[10]; - EXPECT_EQ(last_msg_->stub[11], 0) - << "incorrect value for stub[11], expected 0, is " << last_msg_->stub[11]; - EXPECT_EQ(last_msg_->stub[12], 8) - << "incorrect value for stub[12], expected 8, is " << last_msg_->stub[12]; - EXPECT_EQ(last_msg_->stub[13], 9) - << "incorrect value for stub[13], expected 9, is " << last_msg_->stub[13]; + EXPECT_EQ(last_msg_->bias_coeff, 1) + << "incorrect value for bias_coeff, expected 1, is " + << last_msg_->bias_coeff; + EXPECT_EQ(last_msg_->count_after, 9) + << "incorrect value for count_after, expected 9, is " + << last_msg_->count_after; + EXPECT_EQ(last_msg_->count_before, 4) + << "incorrect value for count_before, expected 4, is " + << last_msg_->count_before; + EXPECT_EQ(last_msg_->drift_coeff, 2) + << "incorrect value for drift_coeff, expected 2, is " + << last_msg_->drift_coeff; + EXPECT_EQ(last_msg_->drift_rate_coeff, 3) + << "incorrect value for drift_rate_coeff, expected 3, is " + << last_msg_->drift_rate_coeff; + EXPECT_EQ(last_msg_->ref_dn, 8) + << "incorrect value for ref_dn, expected 8, is " << last_msg_->ref_dn; + EXPECT_EQ(last_msg_->ref_wn, 7) + << "incorrect value for ref_wn, expected 7, is " << last_msg_->ref_wn; + EXPECT_EQ(last_msg_->tow_s, 5) + << "incorrect value for tow_s, expected 5, is " << last_msg_->tow_s; + EXPECT_EQ(last_msg_->wn, 6) + << "incorrect value for wn, expected 6, is " << last_msg_->wn; } diff --git a/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds.cc b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds.cc index e7493d3cd3..8a78dc6d5c 100644 --- a/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds.cc +++ b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds.cc @@ -88,161 +88,48 @@ TEST_F(Test_legacy_auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds0, Test) { msg_ssr_code_phase_biases_bounds_t *test_msg = (msg_ssr_code_phase_biases_bounds_t *)test_msg_storage; test_msg_len = (uint8_t)sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[7] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[8] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[9] = 14; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[10] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[11] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[12] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[13] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[14] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[15] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[16] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[17] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[18] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[19] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[20] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[21] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[22] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[23] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[24] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[25] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[26] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[27] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[28] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[29] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[30] = 1; + test_msg->const_id = 1; + test_msg->header.num_msgs = 1; + test_msg->header.seq_num = 2; + test_msg->header.sol_id = 14; + test_msg->header.time.tow = 180; + test_msg->header.time.wn = 3; + test_msg->header.update_interval = 1; + test_msg->n_sats_signals = 3; + if (sizeof(test_msg->satellites_signals) == 0) { + // Cope with variable length arrays + test_msg_len = + (uint8_t)(test_msg_len + sizeof(test_msg->satellites_signals[0])); + } + test_msg->satellites_signals[0].code_bias_bound_mu = 39; + test_msg->satellites_signals[0].code_bias_bound_sig = 1; + test_msg->satellites_signals[0].phase_bias_bound_mu = 39; + test_msg->satellites_signals[0].phase_bias_bound_sig = 1; + test_msg->satellites_signals[0].sat_id = 0; + test_msg->satellites_signals[0].signal_id = 3; + if (sizeof(test_msg->satellites_signals) == 0) { + // Cope with variable length arrays + test_msg_len = + (uint8_t)(test_msg_len + sizeof(test_msg->satellites_signals[0])); + } + test_msg->satellites_signals[1].code_bias_bound_mu = 39; + test_msg->satellites_signals[1].code_bias_bound_sig = 1; + test_msg->satellites_signals[1].phase_bias_bound_mu = 39; + test_msg->satellites_signals[1].phase_bias_bound_sig = 1; + test_msg->satellites_signals[1].sat_id = 1; + test_msg->satellites_signals[1].signal_id = 3; + if (sizeof(test_msg->satellites_signals) == 0) { + // Cope with variable length arrays + test_msg_len = + (uint8_t)(test_msg_len + sizeof(test_msg->satellites_signals[0])); + } + test_msg->satellites_signals[2].code_bias_bound_mu = 39; + test_msg->satellites_signals[2].code_bias_bound_sig = 1; + test_msg->satellites_signals[2].phase_bias_bound_mu = 39; + test_msg->satellites_signals[2].phase_bias_bound_sig = 1; + test_msg->satellites_signals[2].sat_id = 1; + test_msg->satellites_signals[2].signal_id = 1; + test_msg->ssr_iod = 15; EXPECT_EQ(send_message(1516, 66, test_msg_len, test_msg_storage), SBP_OK); @@ -256,73 +143,95 @@ TEST_F(Test_legacy_auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBounds0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_len_, test_msg_len); - EXPECT_EQ(last_msg_->stub[0], 180) - << "incorrect value for stub[0], expected 180, is " << last_msg_->stub[0]; - EXPECT_EQ(last_msg_->stub[1], 0) - << "incorrect value for stub[1], expected 0, is " << last_msg_->stub[1]; - EXPECT_EQ(last_msg_->stub[2], 0) - << "incorrect value for stub[2], expected 0, is " << last_msg_->stub[2]; - EXPECT_EQ(last_msg_->stub[3], 0) - << "incorrect value for stub[3], expected 0, is " << last_msg_->stub[3]; - EXPECT_EQ(last_msg_->stub[4], 3) - << "incorrect value for stub[4], expected 3, is " << last_msg_->stub[4]; - EXPECT_EQ(last_msg_->stub[5], 0) - << "incorrect value for stub[5], expected 0, is " << last_msg_->stub[5]; - EXPECT_EQ(last_msg_->stub[6], 1) - << "incorrect value for stub[6], expected 1, is " << last_msg_->stub[6]; - EXPECT_EQ(last_msg_->stub[7], 2) - << "incorrect value for stub[7], expected 2, is " << last_msg_->stub[7]; - EXPECT_EQ(last_msg_->stub[8], 1) - << "incorrect value for stub[8], expected 1, is " << last_msg_->stub[8]; - EXPECT_EQ(last_msg_->stub[9], 14) - << "incorrect value for stub[9], expected 14, is " << last_msg_->stub[9]; - EXPECT_EQ(last_msg_->stub[10], 15) - << "incorrect value for stub[10], expected 15, is " - << last_msg_->stub[10]; - EXPECT_EQ(last_msg_->stub[11], 1) - << "incorrect value for stub[11], expected 1, is " << last_msg_->stub[11]; - EXPECT_EQ(last_msg_->stub[12], 3) - << "incorrect value for stub[12], expected 3, is " << last_msg_->stub[12]; - EXPECT_EQ(last_msg_->stub[13], 0) - << "incorrect value for stub[13], expected 0, is " << last_msg_->stub[13]; - EXPECT_EQ(last_msg_->stub[14], 3) - << "incorrect value for stub[14], expected 3, is " << last_msg_->stub[14]; - EXPECT_EQ(last_msg_->stub[15], 39) - << "incorrect value for stub[15], expected 39, is " - << last_msg_->stub[15]; - EXPECT_EQ(last_msg_->stub[16], 1) - << "incorrect value for stub[16], expected 1, is " << last_msg_->stub[16]; - EXPECT_EQ(last_msg_->stub[17], 39) - << "incorrect value for stub[17], expected 39, is " - << last_msg_->stub[17]; - EXPECT_EQ(last_msg_->stub[18], 1) - << "incorrect value for stub[18], expected 1, is " << last_msg_->stub[18]; - EXPECT_EQ(last_msg_->stub[19], 1) - << "incorrect value for stub[19], expected 1, is " << last_msg_->stub[19]; - EXPECT_EQ(last_msg_->stub[20], 3) - << "incorrect value for stub[20], expected 3, is " << last_msg_->stub[20]; - EXPECT_EQ(last_msg_->stub[21], 39) - << "incorrect value for stub[21], expected 39, is " - << last_msg_->stub[21]; - EXPECT_EQ(last_msg_->stub[22], 1) - << "incorrect value for stub[22], expected 1, is " << last_msg_->stub[22]; - EXPECT_EQ(last_msg_->stub[23], 39) - << "incorrect value for stub[23], expected 39, is " - << last_msg_->stub[23]; - EXPECT_EQ(last_msg_->stub[24], 1) - << "incorrect value for stub[24], expected 1, is " << last_msg_->stub[24]; - EXPECT_EQ(last_msg_->stub[25], 1) - << "incorrect value for stub[25], expected 1, is " << last_msg_->stub[25]; - EXPECT_EQ(last_msg_->stub[26], 1) - << "incorrect value for stub[26], expected 1, is " << last_msg_->stub[26]; - EXPECT_EQ(last_msg_->stub[27], 39) - << "incorrect value for stub[27], expected 39, is " - << last_msg_->stub[27]; - EXPECT_EQ(last_msg_->stub[28], 1) - << "incorrect value for stub[28], expected 1, is " << last_msg_->stub[28]; - EXPECT_EQ(last_msg_->stub[29], 39) - << "incorrect value for stub[29], expected 39, is " - << last_msg_->stub[29]; - EXPECT_EQ(last_msg_->stub[30], 1) - << "incorrect value for stub[30], expected 1, is " << last_msg_->stub[30]; + EXPECT_EQ(last_msg_->const_id, 1) + << "incorrect value for const_id, expected 1, is " << last_msg_->const_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, 2) + << "incorrect value for header.seq_num, expected 2, is " + << last_msg_->header.seq_num; + EXPECT_EQ(last_msg_->header.sol_id, 14) + << "incorrect value for header.sol_id, expected 14, 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, 1) + << "incorrect value for header.update_interval, expected 1, is " + << last_msg_->header.update_interval; + EXPECT_EQ(last_msg_->n_sats_signals, 3) + << "incorrect value for n_sats_signals, expected 3, is " + << last_msg_->n_sats_signals; + EXPECT_EQ(last_msg_->satellites_signals[0].code_bias_bound_mu, 39) + << "incorrect value for satellites_signals[0].code_bias_bound_mu, " + "expected 39, is " + << last_msg_->satellites_signals[0].code_bias_bound_mu; + EXPECT_EQ(last_msg_->satellites_signals[0].code_bias_bound_sig, 1) + << "incorrect value for satellites_signals[0].code_bias_bound_sig, " + "expected 1, is " + << last_msg_->satellites_signals[0].code_bias_bound_sig; + EXPECT_EQ(last_msg_->satellites_signals[0].phase_bias_bound_mu, 39) + << "incorrect value for satellites_signals[0].phase_bias_bound_mu, " + "expected 39, is " + << last_msg_->satellites_signals[0].phase_bias_bound_mu; + EXPECT_EQ(last_msg_->satellites_signals[0].phase_bias_bound_sig, 1) + << "incorrect value for satellites_signals[0].phase_bias_bound_sig, " + "expected 1, is " + << last_msg_->satellites_signals[0].phase_bias_bound_sig; + EXPECT_EQ(last_msg_->satellites_signals[0].sat_id, 0) + << "incorrect value for satellites_signals[0].sat_id, expected 0, is " + << last_msg_->satellites_signals[0].sat_id; + EXPECT_EQ(last_msg_->satellites_signals[0].signal_id, 3) + << "incorrect value for satellites_signals[0].signal_id, expected 3, is " + << last_msg_->satellites_signals[0].signal_id; + EXPECT_EQ(last_msg_->satellites_signals[1].code_bias_bound_mu, 39) + << "incorrect value for satellites_signals[1].code_bias_bound_mu, " + "expected 39, is " + << last_msg_->satellites_signals[1].code_bias_bound_mu; + EXPECT_EQ(last_msg_->satellites_signals[1].code_bias_bound_sig, 1) + << "incorrect value for satellites_signals[1].code_bias_bound_sig, " + "expected 1, is " + << last_msg_->satellites_signals[1].code_bias_bound_sig; + EXPECT_EQ(last_msg_->satellites_signals[1].phase_bias_bound_mu, 39) + << "incorrect value for satellites_signals[1].phase_bias_bound_mu, " + "expected 39, is " + << last_msg_->satellites_signals[1].phase_bias_bound_mu; + EXPECT_EQ(last_msg_->satellites_signals[1].phase_bias_bound_sig, 1) + << "incorrect value for satellites_signals[1].phase_bias_bound_sig, " + "expected 1, is " + << last_msg_->satellites_signals[1].phase_bias_bound_sig; + EXPECT_EQ(last_msg_->satellites_signals[1].sat_id, 1) + << "incorrect value for satellites_signals[1].sat_id, expected 1, is " + << last_msg_->satellites_signals[1].sat_id; + EXPECT_EQ(last_msg_->satellites_signals[1].signal_id, 3) + << "incorrect value for satellites_signals[1].signal_id, expected 3, is " + << last_msg_->satellites_signals[1].signal_id; + EXPECT_EQ(last_msg_->satellites_signals[2].code_bias_bound_mu, 39) + << "incorrect value for satellites_signals[2].code_bias_bound_mu, " + "expected 39, is " + << last_msg_->satellites_signals[2].code_bias_bound_mu; + EXPECT_EQ(last_msg_->satellites_signals[2].code_bias_bound_sig, 1) + << "incorrect value for satellites_signals[2].code_bias_bound_sig, " + "expected 1, is " + << last_msg_->satellites_signals[2].code_bias_bound_sig; + EXPECT_EQ(last_msg_->satellites_signals[2].phase_bias_bound_mu, 39) + << "incorrect value for satellites_signals[2].phase_bias_bound_mu, " + "expected 39, is " + << last_msg_->satellites_signals[2].phase_bias_bound_mu; + EXPECT_EQ(last_msg_->satellites_signals[2].phase_bias_bound_sig, 1) + << "incorrect value for satellites_signals[2].phase_bias_bound_sig, " + "expected 1, is " + << last_msg_->satellites_signals[2].phase_bias_bound_sig; + EXPECT_EQ(last_msg_->satellites_signals[2].sat_id, 1) + << "incorrect value for satellites_signals[2].sat_id, expected 1, is " + << last_msg_->satellites_signals[2].sat_id; + EXPECT_EQ(last_msg_->satellites_signals[2].signal_id, 1) + << "incorrect value for satellites_signals[2].signal_id, expected 1, is " + << last_msg_->satellites_signals[2].signal_id; + EXPECT_EQ(last_msg_->ssr_iod, 15) + << "incorrect value for ssr_iod, expected 15, is " << last_msg_->ssr_iod; } diff --git a/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc index 00b96c44a9..3fdd449783 100644 --- a/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc +++ b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds.cc @@ -79,10 +79,10 @@ class Test_legacy_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds0 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, + 85, 254, 5, 66, 0, 45, 180, 0, 0, 0, 3, 0, 1, 1, + 10, 0, 15, 1, 0, 10, 0, 39, 232, 3, 244, 1, 100, 200, + 150, 100, 150, 100, 2, 5, 10, 16, 0, 17, 18, 19, 20, 21, + 6, 10, 22, 0, 23, 24, 25, 26, 27, 119, 82, }; uint8_t test_msg_storage[SBP_MAX_PAYLOAD_LEN]{}; @@ -90,221 +90,49 @@ TEST_F(Test_legacy_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds0, Test) { 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); - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[7] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[8] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[9] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[10] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[11] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[12] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[13] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[14] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[15] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[16] = 232; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[17] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[18] = 244; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[19] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[20] = 100; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[21] = 200; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[22] = 150; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[23] = 100; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[24] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[25] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[26] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[27] = 16; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[28] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[29] = 17; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[30] = 18; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[31] = 19; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[32] = 20; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[33] = 21; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[34] = 6; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[35] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[36] = 22; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[37] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[38] = 23; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[39] = 24; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[40] = 25; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[41] = 26; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[42] = 27; + 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_delay_correction.hydro = 500; + test_msg->tropo_delay_correction.stddev = 200; + test_msg->tropo_delay_correction.wet = 100; + test_msg->tropo_qi = 39; + test_msg->tropo_v_hydro_bound_mu = 150; + test_msg->tropo_v_hydro_bound_sig = 100; + test_msg->tropo_v_wet_bound_mu = 150; + test_msg->tropo_v_wet_bound_sig = 100; EXPECT_EQ(send_message(1534, 66, test_msg_len, test_msg_storage), SBP_OK); @@ -318,113 +146,119 @@ TEST_F(Test_legacy_auto_check_sbp_ssr_MsgSsrGriddedCorrectionBounds0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_len_, test_msg_len); - EXPECT_EQ(last_msg_->stub[0], 180) - << "incorrect value for stub[0], expected 180, is " << last_msg_->stub[0]; - EXPECT_EQ(last_msg_->stub[1], 0) - << "incorrect value for stub[1], expected 0, is " << last_msg_->stub[1]; - EXPECT_EQ(last_msg_->stub[2], 0) - << "incorrect value for stub[2], expected 0, is " << last_msg_->stub[2]; - EXPECT_EQ(last_msg_->stub[3], 0) - << "incorrect value for stub[3], expected 0, is " << last_msg_->stub[3]; - EXPECT_EQ(last_msg_->stub[4], 3) - << "incorrect value for stub[4], expected 3, is " << last_msg_->stub[4]; - EXPECT_EQ(last_msg_->stub[5], 0) - << "incorrect value for stub[5], expected 0, is " << last_msg_->stub[5]; - EXPECT_EQ(last_msg_->stub[6], 1) - << "incorrect value for stub[6], expected 1, is " << last_msg_->stub[6]; - EXPECT_EQ(last_msg_->stub[7], 1) - << "incorrect value for stub[7], expected 1, is " << last_msg_->stub[7]; - EXPECT_EQ(last_msg_->stub[8], 10) - << "incorrect value for stub[8], expected 10, is " << last_msg_->stub[8]; - EXPECT_EQ(last_msg_->stub[9], 0) - << "incorrect value for stub[9], expected 0, is " << last_msg_->stub[9]; - EXPECT_EQ(last_msg_->stub[10], 15) - << "incorrect value for stub[10], expected 15, is " - << last_msg_->stub[10]; - EXPECT_EQ(last_msg_->stub[11], 1) - << "incorrect value for stub[11], expected 1, is " << last_msg_->stub[11]; - EXPECT_EQ(last_msg_->stub[12], 0) - << "incorrect value for stub[12], expected 0, is " << last_msg_->stub[12]; - EXPECT_EQ(last_msg_->stub[13], 10) - << "incorrect value for stub[13], expected 10, is " - << last_msg_->stub[13]; - EXPECT_EQ(last_msg_->stub[14], 0) - << "incorrect value for stub[14], expected 0, is " << last_msg_->stub[14]; - EXPECT_EQ(last_msg_->stub[15], 39) - << "incorrect value for stub[15], expected 39, is " - << last_msg_->stub[15]; - EXPECT_EQ(last_msg_->stub[16], 232) - << "incorrect value for stub[16], expected 232, is " - << last_msg_->stub[16]; - EXPECT_EQ(last_msg_->stub[17], 3) - << "incorrect value for stub[17], expected 3, is " << last_msg_->stub[17]; - EXPECT_EQ(last_msg_->stub[18], 244) - << "incorrect value for stub[18], expected 244, is " - << last_msg_->stub[18]; - EXPECT_EQ(last_msg_->stub[19], 1) - << "incorrect value for stub[19], expected 1, is " << last_msg_->stub[19]; - EXPECT_EQ(last_msg_->stub[20], 100) - << "incorrect value for stub[20], expected 100, is " - << last_msg_->stub[20]; - EXPECT_EQ(last_msg_->stub[21], 200) - << "incorrect value for stub[21], expected 200, is " - << last_msg_->stub[21]; - EXPECT_EQ(last_msg_->stub[22], 150) - << "incorrect value for stub[22], expected 150, is " - << last_msg_->stub[22]; - EXPECT_EQ(last_msg_->stub[23], 100) - << "incorrect value for stub[23], expected 100, is " - << last_msg_->stub[23]; - EXPECT_EQ(last_msg_->stub[24], 2) - << "incorrect value for stub[24], expected 2, is " << last_msg_->stub[24]; - EXPECT_EQ(last_msg_->stub[25], 5) - << "incorrect value for stub[25], expected 5, is " << last_msg_->stub[25]; - EXPECT_EQ(last_msg_->stub[26], 10) - << "incorrect value for stub[26], expected 10, is " - << last_msg_->stub[26]; - EXPECT_EQ(last_msg_->stub[27], 16) - << "incorrect value for stub[27], expected 16, is " - << last_msg_->stub[27]; - EXPECT_EQ(last_msg_->stub[28], 0) - << "incorrect value for stub[28], expected 0, is " << last_msg_->stub[28]; - EXPECT_EQ(last_msg_->stub[29], 17) - << "incorrect value for stub[29], expected 17, is " - << last_msg_->stub[29]; - EXPECT_EQ(last_msg_->stub[30], 18) - << "incorrect value for stub[30], expected 18, is " - << last_msg_->stub[30]; - EXPECT_EQ(last_msg_->stub[31], 19) - << "incorrect value for stub[31], expected 19, is " - << last_msg_->stub[31]; - EXPECT_EQ(last_msg_->stub[32], 20) - << "incorrect value for stub[32], expected 20, is " - << last_msg_->stub[32]; - EXPECT_EQ(last_msg_->stub[33], 21) - << "incorrect value for stub[33], expected 21, is " - << last_msg_->stub[33]; - EXPECT_EQ(last_msg_->stub[34], 6) - << "incorrect value for stub[34], expected 6, is " << last_msg_->stub[34]; - EXPECT_EQ(last_msg_->stub[35], 10) - << "incorrect value for stub[35], expected 10, is " - << last_msg_->stub[35]; - EXPECT_EQ(last_msg_->stub[36], 22) - << "incorrect value for stub[36], expected 22, is " - << last_msg_->stub[36]; - EXPECT_EQ(last_msg_->stub[37], 0) - << "incorrect value for stub[37], expected 0, is " << last_msg_->stub[37]; - EXPECT_EQ(last_msg_->stub[38], 23) - << "incorrect value for stub[38], expected 23, is " - << last_msg_->stub[38]; - EXPECT_EQ(last_msg_->stub[39], 24) - << "incorrect value for stub[39], expected 24, is " - << last_msg_->stub[39]; - EXPECT_EQ(last_msg_->stub[40], 25) - << "incorrect value for stub[40], expected 25, is " - << last_msg_->stub[40]; - EXPECT_EQ(last_msg_->stub[41], 26) - << "incorrect value for stub[41], expected 26, is " - << last_msg_->stub[41]; - EXPECT_EQ(last_msg_->stub[42], 27) - << "incorrect value for stub[42], expected 27, is " - << last_msg_->stub[42]; + 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_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; + EXPECT_EQ(last_msg_->tropo_v_hydro_bound_mu, 150) + << "incorrect value for tropo_v_hydro_bound_mu, expected 150, is " + << last_msg_->tropo_v_hydro_bound_mu; + EXPECT_EQ(last_msg_->tropo_v_hydro_bound_sig, 100) + << "incorrect value for tropo_v_hydro_bound_sig, expected 100, is " + << last_msg_->tropo_v_hydro_bound_sig; + EXPECT_EQ(last_msg_->tropo_v_wet_bound_mu, 150) + << "incorrect value for tropo_v_wet_bound_mu, expected 150, is " + << last_msg_->tropo_v_wet_bound_mu; + EXPECT_EQ(last_msg_->tropo_v_wet_bound_sig, 100) + << "incorrect value for tropo_v_wet_bound_sig, expected 100, is " + << last_msg_->tropo_v_wet_bound_sig; } diff --git a/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrOrbitClockBounds.cc b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrOrbitClockBounds.cc index d1ca4fe066..a11c533ac0 100644 --- a/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrOrbitClockBounds.cc +++ b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrOrbitClockBounds.cc @@ -89,161 +89,43 @@ TEST_F(Test_legacy_auto_check_sbp_ssr_MsgSsrOrbitClockBounds0, Test) { msg_ssr_orbit_clock_bounds_t *test_msg = (msg_ssr_orbit_clock_bounds_t *)test_msg_storage; test_msg_len = (uint8_t)sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[7] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[8] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[9] = 48; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[10] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[11] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[12] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[13] = 24; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[14] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[15] = 38; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[16] = 37; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[17] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[18] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[19] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[20] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[21] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[22] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[23] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[24] = 38; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[25] = 37; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[26] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[27] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[28] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[29] = 39; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[30] = 1; + test_msg->const_id = 1; + test_msg->header.num_msgs = 1; + test_msg->header.seq_num = 2; + test_msg->header.sol_id = 48; + test_msg->header.time.tow = 180; + test_msg->header.time.wn = 3; + test_msg->header.update_interval = 3; + test_msg->n_sats = 2; + if (sizeof(test_msg->orbit_clock_bounds) == 0) { + // Cope with variable length arrays + test_msg_len = + (uint8_t)(test_msg_len + sizeof(test_msg->orbit_clock_bounds[0])); + } + test_msg->orbit_clock_bounds[0].clock_bound_mu = 39; + test_msg->orbit_clock_bounds[0].clock_bound_sig = 1; + test_msg->orbit_clock_bounds[0].orb_along_bound_mu = 38; + test_msg->orbit_clock_bounds[0].orb_along_bound_sig = 2; + test_msg->orbit_clock_bounds[0].orb_cross_bound_mu = 37; + test_msg->orbit_clock_bounds[0].orb_cross_bound_sig = 3; + test_msg->orbit_clock_bounds[0].orb_radial_bound_mu = 39; + test_msg->orbit_clock_bounds[0].orb_radial_bound_sig = 1; + test_msg->orbit_clock_bounds[0].sat_id = 24; + if (sizeof(test_msg->orbit_clock_bounds) == 0) { + // Cope with variable length arrays + test_msg_len = + (uint8_t)(test_msg_len + sizeof(test_msg->orbit_clock_bounds[0])); + } + test_msg->orbit_clock_bounds[1].clock_bound_mu = 39; + test_msg->orbit_clock_bounds[1].clock_bound_sig = 1; + test_msg->orbit_clock_bounds[1].orb_along_bound_mu = 38; + test_msg->orbit_clock_bounds[1].orb_along_bound_sig = 2; + test_msg->orbit_clock_bounds[1].orb_cross_bound_mu = 37; + test_msg->orbit_clock_bounds[1].orb_cross_bound_sig = 3; + test_msg->orbit_clock_bounds[1].orb_radial_bound_mu = 39; + test_msg->orbit_clock_bounds[1].orb_radial_bound_sig = 1; + test_msg->orbit_clock_bounds[1].sat_id = 3; + test_msg->ssr_iod = 15; EXPECT_EQ(send_message(1502, 66, test_msg_len, test_msg_storage), SBP_OK); @@ -257,76 +139,98 @@ TEST_F(Test_legacy_auto_check_sbp_ssr_MsgSsrOrbitClockBounds0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_len_, test_msg_len); - EXPECT_EQ(last_msg_->stub[0], 180) - << "incorrect value for stub[0], expected 180, is " << last_msg_->stub[0]; - EXPECT_EQ(last_msg_->stub[1], 0) - << "incorrect value for stub[1], expected 0, is " << last_msg_->stub[1]; - EXPECT_EQ(last_msg_->stub[2], 0) - << "incorrect value for stub[2], expected 0, is " << last_msg_->stub[2]; - EXPECT_EQ(last_msg_->stub[3], 0) - << "incorrect value for stub[3], expected 0, is " << last_msg_->stub[3]; - EXPECT_EQ(last_msg_->stub[4], 3) - << "incorrect value for stub[4], expected 3, is " << last_msg_->stub[4]; - EXPECT_EQ(last_msg_->stub[5], 0) - << "incorrect value for stub[5], expected 0, is " << last_msg_->stub[5]; - EXPECT_EQ(last_msg_->stub[6], 1) - << "incorrect value for stub[6], expected 1, is " << last_msg_->stub[6]; - EXPECT_EQ(last_msg_->stub[7], 2) - << "incorrect value for stub[7], expected 2, is " << last_msg_->stub[7]; - EXPECT_EQ(last_msg_->stub[8], 3) - << "incorrect value for stub[8], expected 3, is " << last_msg_->stub[8]; - EXPECT_EQ(last_msg_->stub[9], 48) - << "incorrect value for stub[9], expected 48, is " << last_msg_->stub[9]; - EXPECT_EQ(last_msg_->stub[10], 15) - << "incorrect value for stub[10], expected 15, is " - << last_msg_->stub[10]; - EXPECT_EQ(last_msg_->stub[11], 1) - << "incorrect value for stub[11], expected 1, is " << last_msg_->stub[11]; - EXPECT_EQ(last_msg_->stub[12], 2) - << "incorrect value for stub[12], expected 2, is " << last_msg_->stub[12]; - EXPECT_EQ(last_msg_->stub[13], 24) - << "incorrect value for stub[13], expected 24, is " - << last_msg_->stub[13]; - EXPECT_EQ(last_msg_->stub[14], 39) - << "incorrect value for stub[14], expected 39, is " - << last_msg_->stub[14]; - EXPECT_EQ(last_msg_->stub[15], 38) - << "incorrect value for stub[15], expected 38, is " - << last_msg_->stub[15]; - EXPECT_EQ(last_msg_->stub[16], 37) - << "incorrect value for stub[16], expected 37, is " - << last_msg_->stub[16]; - EXPECT_EQ(last_msg_->stub[17], 1) - << "incorrect value for stub[17], expected 1, is " << last_msg_->stub[17]; - EXPECT_EQ(last_msg_->stub[18], 2) - << "incorrect value for stub[18], expected 2, is " << last_msg_->stub[18]; - EXPECT_EQ(last_msg_->stub[19], 3) - << "incorrect value for stub[19], expected 3, is " << last_msg_->stub[19]; - EXPECT_EQ(last_msg_->stub[20], 39) - << "incorrect value for stub[20], expected 39, is " - << last_msg_->stub[20]; - EXPECT_EQ(last_msg_->stub[21], 1) - << "incorrect value for stub[21], expected 1, is " << last_msg_->stub[21]; - EXPECT_EQ(last_msg_->stub[22], 3) - << "incorrect value for stub[22], expected 3, is " << last_msg_->stub[22]; - EXPECT_EQ(last_msg_->stub[23], 39) - << "incorrect value for stub[23], expected 39, is " - << last_msg_->stub[23]; - EXPECT_EQ(last_msg_->stub[24], 38) - << "incorrect value for stub[24], expected 38, is " - << last_msg_->stub[24]; - EXPECT_EQ(last_msg_->stub[25], 37) - << "incorrect value for stub[25], expected 37, is " - << last_msg_->stub[25]; - EXPECT_EQ(last_msg_->stub[26], 1) - << "incorrect value for stub[26], expected 1, is " << last_msg_->stub[26]; - EXPECT_EQ(last_msg_->stub[27], 2) - << "incorrect value for stub[27], expected 2, is " << last_msg_->stub[27]; - EXPECT_EQ(last_msg_->stub[28], 3) - << "incorrect value for stub[28], expected 3, is " << last_msg_->stub[28]; - EXPECT_EQ(last_msg_->stub[29], 39) - << "incorrect value for stub[29], expected 39, is " - << last_msg_->stub[29]; - EXPECT_EQ(last_msg_->stub[30], 1) - << "incorrect value for stub[30], expected 1, is " << last_msg_->stub[30]; + EXPECT_EQ(last_msg_->const_id, 1) + << "incorrect value for const_id, expected 1, is " << last_msg_->const_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, 2) + << "incorrect value for header.seq_num, expected 2, is " + << last_msg_->header.seq_num; + EXPECT_EQ(last_msg_->header.sol_id, 48) + << "incorrect value for header.sol_id, expected 48, 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, 3) + << "incorrect value for header.update_interval, expected 3, 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_->orbit_clock_bounds[0].clock_bound_mu, 39) + << "incorrect value for orbit_clock_bounds[0].clock_bound_mu, expected " + "39, is " + << last_msg_->orbit_clock_bounds[0].clock_bound_mu; + EXPECT_EQ(last_msg_->orbit_clock_bounds[0].clock_bound_sig, 1) + << "incorrect value for orbit_clock_bounds[0].clock_bound_sig, expected " + "1, is " + << last_msg_->orbit_clock_bounds[0].clock_bound_sig; + EXPECT_EQ(last_msg_->orbit_clock_bounds[0].orb_along_bound_mu, 38) + << "incorrect value for orbit_clock_bounds[0].orb_along_bound_mu, " + "expected 38, is " + << last_msg_->orbit_clock_bounds[0].orb_along_bound_mu; + EXPECT_EQ(last_msg_->orbit_clock_bounds[0].orb_along_bound_sig, 2) + << "incorrect value for orbit_clock_bounds[0].orb_along_bound_sig, " + "expected 2, is " + << last_msg_->orbit_clock_bounds[0].orb_along_bound_sig; + EXPECT_EQ(last_msg_->orbit_clock_bounds[0].orb_cross_bound_mu, 37) + << "incorrect value for orbit_clock_bounds[0].orb_cross_bound_mu, " + "expected 37, is " + << last_msg_->orbit_clock_bounds[0].orb_cross_bound_mu; + EXPECT_EQ(last_msg_->orbit_clock_bounds[0].orb_cross_bound_sig, 3) + << "incorrect value for orbit_clock_bounds[0].orb_cross_bound_sig, " + "expected 3, is " + << last_msg_->orbit_clock_bounds[0].orb_cross_bound_sig; + EXPECT_EQ(last_msg_->orbit_clock_bounds[0].orb_radial_bound_mu, 39) + << "incorrect value for orbit_clock_bounds[0].orb_radial_bound_mu, " + "expected 39, is " + << last_msg_->orbit_clock_bounds[0].orb_radial_bound_mu; + EXPECT_EQ(last_msg_->orbit_clock_bounds[0].orb_radial_bound_sig, 1) + << "incorrect value for orbit_clock_bounds[0].orb_radial_bound_sig, " + "expected 1, is " + << last_msg_->orbit_clock_bounds[0].orb_radial_bound_sig; + EXPECT_EQ(last_msg_->orbit_clock_bounds[0].sat_id, 24) + << "incorrect value for orbit_clock_bounds[0].sat_id, expected 24, is " + << last_msg_->orbit_clock_bounds[0].sat_id; + EXPECT_EQ(last_msg_->orbit_clock_bounds[1].clock_bound_mu, 39) + << "incorrect value for orbit_clock_bounds[1].clock_bound_mu, expected " + "39, is " + << last_msg_->orbit_clock_bounds[1].clock_bound_mu; + EXPECT_EQ(last_msg_->orbit_clock_bounds[1].clock_bound_sig, 1) + << "incorrect value for orbit_clock_bounds[1].clock_bound_sig, expected " + "1, is " + << last_msg_->orbit_clock_bounds[1].clock_bound_sig; + EXPECT_EQ(last_msg_->orbit_clock_bounds[1].orb_along_bound_mu, 38) + << "incorrect value for orbit_clock_bounds[1].orb_along_bound_mu, " + "expected 38, is " + << last_msg_->orbit_clock_bounds[1].orb_along_bound_mu; + EXPECT_EQ(last_msg_->orbit_clock_bounds[1].orb_along_bound_sig, 2) + << "incorrect value for orbit_clock_bounds[1].orb_along_bound_sig, " + "expected 2, is " + << last_msg_->orbit_clock_bounds[1].orb_along_bound_sig; + EXPECT_EQ(last_msg_->orbit_clock_bounds[1].orb_cross_bound_mu, 37) + << "incorrect value for orbit_clock_bounds[1].orb_cross_bound_mu, " + "expected 37, is " + << last_msg_->orbit_clock_bounds[1].orb_cross_bound_mu; + EXPECT_EQ(last_msg_->orbit_clock_bounds[1].orb_cross_bound_sig, 3) + << "incorrect value for orbit_clock_bounds[1].orb_cross_bound_sig, " + "expected 3, is " + << last_msg_->orbit_clock_bounds[1].orb_cross_bound_sig; + EXPECT_EQ(last_msg_->orbit_clock_bounds[1].orb_radial_bound_mu, 39) + << "incorrect value for orbit_clock_bounds[1].orb_radial_bound_mu, " + "expected 39, is " + << last_msg_->orbit_clock_bounds[1].orb_radial_bound_mu; + EXPECT_EQ(last_msg_->orbit_clock_bounds[1].orb_radial_bound_sig, 1) + << "incorrect value for orbit_clock_bounds[1].orb_radial_bound_sig, " + "expected 1, is " + << last_msg_->orbit_clock_bounds[1].orb_radial_bound_sig; + EXPECT_EQ(last_msg_->orbit_clock_bounds[1].sat_id, 3) + << "incorrect value for orbit_clock_bounds[1].sat_id, expected 3, is " + << last_msg_->orbit_clock_bounds[1].sat_id; + EXPECT_EQ(last_msg_->ssr_iod, 15) + << "incorrect value for ssr_iod, expected 15, is " << last_msg_->ssr_iod; } diff --git a/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation.cc b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation.cc index 224b836b9d..094218a5f7 100644 --- a/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation.cc +++ b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation.cc @@ -91,146 +91,23 @@ TEST_F(Test_legacy_auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation0, msg_ssr_orbit_clock_bounds_degradation_t *test_msg = (msg_ssr_orbit_clock_bounds_degradation_t *)test_msg_storage; test_msg_len = (uint8_t)sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[7] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[8] = 3; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[9] = 48; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[10] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[11] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[12] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[13] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[14] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[15] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[16] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[17] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[18] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[19] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[20] = 200; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[21] = 199; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[22] = 198; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[23] = 197; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[24] = 196; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[25] = 195; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[26] = 194; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[27] = 193; + test_msg->const_id = 1; + test_msg->header.num_msgs = 1; + test_msg->header.seq_num = 2; + test_msg->header.sol_id = 48; + test_msg->header.time.tow = 180; + test_msg->header.time.wn = 3; + test_msg->header.update_interval = 3; + test_msg->orbit_clock_bounds_degradation.clock_bound_mu_dot = 194; + test_msg->orbit_clock_bounds_degradation.clock_bound_sig_dot = 193; + test_msg->orbit_clock_bounds_degradation.orb_along_bound_mu_dot = 199; + test_msg->orbit_clock_bounds_degradation.orb_along_bound_sig_dot = 196; + test_msg->orbit_clock_bounds_degradation.orb_cross_bound_mu_dot = 198; + test_msg->orbit_clock_bounds_degradation.orb_cross_bound_sig_dot = 195; + test_msg->orbit_clock_bounds_degradation.orb_radial_bound_mu_dot = 200; + test_msg->orbit_clock_bounds_degradation.orb_radial_bound_sig_dot = 197; + test_msg->sat_bitmask = 10; + test_msg->ssr_iod = 15; EXPECT_EQ(send_message(1503, 66, test_msg_len, test_msg_storage), SBP_OK); @@ -244,70 +121,73 @@ TEST_F(Test_legacy_auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradation0, EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_len_, test_msg_len); - EXPECT_EQ(last_msg_->stub[0], 180) - << "incorrect value for stub[0], expected 180, is " << last_msg_->stub[0]; - EXPECT_EQ(last_msg_->stub[1], 0) - << "incorrect value for stub[1], expected 0, is " << last_msg_->stub[1]; - EXPECT_EQ(last_msg_->stub[2], 0) - << "incorrect value for stub[2], expected 0, is " << last_msg_->stub[2]; - EXPECT_EQ(last_msg_->stub[3], 0) - << "incorrect value for stub[3], expected 0, is " << last_msg_->stub[3]; - EXPECT_EQ(last_msg_->stub[4], 3) - << "incorrect value for stub[4], expected 3, is " << last_msg_->stub[4]; - EXPECT_EQ(last_msg_->stub[5], 0) - << "incorrect value for stub[5], expected 0, is " << last_msg_->stub[5]; - EXPECT_EQ(last_msg_->stub[6], 1) - << "incorrect value for stub[6], expected 1, is " << last_msg_->stub[6]; - EXPECT_EQ(last_msg_->stub[7], 2) - << "incorrect value for stub[7], expected 2, is " << last_msg_->stub[7]; - EXPECT_EQ(last_msg_->stub[8], 3) - << "incorrect value for stub[8], expected 3, is " << last_msg_->stub[8]; - EXPECT_EQ(last_msg_->stub[9], 48) - << "incorrect value for stub[9], expected 48, is " << last_msg_->stub[9]; - EXPECT_EQ(last_msg_->stub[10], 15) - << "incorrect value for stub[10], expected 15, is " - << last_msg_->stub[10]; - EXPECT_EQ(last_msg_->stub[11], 1) - << "incorrect value for stub[11], expected 1, is " << last_msg_->stub[11]; - EXPECT_EQ(last_msg_->stub[12], 10) - << "incorrect value for stub[12], expected 10, is " - << last_msg_->stub[12]; - EXPECT_EQ(last_msg_->stub[13], 0) - << "incorrect value for stub[13], expected 0, is " << last_msg_->stub[13]; - EXPECT_EQ(last_msg_->stub[14], 0) - << "incorrect value for stub[14], expected 0, is " << last_msg_->stub[14]; - EXPECT_EQ(last_msg_->stub[15], 0) - << "incorrect value for stub[15], expected 0, is " << last_msg_->stub[15]; - EXPECT_EQ(last_msg_->stub[16], 0) - << "incorrect value for stub[16], expected 0, is " << last_msg_->stub[16]; - EXPECT_EQ(last_msg_->stub[17], 0) - << "incorrect value for stub[17], expected 0, is " << last_msg_->stub[17]; - EXPECT_EQ(last_msg_->stub[18], 0) - << "incorrect value for stub[18], expected 0, is " << last_msg_->stub[18]; - EXPECT_EQ(last_msg_->stub[19], 0) - << "incorrect value for stub[19], expected 0, is " << last_msg_->stub[19]; - EXPECT_EQ(last_msg_->stub[20], 200) - << "incorrect value for stub[20], expected 200, is " - << last_msg_->stub[20]; - EXPECT_EQ(last_msg_->stub[21], 199) - << "incorrect value for stub[21], expected 199, is " - << last_msg_->stub[21]; - EXPECT_EQ(last_msg_->stub[22], 198) - << "incorrect value for stub[22], expected 198, is " - << last_msg_->stub[22]; - EXPECT_EQ(last_msg_->stub[23], 197) - << "incorrect value for stub[23], expected 197, is " - << last_msg_->stub[23]; - EXPECT_EQ(last_msg_->stub[24], 196) - << "incorrect value for stub[24], expected 196, is " - << last_msg_->stub[24]; - EXPECT_EQ(last_msg_->stub[25], 195) - << "incorrect value for stub[25], expected 195, is " - << last_msg_->stub[25]; - EXPECT_EQ(last_msg_->stub[26], 194) - << "incorrect value for stub[26], expected 194, is " - << last_msg_->stub[26]; - EXPECT_EQ(last_msg_->stub[27], 193) - << "incorrect value for stub[27], expected 193, is " - << last_msg_->stub[27]; + EXPECT_EQ(last_msg_->const_id, 1) + << "incorrect value for const_id, expected 1, is " << last_msg_->const_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, 2) + << "incorrect value for header.seq_num, expected 2, is " + << last_msg_->header.seq_num; + EXPECT_EQ(last_msg_->header.sol_id, 48) + << "incorrect value for header.sol_id, expected 48, 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, 3) + << "incorrect value for header.update_interval, expected 3, is " + << last_msg_->header.update_interval; + EXPECT_EQ(last_msg_->orbit_clock_bounds_degradation.clock_bound_mu_dot, 194) + << "incorrect value for " + "orbit_clock_bounds_degradation.clock_bound_mu_dot, expected 194, is " + << last_msg_->orbit_clock_bounds_degradation.clock_bound_mu_dot; + EXPECT_EQ(last_msg_->orbit_clock_bounds_degradation.clock_bound_sig_dot, 193) + << "incorrect value for " + "orbit_clock_bounds_degradation.clock_bound_sig_dot, expected 193, is " + << last_msg_->orbit_clock_bounds_degradation.clock_bound_sig_dot; + EXPECT_EQ(last_msg_->orbit_clock_bounds_degradation.orb_along_bound_mu_dot, + 199) + << "incorrect value for " + "orbit_clock_bounds_degradation.orb_along_bound_mu_dot, expected 199, " + "is " + << last_msg_->orbit_clock_bounds_degradation.orb_along_bound_mu_dot; + EXPECT_EQ(last_msg_->orbit_clock_bounds_degradation.orb_along_bound_sig_dot, + 196) + << "incorrect value for " + "orbit_clock_bounds_degradation.orb_along_bound_sig_dot, expected " + "196, is " + << last_msg_->orbit_clock_bounds_degradation.orb_along_bound_sig_dot; + EXPECT_EQ(last_msg_->orbit_clock_bounds_degradation.orb_cross_bound_mu_dot, + 198) + << "incorrect value for " + "orbit_clock_bounds_degradation.orb_cross_bound_mu_dot, expected 198, " + "is " + << last_msg_->orbit_clock_bounds_degradation.orb_cross_bound_mu_dot; + EXPECT_EQ(last_msg_->orbit_clock_bounds_degradation.orb_cross_bound_sig_dot, + 195) + << "incorrect value for " + "orbit_clock_bounds_degradation.orb_cross_bound_sig_dot, expected " + "195, is " + << last_msg_->orbit_clock_bounds_degradation.orb_cross_bound_sig_dot; + EXPECT_EQ(last_msg_->orbit_clock_bounds_degradation.orb_radial_bound_mu_dot, + 200) + << "incorrect value for " + "orbit_clock_bounds_degradation.orb_radial_bound_mu_dot, expected " + "200, is " + << last_msg_->orbit_clock_bounds_degradation.orb_radial_bound_mu_dot; + EXPECT_EQ(last_msg_->orbit_clock_bounds_degradation.orb_radial_bound_sig_dot, + 197) + << "incorrect value for " + "orbit_clock_bounds_degradation.orb_radial_bound_sig_dot, expected " + "197, is " + << last_msg_->orbit_clock_bounds_degradation.orb_radial_bound_sig_dot; + EXPECT_EQ(last_msg_->sat_bitmask, 10) + << "incorrect value for sat_bitmask, expected 10, is " + << last_msg_->sat_bitmask; + EXPECT_EQ(last_msg_->ssr_iod, 15) + << "incorrect value for ssr_iod, expected 15, is " << last_msg_->ssr_iod; } diff --git a/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrStecCorrection.cc b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrStecCorrection.cc index 198ee2e32a..5457b264d4 100644 --- a/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrStecCorrection.cc +++ b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrStecCorrection.cc @@ -89,196 +89,78 @@ TEST_F(Test_legacy_auto_check_sbp_ssr_MsgSsrStecCorrection0, Test) { msg_ssr_stec_correction_t *test_msg = (msg_ssr_stec_correction_t *)test_msg_storage; test_msg_len = (uint8_t)sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { + 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->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stec_sat_list[0])); } - test_msg->stub[0] = 180; - if (sizeof(test_msg->stub) == 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->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + + sizeof(test_msg->stec_sat_list[0].stec_coeff[0])); } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 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->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + + sizeof(test_msg->stec_sat_list[0].stec_coeff[0])); } - test_msg->stub[2] = 0; - if (sizeof(test_msg->stub) == 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->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + + sizeof(test_msg->stec_sat_list[0].stec_coeff[0])); } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 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->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + + sizeof(test_msg->stec_sat_list[0].stec_coeff[0])); } - test_msg->stub[4] = 3; - if (sizeof(test_msg->stub) == 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->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stec_sat_list[0])); } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 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->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + + sizeof(test_msg->stec_sat_list[1].stec_coeff[0])); } - test_msg->stub[6] = 1; - if (sizeof(test_msg->stub) == 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->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + + sizeof(test_msg->stec_sat_list[1].stec_coeff[0])); } - test_msg->stub[7] = 1; - if (sizeof(test_msg->stub) == 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->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + + sizeof(test_msg->stec_sat_list[1].stec_coeff[0])); } - test_msg->stub[8] = 10; - if (sizeof(test_msg->stub) == 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->stub[0])); + test_msg_len = (uint8_t)(test_msg_len + + sizeof(test_msg->stec_sat_list[1].stec_coeff[0])); } - test_msg->stub[9] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[10] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[11] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[12] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[13] = 10; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[14] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[15] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[16] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[17] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[18] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[19] = 63; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[20] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[21] = 62; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[22] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[23] = 61; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[24] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[25] = 60; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[26] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[27] = 31; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[28] = 15; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[29] = 5; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[30] = 63; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[31] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[32] = 64; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[33] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[34] = 65; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[35] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[36] = 66; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[37] = 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); @@ -292,92 +174,78 @@ TEST_F(Test_legacy_auto_check_sbp_ssr_MsgSsrStecCorrection0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_len_, test_msg_len); - EXPECT_EQ(last_msg_->stub[0], 180) - << "incorrect value for stub[0], expected 180, is " << last_msg_->stub[0]; - EXPECT_EQ(last_msg_->stub[1], 0) - << "incorrect value for stub[1], expected 0, is " << last_msg_->stub[1]; - EXPECT_EQ(last_msg_->stub[2], 0) - << "incorrect value for stub[2], expected 0, is " << last_msg_->stub[2]; - EXPECT_EQ(last_msg_->stub[3], 0) - << "incorrect value for stub[3], expected 0, is " << last_msg_->stub[3]; - EXPECT_EQ(last_msg_->stub[4], 3) - << "incorrect value for stub[4], expected 3, is " << last_msg_->stub[4]; - EXPECT_EQ(last_msg_->stub[5], 0) - << "incorrect value for stub[5], expected 0, is " << last_msg_->stub[5]; - EXPECT_EQ(last_msg_->stub[6], 1) - << "incorrect value for stub[6], expected 1, is " << last_msg_->stub[6]; - EXPECT_EQ(last_msg_->stub[7], 1) - << "incorrect value for stub[7], expected 1, is " << last_msg_->stub[7]; - EXPECT_EQ(last_msg_->stub[8], 10) - << "incorrect value for stub[8], expected 10, is " << last_msg_->stub[8]; - EXPECT_EQ(last_msg_->stub[9], 0) - << "incorrect value for stub[9], expected 0, is " << last_msg_->stub[9]; - EXPECT_EQ(last_msg_->stub[10], 15) - << "incorrect value for stub[10], expected 15, is " - << last_msg_->stub[10]; - EXPECT_EQ(last_msg_->stub[11], 1) - << "incorrect value for stub[11], expected 1, is " << last_msg_->stub[11]; - EXPECT_EQ(last_msg_->stub[12], 0) - << "incorrect value for stub[12], expected 0, is " << last_msg_->stub[12]; - EXPECT_EQ(last_msg_->stub[13], 10) - << "incorrect value for stub[13], expected 10, is " - << last_msg_->stub[13]; - EXPECT_EQ(last_msg_->stub[14], 0) - << "incorrect value for stub[14], expected 0, is " << last_msg_->stub[14]; - EXPECT_EQ(last_msg_->stub[15], 2) - << "incorrect value for stub[15], expected 2, is " << last_msg_->stub[15]; - EXPECT_EQ(last_msg_->stub[16], 1) - << "incorrect value for stub[16], expected 1, is " << last_msg_->stub[16]; - EXPECT_EQ(last_msg_->stub[17], 1) - << "incorrect value for stub[17], expected 1, is " << last_msg_->stub[17]; - EXPECT_EQ(last_msg_->stub[18], 1) - << "incorrect value for stub[18], expected 1, is " << last_msg_->stub[18]; - EXPECT_EQ(last_msg_->stub[19], 63) - << "incorrect value for stub[19], expected 63, is " - << last_msg_->stub[19]; - EXPECT_EQ(last_msg_->stub[20], 0) - << "incorrect value for stub[20], expected 0, is " << last_msg_->stub[20]; - EXPECT_EQ(last_msg_->stub[21], 62) - << "incorrect value for stub[21], expected 62, is " - << last_msg_->stub[21]; - EXPECT_EQ(last_msg_->stub[22], 0) - << "incorrect value for stub[22], expected 0, is " << last_msg_->stub[22]; - EXPECT_EQ(last_msg_->stub[23], 61) - << "incorrect value for stub[23], expected 61, is " - << last_msg_->stub[23]; - EXPECT_EQ(last_msg_->stub[24], 0) - << "incorrect value for stub[24], expected 0, is " << last_msg_->stub[24]; - EXPECT_EQ(last_msg_->stub[25], 60) - << "incorrect value for stub[25], expected 60, is " - << last_msg_->stub[25]; - EXPECT_EQ(last_msg_->stub[26], 0) - << "incorrect value for stub[26], expected 0, is " << last_msg_->stub[26]; - EXPECT_EQ(last_msg_->stub[27], 31) - << "incorrect value for stub[27], expected 31, is " - << last_msg_->stub[27]; - EXPECT_EQ(last_msg_->stub[28], 15) - << "incorrect value for stub[28], expected 15, is " - << last_msg_->stub[28]; - EXPECT_EQ(last_msg_->stub[29], 5) - << "incorrect value for stub[29], expected 5, is " << last_msg_->stub[29]; - EXPECT_EQ(last_msg_->stub[30], 63) - << "incorrect value for stub[30], expected 63, is " - << last_msg_->stub[30]; - EXPECT_EQ(last_msg_->stub[31], 0) - << "incorrect value for stub[31], expected 0, is " << last_msg_->stub[31]; - EXPECT_EQ(last_msg_->stub[32], 64) - << "incorrect value for stub[32], expected 64, is " - << last_msg_->stub[32]; - EXPECT_EQ(last_msg_->stub[33], 0) - << "incorrect value for stub[33], expected 0, is " << last_msg_->stub[33]; - EXPECT_EQ(last_msg_->stub[34], 65) - << "incorrect value for stub[34], expected 65, is " - << last_msg_->stub[34]; - EXPECT_EQ(last_msg_->stub[35], 0) - << "incorrect value for stub[35], expected 0, is " << last_msg_->stub[35]; - EXPECT_EQ(last_msg_->stub[36], 66) - << "incorrect value for stub[36], expected 66, is " - << last_msg_->stub[36]; - EXPECT_EQ(last_msg_->stub[37], 0) - << "incorrect value for stub[37], expected 0, is " << last_msg_->stub[37]; + 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 index 6c1c210a24..850314925b 100644 --- a/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrTileDefinition.cc +++ b/c/test/legacy/cpp/auto_check_sbp_ssr_MsgSsrTileDefinition.cc @@ -88,131 +88,16 @@ TEST_F(Test_legacy_auto_check_sbp_ssr_MsgSsrTileDefinition0, Test) { msg_ssr_tile_definition_t *test_msg = (msg_ssr_tile_definition_t *)test_msg_storage; test_msg_len = (uint8_t)sizeof(*test_msg); - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[0] = 31; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[1] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[2] = 1; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[3] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[4] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[5] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[6] = 4; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[7] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[8] = 8; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[9] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[10] = 16; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[11] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[12] = 32; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[13] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[14] = 64; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[15] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[16] = 128; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[17] = 210; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[18] = 2; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[19] = 150; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[20] = 73; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[21] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[22] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[23] = 0; - if (sizeof(test_msg->stub) == 0) { - // Cope with variable length arrays - test_msg_len = (uint8_t)(test_msg_len + sizeof(test_msg->stub[0])); - } - test_msg->stub[24] = 0; + 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); @@ -226,61 +111,31 @@ TEST_F(Test_legacy_auto_check_sbp_ssr_MsgSsrTileDefinition0, Test) { EXPECT_EQ(n_callbacks_logged_, 1); EXPECT_EQ(last_sender_id_, 66); EXPECT_EQ(last_msg_len_, test_msg_len); - EXPECT_EQ(last_msg_->stub[0], 31) - << "incorrect value for stub[0], expected 31, is " << last_msg_->stub[0]; - EXPECT_EQ(last_msg_->stub[1], 0) - << "incorrect value for stub[1], expected 0, is " << last_msg_->stub[1]; - EXPECT_EQ(last_msg_->stub[2], 1) - << "incorrect value for stub[2], expected 1, is " << last_msg_->stub[2]; - EXPECT_EQ(last_msg_->stub[3], 0) - << "incorrect value for stub[3], expected 0, is " << last_msg_->stub[3]; - EXPECT_EQ(last_msg_->stub[4], 2) - << "incorrect value for stub[4], expected 2, is " << last_msg_->stub[4]; - EXPECT_EQ(last_msg_->stub[5], 0) - << "incorrect value for stub[5], expected 0, is " << last_msg_->stub[5]; - EXPECT_EQ(last_msg_->stub[6], 4) - << "incorrect value for stub[6], expected 4, is " << last_msg_->stub[6]; - EXPECT_EQ(last_msg_->stub[7], 0) - << "incorrect value for stub[7], expected 0, is " << last_msg_->stub[7]; - EXPECT_EQ(last_msg_->stub[8], 8) - << "incorrect value for stub[8], expected 8, is " << last_msg_->stub[8]; - EXPECT_EQ(last_msg_->stub[9], 0) - << "incorrect value for stub[9], expected 0, is " << last_msg_->stub[9]; - EXPECT_EQ(last_msg_->stub[10], 16) - << "incorrect value for stub[10], expected 16, is " - << last_msg_->stub[10]; - EXPECT_EQ(last_msg_->stub[11], 0) - << "incorrect value for stub[11], expected 0, is " << last_msg_->stub[11]; - EXPECT_EQ(last_msg_->stub[12], 32) - << "incorrect value for stub[12], expected 32, is " - << last_msg_->stub[12]; - EXPECT_EQ(last_msg_->stub[13], 0) - << "incorrect value for stub[13], expected 0, is " << last_msg_->stub[13]; - EXPECT_EQ(last_msg_->stub[14], 64) - << "incorrect value for stub[14], expected 64, is " - << last_msg_->stub[14]; - EXPECT_EQ(last_msg_->stub[15], 0) - << "incorrect value for stub[15], expected 0, is " << last_msg_->stub[15]; - EXPECT_EQ(last_msg_->stub[16], 128) - << "incorrect value for stub[16], expected 128, is " - << last_msg_->stub[16]; - EXPECT_EQ(last_msg_->stub[17], 210) - << "incorrect value for stub[17], expected 210, is " - << last_msg_->stub[17]; - EXPECT_EQ(last_msg_->stub[18], 2) - << "incorrect value for stub[18], expected 2, is " << last_msg_->stub[18]; - EXPECT_EQ(last_msg_->stub[19], 150) - << "incorrect value for stub[19], expected 150, is " - << last_msg_->stub[19]; - EXPECT_EQ(last_msg_->stub[20], 73) - << "incorrect value for stub[20], expected 73, is " - << last_msg_->stub[20]; - EXPECT_EQ(last_msg_->stub[21], 0) - << "incorrect value for stub[21], expected 0, is " << last_msg_->stub[21]; - EXPECT_EQ(last_msg_->stub[22], 0) - << "incorrect value for stub[22], expected 0, is " << last_msg_->stub[22]; - EXPECT_EQ(last_msg_->stub[23], 0) - << "incorrect value for stub[23], expected 0, is " << last_msg_->stub[23]; - EXPECT_EQ(last_msg_->stub[24], 0) - << "incorrect value for stub[24], expected 0, is " << last_msg_->stub[24]; + 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 f064cf4eb42a7fb3f1bb3c93bee8dcff4f521499..fa5b2d6e6b20ca2811d323126959908ee77d97b7 100644 GIT binary patch delta 392178 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 z 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%0D7O|Jwq9^`3C2W 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¨^A|TA zkSpO2cFUOywsX+=O|hB-k>?Uj*PI$;B8<$CSMz#b<(EXE@~}VRsXF!9Oh)N9KvUeN zsEI73QB0Ek4r1zy4<@6^2W)@3s&YtmH}%D4mB=*Cq}OA>?0M)us4!;*MxR{~ji5dP ze6j1?8$pJarTxL;i)%^(hq;gSLB=cg)yx_0Dlue@;VP(rvSMcW&MiYZY!zBofj5ly z`d=MdC-jzW>N(LHjk95)6h+Z7a?(kDICl&Bg^Z>76opDf`*gRIo=cgPRh-%%qtr3I zM8XHdR$6eNyA>xoCSrkgUyKhC(v4ogN2b*Vz9t*zlxLzpkOEse{2ezSP(Fq1}5 zXs-*Xc4ylI*J2Bn5IM9hrpUZAPQ8_-RqOI-plmfUp#1hGHMJ$5d)@z2D$3SzS=BN% zkj+?x!Gp<5mt~n6Z!;g>)L(c|(x|036sx0wC2xPwEG9f;R{Z)^NfX~R8y z$Rx8(FKV{ldLuUekhrgDFZsp%DYhwpu&;qH;1BXn?Iew+>jy57&D}+Kl1IB+AB+SqJDD@j)+^Fv@g|A;ELA{1~7a6=K1O!xMbn&bd0kE?6OC*=E zk$&DuufB&ps$B#wElZl41*jA*_aPXJr(KChzxH-Bk#{Y-?UiAdeV=v6yj)RB_U)H+ zWNvE5vgil-ix(S!eMZDKJ4+Ea8fRCgI!fTIB}Y~a%tOpN7(vQfooXZR-#|qM*{Y{O zm9+)w^WL)QTe%bTo6hv(^)-j}`0@JJb}_vfzWv~&AO+@E^NnQ_(drHD!YPY9O0ZktbGoyShOuCxiu zrHoOcfe8C)o`ps;fehuafq&4{Hmksf@>dkIt2&gk21!>Tw+E5_oiK+Ban&7Rg@^_k z5xWnj`n5yByk))yey~}y5Z?K4f=CxejtrjkMEG>4%s|U(R(yzUruZ|^uBELWL*NH#pQr=Nbxo!?V_z#pUv3qgcZO>T8j*V1*n*-p23-NV8r zec5!6(fbOR1Vt=YdzBJ+b7w5V?QF}2(iGw7w<3#HI+vWOA8Ie`mQ!-dd_+)V^|G15 zlea!;;!Vl^vK`v=fhm7Uh_}B8{04woEmfcqq9P5J0srJ+(NH%x~2yXR#~eg?%4hqUmnZo5gu=H zsU)!CWa@U)$n2D1+wSEhS|`?iRWX{*E+?J|$+XOwS_5y7$eoT^>#6|41MUq1H6*+O zUEKD_jH@`F6;&e%i|T4NL>2Ad)t=tosjHdKCo?DL`zjr^OJ@F&RQBdAqC!F@U51^w zp*IKIAL#&4m!r7;#*w(y-N~g@smm^m;Xh$>%+h*^FT+9zSWy3;j8V!KhY+?WLW_kl z7kGpKGZ-R%+J(6R20#5G18*#47E^4BY~G4q^wCDAIWo`^(hpm_lajIR(@DK^tGB*n z2B4O|gU;w&Pd`}&k1(bGV8(d3TCx)}Z1bug@Qo!AIfke5k0A6}!>r{y*76QDz3;x9 zZ($YBd4PYsZ~>tp4Htv%);jwKpjWs5UV-=c#z@e20OQITdGI)Cub`rtNQ@I0fAs6^ zbe~D_`u5vm>RyoHo`;YLISRdoApU(sFZlu$klx++pMU{lX8kXo05c6N`Fn4rv+#Rx zSKWe5M+PXRLDs~JQhI3ZeCNP#?<#c1}-}u#U3#v?$8d{XF!K1dl!dX~uc>e$#LEuHgEErj zYI5e(EH#UOb_a)&fl-tahgGU||L}szayxReOSwPZ^sux`;w=!l$O=iURC~#m;lLYd zDZOo*4@7m*a%C5 z(2wXt-ZjuynQaGoKoA7FAGsF6r-|y`v@E40t9KCH+EL5IWz5P`TSd?QPgJDd=W=X} z69yO#;8-3DiR;D>m*=MV`Q_H#=@-^^ko+LY+f@3Xb1D^zI!vBKthGrg1Ok zE?~PAmT^l9k|&>OnjUlvkh>Edf=59BT<_8U3*;?GZf8B91MaW80uX-{a4Fif3LPIV z8LfCnM{urQ6v&_xmW*5QGs{4ZWE9S(i5c#+EGN4*`+sS}4?|ohH?IY?c&5Nz0M_N~ zsv(k1uFE?n4n`{M+Aw!#9IFS#$+k>sSPaG->#$#ypnd~c1IV}5Pq}m&-!XhJ zgX1=YplMGa0;>heOP)%U3Z$&*duyVFE!Ta-d0fW2f zmb<^M>~7(}La(~&u1CA!juu;LnI#FWzy#T&{qQ>nEI43DgRbo#r2Hvo=n$&+bnVZj zaZ%TUEsr|z&klcdJZ>8Q#(UFgCE0v6+7S#QENuyx0m^{_sXgZC?af$9x#arIXc5s) zPq)XNi0~1w_a+R2MdtbQ&K|2)>?stoP=cqCFKSN`Ym=oQ=$v40D_#fu^0iBA^(yD` z!|(S({A`%ezNBb|!Wvwr$(C_2quvWADHH zyL*2SG`U^{WD7~&?!|znmoGwD9A-aIaq2BE>j85;-%## z)tN{eA3~f3uZ7QFNo)j-L}vU6Nyi>Tuvfy2kN|{OEeF=Tu#OrQHYJO;r9Xcfm5)kexT#^P%I0Y zdIgu*F%vTUe~_`A^B-iCmi_{~ooUj;)ZzX>M(Id}E5cmlg#X76WOUel$^JB_WXky@ zk5^uqTS-NtsOP%Yn_oJz{EGUaj9yv2*2*xvd!$+e)Ou)7q2`$XK?c6KYC%}uo~rI$ z-+-Y{=Xe0Gt+De`f-K(&U*094rKEx5R=)euN8%A!LbLL`lfD;=!dYAKC@Jx~om~>-OPw!E zkoRJWP*lRl$h2CzZU+PAv#T1T|49%e20y0*oOk5Tin!uVp=H|;>N4*ijfd&h8P9F= z^{?Kn2_#G7fc>>{xwNG#I=)VBWgXKd(b#v?>n9$UB*xUC7j$#LrJy=*0r==&-9MsJ zcZd1m7UV#gwa;2uk}V;^UM#G&xCFz_t~TR%+FWA%jV`$4L4(^Grz`A0@?5 za76`)Si05sUQbxYLAUwLso)%ZEe>pihMlgCknbf@$~zp`cG!-APr_956h~(W)aq;0 z0OH@EpB12jOLWJ8%TIMk4}Mc=0_llgv{pCD`4rZ7p3eey1;fsy&vr(_NS;iBtOKBe z<^P-$nPs^@Mkq$(*jME63M?G_w3oNz3}Q&Emu&2Sm$KWre5EiIHHy*5=-yJIXjEbl0 z73e?bK^OZXJ!!KHJ0)?@q1iFu7iUw^;Dx5>pMdc2iZI|-8DRxM>az8dD}taZ=PF>a zjGY}%7#rZi)fUW0!?S_xe7DIRCSlDX; zUMczwZb>U(Hy6vb^sNkuh?sM1`mmzY2^ve-b)!P<(d)*nB2@4y z5MaL+U0?cz)G-HuF#RmF1|h0q5z|f+4_-I^E)yP@z5D}3rERK8SiaH;w^etZ?trtv z{!)^=yWPb4I4Xf#a?AbFxxP?<`|#pzUP!&8oF#19rnR1yuE>#z7Kra14R(8QXn5YF z(EjgQ4?_1R=zj!Trzb|yNrBHyVN86*7a(vX#n_evncWjf8<1i@*Q^BIy zsqe9GEko@h-Abk;V#Ze*i5+w|8yrf9Okm%(MOx(zg~er)lClP8k$9zP0!VO>LYn-R z?meD&u}HXEo-e{e#$&ig#K9gzk}Tr9I-DRqpC^u%iUd-WITbCd3G2xcYb83ChBmwS zGta1s4@dTYUy)x)z_~xMjK9-nl|iY0Hg2m<>;F*xw{feiv!K&aP6_jfs8L>}xSNnp zbm}D|yG6hZk>=^r2jE&LrJ{`nW+@IGIvEH zoO>C0PCRCyzjclCoJdqnKfN$yHco|mCVc8~Bz*E_MzU8(9iKnqMhz$6Isgd8ymi#v zv(1XjvK4K%E8HvqmH1K@<*r8UQsp}E9xjf)50~M69s>nYs|vqOCZr+@r}ZOJ`U-zz zICgT>Uo{#SzS03fotd|?@x6V9KLCZ@g%Jz#g$F$n3lrGkJAtYrPY^c>;rwGYlIRH= zElQ{=3DqE#+DP9EVjQ4si3Qkix6}u4Es_95LoOvQaJ&=NQpf_XL+r4`#z8xlqL)Gx zwDPi60Lhx`9HhA(Xevq)kPz@6J$z}hO6K>13Amn=1Ev$-0q#VHiiv?c;)#J&ZlsJu zk|^njq#H{_OA;~0X?GU2r3^v|Gx{j`$^B%3f)sy$grQ9e=}oalTtH|Ms~hhT{GGY# zY9q^ZlVR+iR+)On;CnDA*a&#xo`%Yll?f%y=C{_$Z2y(&Uwc0!M`x`7T8-&hMumd- z2V|GWRV-)vLQ>WEkflaymUTr!BmzC7>DQ|Ch7?^&2{mzdC!cq>0;{I)VD_7$O$DdZ zHiTehPgX5m-3Jd$8~^~@Wh5*sl5!)Y3Vq?I*Ryjlaoe*S%6+p;H{fzbIVX+;_GFTcFN#HSHS-EOgG;sB*5~LR#BYXC! zM&4+yWL&NxpVE>^gHX?N!`se$R9Qv#v5l=j5m46HTf1Rm3Ls%7`CSDw16K*Qz6d7D zz#m(;FE`fB9%Ra3I7_pV2RZH*R7^D9A5P!dgLJLiifhOJ2_^nNjR>5QB?JZg9DZZF zLgnRftN_NCPM6;8hvO7yg@|9t#w=?Z)g|Y8rEu0sT7N@`^tN>nMI)F*Bvp2fj;Sqe zi`pS2a%TfDeB43Whl>I&awSd-ZyZe!3wZ-;^`TQlE&abOR6sa1t#M!%sErT=0& z;{qzqaw32A#8o6BV^BT&1bnKSACp?dU=a_mFD(O1D2~=hI+$v)9b3N&tHXHr=heMf z%TVa_jOqqzr(1RV_PQ-?7oo8zN(>&$h*YWYcYs#9e9j%r03HGK^(kvMInN?bZ|)fmE4=sP17 zoONr)Cz{yz*q=*XcmXISy68bbNc{I zxT=Crg5+c6NS?V)5rZ_4UyWHl@Q}E+YU!l#fxZb>0~Dx13QoYvawt$SuBj%MpH}`l zeCaxLmnGps*OqOxT}XWo0SD0D9LHX87WY+l@CYnJ+g!|eh9DBERpm|O`R)@lb|wii zFt^*~{O?GB^Q0;A+0T{ml>quyngf6emd5>hc@}~-24=aQb%*v=VM15~b>#0*EKC`7^uR!vJ&2d8hzM(f+wsgj1R#~;~fNuaYA zZciAJH7ICBef=)K70hOi$4s#x5aaQ+ccw?{AMW&GHMn!XApWDD)e!|dgfpOVM?{~y8jX2& zv0G@Hlz}qxMji0wLMp1DZ3m=xS%(lV7QYArY!BHZLuZx|tMRX(D@BJYGjwd|g4bz0 z<=m|oa7kd+W9Bd1Y{AcJTGa}-4E9}qM~)Cp;p$@Pv&lkAL3`w-D`Fa;9FB+X=C?8f5zZm>Q2qxqMKx1D*sv;hP_~ysIkpP5Un|`N=)N$Um z_>ta>?$-HUDopcvyF0P_eGB^L?d-;iZ%zpem2DR@lBN4T?tXxf>lrDkoR%1-81J>G zkjN`UG39?HMtTm6e1aVv=mA6A!N;sPk267tF}ug+0_bU49j9KqDu$V-ytdgSe1rXHrHCwS8;ZQHbF z?p=b$(2Bwh)t@^pnf4<}asd?sTs06XxE_S5;r*Mqhg^sHZILKC03SGrKh#uM|BhiV zBc$QwqrF{ukRnlcUPV`WX|sM{e1^imb==NS|ESG@6WGbJ4FhPEh5+q$^GQcOG9Odi z=qcWUHT_-pY3JkVe0$4}dCkD58)Gjw{k|jdML`y+*cC5JTGH9TX1hsl8@9f47$>zf z4$r~qs#&{C=?Kbq0`K{7Q$k_k2jG&)&SH(az^vRZCQX<&FF=H{Z>t}c>n9eY zQ;I=<^TGM2C<6~U`PK^~*7E=$8n{jUKR{tkV?F~x17=Q}QT{J-^{2^mo&(MAy5^?v z*E*E0&8k^wn2>Y}Tp9!QJBW-}UCKav7ub5f3*eJL(k)zgjw%Fb{#1icjm$T9N*42C z0`Ed6ho_U%^I-!q8%Z?Fdunpwmg?>=>I+{10Tjw{CwH4{>7;=~=Zr5sME*Nxb_4}| zRPS&mCPI|ZKn5b9YExf5DyJl*45ELeQ~5gJ=kguOZQKm0)l|ouVVcF<O8xYBcX|yZL}@%bGTF`@B=b>M4`1fQM1lnhycfE z61)sX!rC}W(CtoZ6L`~tbAK!5t4ej;;_rYxsdJ1DAaKDI>%CUBa~jM@&c53BY6;xD zwP6C__K^U=z}D$aXU$>Nwv$RrTE%D*f<*gd!f-%q8r4(_k|?#&%I}~7CW6QeX|=Pr zCO@zw(BNjVPB_^VgH1aqLnf%L#fWhpMp%_n=yK79Vo4#A1I3z(?@GEeF|&-NXT#2T z$2Z_#7@&s0Zu!tJsqAwdB@uKupZIVg#+dM-a4Yi^MWsNV`7NBP3Y?$~H$G=_DcEIw zrfL9;g6c`>%4k7!GO7+6YndX?^1l>V-?tyD=ZiA-7X4Lk$SZ`=39k$)tl+lFXPW89 z?}iR1zej=e`TQ&&T`y-T%{CG~4uhHWoSGhBa zT(lw(sQ=l6Y@OrBU9wsEq+yf{LN$YY|gh z3{L%O!OrT5imdT9_B!dG`fbAq|17b^8)eA%gxll?FWo~NU8jtFvJ@+}vZb1mKLJ2J zOZS_E?$pq9{rRGdq2lt!NxB*!Lx32gVbBIM}rl7JT+>CW)hqn7duYH`pHqLdhg>Wllj1btp^!oKx* zBcC?fo+0PD8Jb=2jbbe3Pw{wjvcgjHHa04wdk-T5Yq>cKf5nQrcsOeI423GF2EC*%-yckeqd3oSZlkUjp&$b!Ix6 zE0>xGQ8i|NmB?m(U3M=ho5z*|K?gAeNJhbQ2;ty*>ZtvJ$F9LR9rMv7Buuxn`)94? ztiYPlsNy+pHAnwm9x%3==mOBZW(S?K&)W4p01r#VtW3Zp6d?dFEzRcVU=KnBbF@5B z?yGsoU`)|e{pNb=fUIABGVR~JYdKaZ!!R4iQ}g?z)2O0(D64#h1Aydqw+nuAaPfNi zaLwzN<_yG68KsW;89|@7(9x@L7rN=(<@Oxf*ZkoRmF|Y++SOx7asqJ9>ayUqn$4#2 zls_kBXjD4skJ`ntF}8PZ^vKSgx(G;Q`bae`v`mV8+_e9!;ZpX0)^G(AqDyu=QL4$H z&LI8^Y}!T@RnZiamkCaORCApxCN{g03=7q6a5;5KnVasu-~YPMTVXDn!$GbMoznn4 z>1XsK;t%IjOTGf<@&HxiIu6l`00 zSRL{lskKwact-8aQJN|9xe(+d9F9jMPBM{XREC$T^!y}@t{&u|C`IH`#p>18(aVBZ z8Z)}ZdYe#1n4&6j;-{2HrQSEe3xfzli?uvo9F6WfxJi-wu~3)k5JQ7o?I4e zue`0Ytc0At&f>!WNz;qHwQ^11Wf793~;|8Aef-&d1 zfSnrI!_P;0eNZLr4Qp7Fx+^Ytb~QWN+J!Y7DgJ0>ax7{onJiz~2=n2~t=?^frJIgg zh-cHB;-q>WNRgj*TW8@f<<)7p5y5S=bFbb%MF*UWfQd7+m!fZ^Gh$wCIJNXBD;2Uq1rH?r|cFX|FjvztP$aXXKs=fWC`JD4t-mX zZ8)@@65RX89(T5^O0)>%&g8+$jB6YpD0;}SjgMaLnhNA8g%Kf2A}AgE-#mm6CPo<1 z7MN0`H_@I&cD>L=@S2{W#`N`i_ zIseBU=xnS+OhooZRxms~|9^N7TiQ%H812u=HRZlcO;xsrU(#BfiK57q?`MAV5HYUg{pV~=951`Io!1oarz zNCVvL0E~O+SDu z?3|AR%Z;7EK;6{~Df%e$#9btd0OG(0H_%B+a8bnl8OsL02?VPc9CF&&5R_#sE5tAp z!t{Z@uXpG11l}BgEypp28jl)VJC7^7ks1~D`ZoXJ_T{U|N4Etau+#3zO=scnXT-W+ zWs_23;lLtnba+dSd81sU^rHQ@srKmZLx1p@uQkS6ivU0#W9ONkInXRV-gMOrp8PY?*4}Mi^^4<`W?p{I_m{3-0hq)rO@w{%mv_jSxMZo z1FmCD9sR&2CZ%uq3{1UPjlMRWRz*1;R0h)d!F0c}%(B2Z4!h65bNeutZoDF-fKtt# zlww0*dM!;wF|qH8nOB0#KUAn~88QbE)5=SJ5%WO-rud|P%llX?d>^d;mS`m6U@=a} z{FA70(b}$*Ou~ZxR*Ts?b%wtZx=iZnPgU}eH7AW}!jRWNRLVZ}(p1WyObea+f7HsB zcC!kG@qb+>|1oPO2X5DN%?^s0F$pwM!LL?{Ox8>}#MiTnt;XzVxcW&3$TZ>lRsHYI z#2&V4{Bg_8NfQHy?}exYwuX3D&xgCClLOZtx+AgVx24I2y9it)S~!rj7p8cP z+>2XZF54{R+l zA@Of+A^e`Nx6MSRTrn5l(HYnlhSmUD2ydt=BxTHB1<)@{*-HhA3q;nz3Al#7`@djj z2A}~KVPXq2Lsl?A_hn5i)>&V$mC*CYpEK~n&22r_gBB^y)ZiDy?{OryR_16#gh3Kc zyFCT0c~7ln`!u=_fg2;-LJY*c?j4}iafu?Q&t!@itrKw%6v!80MAK^jX=)^x-j&Ox zsi)M2wJhMqi0p#zoQ@gCrn^g)drKXwwE(iAgmcvH-0$)q`ZLK;no#USa(u(~)PoBS z83`rd(OZMsltoo!J?kpNi?mtB_UzgELFpzio!nO~1*$W0@T7(T>{sBrQqyAGG)>K$ zwx#TJ%r@dVGln*7)chKyIjsC`y>72=G*+ChJv~0ORi`*TgMN`sf8JB;{F+=b!0xU6 zL)6ts%m{6V0(%+n)R-8eZgvfCSRC~Go)rz`9G)kEE2vE9dT&^wxekR^ZmCL}KpX63vzJL4pe&s{jvjFohnImN^4lChvx z0(hTx_M=K_@Q-a=1q%PNq9walfLxS@MV!v>IYHDJlugD`ud%~N4a5!D+h?=d0nuRi z-Z=!iRd|ek9YzzAL-0_K>!?kK_RC+LZ6HdGuVB$5XfVH0anrl?rJm0vW5#0Y8qv4m z58|}EU?UDl8O^e1ruP1YNZ_pU_%T5Q3%2{<)Pq{?vD(_r7a%Xj?N3 zJGm(v57&mh&`xLPb3kG`0ZkD;{lY!DusLk^>k$*wZb>)v$!`hf=jNvCX?_qdj;1U^ zWvtVfULR+RuTWm3fit(wKg>A&Dr6ZxtPEIrd>nZ>%+P}WBcU(%Xd1HHbAJI6 z_+7G6j>43k9=K!;JQ|f8peOLmxXndS$KNr-+sNX6L&HdRrn;WC`7i3QJ=&P*SMzax z7)$LB4Ys0dfI%Rffy6NwEsM_T|e<$E8K?EB9HHY|~yJmOJ>lP+$r>}fwSI~>WPmt6O1$KKi9BUlsF`^V_H3*&jK_p>$i8hZ~i zpMNnRVqo)iy214YyvY^UzkSE^en(umUbF1h`aa<~wf0p`?jHP}2t52NbUBtT{{;K; zF%5_FZN%>DV84KVA7BD(bT&YiL{d{T~Wmj5VCT1@qMe9g*ydx~r$P|K{Y= zJeey28J-fwo{q`Zbn!4R8Ih6-()twNs(d}B$)4n%S1(%B#(#uh3rDz|fs?8+|B=>0 zfNc6U%nix1F%UX}@&h#fC$0In=Cg)<5(3s*BVv2E>|<1HT)(9d>K`;7&0oQS3#^!B z%PW$O9#!vHqajva7JBA&`rXDafQ`&(_+t$q5-4c*yYsR0A0PhWqAEX<)2X&m=f(#J z@HY)k%P8sbe*v3Jb{e<}0bm#@#U^%+`(%`g=gs7;G{h&nI5{0i``MX^!!KmxF#$U{ zM2mQMMs4}P{7w>gg_BLl>r`jF`Yr$JTRt`KBbcoz^jT7qGFklO2fT`*G#H0Qu|u z1GhV;Ygb=9k<$hzJJfX7(;|ppg#r8(gL{AocmLG`H-&1dJqW=fTB=TYedyl%Yxwzs ze>Xbn;%k2G^t`ut|6SOcx@%Y+j45{hz!-GC| zKowb1O8lR{`7H(MZ1+`}&!A}}fZSZB{3`zUK4NF#T&?tAh7j~Ne27{~`~ZLUmV?K7_yXYnbgYz$0$|4fAprMW!l(m6$gr;AZe=^6QPat49X}R8dV`v{ubRkJGm?|uw)qQuG;4YI3idy~am`veo`h)%NeLYlHF5p3< zGTs1Lf}01h4A(gtWr7}D_g$7-%&!X$_HK$l;FpmKOYh+1!}n?~BtY;aQ2{TQsKlr% z$IxYLk5I$sg>|dpiDKSL*KNi!s_Yh@#1Xr_Tj8ajq8b#8T|?2JE{&)@Lm{f2wJ3B4;qgILrwAwEJ@)F z?5ZIJ3_6FJAOxpe@wz%Go3c2>v;qq)#vFT@DUG*#PIO0jUK!|ZbOcl* zVbci4kdSO8KHzOUzsNG{2W0ZH9obPG$kdnRuT0kfG!QBAa$QfOd-xnf>xu%7IW&km z4$2IGj6f*}q7p;WiH^lu$WMP&VeA;T#v|=h*`Ki{xxj0^WDRCg5MoW5b84l7RXKE4 zA$JXv5i%N}wm<5ok1C(SfJMbIbj>Y(B{!pMQUoFSvDKNgOWb*?Egbna!++uKdeT}-9Z8yTIK4BaEvg;a)oWa3z9CTln z8uw%mYchH%s8_$lov+D#47wBM7Hdq(BRY_IHGjmXvJaiNy|}vfTn+h4rAyKJD}xNl z&+Mmoxubp~d1yPq)MxmF*ce1K_$sn!>dIv0>P*vYISX!m^G|Q!%IaG6@os*DRwE34QJr3(-deHd({jC1Iqon2RZD`3{G7IEf#jOe z``usrRmv$Mk`my0lma{4A)!m9*2JLCdUrnbd4Yzi=(R&U?iU?enUfMMM1j7kWk7Zk zW`xzCtgm?rAyKEN7la>{heYcyz;_4`qS1#J%1Apu4=G97UD1yXt=A*(=jg&-o)_q% z7_4eoJ!jSJXD5A1dT?yC40rO+*^k}tyrrnAxhn{bm%<<|AM`?1z(`_%VEB#0{KRGw zGiVW<%oW_trVfAnP zbTH^W-k*mz1%Q0%rqZ3YS6Fv$V^bI^A9+sryjOJ{b4>&BOV}ru&Fp%b4D)yRV)iLZ zF#FAFXJ03J@1y9z}%rUN+-zY~e`g zH^Nr}z5Coz8!Yg1*UNiYUrhm&WRx0Ix>w}r*P6sI{jM%#Uq{efd%HltlgpSj&${po zZ>Yf>G!G{oEtL5ToDa@MZZmw7{+(3c7sGlwi{W&m?wn!Xbm1k8`k9fkEN=so`!!R| zclccd)8USkqt?5H-KLY{56~eRbPc4>>Fr#mN&Z0q4J$~ZXVG@^y8Hxa_YNDCfsIe0 z=)?&4xOxYLG3RP;k{-DozU635Fqtv;#|*;RE8Rp9x?K<>4TwLvfVRKJ8``0y_`Y*i z{5D5!hJDZ1`K(>YIP{(eUah#+I0gmj%avXpPY6yh?Axl6sR=eV(wI~4PwZl*bBxAK zeOL+FH8=e?M<>Z~p_vMJ&^8#2pA}XSmS3jM97LfO16(G<7yXs+l93!B-L;_5_0}$D zLMf2tKMvReUwG0XBbFBP13CS4RHV3qd!VMZ%V&MEtf4AMHWdUieEl<==yQuJLk~;@9@jBc8j()55?-Y~+ z`&Xt!fR3zyZGG`A6F-15amlcIRrrNq##WCbXh=%EfwDLQQY1-*`Um6h?{~#^y>+BD z#f~tVCjP&t1Ti8{hn`x_XtaINOL!lD0+*1%f?cWz|ALAm6Y@V&_Hhmb_%~4-shu>7 z*H!tEs`t>^<6CJ1#DbZE*gWB)M}=7oxI#3DKsgtcuA z#1XF?sZ`^ZA%;s}H(f-qO?~FaUPQLKuIjo|n5NywKo_aIHb{XMd5a`c4Y z!M|r$qsl_8cuFIaI0+9P-TPv2{0xjc@4FQ(!Y#NA^@B7K0ZT0U9F^jEZ9M{%l$fLe z8-k&M{QCWqgopOuq1gW_NB{fF{qeT^U&hgZ&Xy$liEyTwck{`hw)wN+I*Eb_1%{R6 zUvkRK`}64=l2;T?wPtf?zYTCt*Dj?ZgoA!mmdrs04x{w8-H3yMl0 z)Kh~gEBDWd7$op>uAV_1In%sEodj|W(~Yx`PkLu3Pwv<8NB`^bwpp6}Hf8icF2i<~ zJfr@qbLp+R44{~Bx0`v%29UyJWa>CmQj3~mM_DvyAw-tADTWCPN@#$WxgJ72S#FUC zEjj;>RW@le*qv5jxba*SUC+#~mAQ&=VcD;9RI5P;!}g_8PZvF44@01oV@hiNkLv#N zn&{Hob!2V5-2_jEv)1iCkM_~IsadPm9?;NEY>TV120%A=%@SvuoP~Xyi*YSXWaecd z0~P{^Nh%_Zzv3eH&oJkVZ;LSSo=%VjRR+_FVH>NaF^{bAkLNa65P-$~dU+8;2qnTp zIRn`$5ggr6QG6?n2QBZ?43&OR71Bw6SF*l^y0MJ$?745gX{DHIrpLib=cuT=Tv7ka z!Q&ep7SJ(!nA*efh;m&HG7`aC{EV=32x)rx(f6{t(WqHx6Mr8&6${xR!V*%O_^wxw z&UHc#dR5a~r2>W#63M1 z-VW3tTazJSbIjjThJ(;{XW5Sv@Z~NGv#7d`$ik*&+W6nyyX_Vb8O(#WK;q`e0(d!A`-F$I80PK4@B7|T^{HG(4u8?#s+BNT zaL>FcBJ*oYX|r*en>8ZY+U|URy}a_H?I6bhU;eW(+N>+P z+liF5h9#ldYyQPAzsEDiuz`E;+c@&3DQMA`T%wH|jrP{X#o)}*^|X;qwAj`G0^p5B z4-pVJR65llOfl7~@eMRra7`{W)vT%C5B%7*nU=catgs85(>r{{VPQ=+dhJ&X5JDm4 z8o9@F#U5-HOq7KnX6Iu6ViSouw1`o}A^Yeaf{8E1LMAh_ zU8)Z9_WaQs3f>lKP`f|orms*W0PH>7U{V+A`fgYryHU5hq4faakC4&S%e}iX44z@Z zl_Jla`W1ln@Wv2!59F#;gw%Ns;|G_@Bx?HV+vkIUo1RI_6xqK-=E3k*{=k3w8J&KI z|9X+$ho!$)gfy5SMt`FLc}uRUhE+Hm8t4f=8M^LZzqD38S$>>`KY8~Jbf1iE%Rh)W>Ei?WyJ!dU&$ zQ1;=BDb=313`zXp8(JW)#EU6e1%Mf?!BY0Zo1&YJ>xT|W(8STl@l+;TGuMK(JVR=t ztu{5aoguM;#87;9;ib;z61nVvqH{yq1Wj~-c19W%jsY6tEQtKnAqDDL6cUYQE>cE^ z;bl?rRgOtW_Kj|r0N7;Dy=7)T@*JAYT@ zE+rU>;3GNvqrE@y_Ngg;M70>)O6m;m6-;XE{V-#sHY(yMYxJ>_4E4|74CRDv&VM9`3;Kg487PD{`97WOig~sVdIGBqj_?PJ0Qtzfu z%Oa7)+tR>?mwBignf!M<`od`YHM;B3)e2(Sp6mo>2S6@7G4DH*h=nx;O?o^0Yma+4 zIc##KK4Z>GE+Wdjq0ua|{5z>k*vSDY7Z-0OSOIvV2!B5rLOU8NT77k39^@72NUw^p zqXgTRR`XTl1ZZqNaoW7F>;mIU$Q!!~wxbAp@i^%-)`&=4J(Hjc-?{ndu;-9-pf+1? z$1@ttZ@T4@??p5#d=ZM(JGX=oxuJGf^d1r#y4kMCb!4TLZ8l9pu!BOR8-CjtmdXDq z25BwSAV1bzw*Sh8X#pDl>l*euR)0~H2`bMd_cVW-VYO_|w#}sfQ4BJonL&8i*rP;O z{?|2JB9PB9e`&&!7&nm6b-h8BV1bixQts|I@BPZYlrR*LOwyJi61bZ#N)yYBN`xie zV)1W^vYFpNs4&h_zi`;+&sqn~`}6N>(i{sqPq;Ndo@GGP)IE#t6C|{k(>9DQ<9l-6 z*b}OXsp>A;6N9}M;F;=#6nXO^)M!v6dD6S(nGC0Y<~`gX;l$#Sa;h+0(tpQKO{9M- zmv;_m!ya_U1D0u7<5og32KwZlh!3uYfT0G^{o(NXx_M*h@#Xd6;OP13aK)aT$K7Xg zk^q33H3H~MaXJg|)Iihq7wJP(kl`pqn6{5i($#>{FP5h z%;04yfh(xfqzm9mDqf22H`s!cRZ=)yP#q^Kqc9BAoS4|4TQ7D`)mZf8gumnN6HQrb zo5g6fP&xh%RFr+W8Tz%adgK<}d8_pY5le9hx&(0RE~cV`&$b7Ay%odDDiMo9)u>P|*c=og(+`8Qww6Yqwcq43hOA3{YPUdXWcAvUsQD=zJR;g#}KJol}!7H)!?TC;EJWKta+n5FGXL_maR-@Zf-OO$UwT zR+@5_s`HzKV$+lKjVYO5#wJ4NGP2N~w@-k{;h5s*4#P{oWRK@#=D>*jedEz4Qww{@ zvx|@pL_$8Nyby3*@d87|RU$9vIfU~Kr)v=!MHc(TDaGYgZ2Koky+oh!xQ3$>I%*vYTFu_{(qjSSrIMfpN-Z2O| zZurzbood!~tvu2#S5F+f24DO}Z=yphzCfZg7}4Jf50X^-R%|pr;R#@q+`^jl^Ya{C zFLxLIK62yD8eLQM=qf#6#jDEZJU`ZO;*>AZSdP(4VLhz|ADJiwY|q1Kqd4CP92thN zwI?D&*@|){EPFO1nY6CW=C`d80Qn_E@2}rT$8Az;wI%?%u)O1Z^4yOJe49gTDgWe`A8a z;4leI#V#(}q%w3!I}G-WrN8q>h9oIGjH)i+JPdBkpO|&R2y5fPh99DgeY?393wHAd zg}nDPL_1KeHw;0^xJ=--;El1Fs<=zyN0kSmR}+_)bJ-)_Z##K$K>a)Ld!>#pk{wy~ z*&4|2M#`9yqdbt`@m(eENL_!Bcs##lx*m zIbAx@$a*7E`Q1Cg=3FXC5UMt2WDsBB=fR{~p$9X&XeXC8aX&zjHmWwI2bC3z_le&6 zla>h)npiTHttycIf1A>ZfL3Lie=U^l>9zebK28_ zR`0sta&K;}V;3|V_$@We@0Y|qXun=7OKUJFB~rXeEw>-?%#=ykTXF1q$Gz?sz$%Tn zB%%iCY^Nlz)lG$gRb#?!osJMq-T)(h$Lhw4$K#3X|LW(lX;QeiQy2I>LPtVh9~+5B>)DSxviC76o9hRL3ITgXTd4TE#6lm)Zfn0u(w zdar5~pAc8ZA9DWJIiI=L)No{#pn;f|l{YP_roPKW5*Wx$Cj&JTkgn4Vr!ebv zWbJnD%$n-e@dNrUW!5rjmK4b4lm`vz(h>wz?WfM>dI0l5ETAH?G`Yy-l@c-X5URG$ zprDMmmriG4I=XQk2F4RXzwoo#HLNZ@2=x}yzj4Wx1Vn70^ zT*Dh5tyP1U%pC!;=OqGJT)qfA8Ln_9X>{h$k9&M-so!X+5U(#6Ck05J{j{$8tVr+o z`uH_*$b^#}hFOZLxt?6-ONc#hD9mc>bVstsX;dmGVwY|kqR%7k&a`ae^8GuccM%6b zwr^R5#whlqrJ2Dd3)rugH;T!!<=B}K;Oxg7ycCb@l^0F7g=!O-`Ar4OVUA=K8XYeHhXLk*60&5M*A7HQF3Ck%=nEQ^girwCVranRM z>a!+C-)#Lj)!SD0o4d1+^6-uL_isFa97M9>CZz=ZH~~a=D7=oEruXv8AHI)_{-cEP zxGqXdH}`D%KlIlOL?tbND0Y9vrQc-SJ<-fSAC=-%-mJVr%elmbBL}8`7Ui?kRiiZB zjheq^2wlkh;2!9SqqD_wicT#L;$3Cze6~2PZgV5`#*{gwT`70>hqnCUH>OJf2dpP` z>U?`Z3!9I5Q#=;&o-+!!d6$BOJo`~;wnCD~Pif(6dZgh3lT8?2{OMl*;5|Ne8uhEY zJgzqG#7RLmzhx4>rI#CWf@kN0bt^ZtgNYXEOr(bst2k1@i0P%(njJqX@zhhv!PUK{ z6EDG2@%}f;Pus>}3hGcEh5=XgJ%3`8z3l@)6@{HKJ7rMm4&4}Ig}o8VF3AUZTYGr< z0)W1g(?$oPwla($MsLIKctXKSyN`PV@qBd(X!;VeQKiH*D-6JB1eI>qsOXrDwiVnNrNc}yl_E1fs?|#{h$YZPx;ZcJv9sW)ewL~5 z?w6`fzF?roy)Nko+4h#YKFM2(A2#*m(6#k@ttwb|Qw|?!sKanWjl!Br>igI+cUccK} zVyy00yV@*9sNmg6_}+6iETUvkyFbJ+WsMmne}}9}o&<#{-h^FHdQvc?Wg-$mkO8tz z=scwJx;QF9#Z3#3(r#z#xcB_R?Bj(m5sPS%ghBK4xz;SL@-e`cb+k_$uXI-wml=oM zH#tOhHko60boJuk8WrMx*56jGUt-KtL4`7HnN_2w@EMrgu_O?(LIWH+4G37DHt2Me zka7XkXN#+66vH52f+jGTTF8(Oc5nIgb#irZ+Ppi**W-65=QlYD-N)zA&qtHAI_?;H ziVV7OU&4Q-asbj9Na2G@nZ0TM8udvmF=W!ooL**Z{_cWH33qCpNwt(jQP7R|NxAF# z9p^Un#9l4iUJ@S3ZJcho{?VqqzSB!9KK-{A6nw8^t=Ax$ZLtBj1f2Q)PyPo)h3)R{>}xfM^tg94+^J0U&a0=a+k& z?y|jFpicP}S)eI;0n%BK9!v(QZ1=TOmo@jd;%gg>pdj~}?SFDY>6y?My=ICe{XTkD zl#!Bq$$E^ul%jEs&m||J)7&9p5T5!jcB~Szs;41!HhJ}b?K7Kk@bGfZ1md{W7%pW{WScQGp^Q+N;OOF@_2u1iOJ6u9Rlr2)-1)8go>;-Za{5rvSy?_J%#nW zgkU$wbHx@ManNG#MD6sxzuO1C3z8_>^i;Qq~&aYRW2_Q1Y0p+>=*qgQNo&9wJ!pDxVK?Tb4xWhv{`6m?Dsk-lgC>FLkC8d1QPrmHXa@+^-WV8#_&$ zM{qI^8(S|T!2hcoYr@Z*U!;_vMlST71+4^vPH$a_HCAY6(XK8UcMfBmxxAt^rPIEuL<*Rk8ob|paa$_*P&~Q9mwvl{ZrQqi% zMtE&mF%HtUwUy#pPv@Ow?6D*ha~ct0f{3>r9}(<@iqQ55m#QfTDwhJ$s3$1VRze;M z%J})kijLKau+_@Wu`mthgDWQo@DUah8FlqjS^~6ifdLno6O8ntuQ_BXg_*)`0t zw)+a{O4CaaG37UYsa52N4U^mXZlVTW|5&ayf@x4FcYO72g%1xw3xSEIe%Z`NG>gh# z$Om=J>>R&3)rw24kW`MQmn{a(UdrU?p4H_Hl*gZ)d2Wlj6sS|_JO0!e0nT;5Q`bHd z=O+(P&9rH%RCLfW*e1F5lx+Z0P0>?R!$RNS#WtBYVMh z)L*SY)j#hPFuK>$ewHcjAkC_W({H0f28%7YbFScVX287BfvBeI>GgmxUl$W_j?}hh zS$lXc@H^J&Sv;cvTrIIYF_^QpLrI$%&yf{`U~$dCl@mT+e1(EZb7Ec7^>Vq{P~dA> z!_mYdVk}g;n3V%Zdt~Oa>H}P3#DDLMwV=QYM0Tu`JM!5n~r!Ue~%J!*{O9b^#BA7PlJg~{BhNh)e_7Ag$1kBDh z{q;9)kM~v^FnpHZDw{56}#5S)iUd$npT+#7TgS~WdE@rmkMSK=E zli_L~m@-HUFXc(wE#%>&+G+@yKTgA<4(`FnhW-@k+&fCNT4B8H6^ppzB$H9r{qA;7iXiL5(>F_KtvXHs}IPU`o>oLS6j%) z?m~yb$@sb$0seYWCWxLCO(LCwM;jrYqEhmFOm-_O%Gms;3_FZ&Q=)Pu5v&TS%tadi zgaTbjj>(v41W9QmXRL#)`e+e0cd;j9aBk?92!zIUAZfYWnVebQ3VL5WdYd~EtCN9P zy&e(*sQI@k8PbfS4?;kbe;+|X7zl%(ElT1uk&;j~l~h$y#Ai5CMr+(+67NP$EaYy< zfU0%}BVyO|3}3Hyrl%K{m7v3sUX1obq0_>6gf!P?_-8xh7^ORisc{PzhnJF31WvWH z0R^AlUp%q!D=G2?s`W}~HkTb#tuI=wbymv0y;{JH1nW{odI#VaW20;zX)lh&QHK<* z6vA+@7Qz>hD9j87<>uwhx&Qh3UJvuWu9Bfxd71G!`C?gp-#Pp;F6q~G z0h|M;1%_o0%%_Im95}Y4Y1}c#rmG04vC%xi@Dju8%=+@fo0?_~!$0;6zkk+y_X0W|5`q!biWX1au|_Bmzu+p}cEE0M8e>YTsWy3W(x)qkkw>68&Zccr zY$EOy;t#~z24Z!#ch!$J-=49d93q^JDLoj+_ea;(P904vjd6)9FN{P#{oFfs3^k<`sCOdwc#SdI(`nsfjA-V5wp9-XH#u*YMw z_@}?h8hs@6n6@sv3@JtD?5Y&Yf3no%a83Ma3ZNoXpph~kf-R)+;POTHiO|U(=lg9& zyZgO8#NS9A*F+sMXT&eN8g7)o+PgO5v?#sgh}1S>cUM!~>X_n|P5KGdr-s6#;gczf zUn>`bH-@^Se|HF6`YEliDEUe^!c+>Zf};Q9Fot51hn`0nEowy81p4)>eOoImxTF+4 z4H!DKe~qVz9F-1kH9o%*WzByiJgYq8&)Ov#8D|^0Kqf0TMIeKGR`03%mHkd7LWM+D zg`TXf=&w7;%BNmGH28huK4M+?8T0(;mkgdDCsIR2cgTy&p_?Ic7E%HJ_k_c*!n<~MsD2D;m1Yw4+3%VsE&EYe3gn1%%Z}s6&y@N z#{3nkTzUI}zkeQbIgCmS|8Blt;%dPowy*;wv`u zbj>_C_98Edrj;D^3tn#6s+~XKZzce`Xzp+P4~!3>(g+Q{SY=;{!=Y{SHZfi;)DHk% zvi+@e+EKX2Ab@8VowN93h7g%{N67Yx!Ss zFL#5Io)pNL9FYRy8g525jxj)p2Fua(J}y;pzt%khk!*Z zLBg&ZUjpM$S({jYbJhx~KtL?Dv^}0E&xFui4-6t#Lpmxd&8#B|Bqu&*$9qXDO<8xAZkn(k$ zaCq|md9^}z*)*L1RatBMy(u11tz}BTvnB!@X;W|kh!t3K0cW1#-?3K>ZwGlu`8Q8=AdW?s`%E-T~*9G^txy(foDDCqG z;`S1xBM^2XNId4c%l4u?yyRPEyy<2P)U=Aw?8<;Y#|GK zkGSl2na$k1w?>XT_!+Mu>2}^bvKZkxPd&GRmh1C-F~Z&?&VVffC>>(d&{(GGmdE19 zOM^+%QN2wR#r<@4YLPx;OFv)UGvB{Wc9sYA!c6D>s%l0!Fj)KL&ZKQ{MLU)7c~9=Z zhBLe(#023QqfW7xb1xycM;7PCl2iVegz7N3`mu2p#1UMUFf;L#_9osFKp>n2TCCR> zUikNKIa|-~BcB>>u3R)hj|Kv@X(q-mM=(>+BV<3+r5jNLs{V~x3#voJy5}04{91q` zVmtiYwzmU(zUG9MYfg)XM`#YZXmS-uQ!E0z@!`iCx6%Hh4(M8ntiGzTJ@#9C(oSIR z3DJ0rSIl`OUaHZ(=OOLnojcltTfY|lkPzETqj%Fs-D5FEKrCy}9RZfE>sRSvM9KEp zK;AS%(E1vhP%jp--|4(EJW22MT8MnPZ+BV)?h=3CEDJoSoRm32!|^?AS4aXY*r%lc z@y9xbx?pdfiL`TO=%HNp0oj9VLxD*q=vR|DnO?Ey$I-r0hJsNj=FN4_oz8Sj7%!@b zb3H5SMM4q=rP8*E$hlFs92cJQY3=8)erLG4b)kpNG(COD7J~7YYmF7mbMN|rqk89A zv`2CMgh-46gz~;EW$pMc?E?_o{rD0;(CBMn^pqA@Rj*kYslzVTNjnI2n4Ud7`Daa| z8EMwz6-sHoU-?CowN;K+J`ZT!;DB$s0>9&7Wc?fPRB;#yG54KdH5)qZBQE&XSr`Fi zFx{NF51KpAL5@zsunUYrKkdKbh>*3=%pu>w7*Xvw+4;>z17A(sEP!WOYPct>AIFJ0 zPyg17TN(`De<ZQ)D z-6REpy60}cOCYGbGXhA98v04KoL~-qxDl84xG%$6wN`#v>lbCSf|M)lDJQmBlM9X} zH{Z*0iOZX4CI;O^%q{44ZNCE;Sr3&&v{Qs7G|oR&yr7bl&qzvEIxMO4cqN?e2GMk5 zFG%MJmjM;;#8D+dmT=S<^PlS{e7|74F=cl91I9cRby!63G1*<~pyOMV# z?<<~Gqu`=$Ujn~;M#^t17aMnvZj-66Kf9hk%@0pu@JQ;ii6J$}IUuU4_3yNdwi@p} zc#gU7hqP2l1Y)Zq$qAAWc_$mUzoE92L{jj*qY{7Ih$@cQ>=tP`@?CbE9=oVN(0@KO zcq0OTFNWmW-l{yWLFuG0OAqfu1Tper%TFW6igeDFW*(gSU~(`PO$Sh858-KL@FC(ic2A8aDgd_usPJD9n;xtJTQ_+Ye;G;gxDh=AifEleWXqfh>xPV6o=#+HL@@1Q(`~I}+qp3d;600!cG=@xr{BRC zr!<^AdXw{eE~)k%PQ%g5S;bltaUB|=bv7-gWNQ-*78|N^Hig;{2~7zvt9PA+2OCxc zRqp}0e16sFx`zGtj^1~aF*#LA^vv@$phMwKb#bqHj*Fb>DK|N1G4lKTs;Fa%#UH(hyV1X~aYhVEEzkeEq(+{c@PJx7QjGGm#SkujeTtz*6J~B)pGh zF1@NSVwyPrvACivTF18xsmc#H5AO4h*^ZP;TXmQ+b3^QPdiTn392hABdDt$MxHo z0I09Lfhft(W=-i<(=b=q7^QB7xh3|@?rNFU{fEBPTuU}A=bxW-_B^&&@Q0hb4%X3d zxpG)STH`Qspr&c;9}RT!rW;>*1C!AB5wsOo(p@JmSG* z3)II9IL&t*)e9EBak#(<-ra ziE$zy+qn@r84O?l5++*cE0RWri_C#W3&57yEiZ(@v!o~aFsI(r3C8VuX5^#(9_>0# z+3$@uLBwSy2fVLYagc8atJMH%$z1h^BAXg*{{0wG-ka4lQ$=!dFsgM?dqXKL^lZ!ktpk2bKkbX***_A{4{4)I3znGNK!;wk=PQIYe^Q$MesTUsn$aKQ~vPnKu zp6qY6z_dy?K?T!Pp{Q8g=8$K!V=J-R)&Q%RT^y74pu65Y{q};*MWYX?D>`z5)pK#? zfi3&pQc|MZ4x)NhKekLTQ8CJ_a5TafMRl4J<=}v*TBePODyL>%nP|V}s>E%IiQki& z%e$t)!BZE9{Phm)O@}>U%SuaKwkfJ_;I}b@iS$h~XggUBLu6V6%@2$PVn3Cg>Chrx zMb`&!*TUB<-y-_VTp@&T zyvIs$f~jxEj7z+*>~z?A0J))qfp!acOFll}^w3h>MOya%yZ4|eE7==VKlQ?}9VGOU zKjXhcfpkmEwM=(UoX9f#);~f#^YT}|2XnXbUw?eQ$f143|GN0{%Fo9Tq=tZ42x^Nt ztTcCnem@1q8bS5q$OylY*T5}OlD3k0L^=P{pCC^}X*9H}B^WI@!RF0?F{}T#6z#Xx z%(tOTl#1iYm>sq}rL3&5>*g#^@jCx!V(SQ67ACjB~N-`v>rHL z&aCV5&q{(x^20Xs>plF@4mTmlhPfy z+;h6bs47LA#!6-G;0nU%M&RMchg%YSPLHPq=LwQr`tf(sRd?aH0XdbreojfhjtD<$ zBUu0^0c!WAcY}W>QKvz&ii-P|z`gpitWb@@ycC?Ycug>E;oT>Y%~OP{Zj)l}D5;gL zJBsuVGy!cVdAoS(HPtd(@`q+ZEzwV#MO#MHzjJF2bw>9*$p|~#Deo_6T1iY0Ml7`I zY7~OS#!af6gU3t$SO11>EHzID>fZO~9{5KBd{J01Pt=z;`Bf6jy`)z+PetdZwY#Lb z!N$)WT$d3XB%Zk_3>gl+xoG^gIE|nA5Xl<;mU>3YwH5R1cE_cy_QHP%!oOXB{&$22 z%9hcv{H1HTx&PaqnK4NSh5-Cm$_7u$5oHfONSE9Dk+mX^UVG8NwJ`6CqtbQ?^nRR~ z2y5RYky)(9j)EJtx1F_OGidO&A$vJF-#nb`Roqg*v!+*A6Xl*iE(NYgQrbV-4vVxICD!iX@F>>M2=a#vsgr}HN@bbYRYfCm|O>3 zUkU@X)%H8+oYc+!_0?OBny+d9xuHe6y&{znRc$UiFDMoR!YihgxIp@}8Kpjo`w5%4 z7=kVp&!|YI2_r{}qk;(;=~dmry?Azc-v>PN-N8bTFaN1h8wYEE`A1gMNDrE5;F1k9 zkd}MGCrJM#KkNS1Y3ys_WrzCcEm;y|bGkZND+-=v@48%f(*JAw6+8dRQr`h~(lyyj z6SI%;Ds>MVsK;_YS@I4onp?jMtK~U(GpXO=|45>nYEv+LiO_f{1kRk_5C~+TjT#uF zDf6CF7Jd`m7yW9Yfi3Xa6?10TDx*VeX)Ax|MFE>!d2X=Kv0Q`C<#iRy1w|?Hdh#{( zRgxPp1-&klSlFXIdhR|RPt!+Iwq}y5cNkCkgeL<5#yN#$7Whe=r%Ugm_nnBw)M+^4 zKPL+g<$l<~#Gl4$-FdvBiu9At2UXaecGzoK9wOx0%_NKLF{EGj{pTvb6Ss^`aj=$o z4Wm~FGs?bvqD44gXX}1-&`=&1y<-=;wAq&DuyDq@%&s-9>(e&9GPA5$Y5%cWe#C>9 zDlQ5Tn)VCxk4`GZWMk#_@&J!(5_3#^yQtLr(?{xPVC3%qQL$fIzF5()jFZg?3H+Nl zL|XVl)p^w2_Ir%?j+zB$Y~lLcffy~b2dQTQc|fYbgoi^sy_?NtPBGZ9P(4j+8hpPx zE#b7@(a_JFcwMhzv5Q%cIkd5f*Nxu|ia_@@W5lf-3m)BZQFMZ6S)gVaEX3_x=6!9@ z=O}6-F332f9ZYtfy^QFw__ApWX}^rsnF)8jo}NO~mDOayYgk(Bgq`NfA9(r%c=|xi zV>t(VW|e=V2W@R1Pq?)g5Y|ig2)R}@G=HtSgI-6!g&T%psVAhHchkkg-}qX-bpwy> zRu|p#0gMyudcle3sfs0#Xh!+VMBh*L~pR( zal=O}_K+6!!p;@v{`OGgAxEJqzxDXd8Ex27$EruuSEt(T871eu9{gL~_5ei1? z!T6NrWl>P%EsVA*z?pY2cZUlGn9;P(txh~J5gg$He`1#V8n|6NXCEbIeu-Gxo8zL_ zW<3m9OVkDh(XlKSAb40TtLOc1EtI~(6uwOhib5(Je%ssQMlB<#?sJVnQgFR6;Vc;2 zNT^PDfx$wgHG3^of3ZwoiYwJ~VCVClz27Sz`+!n0smruBtc+y)ZuPX424HBgN>hy1^g&Tw5 zVPo*7bGtZDfDGbc*hdbl!$m7~P}eZxLiw^2{c(iJs;UkE_~R!Eu>Gvg2j z@Qv;#4}FB$E_5Td_|q{8|Ep7ptjrEsL@ErvQ&_xSQn1Q(1Z{r7n5oTNi;dF($l^m8E&|jJrjBXlV;h2 z_AMfaGo4N-qxS*CIvTgz=_R}1rj;46LnC~}jpN~GOr+#g@^=Pb)FssXs8n#3D98DK zCHZ{ALBB@q0eQzzAYNT0joAhA3NBOYJy>JroT2~>#&-gDTo zRo)m^*SPTrIaNRKWDm=0=&8^dL;lbsbsNE$0n4(XY9ms}q!2yEjxW)ML+g>4I*71+^{Fl{uwUHPCp2zm zd}YV1Y&n&sWLopDLaTrDe0O7kfmK7SoI2pd^&)^Fa%9AZh4pHEHiu-0jgnUWh8+eZ z`s;CiJc;-wuZtZLBA^$6in1SZE;5}?eS(+U8pixDr&H7ijsecX%$nis^yOMlY04+8 zaiDa+YFmX|DFrirHy>BzF_lZ-{}{H76agBT?6A4#!qxthzAjS-|w8vZnU zjGC!pePQjEAZrnWhn&lQw3i1Q8(Fm_cX0&SJ`sELC1ZESC0Xj`=^Vl01M=cOh*%;e zQP+x$hn(W)P41rI#a(eaBvOB`6x*L_kqomdS(WcwvA+0=@dl4>2Gy^UGcd4#;ab3k zd3}r8q|!7LT=(m+78-eqcOeXzb4(q%TNy943vBg{C1qH)*D^6-v&aUH1Ww$Jje-ww z=9L$#%XBTRO;NlcrMEGt!)_h)q1QaJ$|kP9kKNkfm%pHhvQ0E4FyK_PM)+kfVM$cG z<5+ilS^DlYSLz=guGt^ee9g)Mx7%aL~t1sEET11 z!AK%T#Fbil(+_n8h@@m-jsyq7ES~h1-M_w#S@%jC<+yIjHl_Y#iFzm>x6Z1 z$mBD!a)ygN0tC(3kjN1mv`eo-Jl!Wsu7iS6@XkBsJNWVOKqCPhQ)H1YNA-HfoCyYoeUsty{` z`{8E?bx@i*lr&{z*lVNy{4DxidzsiN;iokOweNmP*Xc-+q!d{Q@eN%T^n#@3zt?^3 zD<@(65d&Zzajpp&S%I7F8A}=z^`&BzO(l@l4y}(xOtd8c)_*%7!{O1#H3VLBdCY&4 z_2r)GKF4BrUD((2%|E!%2%=*xql?$az=&ObVqWk^A-?%9@_Wl6?r;gz$MsJRVF>rDRD=PRa)CcH&E85AW&G%^RF*qWhL9fq5f!d1x(qYrL( zLe33ZXWU$!veD_0#S?SKW_N30jla<D7) zUKkDb9I-glUwalk?}b)KvdfWZ#|*1(@suih;GrJ6K|6DYsOO+W0^ml?;96QH5Ui7E zaMwI21v?YgeuDg+-R*51Z!h}^Qrvv)9o<<5|ArTCkv;8ikbnxk2;k09hL9Kd#agK& zMA(ZIzuUnZj}tL6iE=8(bzb*7nF=0)T^lR2orjlr(AreNTI*Q>liyd0=&L1z=<6#L z6vs)b{~f$mY!D`BzTvz!nrA6678CANd}Wrmtd18Cyfgs7VUgrY>M7j9-Fg)U*0^igoxInA^xH88{f%;7iKL(@;BJ zib;cx0o1x|ikXU2f;Xr4VV3Av`{lDA(*Xo*0jV_oFo!o;6hWDWXl3`P#anc>XU)*d zwOp854$Zd(y{@6Kys4`?S5^$alG|W=EHsy5VSh^?PY39vRZ{o-BZvYfGRe{U5ZH6e z+}Ry{#1GV0Z5yxcuU*3Yy?$c%L%QK1Yj3{yZ?aa?_!jnpsx;{5?ZrT;-h2N7dBz+kZ{1 za^U<3AO_M9dLo9@8*<(0|CZDonca8sqJr$t=9`4Zch z3l3pGv%_KjZ? z_luhmE~u7!D2L^97aZBkBD{F7DlQegZd}8`JTfqH?Z-G=hRXGL$g0aFdL^B+i$~^s za0}NA9=)E9ga@_^S5su zy*VgdZWXIZnC6Rr$Pv=12R109;KBYoYlc0j!aj9EKdn2y@Gwzw-S?qw5AN};orK+Qbf&PwOo@6^ILpo=kdWXIH?DLTdHLiz~;kd^U z^vtZJk`56K%8{`yX|fI!eZhIVy_o8H5`vEJ84OrYeB|Kb(RelNXK+9)a+6N`k5&23 zE4cD%WzN8!GF5xDiIf2>WVBAaWassSGZCqIJAI`f6<pmpmQzpIl-kjq_R<* z;m{NPIWJHdL+HK?T(go*GMn!bMcsQoJOE;HiCsh@a*+Rg5>QU z?ODZc#*gsN{*rqEU^b1WabtnGvJM7Ex=rn6hyi`|C+K`pK>~Hr9Unz8QY2S?NK$ag zs)JILDQmSrCl6!E(LbJ^!6F-%t0pJ8AAf^Sl--Wr?>Q1)`1S9+y|nc4Jow-R-*u#Y zjPJiOShY?@gH8h;%#+=Y+;-o2cZff_WTSPRK$U}8VEm00eJ9yljf~D)F65Yh{moKW zRk8cvo0XsSt`O5-Cb%_rM8kZv|H;r$cs6iPp&ppO;Fj-a(_zFKd0^A*LMhxv98R16 z?Z)F}U2jS@E_0AAZs%8fuA;>@iM5Ie0cj1cTUSlg)TcUd91?gKVw|2_=&o|Bp%eu< zyDD6+zD*p|(qAtXnT}>7LTEAyru6~ni zMZsE$?NXodAX z4rs^>`xc)U9V6Y^cnZ;tDYi)8$@^?QW>@MIFcRj0L(lF*0j%6b+Kog{db`3V6?Cpx zP%N1`em&y)c3wDHxpzfvsQun=lE<}Vsj$AO6x&v+Qd$hJ$1dA1E%~<&q&2Z<%xTS4 zcD7s#)sxokw8Yu#U{cEber~klb7X%pK;>D3`{Ai?53dFu)){vP{FTJ9DSz3uVihva zPVK3~Iz~Huf+3V1F8$v;f5HE(!2iAnx;54u)+GM(9ylY{4qfXugxl+{LoW$mph;3G zj06v%(qvVRb{kGpe>~;gQ;9B}Pm09~BKl1jZ!wd_-}D_~3RO6x??6jcc_`8+zGAJl+L1T&|WYiVUa#Ev_~Klv{bwP4RDTTi!_>&5_o40}RA z#NyLKjkrSz{(zbnIe=>Nw2-H4>}C!0EDi|U`G15K0^uhWp=#8Dfl5Ufw}6Qg8_v2 ztdF4@xz==_D_lr44qEAUeKJ~%U6Uyta_qa%?A0=80 zbq$C8{z^^l(|E?E4d*`8Y|M*KP}W%&-*g_7gVI`}REy>5;LQrVm{K?@ow?gboK78> zU;3|~^!X#-i`3}77c4+-f=m$Ux$bHVaeFH;54ZTZmZAC{$g$>L>tB;`OwGk)C=!%1(_fyMP%}q*Q0z zL_BbC7LJnc_Ae%U^gkFi_0@q}u2J zt*`H%3*`%-b)>AL_P>&$)oYeu$Xcf3~lF79u?cMF^k@S2<)*&a>HP(Fk-Xh zlI`5>tnFAQW_Twj9-bbY_h*eGp%O6}BE5BpTry#BN{C_ts`CB}ryHepHf6bXB*D@o zq{|rXRSb1p|86hrdNJ}b2&=VkfNe#546DAFGnznl1Kem#XXdanPf!WIx&9E$E_jGEkp3W6DDHg5qJpsOHbjTwK=#vf%;1h^>c*Bb|DivV8u1@Y5t0sGrgvNE0^A z%jq*vTkTGi3C^S`Mc;41o4Nfpo#%PN=jrf#y65i4lRt!E+UgPoX@SG?N*>vl$u*Z_ zvn_V9rHJMOxzHsY;~iHcs(S<;pC&?@6)8VTSKh+o5y*n4AOe|8FUICvKkevn($xUb z4}wzyLG3Us)E+PPw6fO>gc+M{`DG!zn566o8Yu?UL#^o1c9-we?l0{yvingWL=;RE zSC(iQDFo(vZqWyqC2pT~O=Ar|rq74On?NX!7cip`G%YBrAaO;Tl(tvk5!4rEhIN@v z$b2!~jXUCMC`*(lOSg>A&D0BqLz(L(S_Y=n?+Mu#2Lm-k(1t((8T@*0jkJZ;@AWj_ z6^lApl4QhJ+ML~Y#R4-Nc1UM>x$kXBOh>-jZ+;fwJ~AH%WI~Wd(#redpNYRHT|l28 zE-U;DQ)0ZVyB+Q)*=rIyYwlt!|Dllco?f74zOi@PE??^W&OZ|^JE?Ur!@zDUzB^N! zd0=k344O4WiU(H&AgibJx<%P&Pscb?smO6jVdkg1^V3?G^8lde*}T13X$~c;ajFGQ zlb>C&`Z#2D&o2hr>{Au>nqZE9F09GC-i||XkC;7NIVy^14&)*Zr|f&27PN^w0e>At zV>)`^a(&g8I=M)(ddgn8m4HJV7LmA3EO^#EZIzhoFR%r?)ZcPUbCFQhe&*fVB6)2) z=~e9iseKWo)1ws#{5{4r+Wh;}&l&l!3ww>4-1HUF`)M_lwaI176e3 zn7uMGPw+O$1s~(0W9EdlKN)u!WGkUQ$JYUyLOq2}v!0=Ka1Wo-qwdAQ{SS-Ie?N7$ zK1=?55t0Y^V}sq4%!xY$r;fs@u#=YK89cEb_tgV3E+tAFy*-T!Q=l2IRNL(E2TB23 zx0dwP^fxwG=#%MM0h?{kGkcKSF30Pjy#fY$oZDt@#%ROQMVqgg#IW4anHY!OKUIt>3abO1% zB$B{%^&iWgrmkG}R^2#kB{$`pTsUmU^SH=AQWVmC+|@c>)>ZYhLKdJ+ji!p?lu+sz;$VLz6|jQ-*7A^5z4?+czJwAPODm*etDIPeANf z^9v4eKz#i&+XbysTc@GCZWHZWrL!Eki@`kCCXppRcfPECVjJ%0jJ<(jGw}kR>KCYZ5B z3r1w5Sq2hHMc?-uHAygk5^BMUlCVa@QK)p_{F?N~IaQHFh{v?+mc8+%f~b}2(tt$x zKh>S1x*=s_&C?aMQHAENRXJPOpalx(Ke`BV#{$|2N%s5HP)0OEJk${LP3vh=M!uk3 zt8=ub;WQzop+%eWKh{1jBUyocw2`L^hhNR%lqej2mV!R@>~ip#y7wiqtUWfj)4#`n zIi+rpN1hPf3Ti3Ef5@=eb!l)|3h@bk;4Si$x5*WjsN~zv7w^x7%!F82wO4K5jrl03 z3x3aC$BPEe8Y@*0DMXzY4Q|=YUG3F>3EHXN&8Ob%<~zL^I~`HpzTA9 zx?e$4F4~+zvSm1_lN#+H@$uQ%xBcZSTZ3W#Z;<@|VHmqLHyyv+q<}}mB1xM#u8%}1 z8zJKCQdqoFdyY=Bi~7h0%3$PRfdQx%FyAisCi1s{G&VHkz-`kH~h~ z2ZAk)z7{7s4BYfuhZz)H?#`Cb^ruW@lq`1%+|8G{LP8!(`VGP19;C!H|0yxx#*9bw z-+zmuTj_{|QES>JgQS{q zjIl`0EIJW^eq7x0(?7#u$tlj(6Jwo%+dq}%jO9a4N^>C7pfmS=a4K2r{)y`sNR^%C z6`^B|63@4fP;+^+ zrOfh#idLP}dLh0LHtNBnA@zWWMy;98H*@O8B_}AOZ|OQZBvj404TPvf4L6oDWQ(6hs0IFZ) zR50WjF%kCgYki*MlHuIA@tv903?(DFmarcCxOfBkm!}?NCy@v*fOGn{pF|8f_yW4< zf!E;#E@$Av^R3i2Zc%=h-pYi?U3(K{TDFe_77V>!QJaGsboS@=66n0iek0fy3F6O zSJfX1e4>RoRL#eu9I?w$d_Lq3g9F$cINL&;s8%a(9FYRK4(|y>EbcL$hNXSD<~bL? zF9VXyHIKnvYV%vf!8r$D=$0MtVax!%V&^#xV^8+$aC8M%VvEl(r=8Jb3;Rv?pU36l zOu2VkIF*-pB^AY$)$gEq%N*KsNfiVRZB?=`%DjlD)K4^As?GjLV4CUcN7^^VEXyOq zYEo|8d;xJ!rz5!LzZK{|%RumN_Ay#Z?4$Gpq{Tu;)<}?}T?sYvr|*WPuL6O7{Um+d zYmPs~Wv#~hh;1Ez{_cA??K#;TLSyUf!q*lnoeUZah7JBjBt?iG0WI^?Isc+L2SFa2 zZajix?4-k021FV*(_Z4~VEN|hLdD$>pA*s>p0Wj&%@Q_#E?WoA(51{`l=Y#^g-m(` znnoLuY8*+hket+1EBCNOFjfN~Z~~nA%8+wq4iyg{>WAX-+@I+l$z3lHMQ}R$kR1N5 zzcY|5w&vT8b1;q!wz~|Cif+yW2(x=Vo#{jd8JAbxj?$W0hTRsACJ)N;A}$wvhS!Na zx7_uMp31Su(5R&->uv7;1m`Cvf0W((P8RM>PM-8bG{Y~HS`l5wl#md%XSQ~~sy&cN ztT4V|J&uz{ZT2tD}rWb`LeYV zcPf{BpyptZEC*Fi1N)6B`m5^t`Q8#6{zPN7cwsk7VFb0U?Yx!q3~VyTce0bm+uPOU zflj82LTZ=m&cVWfCRoagE*cCK%=pCrj@r{=DSm`Z?#msLI( z(2}TM-8KDoTvmB!!=~`=`=;^n`js2)b&#wyv~&-G&wulCy}1t^^qJhnckn6|N%_oWhQ7MW0Qu@9F-N00rp<>ySZX5qr%>0E z+v^<@o8Q~?nZWhP)T7s3K(bl+85NZY=$tW)q;i$I5RqZguVQ$hHEhr-RdOCUqj=(P zFt}v)W&Vs&(d5C8^Ui)T|HtNY;iEy4)208jDx8NsDW|LK(&qrCV=89gmxE4s2fM=% zn%K0lNmlD~6>OoQ^rxTaV5P%Ge_dfkk!G z^7chLfpZOIkU6>9Vdg|ocohY*%*FZ+lmSDgIoZ?4`mM%U%yaRFPPCtUO}INkR+oy zjaRwCyILL;Ob9q;=p1!4sRS$E5$#o0;XmT!2PFlSR3%z*LKzNbe&fk00{zg>p@~~l z-rH>THdWq2xiY}@XjEbfsJusA#4^C<=23PpEP)e&}#5y9;bvtjECz zJVm57oQ%$lK~Zh^DT|bu{vdUjfz^);W8Qe7WM?CWf%qn3^&@-^>06BjnW>Hjqywa$$?;xa#6Mw}n~Ba(bIRsJFSe zwy9%m_9@)g?Zx5FxMF0!eI)9nxryHqL4WFlpaA-pcP@96_CURL0UT+ z@cH}we!c*@b&N zmlLt`O6%s2%o>y=1=HbcQi)>s_6N*qmS6pkP;_-KJvFqEaW1%bi~7k`ox#lwkfeQ* zAJ(G6O)P1MPbhL5&LA2hn-2(Kq!)ggANu*9e~~pHV82&x@4&c z`aW%yUY7Q4B-g7K&sV*%+Y?XF{;C$ckbQ_5>SKAys7d?*3V1+KZX9+&S25qX`j-eBh18Hzp zxE<-}6bwmJPELp|wGN~fJjni+(OIrvq2rd_dTSJKsB^!Iwq_!icGRucGEO}J4h@fM zi6Aw);k(rB^F4Xs6H|^PeeD)c@WH2WsSpYSWhD^Mi9orWjp<^$GfR+wNV7g>)TwRK{QRT&oWcW9e7x~AU zdZ-!DE&dCEhHoA>Y;Rz%$! zS7dOub4K2O@=B>+Gf(>r?kyzkoEVV$KTLgNaAwiEW{gfcwr$(CZQJTtUu@e}$F^1nen#S9HLDf*sH;OSjRt*RC!|T?7W2xaJE@@ z5vtEr3#7_ZSkMkAgT@)jG%et#iw=Ochd@xR4ar^HZ=!@8LzM=$>}2w6N6@zUGNT1+ zRh1$5nX6!j&@tpc_)OJjw+F>0Be97sZLaL5?d5$!o2==sk^xmAX2f*fR8efuw$|g` zH+7V2%JFzZDduaA4*Z}Knh@QMOzD=_&&t=j4ZY6&diuY`lDu=T#^s}+wZi~8;kG{a z7_-Oc<+yQua^2OB$K7I@T}zLGb%Ll=YQ!Fv!^K~Pu97uh6F4NQ@`+*?_=zEJbkf_C z0e&1Spp~z(x>K?pIqTMJTn4x5>;_;MglA7x+^cj;YJENZqKpvELqp1t7q(RKj59>RSuO1Zmi z#&S+<67(f0>NTFE07`K0%E%+3j*6s}^YOZwWMcozhb>Mq9dHGA7b&&9J?6P@ zAbe>Dfz-NS5DE|`rqn)~AF97eQ}WMdGg9|YG=Z6%s7Y-cPC?x^v*9w)-SEzo&=G!$AedZ32TT)m^n+ zmqbwAjWbRt5lH{$`>FnRYKs|K7{%?5X~W>R5*?Fr^VG%tlC^w^WEsE&w!_D(nzV~1 z(}opB=^OZc9nh2Ec-&%^@@BiO*19)GuPzS2cU+D2@Sge&--Mv2hwt+-*~tmp^`wDO z9PVaMzN|-s66QBSb$xgGOneNs`AzD7K^t>^$jV>mWf z&1Ti)gK^JzbD48l>yNGk%I$xsC@JiV8r3x{+u7z4GK(muiq>APwv%EvhOYgip@Cka z;X)W?eU@v3&oL9V(d=BxQbpLGntm54XzR*8p`hmqdh$~@>j0ocx@$fg_b_bIo($Dx z3DcOaT4Lz+3#KH8veRDG9bLUneW~y^o(iyV2*c7q2t$(nyD_|}DVZ<|&__)-g@9-; z$O}H6R#dR8IOx(}yNbqbmyilD*mDO#4`v!nfZK-5TT zy6(Y#zrb?Hgejz(JB!kVE6b7E8-#UyX!|<^D}Xs@H;Y)?DJLX8EabIxm*aF`xi`QL zTJ9-aGQDu%>W$sGZve}9q|XWUz7LZm&&>tW&O#MIOtP_tDow|KNUV5CV^!ec&7jI(I!Hfd8Gxr)=(! z*fgQ1#`coelXF>hFhcZ-gOtR*4qK#RI5|Ye{n7T2-g3WRD?~pb8b~PpDU($?9!Hn`V%Y!iujobyGYLI<$DFZD*W4BCc?Q6nNu^&96*okxU+3@s=rx(K**fgk z6}f;KkivZoQ%JSVT|h$cw80fYuT+`6J#U)R*H;46v*_(gYb}up(Hg26r{R#HA?IW= z7os+#Oww~VCr!06fBse#fvov=Nlwbs-W|D6*Zpy*T^mZ=6 zC_X^5!GVi=>^_Gn_QSBAC(NzL`3K3kYiFF-`)_d^h>s`0z(_tE?h!X1 zoIyR*_2ZkmI|gEo7y(t0ED3y7L(RPu2Y}glI-fv@ms5Eb9E3hRV{OMgM+$$Ncq;Hb zpVb~;-5hDo=A=yI;;7AV2agd&*uENqe?z7~rAEge)U<6GLvgkR?=d><0pR#_bbg4? zhE|z~(j0|<@*mF~?D{_=&Ge3+==uj#t%3(6K||g{YY767iQ?_-SgY9!ZcK=!zyL!) z;ULV-qL^#0#2N^q@yJI+Mcb4*A!%tq|A8~M2p}64y&UeZ{%^gS46b1vL5>5SYivJo zX0UC&85~DHlK5~PEiR@s_M+o2ZPMoE%IX?semN+XiVMXac7l5(+bTATPMcrLvwYI8 zs9&ZN+|cp4`Fa>hWut+oH35HJjEtZP1#3c9iHB;JYaPr7p8dAss4+wTLZrO(4P;jIucev#VHER>9T3{ zz^aljwiQ|4>>mq3fWu}6PY!u+GDhqo;lx{ghhHVD1i{1ed2s>jUtlwmr|4Lg;Czxj z$^(t}dpZEb+98Ko-MUdWyaq$U339^{3T=Mbz|yI;Z{|=>;G4|*l+oKw5XXn!8zTo2 zDp148fZH8K8U=8QY%F9`{vH^oH?sj<`?Y5@G#qr-k)MX`*u&fEXrnz7i;=Z!*uQnq zf+R0`!FZxIL!F|l*@XP-TAzUD7=dZBd{X-U2Is42?HO}0U!q6y|_$%cQG<)035;^K8hNXj}_CdNiBD0bzP`&|%hBCyq%Wx{g>w?&cgp_^ z2OMpd8B_W>vaFYhor;_SmZ6yuF$2xopBXzO1L|NoU1Gqxyic}dx*R~rk^RLn=TeuL zF!i?vT}t_9ZZzKiWSuP8y4kHOyxnv4QDA4NWfuH#V)fxWrJ&9#*G3+G$RGJAK^#LK23D9XxDH&e9|%6&80F1m@n;MZI!5}_b-_) zO=Rt8GCpYJcN#)&HhM8F1T|ft)YdBgnrD(;0O}pfeyy))C8BGw?6hdU+>(uk@NW`b zDh1@VI$LO%EIB%2T3*ps`&ZX#M2A>dYFM;0=#*GyvxMI6#sAn{vLPd`GKz*){}HJC z9m`*5c}M4_c(sH9NDN|ljSOmPqhu1fB7%&a>6k9@fK(@!)FgP;jV=3V z!$U{`DI@r<1Y@M(Lr9(b3jj03=~6ok61NuB+Gp9nDK7qVshL=YI8g8_xi242Y<)nV zG~@=A2r7EV7S#dZF~A_yDFk&byH)L#pIt0%JZ+@vWLJ#?IBMR7&a1WwLv@KU(4Xw8 z^9srFiqt{*h~@+GgP-pw-;XUG49hub_N||}KIFTRZ?^SvI&T67Qb&5WyDoDLXmg_; z-xwwIc|lAcRg#A6$+URP3Z@e4^!OppAdz?N161Xp)dS0VpMDAhUauLtm~%!ps97ovAMumhT45i*e|kjur( z5Egjkd2j|;rtA1WVfponE_~zbAFh!l^_@Sf5N$kKM_s?z(FsK(w-K90gTvp+kl>={y1%!5LSi&II!!D}2 zgcCR&%ZL*T&Iey!RbZ&GgT@sH4eT64LRz1BNZun zRn9r z*5XXvGF_ghQN5vlRM99=YRCxr*C_2})rI1DP(e~U%^Oje_F)d=DQ-bv7Qm_`InahS zuYYnszLXP*(pxg9gzaiqR+K2QFAfBH%qIj@MuM`giftyp+w9d4EP`A$l@tC){@`(3 zcnWL?fTH=kOfrLEG!S)ntSsRdz;($vd&^~Q0VZiz1oJ820%(%mU#T3DVmdsJiHE7} z7m8`eg*hxuB%POhz;F(wG=O8HgdO}lYUw5YawY=nN+o-L80>c!ARQ>VO789O?!1EW zZ~f2cd`dH!Ob8<1@|QPNWW9L8L{fLN%h*yN#3HkLoBXJqG^;NA>;?@{GO(Z_04XG$ zT?>sTA>)K)r#Oj=3qQvC*71dHTWR#6$aKt=Ru3&UDv^njk0Pu2tJ2#n502ktA z2rrYT#bKZf43=szqZxL_Jf4MPg$B=XV+e!51c!QPLe91iaYQ=?}e8 zBwSd(AoYEzx4v@k0%DM-Q5N4tDR%jT5~g4Y7LfM06VqRzY-9TrD0y(UE*vgcAYJ z`Wn(vixOl&R4eag*KLEpNu|=Kixn50$y_p8K5;&hEsJiA0eU431aJEh;0On+2ZYk@ zch%K?c(%If!LtIjBo9tH6O30!?Ut@`TqPga-?c9Othy&H-^K@vcUE4C} zvJ^WVs=E#sx5^CtOC4CN)4Xy2N|w&J{>VWWR@v(l!{N`huO~qNLNj#C*!gK9AZXh} zsXCEqA(G>~MhdSqnO&)+)okLsIQ;@nhdaLfpE>d4K%Q&;kL-~7|GJa@9}h#!8jheN z5yxY1>y%|l<~YC3>m$K~84*N+qg*7Vq`08Jqf0{}U2ijXS$E<-ENoB*QitE&<+s~M zv)lI*-cd8Hmpx(`S1)r;(V77fZ&C-Fz+uJ&B8ce?N5A5_9y`n=H4y2Y6tZ(cb8V{} zTV1maP9+UUS7V%fs;x%;v^ej?jc&N%eoDMi=0@VNc~eAV6II>|GXL)8djFK^_5N`p zFF~b9V4_4e%&hQG7@q3(Y9Lo{|K?C1me>#V=i$eu!bl@!O+0z>N0Z zW6T9a?caFWb6LQYf@)Vg*H*b&euD|6Cz^*LrI4IWqnyOpg@GCnp}+&GY~lTed60Tn zzy(NKV_aT_okguvK_}orib)p!whBuD9Si0)@&P3!$=s%)LBmFpsv9;ME>-zLWP0sll&gY^{ah`I#m6bf+&l13_jqOfxxsPK|{f153JG|z`AlytGh6mmlAy&3lmYth* zj+Pt;=QKY!z> z&B39Zl2x>8N)uS*N~QqW4RcNi*>5F18>^`45xU^%{-{8t={k!Cj}RZ2*Tu%%%W*Su z7%>=f#LC%dKL3QjG*QB|+PLCtend8`(Z9!@5Ok&=xy3;|(SS))JSFG0X4W@!tG%BNfx=j6A|{YfOi`ss|r zoX^Efm2Gz={m;WY)8iT3O^*OMA7=K3gSI#RS#6n&8xz-cI&aL(d8h4VZ^;qQHIK-- zhw^XJxvR`vn4-x*k{D&EeruB8;bgK#rIs7@hqyXlFtdf8*tH~!V=Ix=a)IW}qO%h) z`MVK6H!2QQMb@>yDF&y=ifFPyow^Z+OC2Q|EiZ;u}anbR7yR@(#seb&KrCJODy zB?5br8X7XO>U$3@X%@Tas^vh~eh|4=!(>#V(xvQ^T*j#E1=!kzs6V$8O^$-8wu}yo zrYehpK4RE1wK-?*<;li=nwSp0%d4Ur#J<>ueE%jje!Pss>(iekKwO7W(vzP?Mz+aYE9*Eb@Z(k&9TWs;D(Q6AaUmk96F>^&IKM*1N0VZ?HiMQ22ArnmJfRxfd94z+@$(4*B~^-L8dl zyOL`lhjmH%7A4!<;ls()o;#0dn*FJ`yp!sDRI`xnCQ=)eyT#t$CSelDvzCl2`l zyN}(@bVEPFxPkp|9Z6>_+CHEm;Jz7V`WZ~4R3}+OLb`yMZCfqwxIKmoJjB)pgF-xd zB@M&VD4B`_;P~}sbZ=`AJ9yrPsZqI)fbw@Q3pAINmp?W!mHvU%B}>0I(Od59rrydE z>GQ$t+HJpBrY0A##=NK;4nd;-)Ew>>%t0K_&I5n*?uwB6DHr&f{||}R3#jkZN;SQFZ;#Wh zo`39KY&)sKCK?4o#}2Y&>A4}cQ&I{Eg)Xb%{p~RAlHM+$=Xv)|1>xM>ztukT=zt-G zQ3P0Ob3!{$u^o~n0wS-@mvHQxaQ>`;V9RLh57s>XM);*ZszzXUh6asx1Itz@yL5wt zpwkP^}l_JubdLUoA7d4@8RPaJ|ZR!%VN{@H_{!NdhD7*Dc?_DtJP- z_+e3T9aJGgF5Jo&{P3%#V2N*v>hgh_1hO}G z#;wYUS$$&xHUYxGDAcwsZJ3}4=@=)dSyy@qhg;=XPiT>YktC_1JWOcN%HE07iO%0K zC-lQT^N9alu2~cJdQpIxQym;pFHe zkg6%V(-cZXnsWEo9Rw2TMG|Q&E(s$3ky~!~KpiCVc*r>)oL&HCFSlYFqx1zWGIscI z6q)crilLw)nCCIuw^#G8o204W#Da!=Z6)S{&Z)y zS54TD6pDOGFu(@cE06Z1JEp;V0~4$igRMvb2a{>%5k9k7>mD5?|M67r7aP`6Gjk2> zls=7WL4r6$6?zk^cK)LN2H<3}XhPN(zwzbk`mPp^smk@8SF&Eu;|Ol=x<=<#D0du` z$uW^KneKZnsRgqneej8(9T96qV%HZHt&k{bQnMFq3&C^IlL%`BYL(*?R@ihMR?u-)K zWl?qN`qcE3BNI z35hnWGT7O{RL%ws)F;6zvew6Ia~i`?xfhwIL#$HRPT(025{?ke#kiPkS-PQw@vA!l z#4k;eoOYU3001e2s2s9M5V6nRN*(>=7^F zRxFo(&lnKXH%Ij4f3E7yy(7XNNH}*Rm-VOiV^26`NyUvR+IKi}0kKf>s;yO9v$&BZ zM@PC?)i(U56!Gy8TA?PWb}m^ar&P<+f?g$RJ$2l{fXjcac1^!+ACgRiEI_-oeOCnW z6CkY!ydfw`!&4Ic!y3f>K|?j#KNY3l8^!1mvvvp2Uk<5nlDDBIl42UzH?eC)3D^Cu zl}m(Q3*?R>EtBU)E}57K)n7{_?7&8WpSUVrAZNf27CWOQM5ENGIFjX(e!pH0sNNy1 z#Jg-M0G#6I+AR}c6319!En`(P*f5I=JP8#%(2a)@0+W=B{TyG}oTTkLcj;oT4D1!= zxUAx}uRq8Lv6)%?mY8%LWT0^feS=hwq(SuMUW3Fmf)kdgzj+$T13Zy8{T82usQ#AJ zS6!;g1gl6>iTOn!wQmg*KFUi*MLG)7HvLiA16WKHc_0@jb7TF530LOY#MRo;X=bp^ zo?ZIGwBRd;2He;qaO(4K8J|IEt;8Yf3sE85LR_^SEO!yAtN^U(b&;W97(<7aVNVBH z{o<#*BEJ)adAH2z{+wpI0!;?>yci!rc~PPp_7BdsQk2@2!icqM*2>Azk#&>%GzX>TOE|@VB0-+j52{is-+_IigUFfPWuNCU$`KTwH7I!61&p9 zFI3M(?%I3v-+c+YDpq4y9p|5WDr3@Orc2&!gdV;y>eaCuO5_YjqlqfwCaN!TBC0Q%mqCg?=$}5{WD@68bn`f^K0Y-7($6w3 zMv)3GZ=p`uZw#X8{%sMLRd%09So^Chd%i7)-4PJq<&Y861hA>SJbE>C8Zu@o2PRq}_MV1K zb+o#Arm5X~_M_??XrmRkSP$~QQ2GNh>}2U9892J%$FpDnii;I)GXuWtk#DTnY;qP zeE4dE#4T~H0%2*7Pc5mm$=&G-5{i&~F|-R~ss{K53M|9{v`cd<7s*Y4XjYI|Yla@y z{&eOVnAt8>NYf%=NnX9wGCZXAI$LO~Cj@(F7*XRx0WZGVtn@DD^M|?PzsafQdxOCH zOAseOrS4HwcQ@$R4WPD4*=z;YBwE?YdzSRvS}!b85zf|*6EiSfLldx}iM4dz1S1wQ z2~oi{}ejvL-o}UTHc6XE4ZX27^R!mBZJ=u-^=eJ+ylV1bUEpT>#9Noc&4-{<0fT!wsL7 z>fUF~wO-B7$(GmS{e*c5g||v8M;6_;e<@}Mi^Cc01sZb9l@v3;Idv-lgPb)n>Gh>R z#~(ZbTBq)5_i+tR0+|`@jRM=$zByksmFv%y68rw?vvgQuwc~2l()Ds(Fqqy=cWt=< z?I+9Av5wZn4M9k3hT20nzAX|6W>-KX-W4b`vUUnj^m(QC^t1Y*GKW4XcoB6nZh@V^ znINuW7TI`V5L5)<7hVBnq!U+5B5qQ8h->`7R{Z0ZJmO4WX;064|5#&S1R6tIz0F3j zvgP9P@DNHc)IyByphwtiXy@^SoHUSJ7weGK7+T`8C7gIrzJ=x6fTMzzXFKR31W`^F z9|Cv-WKTh1VEIPbj1_Z4$|+r&vGt$cnqcamBj7>*ak6@VH_wU__P|n)CMxP;5rkDI zf@0*+0XXSj7byBoTf`S7Fs0aLYJaE-RwV@r-yXdSqZ2zy`ay$)>h~(n*Ngi48C~eQ zmIBa7rF+3m>E(m?MPS#uVUMDQM2RGFLs&i?Dw0K2Y8fA56>DOcx^7JPUEN%B0T9Tj zVShGM;8|rrOJy32k+hw6Kf&5RAYQ4a{keAJF!MGg7O#L0Fz{XG1w_kVa2JcJjMs~` z-nDF+7kN3-8EAwq$5!*CveNV5>XPU|bSMJzlm3I_vzF(aB$J*n1y%p}x<8tMDFd1A zLf^_zv%MqlLHw=t)vyK8vgPF+*lR`M1igFQ)GdPn@$0i|W1L|gv2<)|n*+U6Rab~q z=odi~A>Gc#YJ44xvppxnwV&)Y)V<8Qz?tV<9aYKD?9&k$NRYQ`77KhnnTu^jFBnIA z3khIlK$Zz|Ef=vI>#Gf)785oHutu6`UC~ghP?XJDOxONMfkr||ELcla_aacFpsleH zFCNW+U{97z+x)|9Ov`hEmC}=HvB{Vu%RLwuOgzSByfWN}str@&_f>1t4-N4eWQ~8g zfw&JhxA6vhG0<-pre2#dmpZmPUI?z)U9HQLx|XrIYk()JQFHhPRjgDOpv`?6`K<{9 zM=hp|dmM(R7F504C(8s2T@UH#jCkt5s~#~JzECh-HL_t%Dowz??H+AA(P zM+WCCk>}%EiP^${bx2zlx`^@b+16NqgD0D-^8i1Z0q?t*EP5PrMPF+<0D?iscpSq$6F?3+*jHWKw^hLqVS&LG#})5msuLB_1#7tbmc> zsKxixUyJJX#7B&iE<5)F!}@4trdqP!T1XJ=u77XUlSmdUVBgFf(e9HiV!dt&0x0Z< zr~l4Ki%V%F(7bSl{!_cVkFAK%HT(Dm{)z2g{2#412qRPKPj@**YOWv%Oe#d(Pxa(h z#?DVY3)0BWqxwyq2UO~zLx_nXio}L=O)sv(AmuDKF@=e$Y%rCUpwi%sF@n$nsnZH7AfZfhS2RhvQ&ucZY9>XZ02)|HvI#gXFwh#5 zNvUuQDi`IEVE}rJ`gENSJeo_~Td~oHcG{#%W0<%cCSmA$mLwt}O2Rsr@t<2uCs#JhZdUZPUd;Q~bW7j2 z833YQg{N>m9H@paZ7MyPzR#n1y+guO8eEI1?7eJ<4g1OYnT=hU{p~>G`Eh14^ydM; zp4(2g+k%~)cU2mT{02bPe0o~u9;NWmq3V<}q}1>NpFtj|_Yrj0>}*HC_I{uwJ9~!v z53ueIAM4cp>-ltN)7NX}qfWFtXKrt+D!aamwyelfmgK!nx9v|N(rdH4T+`Lgy*}DP z&Bn^H5Or^q*d92FEW3p*18Ez&cfD5A>1Dx;kJXHqRYh+RXAhwL;@^D_TE!0e)XL>? z>T8MXl^)BtO}Bk_+s&ikWx63rQlSeMJBNnQaKB9x9o3DRQP67QzuG?w-Yb0ezl9!# z(0-#|j^7cxj9<=z1E`(5LpZsmB{&8cu1B~12Nj+g<9o5#1OobRCE@@GBub6fexpXp z7-OJwdpsAT+kJom1+`vle{;D+NRm%rct*To;V9Ey;Ual9Q4v0zaNITSIE?We*N9!- z3WyFziOnbYScxefB35|Qy7;=aBjrc0^#ivrsGf=cUJT#~OSu0m-*lgD=r{*THWy#)fV(bC9BodQoVVYk@@Tv&bKpe(Jkc!1_?7U1aQz(lg|)m(YTUC8&V4@i z2+tq||LpLbHvY@ja6HYEH8FdP$KWty>?#MGsXTW>5|cjBsmEh=!Ux&B_~D?tUU^Z%b=UaCjbbYqCdJC+P{Q~6 z^WD}9<5q9sV{f>BE`Zv|gf(l2FTB%-3hamE_D9#_F5&-t+5v^9>yFn7e$-d5AmTfO z7>SVq!85{Lf|M_Z*#rMHt&*Qk^)G~*gb3qJcZfZO|U;KiVX z5dRb7AAP6~VS8pk4`tB12?a-Ud!Y&4GU%ni5ZOgV>uJ0I9EXNy3+RG)#zEI_LAOF9 z@Qxw`%u#|PRP)Hvo^>4kgryym^jhp`;BCcw5x}43!LyoYxmsXmBnAQv2RJ|$SdNSF zQ$F-}+%i~wFXD2XY%LW-mg;l(nrH4v=E6xN6A^r}ARdwTYbZC`=14*Rz&*hqEryYHTtCT-bobMwoJ%yF{~x|+tV=5)LEAsfye zHb$-!=8nM!_pTS84)>3LR%^6)_AB>m`zu2><#(}sez#i#FnBzsU`+liA|U}9pY-s! z)$lxa-dvp<16m*jwksEDyw~kR|BjyABcYiIV7i((tgxu|I3ihz=+T9@?A23!a2DT2 z7PpWNGH;$dw^w?@jv}F>q-!kh~A2Y?TWp(&IE_$fFMj(tRB1sW6UkK))kUM)w z-y!EeZDRhr9c23te}?+s^SI(4Rm=e!?2jtuw0Tix>W+|aQM);FiX_o&Ipwh76y%y zkU?6YE~-2KRk-foKBY8EhH0JH^AOj0M0-RJJsnYw6-^tE{q+Xd5@4iYJi|SsfSj88 z!3$YA;2)iwV)jb03kRpJ%oQ2RM|>FEoI)i=hdGPpPS9Xt$Y|B=ocrHnb=6wPU8x)d7ukSlPMc@q9WxaA5=+6G)Bpq*$Z)$ViO z4&f?tGMD4_?&9B_(|WoY%+mQJlY2!<;Z`waq^%*ltvteL9AG!;4Q!+Owi;6yUbLl- z+V0>|W~oUJzIN{QtcFn*=z_ih@ohXGAnPFnC%vDfZ(Kb)W;#jI&gFu2PQBU8_`5OX zHbES&`fGQR&%Mg>-UgjU>rV^2D&AyDNjdMuOlZ3FO3j_@vdqY9!XkOr5l~7~JTR$7 zlyLm1oxYn-I6z?2Y--1rgQ310SkVtfJ1dR?fzDE+j!1H*8VsveG}z*)}E}W;ZEJ=Gk#e`TH+cCiNC&FW5wc5Zb?#&@ z=yn8|->%8oc%2oHkndGXT#&;QgMb9fESJVXLNc_J8RQ&f$;yxxL4rC^=B-&}fD{Yt zAq&lODE07u(+c*$GIu-9m_nkUQdc)11!O;dsoCH7>d4rR}e3X!ju&nqz&Y? z=EW|-`%-C)=lexsh+&-8!^%Tg?7>pp{H<*0{heB(1!`nJ1jj1}{u!@HYTq4G7C?rA zBqxw)xh+mXP_n@^3m1iA)}v7`z2hZGvPYUPb`8l(WV-5Cy?U~>{f#u7$z*d?z zCW!CJ^tcwF*7pHxFDS-9x<~oK+T1f)f~)5|yOAc>;M6kadzTUEgW6w8Rfb`BA(0>K z^T%-;U28#j{S#dZE-U-LBZWOR-tC8yXJhy|Vfx7fk^YnUqqI9$cYs+8S@U2LemcBZ z|67D}LP*LvNQs^jH$?}6sep4`v-2ZzBq>@==C#BK@%7&NbcwBXJ21RnIy|zudrw!$ z5pqOvv~Pak5DoBDf)e4hq3Nvodf?M$6O?GXqfZcc-D$`y8XG5iVe>ku)5s5lj&uE} zT=N8^qe`L%)qUsX7JqmDf_j=D3;T4^JJ#AgbY^SIM2HLJo!1nOD_YE~A=B?Mv z`&c`VR9~o|$Jd7xd1+Xvh%H@sUiV+^8Ds&}Q-6RSBsOg65(T@C8{h;=VPPgq4C_e{ zp)_IfmrRv_#7Pu=9J4LKoUO>t+gNpI(p}mc0j?@49ZRWz=({$GTn_Y1r!Hgih`L(1 zcR^t_&_5?&B&q&R08>+Aj8ZwdC*oGM60wjh#>)7&-IpM!AmwCNzG`c(4YE#sFA}U z!0p)wkIlRl_}|k_1Yac@PkVIBoT~aOQ++3x>YEeOIX`5Viui=Hvs~c4IGSs^r}~ow zhL}gQ&W2}BgLr@wp28V`iFLE5H0#wo6OA zJgvhxvXLUQ5ziY3+wF4s1MOF$5x;+)>QgbWXb*FS%jCt^R*8)#YnN0xAZxS8+yEMi zjZKE}R(^BuLA+k;q$(I~6;VHPV=#WSbMp{J8f`_+$<|5ynx?7S$rK;W5&;0br4d>T z-N9$OYm!$v$-Zs@iq3kw6z z$}5$mEeAVtcl%8=HrE+Au8{VrwJj)<0m=uNQsY-z zOxa;oFo;e2v@Rh~I04`ZWSNSOjpO!fm&EG;$vLjEIx(}lx_k;ptMiP+hm7w52BQ%w z4vI>WGS--P0WrF73rv!R@N!e0!+UY3@2{E~HH8gnFs~vl4^U2!6YCA^BkmsbN+cNG z3rh^y4(|ff6S2?N4GVxH0@ZLC|5OY|%rhKp11UA;$DPNHqzKq`8|9`!Xd!yX9PwP> z%ny^EBh}G|5LUpWfly>X#z*vzMo?%W7wT69mwHGw;ZVmTG#*JNZVKc~$nt=_ARZ?j z(M&nEE1!=iE3sQ-Fjt{BH%VpYo&pkLImLwZ#0YLT#chc?nnMEpR1_{~$xs5Nvwfj!{_$>prKAvL5p(RlM@cv z7ZmPgqn(a5wyx$OJaMWZBb~h}9h1*(rkh)0)hd~8l{Ab?@)0~->12@U;<1I!NJ-hs z*=Ct#zC86G=)Z8}43Yi^?jK2>T$5C=A=nW|ajL_fVdtabX~k0u*~g9CE+E0D-+B-- z_ozJtJ7UtOV&C$}e*>MF=iA*z&>^lw<=;xpduX*KQHb+)W85i3%CG3E7o)7S*V4EifI z)*l2M0E{%VnYDg9ct9mte28Su(+DM*b!Qlc1u7jUBA(Y4*kAs^t>?y8E1hS zf9ic_$M^cks~+F41%)=1iYUz}Pdvsche;7}ik-2QI>9HWR5HsFi~6Qmeb;T1`SSij zG~U=xbbxT_qF?H%&h|7Hq?8drz(&eP6S_#HGdG@!?R_s;^`YKfGp z=1dOK(Y@FM5em)=F~t@8elsvlePz^b1y{XvFUPl|JEpU#l91^itk+z!T8CCbbv}=E z$%8-_JTH0wCJ-=JNx$U74+ zK@^`f*kFh4M(AyeQMUb8V+Vtu11PioM?3ff5T6Ai`mby-^ZU4!7F8&g{n24ZfI;(& z_6nQAHf)Svh5qA}#jDFzw(AI($cj}h7Y=iDd-M9b39bbJ%ZhaB(N-86pV|ks$k<`S zF2Q!Hs;T;~CfUbR7dkDs4X#E3*AqUP6*_DU-e^8=73-6uWf);0|o<*zVOr$5lm z#ifbsUO*_|&I6i!S)RBaKw`jIfHq&kOFLW!UJ3Qzps*<)7;rW9!xxF>opoH&q3S`2 z?b^Dj!R%aQdwGunu|+OHNZ{ZB5LRo2BI#r3l($eT)Vm6p(EYV0={5TYPS7&Wm3*0( zvXgVfIH;M0_x>u(h?nhC<2`=QQ#~=gBq>U~Ft^)Hj>;RH@|I$=sU?jzfIeuMbC#ND za7_n)xjh;C@r^wuE(jF$-fJnmOh!y49-bgZjE z2lwpE%`Q)hDFQ^sw_xmD2E1adA8tH`+*QYq3T_m$aXk?+3i;L*p2;kN*M1n;mOSas zxd?;&MbT}7yx!Hw;QUYn0Qd&==~-k=qn>{GKF4wvbUei>OpA!yud^%uN%$CcoigUg z=-p6tFYN6-7GR21%?$nHX_$d=9 z$A6XQsqce7ZV`uSVCw%r)0%cyCU{>+XO+EFk>{~hN@>g^oEa}8fJDwCp0qsX{ZSW$ zKz7WTEWKNz*9iI|r@;#-g6${NdTit9aOHWPKp3gms8Odd4S6g+CE*4Gmihsl9`D`- zS=Phmh9?^Ki+ra@R!@Cy

oioKQ+)_42)Y`T@XJGw;J9`=cLSc{$)SLRpbb+U2T< zbR8J8;q*vjSdArG79R*Z#xXrQoKTNYt91^h2uBXY%Qg-tQI8XP*YrnAlt;!w;`x4t zo)GNsN1%-}3sG2|A-z4>zq4bEEJ4^{%E0RUF!pV0eYbYKh4V$j-&jTVmTtQvev6)m z@c`JFN;SW7xFd5!Q@df!L1!?Ds<^E>S?__;-Sn}^>e+r2HHHeeLsQ3kH2f~K%?UPK z@M)=!2gzz+*aA&^s;#J4>cgIQF@82Y{citAIC*Hl;PZ(6m>p7K-QyTpTnh&~4*9KQ z@#F*1q5`E|sS~dtk)9Cr8ufX+E?#*1aSV9#{6(0efD^47++@Y7p}R&z?+>5#3^yZw zhKC>B&~8O==l~Sght{w|j3yj|e+(+uB>k2Wo|c1r8I?<%e>>zdh}xabDczyYVQY;$ z?2BeG`x5=fi+M7YjL*<(bYAzI3|Zh|&w^S!g~iWAmHlZq^+S!p;?GaR587KWDF7PEAaPxsjWS$!hQC+KbeoXo28|;*9FC{! z?jj_4eG-#LZ4wsw`l#WEkIZ>gSd;*=cdO4@Jz?{hVsB~Eu2>RZ5D3G`EO?1z1&h<> z(Qk0VM*dFW%JAi5lgMYdIiIstgMj@^D*H&C`85COlxA8(QdD2a;^rB*Y_8Zn5@ZEp z%pL^g-lGl<%10z}OC%x}1g2lN4pcXtsa@s(jzs7MU8MZMtV}#BMq>~V#V&xp!eHt< zV+zokiFAv61X&J7oGG86W9DcoaIuFv&G`pKRw~>t4fft0hAE8AgwJ zxv`uoxd$cJcz6sSV)lx=N|puL7k+GSWPESop@=|XYu?DqK?qW@CrBz{Bh#rYVznd1 z9?Sg8|KaH^gX#*lwp-lY-QC>@?(Xg$+(OWWI|PT|?(XjH?(PH+4go&Sx#zwAcCA0V zYVTS-yXWj@jIvTSWX|s9B`6ec#vi4CGu7J6J)Q5vP(Q}zE=tCsvbm%is%-e#b_8DV zmo{h7@zOr|-{@sEv`0Jc=1^VYh}kkh*61N07YfP%*eh+YpnPN-?fr@s7u<;0d8`T#4CR8d<+2A;58<*W zFM^d*g?oG8ACaLoh!lQHx_fb9o)PpY{tBY--Nlk$50uSHqmx^N=kvnxq7u-O!XS&V zimm+YlsRb<+RYoruB*8fYY#tf9DUz7C4iJf$A!6hY_~7qQ@m@vhlUaY)*AX#i)Lt; zzVGas>Y6X-aYuIU5P<{##oW_O&$%5L?5J`CRk(`FSaYm%gwj*A2BTd#;^KL05!u6U zezpe=DfR_W(FsS|i1rz&4W{0%nG5`dj?+6t=7{}fkQqb0BRP;bRyTwB!TI9m%=QYK zPOlf%$DJfcJtrj_<^vc_P_#60D&vPwTA+V97ogMk(4kcfRk4(zhjA^s*3AZK}{_xZwWYB1)ppae4xh5{#Bh|fu;9Xqy#xhrZ^#*z^3N$tnDi(uKFqifTv{a-? zI2B@hZ7sRO#S*MHw#zY_Z zAGO3CD3PB*@2z4lTb?ddI(1T?A6K|XB6mw-gA+ox!ho}AF}9W?RSWS8AC)Lm$~3K8+lcpNFLs0Sf(XlOcG50!-3>2!=ChKnEpC4ydOo3YtgDQ+B0r$!?#<$xf+sKc zPMHF8Dn|?l&zSYN>d7HwnlolcqO$e+`c=qZ#6(~oh zmNI75Z+;6+FB6AIpJeZ@b^ZfV$5h314GY_GKe65nrRfhCPY7CXz``}nLG9;&#URq% z_vDql#lvSdj7T58hV;89;+?(y17#VuE=X7DH)!s#5gxZ;u^Rz~7({GSi}{iuiNj=r zw{gHmfqi1xFQ3(jUv0YceKSeJHa%zvCRuGN#VP2gY&|Z?i8>ZrV?DK)li%D*_4l_4 zXv>Pqj}mA0wb&p`e*_veoU>7Ek~AKW1VRurh~ChtNAO45Fn3yNUZVK^BEy3*oxR3s z36$o&K4Sw;1wSpEmi!r(X&?Besx7~U5H)~bKzKEU+2N{+ja&cN;(W^9V@+>ddIdx} z5*3DLAGYmA@8qcR^cV_Wi>;2+Nd1BC{K;ECWBbla03t+8&*g;8?^2THelM?6JoU-) z%}jat6%LZ3^g^@7o8no8IildhQcf%4Kw9kK)phFWYXAy0?Pd>Nq_bqwtlW8yr~sT% zV^>qwApOh8P!?g&c_B6TtVQW{{+&Q&Plu1hZs}nnPm~uY za=Z*hBU^5~VwdpgFYx=bQw%~NHxcM!oF)ve25B=tRQqk#5T!F1V5GGQ{Eo!r4GC2} zInPcG^N-}bAg-XMfb0E-K~n_fubM8al!CC?_l=ATqJ>jQZM<)~2a&HjGiLk92uYA5 zP^>flC_A8vN6CgFe;Z-K;B+;^d#;;&vv83EJlTiO4lW?Bh9cB<0F4gP1N5cy?^ZCax0o-MA3jZT5?r^ZE%Fvm z9@%*{_wUf>ds{}t18;mUMW~PuZS}RyGA8@vZ}@_V$~L!h?eyM{D}hpQ#{NWTYCn;m zkcM{?yutmsXY;N9;$2(5?rZ(5zkB@llTGa1y`lN;SAl^f?>{7C5?)M^KN3R3zNfiM zt5k12bbT~dA0>bIFap!s*Z$%6A?EvJVxC+4IOK5bm>=kG(t@Q5ttWC7<~s6SMt2`g z{{$QGbpNk`2b+_ZhlGX1(eyi7j7*BaaSm2pp2H~8A7VEE3|+!QcY zZ8xC z&?iJ9AOPE~jv+Pl{UE7`tgV^JZQux!&NuAFSjZ^eWuYoVyy;be8T`Vo-fj{8l9B}{ zT+Sg7sVRYPj8ciat{{YcTTAFzdck4}8sQiV7z~DT`wNFYe7NxeRg6^NF$Yn%FXpcn zZfu#^Xw^5r&W3*SynZ7zjFE~B?`!ET+UaBVM+e&QEmZkjs+NZhr!2fVHJ}jF3hR4# z{iM58-PbvE>MFYwE53S>79Nc>^u$w}JD!WgyqDbTZ6# zgn%S#e*1*?<}2Axd{R|)+IP79$_K+H*-RrHm}lE~PE9gU)P`e&qG=FSX#x3jon*ns zlpT8Y(Xz#h7_lmruwXBE&?Hx11o4WdBt2bxv8GyG_7;~Jbi>Ri?q9aKs(-p|&Gz*d zC_GnEG`j}V%@b3{Hp9LZ57m3}NasjkDFQ?X=sY|D+7y*4IB3J1p=b0M&Bbp54@avj zg~vf#wyth1f2xSKY^vJJmK!X$6pQXPTraA<#bI!d{+5z1xwfbr@fGBB6VL=XJo}Mn z9yFF4Sz3#ek3-3PJjZq3#ZS1;jrFTz@AtlBTVc!3q4a;OHLVkZ03f0I_Tpcb_0(W) zP?WDB(0{WUia=!dO9a@=G_@6w%^D{~zI+vmI^fA+kmdU!T7cW>g{?w{jxWeFtWnqs zg?ZCp;pY2z8w~{+Ac}!5*=yGo-oBtTvhC%hK1d^D-OqQ*B8H~DX=4}e{^qBvdG9$% zQ*`Uzw#o66;`Xf)P}~}s`jN$oHXCfKA1i5Q39BFv(xMoJ3z9b2@UI8Nf$NSXKTQWN zpJ242vV2}b^JT45-@6z-*lXdvvIE=rzFGT4$5txn2Ztd4G@DeqCFa_ipA_QKZCM=& zRm8A9N?EYh(fdP2#(9MiljC;IFOc6q*;Hlz%@_RTKU)8F3K(Hy-*+l4MN*@!T;?5V znWUc%b0u~Vn9MeULQ*qir$}TSOZ-e`N<~zHCub>YIVyf+{?jpuTwYl^?tX+zV7SIH z(G%M^f)Rq*KuoybTU&YkU zak5@4@-9S8Pat^FgwL{3`y8)bH>O7_^Hu$Klz`VS zxlM~Fp_BA`x{2HiU358L6}JXT7IwpzeXmLp*#oz-8Mr!YqM@Tkw@Zb}9PeE~(=~P+ zkm|d+iJ!2`K5bF2xkE5^Qie$R;f)wt!BE8o^Rsz8lH}E+oThSNG%GqSyk@%xr=Q$F zv$b&VmRRCN`Pn2=Hw_CRw{>ZEO`EKS*aY=B!to?qu;!h>O=2}V=8F=KSWe;0S0y-u zOwI&u4D?3$zwd@+MT0dEfB!m$FyGbI8v83GK&EFRyFfCNA|11 z?7biyU)i4l3M5aEMMDfwGeo`e^!wU&BTILz(jmoK7x_Z#eUxH>Z_HSp@uUK}dDxJC zqeM>`ByH=Kx<3zA_Vgl1HT4x`yl5?`)!p#v0B=#!+u(Om6aL)egcM3@T|}fI0v#Kig*U~){2+Tai{_U@ZBGU`y+f6nK@+0 z_mHAe2F^W#IPa~M-i-PJZatYb?avvj*fI?-r5N{6=_L`R*t(9!WwY5Hp zqi&(iU9o>USbQ3?+f3 z+5`_mQu+6275~cv=7HEcS%Dz?H0kIBKYFKJIIp`tY2$P^}NO83O*|XV9OF2 z3VJdut`zGhdnTIXFjiqipQ!UJ?d-|(PDD0H+*i2R)Kz`>Hg}k`y$t5~YXFgN^Kj^7f_ad5!tu|@+Xc@f`p&}Y zY8}7S-?eeBkv9=(p1e&z09tyIog`p!s4*&X$4@L3(CZzuU_;|`;1oivePJ`m+%3+j ze+j>hyRa`|4?av+ycYO5MWs$~GiX~*1K|uINhnn5%hAE8_h-RTA6QRtL<>FVT zOOo4+B~7W#F}6z#kP}2@dayg8oB6?XAS|p=!@aP+y~vFP{m`<>~y$ z6yN60oRTu`lC#%aK*y^$VvB9>-dH?fg{>-_ZSR{VOAn*SlOX(a8&@rxWY?dLl+(?A zcEv)KDyz%z-rzotpjZ_F%0NES$jgY@KpNU^8S#QqXH-FnS03`tIGatiAlHAsBeoPV z{P~Z9H9dwUs}oMK5H%GUaEp!ImObfm3tdWJ+r>XJE`8@g0cZl{*MmEZ_4eE*@v?0A zzk?6hlTP^x8S2pg=K7`Lausi-;H$4>x3alu!+$y6QB`vi-FJ_b1W{4*m@A=s9YPZ& z_G=IU1<6)&9{e;LZj8INM}#opU$H8#H3Uif78tV=qZ@>$2LSbTr5KM-;5)5S61lSVZfuc$GQq^d)*rnka0( z2v!KRtx`Q0$m*^{9?IV{?|w^mhJd))e`Ui*hf^#t%$DxnYBW3-`xa_W?*Kf^yVINP zzb0Okejq9gsOHpnQT;$=*1o25^I-r&g?kVM4I7vhk)m z2SLyR+7n++AB?Rx`o<)G)QKnZiF}24ki_4M({=(PdF!%t>hby$ig7*HMdD-21F?ke zlo3=jzBii#a%R_a1KX)%BWs5PMYGwGlCoD*L;{NOx!Gu7DoEgRj#o-X31JE-s@3lq zG_xPBe{t*+1mLf%R*2Z~WT-$cpEq4j%@QPla}th^ig(SAo^yX=p&f|f8Ent*pwu~5 ziALyPKUc|PxFKj|yM`9b{eE>({&TxD8H{-}9FI`S&P5Zgolte;Ys)gmHh$6pNB3Wh z^z4@&glU=Wp^`QUi8&!Md0VIs(lN-bm4tiB{nHqz6ls&OT;0W{V{|~qv~Wv6BV?EY z?5#Y(X8HoN;fm4 zU41>VT|}Rjpot&ntwnSyZNqiGWD;Z$dZi(7v|^ORx$1fkzE zp}?R{$YISP&=R64>Z6Xf$W|S3bG70S8ga+vN<1{Jqypm~y;QX?oOy)n&4MfhLT!e8?wFxSSsd7eSz+ zx27(P-@2zMPQUk`36C_0f4u7lN`(;~3A(LKI+G7}ZaGr#QhD@_6|M>m! z=MN_7|5*bHcH_|+M2hlUh%KT0ji1Cq))WBoh zFX7pUt{YOUORmwh=_E1>#QJD359Oi9bRlOTYB@bA)& z2U0EVFcR4$53GugxY?tgzD`SP(AN~Ua5YoSISeyGWC&JKAOf~DtD>`u97esCFR+pU zc01U1;uc(0r5g#jd^Pe?&6B1WCp1S0xZKjS#ZJ{wFAZ^$nWo4MA2j+kNGlyAl&^=t~FV zgjeWizyU}&K}_l66jcz<87+-IaJf#wsyKw3%0lO3)QaJ8Glp<&eSb$Jz&rW#-z5l~ zi}n8_fPu5K@}|y(gVO>3zgR3DY*~Ms+1ECnYBg7e+xEJm>KZfv4(-=NbPO`(PoxRD~2IJXrZ4DzN$ zTzdgAiMT8I;>84C6j|Xy~dRwYwn0Sq#DVY8*4yiQ23tVs>@iO)+a93el@4 zzYLp1fyztFjjSv4)9OoXStM5WU9>R5#58evQ!(KatV|5DX1D}?FxKPECW)SdEX?g?P9%e|8 zvUt7(NmHAoCu0~dOBl`XQGzsZ>YiDLfCxx{FKq8kdg@pr@Ic9k^>C-M)0atdpUFoq z)s(Fg+LjxyjsQQchfMjrSQ_psWfpV<-OAlu5v9-7zUtovu_l9M;`_C;Yw$Wy+rf-6 z(}Jl-j1MHvEe_O^PltP9?N7Isc501&BHm)sUef(O6&;jyJFSe*Pg0PFLJazMj4nHnyd46hMKqr6a9lA_w)oRF|M1M1mEDyeF{!7D%6)eX8c~ z(N0>aJZXnp>o~yXL4|>`S7O)eVhlNY6M&dYl6>7bH~hCb#*o3cv<#FHLOA5cuq%kO zZ@$&+yFYi=o#@oXACUr=tMh&jz{`kKrs;OPMLvp!xb3Q8q;79t?VZ!U1n=;e6wl*C zVttQV8Xq!m^?>?8Rv7Bk2B-M7<@8KC?+8V(4{GJQFa>k!?MX#o@V{So7}KYVlIzOP zYG`S5WywpQA@54v5b2RozR9K0W?LRB`Jr)Ij>hSNpI&bB--l~}ZMpGs%;qJm4iCNC zY=F$z(*o54qrLYXIElp$5i!n4!ot?Q)99fA8jp2p6IWnaVZep>L_wr+|8vA#0)6WW zADZeOSLvteFlc`ac%rMbm)C|DI64*Tzr`D;Q0{(2XfOU=XDElp`n_WCka4<=58H6fKtiVvTR&X!) zB1{bR6Hy2ef@<8XlPJyeHHfezt*pV%8QD9rWl(rQFXWby)6WC8OwW%`Xh692{J)DR7#CaW*JU|OP_D15*z~~vF;7ov zG^)Zpgc{$v#(H*jzN(W zr5u^0YPMkst<4J$`;HiPF<`$ePbfz>`&6xP)K6!X;loMiH);fDH%wV067AFZ=M%`F z|JlX~>wd2OUCQ8y0=VZ^gOML~LQXQmcbyExsq~dr_8OdO5x{vcp^L$SwTz+=q81a;1bKUo>= zShZ~Iv+eWvv?^2@7G)qz=GSM2B*6}|M3`O|H57(B?vuq11LBb^KT_-)@SpS<&^*BF zw-mC?U%V1GpmB@W2zhL~I-|_fo@s5C)A%+%po2E8aF5TAmc6h7=qX{1luBf>ON3Hn zI45jbjGiBsC$4RNJe=YA4n&XK`2d)>UR^U(B|FqPLVmA)kITbnY^HoZG2^}JOm?tw zhr8mm>7c6efICzvq$eI(IT$QxULa42U-s1BLYjckzAYSFyUkQb?Ooz{7~)8ZFmKgZ z&`cKG3*?N#qM2;Q0Q$nD>WH6Oug(pTjMcCMdn*i#z20E1U?fI5VP>@E&q@hO+-LR@ zF`7~;k)^y&7|DXndOXXFR1YL1 z>gSm&fGLNIcOgSI!#p%@{qJtiz2$zzrr3g$+q7OWvf zYJ3U1Y1@$cH;qQk5VsPuFzM%2*oOACXmbuqd$qBd1!-O9K0-njgj#ab?FtNSB}wxK zTeZ--Crf#P1}vUd!mxKf-CZ9qoWDcBx^@i*@F|x-eROruU`Jl|aO&lpNko9FkhTEs zgz!eAhNiJm=F*)U#zT@x5Hjw3C9zBkC6|5H3vWrwM7_-K*2`kO>6UUlj(YW>n zDX_Z5oaL(58G-GZ7$iIO9^xp4O`OE z>`10zBcv~!*qME392ocgn7;!}3TydqOD~&^_$se(#=SH#3~~ z4K6IK*oeStnFwi*JhwblZ2u48W}sM<5WCY;NSksH5?Fk^G#wkl_;y0-e(kxoKWuF6 zw7r!5lc2r3UFWdI0jq-CeE!X`Ky^`@ z35?u_x~&*4TC{q>I?C&*ktL3D7(^iJjicj+?L~^ESGyt9R_Gp-tT)uzNK4nJWKzhj zi>;pA@K3<1Z6VZpFqilI%s0CRQPXLuV>>}*Ry6itr>q8;-p*E77X`UDl~25Jt&{c< z(t1Wu`cc&e8V&a&7`a1aJa^p^n0yCMy_0Ja$mV{`J|@gVgv_*2qwY^N$3n%UI?7H{@NG@lcyQaxS3NR2 zRba%CIQ_N1%>LxtzSY|H@qYF)=-aB4kmKv)^*BCMEmXZcN&J^ghx1{5`|-9`KX&yi zp7U^iHu8{Uq!hMsVb$C{^Sb)tV=}?>1kg{{tC9@e`C#Pw^?8I!zdw?$@h=>uMyAOfRJByEdq$ zF2Qj}k2Ha^`0(xDAE<8&$H*IW4`@e5D)Kf_@qw%TmL9YANUGDH8T42k|0{oA@ZhiV zmrCmJb$lrLE$6x}jpBd(500>?+~UVJ@=k)ng)Ck3itP{PSo$LWXbt#&5weK?FuyIK z;!q;%6iHaWyFdB7<2iBsa&lw!;>UgWV{$8uk57=- z?0*F?>c0hWJ^Xy_kJxQv85Qiv?VXzCL;05ZE-l@8NgUf84pIK9_ZeHoypAqVG?pff zS~6X)!0NiPWOm%`e_^2sNxk}Y;UlTS{fz1FzIXoq(!Mv@fgRRWlevK12lz^8&cu?b znL%`KNy4yW@j@lTT}>2&z>&spA%_)UEUKfz`yQ7)dwSwn?>o4;kEi$T(c|mFQtHH$ z=88OE z>WuboO+6Ov*DX_mptQc@ZR$^S@y@p+45G*o684m0%LF&IFwMytE;6c;M2Zi#42uP}IF( z3$2M5F_=YJG?Wt=eqtn#LKI;?Da?X6vR>CQMQ2a!^L48U-br|7&?fo)nCaxo3#(cU zpXf2bF~cohYbGL>mG2K5L%gPW+C(p;ZmBd5Y&E*#89Rd~_K3%2=*-$udVNcAL?sk6|h|WlT z8-Y?dFWpM=&5I`NGw;%tP)r%0M4guyqwHAOcar0c^0LM zjZq(q#CT7}#ZX|VrHx@HNUNG;jJ=DZl?Rho180+RYs1qpaPO7+u` z5>Xjmnxaz}?Um4FP#2YoMRrjfGShA~6`?ua99;&5bzL$n?f`HcY$X?brS&0nM`pO8 z{KUo-8*b`Splc+}|0;5v%B=rvkRK7hS}q)8V2ro`UPtV=A|)miiufh zEi_sw?r2PLcv%21n>JgfAh-d9*}&SJi`SZMXGKsKa7M-`r*-wqiF$o=F0s`X-`h2k z)O*t=B+X$-V_z3{vo9<3$0$O11&K&nz@)GkZ5}V-aCOV!(k3BS)B_1bv4|A9ZqeNr z?C(bg!yhIU;`2TC3)PhCy(iVQo=3sX?~gYR4v>?&>`+6>i+-FY%ApYCCK}it{3AN5 zED;bKfcf}MH&cd_-u7##k~EPpncGS<`JcTv>O2lbY<&J**5TKaj$8!JaIiDMg>l$% z6oX%kCjDk##9!+u&(kNZZ^M_$rpPF4+}2abp9HOPlNJWFTG`gn-v}w z{}OeA3aBB7TMq4}q6*|oBKK|8ipl-i#>WEfT9zSlYx6L0IWNKUeO03qVanGuP+dda z6W|eVc)J_PsJNV)iAQOhw0yB#OW8(;YRM?E%L=n@Uv2giM4jav{^6A%0!}?BgTJ99 zXrjrJ1YY$^ZHBMRk+X@*!fs4!WQ_Z!n(FyJ8WC!T=maj!2q#!z&iA9vLK~j{!=>w|3t;b$znT9b@M$wcB^Edxb@m+=R&deL18QaD zk-~(|@Z`=@lNi*K_aU!Th;cm12lq7R$RZg_t!D@620JMPsnv)Wdb>e=%{*6e?IfEg zjs+7HT?Mr1^CyNAF=PjNFgDpQop%qBAWuIk!#d#UwJ3~XbkaXvF?`n*&q6!$ngR#-GB-#bXKC7BrZkRLuG zpLS}GmT~IWB_HYD93`Z*L*js_sUO(vx90Na$Sd{Ype}}Jt0flLzBH4~uMD?OnyQac z<9W58w`8188JP2`M9K?F@-ineYP($Z@GUeO2(!{yaVh{H${3Yr4Z9obe2J{|f5e66vd z+7(RT@S?G)JB&3De{qb$fj_nKDJs0shHP+!nQXFE?3vB5un92wD7P3^dy=+0lk%mP z)CHF5q#uMTaBi3*5}3s{Ntg}S#cggpjT}Ctj&Y=Ly`G6pigUa_PnR{%QTHbi#{&)y zFg7!EV+hV+&HtXHltVNy_s-~IMlz!cW-=#emXf2Y165PHHNEP zYH*vH_(n86!soM@Au^??Y8*eZ1fLj-d+kErXd7B^^M1_oCUoGI)N-MXJG)?&~_=<$3>x7%#!r^?dM}QIT@J}}JugBv3KBhewL*1rz-CU8 zwa}p~*M!d;av=EkvBK>2_fB?D#ZOg%ZNwWB7YgVR>ZZZqVWeW4;bMK8;lSof6OX z9%ulp)%ppV`s~l8;B4p4EG*CSoURbE({6Y?2oH=u$zl#OpFG6!h%BLC_AnBTL_I7a z=wUj&+OG@-*o%Abc0H_$hGzB{+~k#7INpta%JAcjq6ym8fSW}gL`JuRsw2{(x4cpB z>T3D3^FbtWi^lCjQ-YPE#h4fXq+y07a0C4G4sY1{)da=!bR@L4GgJYu5cd7g2awh+ySqdppV`*i@!GooMSd_BO`;5emN|@@?0H!^GTRm<<_bhtN z1Y;OE;sxzLAKho(5ok!=>|gl48~Q-V?i1>6Z0zT5HmGMqyycOnffy4o_WX3WPr8lC zjp${mm+a1`4N`Bq{!dQ&b;$S55u}J4qIR->f&w)(Tp)W;7#*e5z0NoxL2R-=vB73g z+q@gldDBMu4cRhHi>qG~?`V0w6%b|>#H%1>o?dQ+v;*>3ViTvf=!jqXW;%H4%ksZLuAWDR@=j*#@&D7O7V40Ejwo=OSlOF_$&qS=3teCEB4|w z4P?N!gc|zxng`}bQxpu+1RtBp@1!ihXW2JTcdqhbs=2eM3?t8L{L94LrQKewOzx&Es!Jlxs5qb2f$Ak)8Q%rrNpo%+{d=E%ehXhlG$ z-#8ppGPD&%8<~;aR4Tl1)9$WOF{}0#Npx?^wckGT-vW&7;!Tm@8tS%mb-<9_DE`o5 zK_{*Z45GMNfH@qGb><3Ct*Nmd6!e}-&u~MAwr7x~c_WWUn9H2lm$%OFhMhp}TMvnp zLBGZByd5{F3brqbgCvBhgUE`Oh7OE&#R%dvgdoh!)2)fz`wquKMT!QNg~37v@Z!TyJ};3b!D0sL~8|A_Bl3qf*6fB zINqtLxAPI(MMHS$LuRLt_hv7d<1xg9HsMhB%JC2*vj;loxge=nZPY2EPF^*;IvIX% zR(R_@=Jsz|&|m(<7W7ig^&*z3^lJcLQnX0CSo7(L+G?x%IEz?K!}Gey>=KGX%gJj z8EPT^hCQI(EIc>X($@urrPw%gKa*sPm;#zV4Te@qbaSD=aX@)BQ54jl_b?n$xgGR)_)~5HT#ft!_hKb;{WRJpv9NpN z6``&`;g`mMz@h?CWS$~FR80LX=_B&YfP1ebO`G=lH~c&W)jW%Esnt?D5msh1^3~kq z5P7!F_?}V8sH3no9@U?9!SN_`66|QILM@gy-JL>q%NPcNd_dz1wp6-^UZ^eg0X4PQ zc${(J65hd_FGLy?fb-L~EpV)ETg-TvM3k_NlV#w7FpM6jvdQI31*d{F{Iach{Dn^l z@;r$Nh8z2(0IK8xCCirBnK6kANxhBH;)EV?XUF>kH^4cKRlzu2=at}xjiO!phMabM zw4rHf6O;BcD_}~M`RNQnG#fK^GWhD;&dL-QnwKZl690|aCx=)RmtJQo4N>YxW;8@O zoP{8p-*C<90}S~dRT!mjQam|(zY~Wkgvv{$kQkAslU0PMIqUVPjjhMhyB0VlWV}tL zqvL)~*5PIMjSA^_6iu-iH>C(grZ_grK$y-GaoLoB$^TYmE{;TzeRMER*8ezb=z#Pu z>Q*bN|Mdr^fT{*L#I=+Idqh`<+SrBl#}1Z)mRlZ7 zV9eEUm?St!>=ik|yW8#F@jkQG7kCSo*3-=u+c^>;Jk_!0>r{KJo?wFH;JYU;Pu^hmSrA0dZtV1oHX7G+bwEXWR38 zpuYe?yzGC*Gjm?R?Gb(~*UhO}Fe*3S>lNJ&NvC)Ra3U&oN0fL=TS6{v*%Yt;B zG-?dXsH^0^yVsJ>e?BiCEs#gIQ(+TN@Fx5C6?G9krgZN@{|?{)ze`nG2=ry76HV|c z345U^MSxH_bwC<~}Qib}I}cSE-x!zgG5|;iU7N_;!3$w!;_m?;AXy!`IIj?yXHm;x2dJ9~ z)$pedeWq4D5uZQ)4*jMtzU618vCcoZA0hADCqVQdoV44}FDNvVJb-Iix!+dM5*~1AX^Z*c<1Zjbtgq7#@zQO8K9euvG>Hg+GJP}boqaq5A zvg!Oa`-=XWeN`6(qe-*uClBT#4>24s$=~Sj;E1O&olKw?bjOy@$UqqH&&rm%wKSN! zNdW&XX6fD&wdw;lqb`t^-??U7YQ^De^-aZlqZGrwMg3=tHExarpd7&wJCH#8D=Lxv z6Szbg8^(SopSp?)6WM~4D$YQR-iv`=AT)*97nKa`!w*cwgPT43fi0OW3N_aAnxV{T$?uo=n;ma$3fbw zx7%J{$U%P|L{loot!8J#x9vcxjp`cDwUQaa0BB; zxbIF%W^THpB)yb9@)w!`uaH>=Wk_eSB9y`aL(?EQi#ubTFOp~D&MhlO@!U8I6 zQNQecqj+eAb%-JlDxk{0!Tbv8`#@%VQi6?#qR`SM8wKIJ*&=&D0g+iAplaE0AGuhD z-#e10P#OGR1lQLUY`_4yl1k@kGABP=dFv3_<3+7@71b087(Yp8KULYK9w(VRR) z)=Zszl@G!%O7Am5X{?m_^A}k8KIJ~=h_btxzH~f#W(kv6onIj%D`1w7+n>h8k_UyQ zv0j??mx-CB!?b^95Ayg6`iIOy0_IZ2yQKhgPhR3Gp7f)WCeK20V*+9x;?fdf^oj(b zC;PYRd_7e;yh4XyPL%KS1^D#0ml~zpEw{DROQ#Tkfr0_@@AoJQ{!73ypapc?%T7;W z;q5oOsQsS>uo%Xa1bB4xHOLqgX?GJwCn%dZ4EjlL=?1pK%pur#uC|3cYs8dJntTiC zFwOy#gTW{06IX5cgcME{!OEs}+q&kd?S!Uk`wAPc73~JKgzwY7;tVNpY6Ry*ixh>Y z>yu)L2{idu&Y}^443WT00jD+_Hs^S+`yrxbKZ&&umEBjbi|T@|J-u*{oinLF5cv*@ zb9_2DVWbisG32P0#L7Yuf!xF^t&R-i_tIVxzIknCm;uY-QCY2t6f`a=%ARAL7XxKX z$@S%9wi3iQ9lLGd(d4v#Qy?RuG2`n<@oTTbMskS+1A%s1p9`2LdWI0^p*tzOR9}Vc z7jOxd6rVn5;V`#6R=kA6XlU_gmi7Ye*7U9}@OxQ8chlLi6U^WhjA*Ows<3HZOiRS@ z*^!^}`axH^<+;$15~&HXaOWT36RpOlB+g>aiEydVH(cK?1Bt3wlnb4<>Xk6@rL z2GFM#^W~Yu1ua8WL;{M52Ddkh9()qHdDusd<8_{WysEM@S zh9(AbL19N%>uizp$Ia5ZmC+Pgpav4F`xD_#`byj~#Y~l+(`@{oA%Sy~cv_r;V|}cM z2|r#;=?1_Vi`R`2g=_w0yn0uAFv5xb`xu$GWqi+|sWSA>-0zt~4NE4E7nAa4@%IJV z#XRrQ<-=#sxz6(Jg{(RI=cr_tP>AAgRKCzisAb^sT{7wKR3bS8B%n~3Hf;Zor*{mF zv~9b#W81cE+cqaQCbm1aZO$Z_Xkv4siEZ1qzn<%UzPGCXpH=t)@Jz-ST!^aoVnp2kYaG7{TAzJ=W=EYSU8plo* z{loD;MH3)m zcxN5Z{y7=Q>#&xs>~sm^j{v#>Jk+G68}Q89ty!s3Q;0tF-%ay3B|t7zhM0)clds z9vrkL9GHYhD*c^U?U+L>@^;kMh5yhk$jF)ij7{I%5;bqxDnDh4AKPTeZ7W1|F1%^d z7{86sTVK44mwwozf)kI*661MtLv~Ww3Pt(~%Tx2BKUYNuLKE`P<(Ohx8e&}J;=)xcj9=OEMx9%c4l3Th5IW2>7>WO5> zk)83Joy2dWZJ`)6IZ$ZMePHmAGia^mjx?g>Z6u=Oq?BQ~KJth|3wk^ljdGcq(X*B-kuu>tzI+4_QN)Vj9WWda%?PjP+Tbr0rOJqMC>&@Np7q#4kXxulAec zSYj@0sn%mh zSmsvoT_0`%78I6Ld)|_ox`9Q&C_u-sz`wII8(LJS2dTeuY{5353#K#ReP`_SVCB?> z6L}urvj4=T4vw1IglA9y7wN23y*#UJU4W!J7xVLaf5gtqy{nTi=l37paDX#jIQJcM zr4y?-b}G*1`-Ai4-6w#xK(t`cwp+*l_Ic{_)6PrqtMT2>pYyA6lBVk- zx)+g4WBn<&3H0l#qAEOPTx|bF#mdoDSoVu&Po+<|Fr54J_|36#iNEZ7E;K~s30JN6 zY*=>N^|NlnbK7?#=*o=2Ha0Vx=+{P0?8T-vpo2T#;R*3v(1X}a)p7W~=kG(c!%dK2 zFSG?TaVnu7%b#o;yMvp&+TXtzSN_f$?p~Rn{-)y;wjl!4tI1zuO&aE^)V;i@Qcwxs z7rV(@sQr@iXwkTHz0u&aGyTd!(yQeOm+XVJgTq?TWAL3#V2wlN?&g#a0j-2)QI`%+Xyx{_URWtJ=u6?O2PN=Si_>N@>hh)lX7Kr*zqb;TF{ zqDYAvPw_Wkf~)SVSEMWLWQ+U&)Wfr+J94T7m=dB_I3BAZSn z#z@vV^2b2E^HJ_Uxe?QJc%G6)zk^Px$~QkApVmrXh2rW~ZO26zxIVamsXwWdsT+F0 z0Qgr(&&?xh@y$@7X1M$I5cmndqISJqu4>iWqqq)2u#|}m3mcltm(SiK{|11^m#B@- z6*Ce$B{T%9)j*Mc{T2mp!n^rFv*fPkJ-O#vsr2<^gYJvmHmoDu!gge%vrFUjj!{*N za-%+vQMFHyL->7q|Aw>JVpZ7MA(daF3ZN1XTc+dwNy1w9hk4;kp4v`vF4>XrhF!Vm zbbVm6e~NW6#W8rQ)R_ITql1sSh%$00=uWSHu&~QX|(+~^j+z%@`FQ44{U=n`( zzm*0z`@gzw3{Z~$%lu7Q^|`-~n@$4Sg@_EM$bojDqLd*%7l*Y}}( zRcp=rZ_TU*Tr2Qu4qM!_R7+orO0GiD^LKHk>>YIRaEV# zMSsA~&7VW8Tu$fqdw3h6JF{2AcS-unVWC z>kRVS-+*2}=kt4vAU?qLXtLKkB=6U8ciLcM3NYYH5z#769eM zLZc%a#>6_u;s2ukfmOE{uU>&e2i6@9d(L(=wJ! z!JS*4gGWkv`+_d7s@|(S_n>(;|N7<>-IYp*b`7F{kxV4<{gG~&M9>nMwfa3{hcO_Xk zw#A6USKLdlpn^gng`{yuS?l4rEbvE+8yq z#FP&a$m!BNgJF(O(V#+ch>N3C0)JXMiGc?^2<7X1?`DPDA}_sv_+gIl6mJEiI5G3zNWMa-C~fN8SE$O>7=?Zju`5MWRQV4&Z{7s30mk30>H;2 zyLS|$9nZw)R$v(lw~8`GNSDd!)7|wmYfX|#++gXW*<(4hq6hXsoblAYtyPW;0DSYc zxu)j2+oF4IN@d?O6vyI}4@W5rg`W6~%)PI8q|Tz!2AN~rH{MDopG0JsGjwHkK54O( zx<(K0LKBx?;a#~=J?*u?J?{=LkF@>Q$n3s69qp%IO|+`)FgGOxrOkQR>by^+Auga~ z(HuuFDs8QljeHCMlD3r0eXBRw=F=cqXBih2=j8Ow|{bu8YDb)2>joIuvv&ggrqpW2xFJj+;ea6iuz4%^t<8Ez=O@kn4v zQ9^VJL-vJ|w}UA7oP<)yA_GnI&P}jj#2#+IL2|D`m2btTQW8)zPnch!Z)=Zy6>EN) zZi3YrT$K~F!;WL~zcYe| zJtIj43U!|0VNe;y`x5J`~Q!*|k9kY<{ zg?YI~!g?~swXDrK;{t;)Hs6hU9OWUPpFojnm<%@z-#uvE3V}!_bW2Pi5Xmh3hh+8& zJQFAZN@LivRciXrcxHDJ?uD4<1Y){3yAl6~WDXqx7R7(hGHgnqqYJHCVQ$)y1^0Kx zDr8RG{>1dUd41e{g9P>FA*tp99u*-gr@MFB1mimkYarwfZr2U@t#A-&#=!>72&LG> zOtsujPruo9+z>4BXt8LDQK7t>P_Ih0w@O=*Sa!x_j;|l*?$?HwxUYnzG(uanT+svi zG}?^-&%zlQ8NWTHf1I$!f_uveZ!$`D zN16;4l;^2o-)MBNm%a1mi^&+1eyXV=Jl!l^A=|2Y_i7juH+&v!a>5ze*%(3` zw7{JrN^bLIRVIT4&83tiCuj1Vwbl{9vZy}=RJQ!8XPCHD z=~8Bs*+l0G>PbYj=~VavW9}@!$V0%*1^BGf65ZPJdggb^cUoOFtS`(HtO#)I44b2( zqVX+xnj)nvA*FR{van29Ex^UvCMkr)tPk5EZ7OC+5=LNIK(Q#GMQ5sY;FMmwE^Q()Ld` z<$<5{i<$;p$Ns)EY!W=^pRk|&Gz-wk4*bn_kJSrc(iYU+k(>0PUGbzKh`}{ zRls1Sa{r@R!y3a5F8s_;Oxj87qGhcUp!K~cxW zbok$l{-wQu}W&I57*WxU+$z5 zhuI^qUqxpnLhZKRgnrv^%9|%?#%^VnpT93rzwn>t4d!++z7+T`(kGG~I-2&%+R^z2 zl63+j#^-d^M3hF8XyoFGCU?zKY5dg z>nWg-Ctif4Evq{4gqWU=Z%tp>4&lSNSJY$dYsQ;Y7`o`R4=9a{;d|U-2I|3d17BJ9 z#20*-3x91P6!BzJ;>(8^w>cnxm~GTI6pU>t-L5{?T7|mi+7XuJ?d@OwD9sR<8AU$Q z?M<2qUBFTa|55BTL>(#C+=wIcBa|I?bBalfH95Nv4&SLO$EeEnz!>At+WBeBG#;1c zY`BR6ghI<|3P2DymB!lmCB?k4lpte<`@pHlDFkC11igLktt^V)zRkF@UFM!d`*gz> zQ91nst7N3Y;5-e-#6#%~aYA^5Y*J;?KF>liInX+nXHLo~OeV8p;xB8QEQrP=csyt8 z%2x3Qd+?o8XVtlGB&$#WhV4Qh0;`Y@4xa&`9-WlEGC({w7*E~$IGqa#d{`LFwb1RI zlMqF7W^>=bK)H;`?P|MlU84hWV`8CWaUq0j#cy6Ne{Z)R*M=Wb&P$jwqF2x7`f@iz zFl#yT+3-_k7Zn7<5{Yut>YX3eC?b;Bl)ATE{KXS$SDi+H>cEvGKziO}z>x~kouMqa z`xSHg3Sj-TBS8KrTEK?*?V4Srz$K~{LmAY6)Y$d!a9QA|`hQ=GGu?5_YcRno|Bonw z0l$myl`$`;Jcr0f3l0yU(Po>?Q)XqH#|T-8)Vp25UZ6gK@*wiVg^{k-TPrx7-vYue zlSE5?x7p6*JIv%0iu#rzY{#;dFn-{U8gn-QA|AMN+$<8V`25aGc--oBv&?k`hQO|p zTg&xXv@hWys(kY{%2u{FNSkutus&xtb=L5GTTT-!PQ_b0qF*$D$J=4RqC@5i{I4zY5s^ zQ-7OKSNELM>QrW`M@d)J5icHME+h_1NP_Bt(T_6T#^o&Myf_IeZ-Vgx(0lF@gqEF_ zv!8@Rzx>JoVOMQeKJj1 z7KqjDifTLWVDpI`@2^t^j7KvEX2F9ZgLCl$;a)FL3@|p96cY#MrPw@i-Rv(9B0GGtMc?~j5o1AW8=_*WDqfslrtn^Q`7YA;oHYqsDKRDlz8 z=5%)E3HZ|g-;Jp9|J{gUES#_>dj>20_)7F6xMwsXjP~49hi%wC{Co-jhiD;AF&cFN zVpFWS^Rli-KD2j;J81h%vXvDxnP%hIdAwcuU)cUJTIN@XqS3R)b$RRlLw#uBHUDF@ zTz0uoG{7KQ?9j)liK&*s&p)*SCBgqu03tvNV7XFcU)9ij$)--ectX>mWwMS<2`XJx zmq~mSf}Jd>O8dixcrLFW^ALdhu7Y)l-0VX`bmw(eP-4D=tI922zlWC1}eqDDORkP)A2bl`r!ovFrWA3OsuzOJ* z5RlNNh`O!{d?MKxOY3ddw#_o4JC0GT*pp}I0FQWb2;6unV8o-tKtnba zvf4&5IzzT0R2rptdv{%v&cZlZK!;%A4x)eI7picF0(e?5We_^KNxFN!xAt=93xaiV-k*SjDF zDaJ;VD5UL<41oegaUjIhqCVUruY;)pQ zjPLpHd?Sfk=#C2p-*aM*ZmBVuDO&pU@!zj2pucx5JdL@1cLl_q>ymvWw<*>~udFsrQ!vzjNZxNNU)`Y5=&2b1d(pi| zX{0eQaQH0DV|jlWVl165Fr6ETdJytA*q%n6hkOS;ejj=7=vPM*qTY2ix(mhyCf($Z z55hwvne-M707xSd)yp93^4->z;?u-$$z7JOFZwM|@LXW91r;Sl5IN+sFW$5UNda#I zC@^I^sW{=YCC`b$y$=c|n`PnpA`7m*f1=bM&E%lI<5CM-^_$_El!P3(Wy1zS)rEWY zALO;%*9zH*jUvo_U?XoFk9BARs<_J9e?eE*l=|H>%D`F6&dZ#D7wvEut7QZc(8#bP ziIlKkyMuSE@y(Nh))}8lH%QAuj0C#WYm`=y5)Iw^qHgDUkS3G z`tr2mwBoAL7E;<1HGZ?8vyIQ&o$i0$NbMHXGMQ-^*dUsSAe(ziqOWnsGjoZy_^COG zVd2}3#>p|V7mo*0Qz`Nh2pN1p{#p3uzGSXhm;`qw>R>)NQStjw|H-yp6Vk_$kz zlm5AeM2j95DYi<}v$o)$9*aZntXcL@QNLyLUf|NiFq;KnnW~`cf^VR*P%ZOTeKCq@ ztoVqYutj6;D_SYm|E9UihY&CbrmcHu1&yA?smf-xTjrU8U2y&vbDSbT@teX&#+oK; z-4V{bdWu{7k)A zz#SDyd|Kr~)Zj{@mKD1?H}tZV2))vW)+#1<5)X(}ziRTfWshMY05G}uRseGaY`CDM z(HO#Fw=5UTvzW8@&)qS?29gr~`6@$zzRF?MLJF>N`Y2K2XkCRR(Vi?v1TqC~oI0}E zDb))BiqIge`mDyr8@;2!4fh9?g_TZeI#Q^~C~o?I0kH;*b&4*o+01) zqAvW<1@f(F_D5PQk8yLqCDX~Or^oc`WIW_(`Mb5@^USLdGP!2+oU|c*YHaGxjZJqW zL_aKnYJe;I*t;h+l+f85iwb0_t8gw_UYQB^dJB4Pb}AA)JbZ9ZucJLCL~+h5z-nUh zv121k=D=bNwB`52txGEZ(XvR^qdhmRwqzb;ecju^gMVR`+ijVic1xf5uw=++MA&d! zfn0k8lGSAP-kWp+O9+kbk}?!m_-G+FH)dgt03D||=FP!7{x?wi@rDmjkMt?aHqQV| zwZXFV2X&DNaQ1R&X`?@qp?%E?fEh!U%hzKR28WlwA=ufecambe^)Qm-^0SkthcbuW zs0mTqto2J~ue3-VW6=l%&EwQ>8xKT>t5K7LDz6jb=8#n_B?em`071&Hmi!8=6$pW} zEu!6u8$KPs^WN2WdP}?8Ws4M-?2C%$RxB9To6czDV?}t#L0W0GZkkO&fCo6{G*ec- zSYK1D3Uistt-$!G+iAq--)Mf3TZ2RSJ)X)!Pg zkc46WkblN;2duiYR38Or&gVq3@OmwFa)#@UwFu>haGXmbGH!JA=*Qu}zoMv0`56 z#s;Y0`b)*c=qbY`dflQ)u8BqpB}Dm$3MkF&M+0yT)IE;iIO+k(iIJ>v)~-v=*;WlF zhqY14=o|9IJ{`x%46BUd*|n=urX#3((i|y?%WmL&{;Vy|Sm<~vD(xN2-&a8zQD6{% zP4xZ*2Unzwn46n^KATqfqAya}p3-U_vWP|Ie*Esv5!MAA^a^}l%f^b>fb_S90+R%~8N>F@(Id${)~q9kZUo9TD*li`vZ zNosUpaA5bS-_Z*3(Tsg%dTGTGBMP-c zFq~T1vPl7oG8te@887QxpL_ww!TcJnl6jbtd=f}jy5FkbZzeZ3@(iA8TE}8G;azOG zF&RFq_1no>y&+AsKe)z#6Cy{Yj?M#DPnTk(KmQI_sEWMRT4mc_pvTnf3mZd#sq(YdgZpQcpARHPXYk@RlfKyYaLf__shF_9K-4WIPm-~SyoF&fx?Zt|t10`*P19sNbU*$Z#>>+F+-C-^AET`% z@A2{h9*mXXdWnO#WjSCrQZ&DLuPuQ^f+SW+fp}BcruY>c`>)soY8Y1}x<8BZy*`?l znaqLeSKmJCBlk~cGQ_NQ8Kf)AJmkP^RNS8pgZ{5E#4ojU!AFsB;uv$?-1uMuCEwt& z%PjfDzu=*pt(N|~A7$i=120KHG|MCvf-b}94h#aY#)8lVEXAe)kCF11@2Fl@t6FYH z^zgKa`J`nUX^h*Hm_8c46(4#6j!p1NkSE z@SP|@lt?cQONmS5o1vf(xxyPlLw;DKU>e#X+aGNt7p%y*dBtir!{zHu}D)OUx@vec~LH8 zcNt2aA~j?tJiz+QYm0k|L=_GD4OW77!~W2b}@_&=fRL%1Nc#_14CLxPEtFk|A$_P(70Y?Rg(g zjEcsQnsN{=o6^oE9BWcW4#E)Yc*U&} zHXmkyJ89vcYtOXVYuAJROFP8MsM9QK(p=-|E32@%A1?fFzECs?P)_TJC=)uh>*GRz zqCU8<2hu_b9dv;saBiR_PSa^_v2VhTwZyRR)rwZf)l|i#hLXuRcfZFY<#QvRok|on}ALLZLABvGiJ8{)nLn)s;n!2D*ev%n#?H6 zXS)(yrHv`<(Ss-tD&5p{;>IeIlnq%VXKx;r9J-BWZ(1*7xfnXqOfEh;+nRs~L0S1w z8m>v$_#OJb6*Ww_jDCqgZ#0a!v#d?jVudn9yrqPUbtFry4pfRnYP3FH|5lx2GG%}iM%_u-wFSbE9L_>0i3YPZkBeSUxy%311EF4i< zY{nqTh>ITNI-V zmBJ6^u0bndFg?hI3^PVRV^vAUm${8=Q|G6Q{kz_mg{tcn>xF+)Iv6&OML6?f3?(iX zKbq#sSy7nI{P?bmVGSS1p(UPAq5agT@=X%k(Qt#;NG91*)bb-g%K9;Mcrf z?GdGc@$Y6sXkY%=;D`;L=VO}ZY#-*K6Sv?5Rry}Z2iI4-I`292MAb0XH6*xTujg;g zD#zxn9}0g^`jd-I$wmz`Kt*dS?cvob7{&gOyl^~lfxL(03>FqG+Z>O?4mzHxu8_TP0(LZ%R};Ul;jPV#>!7- zjaAhCY%2yAWw-_Pt@^zD`gpw=68FjrAdV=&4Kq?-8RU_iyhablDVG%449;`1_?ZO+ zX^9}tB}^%(V=JTfeKe_nEq_^+NLwI$%qL)OO%Hz1^`|{ds_u*TG>h4M0H&dfuUO6~ z$jrp1ZtOKfyY&9_KtWd^|3L}-C89dPI0uK`aG)yb$6awp5M7iiM3Y1shCHK2o|7bN1zDA z5itd(6;Lhkxu%b8sPT2q0T>H2Fp39l7@_qdA!Nonb?*T3p+8>!G6ZV55m(6@x3vBY zS62KU;39!BLtz!c+UMcLc(Vl%afi9isGm4Na0PpA1rAp+KN1~o|f1DrpQy8CPioni&YSSbyVN@SC|iiT58+Wspk9TKs7ac)0;D3}G#<9B}8 zqr1_b6q>eRI;|_fS0zuW=Z#Q}XRn~_?lSXNI#bHUWW#ppYJ8T(<28NuwN-43(Uh9_ zXRR4NVK@eXFkqPAJMxLz!A7$&S_i^nT>C?L%N9;5?-AS8aWGg#XAHd{?|8AVu_`)D zRgcD<;8mMFPJVo&e`Jw2<|{=@=J#@M#G3%_bso&uK;mv(1lQ5XM-sg@rE}QQVdv6T z500WeE?uf$fT#>%U!^DHUq>z%DLq5xJ>$)lLR;lVwt#G>oR^U@i&P^iBmL6;AG|9p zyMeyT!$=~9!p=xEIiB@XzpQ$G?VPN7I1OZ6`p9bw_Uf;U5N$h9toyoqa?^VOR>BY| z8?fPALk_T9g(r*;)BJ|`w#V6#=O<`jdW8@w54*MF>e2~M)w zvekziu>(5jiToyz))s1{9e>un61u|q=kh)1_DVQ6=H-e}mkn#{^|SsQP|+R4u%`bR zYm9{}^UK*Gw!)a5-rX@bd_B&c7;AA*>fTeboZ~lb#Mp*0yL=JxY+py8<>E*7uRq5| zYhR8HN7d4Qt;V00ryfOL_U4w{j4f+m1l3z%JxqL0l6vK%656WlXJ|=_WJf^F5>i;@Xrf2}=pc zH-KnrVkA9Boas;0lGr9%Sb{GhAN1*P_76z-Fh|+o|1Kt=Y#Am{z?(M*OA0D*E!m`{ zo3O@(0^Cb(lS9rkAm6AEhty!}x}{)wtVU4i(4aBG&(x*u^Q;+d70GzpFZs4g7DymQ z^uGvAN~#9YwC8u}P6X)7gdoVKM$g#BnJQ68f0O%ThO&Q5Zg@HRfHDEB-tFLEd)Cwa zA-=*jbF_f?U-fS7W9KD}k2)8?273biefyIW7*&8Xc!5IMICD{`x~B%1g(A89chyp6tke@gfSeLnuiIiESa+dd zKkL+a{?Ss$)#ANO_zU^FR|G_vqS4O~!FK0%3dZP@?HU5EfV5ZT1xuTUV}D^{@DMN! zIkdwhBpd%Lvu*UW`Q%_gZvpG`#RW981OL~CeN}Zh+uJF*xeK@w>+jkp{KX)yY52w< zy9>q>5d;~ZwSBJ4o+s1{$A)@Zs;(rWWrU0*R;02>Ui1XIMGDqi4x*-M<)OVS33ilT zJlZ1JDscI$j}+o*Y4n~woi{YucNPeyT%;diD#t4Jx}T7;Rz~&!&_HYZcm)QjV0{u$ zS_PH&B3ft?nb}NHCH`z&O|_i@`vUia4-ME!v_ae?hEM5TFxDxwpYyoIIOGbU14Y}& zWng#y*@CCkBjwm|YEvZiVJ3K2RUfOq{{A{3IOy9+*+>NCgjp60q^t?lO~PbUH|3{$ zqtb){RqhwB6bNMilm&Im1Wy9dJorA?gTv z>x-htuXx>$80ea@ajPfP(j(lz?T=tkO6NwS!ELFK=sL#C^|hSLB?j6yH*lF_q=d~M z8dZ|#NO4~JkSB$jYn$XB*;xmXZ1-U_eh?H^{ zxVn<@S0?8Q4)cMt8NvO?nmLDt_c8Wx))vYyOq{H#Mr!*fDe9PWv8}Wsa3J7wYS${k z%0?B5q|@q=kpLHeR__1^R_Krjp-e>m-}vqJTz11&e70s~TkMgL zL(;(B2ooRHcfsJ7K93I}K~pqzF6GKM#n+IGb-SEi&^gfoTH%b>WM|XX%*{;IfYr(` zDA~IboBzGU>=`qy5E!7`8AKg^+rzIm{bAk;C9v^mZZ%*$3Qnw$fWRwXtTK`X22(!4S z%)h$TWY1Hr*+V|j81A{vX&k9^dA&F_7(k1oKrg&_H|zl1voX(IxTOzx9vTc1x2Om2 zRb){)H$3b_!b>RM@0tEYQuD2@#O3^>!86SyISTx; zjjy(^PYAFCBeJBTC8MoFMGM?_T|N)rh7<0tv>lm^@WoS}=}Tv2pSNP*t0F4ZRI1}% zuqGf<0qQnsr=f#u(mm@Uw^0$W9UD6ro1{72SqirSlh;?g_T~Q>%Rp z-|_8mx^4<%ww=wdpgz}Nv>ici3gcYs6S6 zdKqQ6cJw0ST`Ytx27t0`uiZ zOGgNlv>6H*zQ}r```(YU@x1O4x!Nd-UivcpfNVKEsMk>vJi~8+7Q(r$dPgx$=!|fM zOggR9($~hu#h}Jq;UE&{ZHO`A%!&OVfaAX=T5~QZtOnZlb#5`06*LujdQXLC#ym3d z!IG?%3J>7Kz)+VWU@ZN!m^<1Ru9$lcl*amK?d@@ZB2VL<5Ajtgxxtip4vt1Sk36Fv z$%5wh2|e@64K3uN$IX~Y-y*(sQHV~&Td{1XDF#h=8P>D>wHcFw3@Tcjq1t2nU-iOEI#{3gmLtiHu;K@%^X zf|3bL{2?%)jVHk<4`5Wl@R&>{We^@!#&`XVHm{V?Br=i2<>`4*GQb^&pYctVJ1WxNpDKSD_JA z=ybZ+X@x&8Q(Cx!QON*g+jm%h;}*P^pZ!J6gRf7C#xqDBkBc_?`sx~tp_O>>$;$7? zIcyAUzP%ssEY?+47Xf8aqjIR+vBwJSDVklo0@bt0m=eo#h(E&DYtYX|kiW742nmjA z#iQ9rLobg~&ZB}7b7RfjW(4?>Q4csG5+Pg0rl%eOBr0NDJHKV!)@wNWyAgR%PK!CLwM%D9qkE?XJ#RQ)Wpt+0}$ff5`kX76ZZjXCdD!wD~^6oz>ShwK5UG@EA*Gj5Nd*M-VPV!mRjb zJRajx zX2G1QnrdN|mY|aWxf==QxF2>!S3I$pBdZFkpnKaKPTdg=n4C4@$=oUjkp|Mos7F=O z*8v(2f?NPvdkg}^)YJcA>i$FnYcrKOGh=5n#8-|1z8|}X2g4alxH~7yxc0MCnWNXp zU#{+96FY!%3=MqfLH6&) z74;)AvoW)c4!2ZF`v)BFD>Y>uqTD@kwlOYR_F5O9y&#=Xj4v*@gZ8@GIW$`gw^S9I zy;;j7zTab9h`1~4*KfJdKQTTkXn58ZtM!aUqLTompyiB5k~XSb=JV$&b4+r{0nEX& z5RdRvZHyOGB|MOJbJiaI+Dce`-$!lrn6HAZ_oR2fB=wE7$L!(r8gmA#$=&_eRyAh^ z5Mlpra1PQdalQl7 zFIF9#gmYe$`O^>k@6+uN$sf0zo95VHBY8mI9A>MUsvgXe4Pp8(hhoyuAd`B7qm5G? zUQ#IMQN3Ttgb6P6B<vP+!dueTOAF>RQxOuu)BZMh^L`?v->Qpn z1e1}eVvj;(wFOGzS^Ne<@!b@7R>}Zo!6IM>YA0nSrfhXzA+Sj91HMoKdYC&G%aq2` z9S{P5+(?~sm?!~#Eg2#T)8_G`2W7aIZm_W?iP#)s`r1Hsc*yEN5h$Mvk=SEVQBEnf zOB`G)WBrBwF)zKqO|po;-FjNyq4)f5=@Yv@Zs1la%a0R|3$I6FP*pF{$j|{y$2Dnq zR$vOZxr-gj>EDG}zmi#usW|!`fW%+>}l8O{Osf)0C2&xCp z079VL-0I+m@MN^XmuTzW6dhh&Y9g&EALSNNE=UReCaHwe70Azs{`&v8`iH5Zw(X?iq+;9FpZj_D z*V&!byP9jxdEyv@DGo*ppe8H2N1Kb$`BvRVLCycfKEU;Nj+7O`osS%`JI2+ne9n?) z%6(>ei5MwVo2>{2Pd$6#Cl=-?80(4!Q6S|fBOY~Vh!3eD2N@fHf$u~$2(d@WJ+5k) zwy=YERVRtd_UxMqQ@xuziB}>9=brSQ?cM|Fnum17DxJr;+1LjL5FTlx8|arkY5x#R z7Q@Ggofq~D`QFiwA596z{EowRRllk3JYyP}*>-VTHZaJ}o*cr&-REC#t2FgqGEBaG zSbDTTOV?L-oyYrk;2whi2ODglyGeSyXDYbUD{D*#(JXE0kHyv7Lz^@zx=ktM+ZoE+ z8j4@b`bcM^y0;c2Ad34-OQX}~S|X|UoL|$APP?``=V?5W>iz99tj7|&baZzR$RZP? zQB$m}2lv@^ zAMac{7!CI4`vE)u&&1-x*WT0L52DwN$h0R0*=sfY18)yTx-j=-%JIoHAl$iG0jJ{z z{(mNxZtifzg{X}vM#5gdj?Wv0$o@gi9~$HGo6UfIy3{k~*YgJ+p+s>$#D)amYzT)l zY~l^?j|>uONR#4K`kJnq7_&0x)PhL@I_>-K0avZmahgZ_h6b9Pu8#W#8tu{;s}#CK z8ppe7r+m)M1D-S=+8&4Tt<55;RH2Zxlq5>eb}l~+r6v99#-F^?HrkIJYwPw$sRCEr zEQ+s&_-wiMW;7o_Y!nUW2>cEhlY$Jb`YB&TJAiP9`uiaawim;+`}u)rufPlf{_31U z8IYw(SaN|y8=X-Zh|vgw4yX`ih^Q!H_KzMm$W+={thRCdLfs}s=2x-Q6gP1NYL$V| zZMJ+OR1tkMfz=@{c9|XW%n7;Vu6Gr~Lg>ZF=td0S3Mgz`CDMSw{>lKP-rKruC!bjq zQi(-}2TcSHWy>TdlST{xxgF&U?ffvS$ZW|k9%BT9PeYmA*2~N66j28Hpw~{SS{%+> z*Nld+{yX<^rzgS5LKGp%M|hKe-xTPi$Sn?>H2Y#KtJ2O$mA*8;l&*fzoTagl$)&&A z&;D(Q+#DvV@%#q4<^UX8hpC+HWO@G4M>9Ruxjv*f1ELqS*oJwn&d@#@ukhiuU7#s< z+uE>Czx^YJ5o{pX4(=s4*+g-bmjL5C9t$CYT+%^^^jQsz-iiQsekbYp>Qo8p{7`6> z>71wv8WP)1DKg|Eq8=wMa`3n`tqlCtl)k0K&6X-aiZX)h%>#h-=2ANnX3dor{Og8F z`v7M9ZL`|i>B0FQvn~SlNvCEC%VlUl46R2Gv!;dnI#PCq#XDy16#@GdlB5p zHaHaa{xwqF#0S9VvHV$T%*5j7UPhh{IFTi)^M5!W5eDY>o%L;19V0T^T7_jdW<|PZ zjlYuN*YyvGXjs2GTBn77W_&5Mtw)T$33ymS;?@w z8QD`^X;`6voGK~g{38BbIP>vYYs>~q#g)Sz#sB=EqXhiNbX;>c6Qu@ct4wBRFS+fuwS5ZSpcl~Qxb%&s4WHO$Rik;pa zEj|qT1@O_e!yUf}g1i$=Ko+qN#v3Rhi>xRw^k+B##W)-cSEd_DHgx4Ktzdoht}RB8 zZqyS~MsX7T?_Y*{P@mKzSV&0k6_J(X$~bt#bwop;GJb(e%u)!|LE@mn?t!h3F*+z; zF{Zy3F~GKYq!3&v@jP~zs8Vw5ltPzB=5jU~7y#qBbWn@Cc=BHKAGRX|&*@AJbM))D-EN3WB{gG5^;_di_0tp|^(+ab^Fe!_NQOb8Cci3GzhV;U@YqgdsyH`w1n+!uH= zD1XunwhD7XPg`u9LD)hivJal!BlIb@uW?S0moC!M|0WO_rio;>u+sG#X^ee?J_Dz5 z|KGWPTL*#x{KMbX{b_1fYiKKPa3lR>UT=z6ZB;hOpJSwVn}n&^9=a4tjPXEop%I4U zxE@yWbR`|}_Q5RP;~mMW)!#2`dUP|yR*+*5AUn;2+#x5#QpvO?PcCQ@v#AKMi=on( zm?LKPZ-pII5yf@ZUpVpCU(6kImWQkG^s;>;MT{aaV47^xT$KTxq8T$`MPz19fg5m%T{3If{rlo;;@R@wjjG` zo8iS=ZGdO(9fNC6em<)21@#JWxyN2yQaX{nzBS$D%iiXQ3pYGUAMe z?422eB^q-+s`B9NoBNl!P8Uek%bd6V6~ujeaVEiiRsq0mj??A${5RDhtT>qsD=SO>#J+=*3+Jt2H$6I0$DRNR% zAr9(Q7JZK0R`g)W%Rw3;6U!yFJ}wNKNG=#^_#+K46-$p%Sst9nXqy$0QqCtnoc?rj zRXu#1=#%DTjC0lVB+Up3Ccx}v`nzSqSfs`B&wnaFn5S1(F(r}h3nCg!P!UJR6^=R3 zvNEBXY493{<|HVR9qi(&;n(jC7}axvG9?u2_Ase1QqqiAQ)hnlJGiG*6~;+qg^Fxq zj2#vLj=US+6Tt74LpDnU>lo}e!}gTadXXN5$U@1gA&N(waZjOHnvC5DWz|9*gauhT znO4@LNm4H?btm;z1!jJ`Hvt@hr#&};Q{3o&13bgMkdCbFhpYw%W5nFjeR`@$a|Io| z@@GsPGXk7BDn{cmFvG=te1(yaf4M$VWrGla-@SUNtYfkfBr6PVmd@IlPo0;6!c(); z^(MH4xvrs)=0pk;rmgsN=qIDOPO&W5p)`O>KqzN!s-@}|Z`eE_z@=bCK*r$wE#ed) z^?qb<&FKIu!=JB#0*S0~X1qz#1T1QSFe83+iR+6z!2X<6KwEd~!42#9-gcc9IcEvT zZEXFg7yl(e5nL`uG`x*?&=6`DbHKUi(!^yg{%AWk)s!9FGycsiYkRe?V@ZY#kZ6bd zFeWJ{FJNops=5YphUUZkfR~sF#VS}23Rotvl7=}va^#i{+7Hk>pmgoLviAZxBR4A{hOUljn;)`pZ*C_<5{5T1@rYgydm)f$W&oF)w}5-CW}tDOU?PhV5$opDH$r>( z!YN1{GjMcW^SQ1TDT;*UcuT@fR5h|1YJuv)GYo=S8*BloN=xg4x(K%3-cEEC*z49Y zzhEp*O896ek1^qxERAS9FE0)Z24JnH_X7RsbHIw)=Wn{hU&_+Fv0FU=*Tp!ePW|5I zCo^JRjz(?12hEr_xG56vKdw6`!c{wMrbW!yG+!Y+0Xte zza>+n$fd+w(?-4^-)_O0{=3D{fq&Qy=|3i|pPexpfacH2SR2CDySfF(o$b_a*4{;8 z(|A*BCgL82Gn7pMWwHdqITEw1*n z4?l`RA|Wj)0-YF;AIML@e~=&4!5!`k0h6MNjUrwc#yvYUzsajTnk=-i?rgH8e^eJ;?PorhNONJJ4R!xx$w%|7aByM` z{Cq8@BisGyVo&@@uzwT{vJuMnRc@LWyrh)s3S`;lf-)n7ve>+Yp;Aq3syyoU1*5D{xC>S z9jC+nQ;c1~G~>)+KkdI=K6nOeM&~YcGwqX#?taB3*E7?|a&Hh6N`qTkwqcBHr>hu} zvGOyeD)6qjKxyU+@~rN_TFx6i{I|aQsM@?|3FD`_Yr%59R>!10B4K>l!W$a}0E=e+ zs^(kRGao14vznfbERXTCgWiDx5e7#}l7Kx-{pQ3;v0O4+#iYB*ryUrjq2JBWz%Ga% zAhVcwY`jLAKD}3&BS$yK__xLx`au*peghCy3xMTB#!57WlRz2y1Eaqok-kj59Emmz z6%31DfvOswb*b$>5;NJuDR$2jDpz+>`f}( zvig(tVvRKfYLLZ$cN+5AHNaw$v2D*tKg&!ZHv1TbetISX%>p@qD5Jugu{1`3;aSAf zlY)B!yQCdD@8>n48$h>6Jl+GB5Eyje8i0V!N`Q5F{C&TF2SE8j???u?3;TKnY+Am; zV^Pi=hYnf(8H^MCTJ=c)z;9CFwr{VK9vL(*A~^RZY$M>*`=}39hz$kmQ^SuQijl3E zku?@J-~pNcV+~pnQd2qItde$IrIO2a!H1%|#jDfvSImG%Hc%N^A`s-Do}ig_juNlU zE|D~&i2-xcFfIbwGF7z-jh`HBDr?xX5=wgGHG!)Dju3{@sliqO5K`b_BVVcVvw>P# zfj>Ls%15?6kVxvZt+55|87;f*ASl6RliL98F0Gx06q}_d?*_e&-GrkDsN1b;0ikN{ zj;!#xK1gjfm2;S_dDJz-lPL@2y(B(eTIcEUo79XW$JosYa!G%^l?CJrj+?a2o@Q>M zJ6`okWD>g^_~Wzz{wA!jlgaQ=^DAVQ>yp(jOMcB>GX~fJISLMJgxP3pUJpwlWF}OW z_0BAi+`E-<`yb*CUEs?AhKf)B2lSxNzJ87Ek13ZT zm7|H*E@KDQ^j zy9{56RVpqvo7-&xhz(yi_ix5NSv;gxbD)vnIySQ_P&*T-xetVZv&0D(hbfE95rE(t zIke+*2)sLhp_Jxc{O%2&*yOs2A&b0VSD{0OorO1kxyS{s^E7ScIufOdNOtMwCv=aSw$E4wbABJX&4X8BD$A zL3!6yJ($_%oH=jEPyc#hZ$_2D_J~zB0j!p{Xdw*1(NZNDjJ(8c5J}o@(cngmyC-;M z{Q`wN^yPqgiuifIVO;m}uweUrZ(Gz|i6gsdR=e0?{!6~1<9Y4E*zPSvcg34RiL{Ic zR0>#xZn~z|?T0}jH1Pe98g|4JU*WnG>D64KC#(t&)mI#i3XEiGXKYlzRVdqT;=v=~ zqgn#E^15uVm!DLQQ`c81b|zKe&}s0u}~{^05( z^-p0WDK8f$nlg~3i%0RvLO?1Fhi#}4W*y>uWyXKhb34~qgWb9nM~FcCI}p~VX~wu6 zEVlZVnHkJfD&`y0Xs>qd*q8gG7wGp!S(XQQIHp*ihqo#)3v1lvTt>=b%1a?9MQv$m ztMKnyLdAf@MuYYPm)aCy!xKxcwtS;92`2-aG6#^E+P%)|PJC#}VC`>cKfzjKi3vs6 zW_S0pqs6jU=iywTRdM!Sc;Atij@rgD^Pxa6_@MkLC0qxa?w10GeWx7t75C3lVPOP# ze)UY|AFcNA+oP9U4isYa=%hQWQBbZNSXAN_gnmUJ$m>0qe+wiw!8EuEuG5Tl@4Vi6 zQ$B}gHw{>FcPPz==6h|x#J67pMP(Id1RV#DWC=%F5Y;`h7)bluQ^1L_n_!)&z!=v2 zA}IPtSmere7L^JwSxcf_cD-QNF#?b)%UU*)$(OK~`%F!8uigS`NSb{E_54(E&6L?P z>@fhwDQR??7YemPOwh{~uJ$-E+nR<>qD$%HOPf=~*Y32b`TYaO-%fP%T>1pl9u zfHSR+2aFYj<3EJo|38wJ%88$o%mC~pZ2^Q{VUeqe-N^y3018JUpa|%+_Zqimb40Va z#AYqTSyJquxYL-gz1f&6gQze}B3*c}judqB+cySF67I_=3|vv)qP7;2>{epnFE`=9 zdWdnZ^k#4zHkC7ZrffvjDWO4QEG{-xEOg_;#Vi05as8|ne50CuW%}=NzKS$E$xzHx z)X>@!`*lJu?fV+^Mis~Jf8S?_k#UQwx*=J~R?f8Gg%=FXc;U^hmP8@6LLOy>>4oST z%8;-stC&HaW0)XOAlQa3(pVl^hSmYfDE86;jp^Fh-l5ormIj7-LIzkRbt)j%c3*P_ z=x%^Y2!?X^VF%H7v{esxq}bCn}KRqOuzvjKe|zJ_vf}?p*?`^riI7m2*wQvchx|{R*EokY0+*DCjD0E zaM}zgXi8MAcvpF*`*7s#2oD@+tDH5kzA{a^kXB!ycNVzE$$RWHB*=Tf{M=?INWc=O z40h_vl|;zWc0IYcd5Nuu9EB#tUH^4ZlXu?)D#$gj)|x8lNBkhMhX*`R|3<>n;1d zT$|aJ%6RWVBhM~P`@wld4FY3p^kl$!o3TxHpvD5?MMR*>&u>BMDRhbMmrp&HfTryr z_0iiCCtY6kmi?f>mcaY@^hC~!akIbk`K492@3~{ScdN!%gIA}gyJL?R4|v1Y)56(d zWn(SJ^}VUzwT_WkfxjCN)U6yr$q7xZ>xP<&IvwT zm~NEqn|w3!e%gDa$<6Ct>shZNHTp{HkqvV!brN|nX*qEOSLEgzQ%co!299g{kraeBa2ZVV}yD$8TjLvAm z-PGHl*Olrxe3x}5FT4>0CroM~{@XHW&czu3a=lHbjE;u0z2gfUAe|%HM#u0>h$YZaCNuU)npyhBg** zMLdZffo|uKY8_bQ1h7V4x{l}Zd7(RQ$2hhUS~d{qrfv9_&U#lb^tmHYF?YWDt#*Q7 zqZsLjhu05treN&}6_q5Yf{Tk;`b4$NA4F!}K3$w+D_{v|(`=7L-Nku=AepKkUNU)2 z2vu1}RyutmUb1g0k;uGH5mblJ$96J3Nl`?=c0)e;;Ev3411x#^-)b}M2B#;4kxT+d zc}`q7F4O`S>BA*zJVcQi*7|G&bq?aR3!*M^M8FvJ>a)REoj=@U1x-uXI+c2%l+9Ia zvliwo68ys#{ZV-KM7w4NP!B)Yj-)7o}xr~%qbb*@8G=BHT27vMr6XK@r0zlD|cKguMM36yg ze^wMXofkNf0JHkLtx3n>a*6bSf4B-0!MjqH&d(rlMXOSKT%!o}!cc(E>ZXQ$w6x^* zG_iHv+NV~1trSn%IL}&2#-k*G8q+;;wwS`XEXHmH1?nyhDH^5=K-x=D#p+mI*@^8v{oj?(jKt;}b$Me48w_Rb zQ4%96!dv>Nw>4)>$W6oa!64<)VV~DNGfqi_dtD%|d?XZ6`mEHo-<{t8-tT;c@gPqB zO}j(*R`;~F6TDMLG3C^|0Cx`=WzK&ja%FXH-#Tf}h7;Jv2OU(+{ke&2Jnx$3fHHVt z7%UMJ1fwl9gosY0kK!z`YL|WaAS$v+udpazWfj^+IEk81sIDAK0f}+@p5!6um8C+6 z(o!<<{x~`))kZN2n?NOw(UK+HQg3}z3WEx|^&&>_f-g20BNly3xdNKWx1Hs7EA$#I zTuB{9HiD(qzICi~JWcIxYZ%UIfYl_aQse}+hIN(#1Xn5b%O(loFnM6O4YRx2O%h78 zpb_GX4T7k(Iy09=b5`KK@f~{8X+x78E6Yrfm;`Y#^)GE)QWXw|xB@iQ%Kleq%?gCX=6gy!o=>bo-o4LV4bX5+D%U53TE>%(S<9Y{_qK%1is!J!0y0Na5*)q zRkc$vcyw1EkO@|Su3;QdXvH0D9yj#Oc8!I1g)>Yu#GQYM;YC&S+(cFfcrq_ClJe4C zML9?6h-CMLM~9pw2shyE@_|!DfrlI!sAJpIg6DtOF?vV{I!hN52+V8ZCHIN z*)}LlF!8_;*vzb!#$^{t!^pC<-ZL$GhyQP-f_tyR84Cu_CG9nI<)RTTR`W`FgSNfj zrj4f5*uM^b7}`<>przijFvMK`lobL`;}9)8W#8#GWr&P5Qa~krK$qRHHC+;fJJJ?g z!%!j!r@nC~L&oJfNn^on+#@6$>P-O%^;IDTXlB8V{K-gQG3@Bh+I-<9yJuc4l?a|% zBMio?flQK4g)$v7|1=yM$)>SN=0u0K;SLF)|BaAt0v3Y-$Oy`H@YB;>BXXUH7Rc`5 zFA`1?c*4NXHX4sNK~Idrpw3BGO|_)MDs_n9*fyKOjj3_MwY6Amq`la>z>TIi9~>Er zCJ#z>O5o3~-y`yK8NtCOK*gFcLJH1^@8mhpp|$VgCgZV3=9N-*()S5dR1}~fB^%S( zzid`iL-*JPTvu51ODeHI7nQW*1fo#{&~BP^8f{FM7AX`6Pf~puW`kJ>gy4vhDioYM zv*O~EP34V{L`tkapC$1^evi=4$Z{aTb zt*-QZeoT3tP+(m(9zX-8{T$k`pE?lSkYlYM()wHgq)tvx{isv&*{>haM?rKte^IK^ z}SwIBkBTT7m2j7i2T=G=BLW2@Y7#&tFHG9ICB4~Oo_%++&U3p6V z-iXBj(i&vJ-=NFq>F*=-)ij$y%N#2jGO?zc{eY;!e&dt=CFt}ASlcwdH@9PE6NElQ zVY#F~SuoRClJp%^{mv2cceypRZlW=?(9 znG*rib>NaF(98M;t~nMT{@=9${6lNY1VaU3WlbZF2c-izZ*ao(ysO_($y%rW8CuzT zli-eiak>q-g5 zvPzK}cal{SEGE*DqERxa8Z&KbqhHbG#Vn6tXjm25o|Iiqk;T`ipOrL%SB(I(6-a%o zQa8=P-)jfNT>aA&&qHK3S6mqWWp!8L1Y>SKxz>se=^K4Bk1N-VM7BN6P>ZG6zr2pH_SiX>_+kJSxKfgfTF-t=aR=hN|a=GC~U^;#gi`#bm{tuf6Wr1>R! zaa)G!&#FLlw+w+(yA&P-p%N@ch!X~OhO=zUl7%gxoqo@A0IW+o(JCJiDUd{a*HFF5 zwuP(5@-}&wl94D{NK994d8|CrYr!_iX#9=uZ%$lYQIdp2#8j4ssJrfbAd&dYdWNN& zxY(~l_jpQzO`;>;+(U)eX7Yzl@af{fHFuR-QT@GB(_Z$Bo=)I2CZnV z*nS*IJ}cS5^m^b||d7~5}!Ghxb`*LFS?U7#^t zt8Cs~j#l}3I$~-b^&?kn1)QOvt9p3Z7CdJFT$-kVh!LfTLcGjpLE}>qfi(?EiqHVL zMGH+7TQG#L#i*1B#;80CKg zUmKijV;bhO3a1ed`QeI_6u^s=DC5kae!ml|6wCb%>AIbpq02o-n_$N0`PRz~x=bzy zFyX!b?EU5I74=r^T`#=Mj1$#$+fJKR9j{2Yq9H z4+5M$9Uq;+JeA!=;XU8516Ks+iY%5-zBys)nLeU@NXq|~)RnwklczXKvnNm#h)KHG zgoEb=s-UGB-F&P?+-SilQ$uA}KoGM5l7CjjQ|m!DO_%Cm3qDv+!aFOVcLa9mykWXR zrz7fIn*QqTy6q4{#4H{YD-8nN}f#5i%o;IaV`P%RBQ-F*gI4puJkJB1|r4OSyJ^|=?u+_!dPe6LO?qJp=6`%Ok!OnrD? zwf+;Z8{@h@@As{NOf?Y79;-P3F%nRNGJo2A_(YTw6$}5rCm*u{Dkw7xds_egf0KB1 zedT>lIKXx3*anxgc3#eqoRd9M9na>jM*c-N9gmEJ?hhNJ!xd)I_brK@(vny=HpBZw zLyb)HO)^#IXw!S@osFv}_v2QPOixIen)KT1R1_FJ025X)2nq}K8aG1#eR4SuLQ!aj zRe(5d*moI2_7c$hbrE7IWJ=Yy4yZMyKW{5*j1iC>Z(JKaFxqz(%UqV1OyVeJ=H%+m z{YZDH8|B^d9<;;*)68`qr7MV>Q_!4o*ZAnx3h;6u=1oe)zJ=-y-;uz>Zhdoq6hM{$;Ba~0)Xu9!SBqZ z430zQ7?glgy;?MhQRaH0GMj)-(RyG`l`Sm`uO=f&nqpVC>*NWcR-Ew`R+qtnIu)Ga zD4dKngJrxV?Ye%OKr`dNi{55rnpFBidrpU8)UVT+fhTfzHRI9luxP>eg)+5nh~ioT z=W42pd7(s0qib|&TFqr05C9%ta?N6`=K2tmIYTy6>cS-R5qj$JoB`L$B@k*62+L1} zDtz}tuozO@&Akz9#o`JTTi_twMm$Aod|Q9^Tyf-frAs$uo?q>b#amHU=0H zSwRqiNH#edRd&Bmb2Z`Ayj=aQ@g0Y=MJ;TjUkT>AMHC13$$?EZoIojgU zxbo~DzLtF@Pt$N6jv=3afGCiQ?fTz%UUbulWLbeKjcy9UW!)W(q&g#vYACGv^O9v4 zyeJSsGwBbOKf@=da)57S92GT;D8zU>3c9*J{a>bQytXTCtgk(7nK|z|@#o0aL8a%i ziagH+s5hFnb!mUxbmg?{UBcX%_g=@$_9zu*+8w(vuFp{RxypdX)~ zo7<_16CaJgCRD8(ybpn;-4CnZa-SFG{%DW9yApoResx0Mr#`RNYB0%=<-eB?4A@m* z*->)Kpsy~rUC5wY+sKpSmB28`f_}}`ks+ksw;Il0jsPAWIT8Yhm9sK^VR6(~OA6>Z zb9b>I^^k6g!w^mw=H|VLxMan)9IrbdvrExxfO(;dB)ChN>3VQ`|J;OL7QXp{y(L3* zg;8PyQ$X$1r-u5@zd$7aqTO6r;s7P3m^EEszhYJ0ZmkUJ7f&4Exxv4T#rOF$_?{R^ z1{M=MU;{YC3r^E=Q}3vR(zke_M2Nc;pCmW4@faBCG$v+lZk{&W%fzl*nbxl%oe#we z^j(SSjzVd3OowB9^jDnuCy>zl31qh^_6(pRfr$ZRrktxj0dwWGHiP<)#)3aHVvX1C z5YPF>ILzq9Rsn$Ns|Be4W6nCeIGGyS{*ONU?E(q`@oF^M$1IKDpSYt9TNLY~Ye^FQs~au!?Y0y~F8 zFh?@W6at%DU2*5j=@WICVm>Kb;{YF(x_xE(%YqkamKj_@NsYq?=fMGdXZ2gSVk9%& zYRCSMvF+Y>31NGxicD)|l2loI`>4TbNDsXOdemZ{jzoNch&oa)= z2<*PST^!)oY~|>?7rvs`*ioyu6@DvtIXO|8BD)&k*crEF(z>%hme7$1Ndvmv>Y4ND zNqY_Z$)x|$Un0CPS#CNkEP(4fDXWfmaQ*q1QgaQt>tJ<}9%N!gr&$FF8Q(BV(Z_%^ zOQldiYF`8keCq{MdQmNXRiK!eYUq_GTQc+DqEVAqwRJ*~5yp5W46`dWRitde^0;ak zV-}W_F*YUO6yV#!G!!lq}v@)vmoBQ zi0aLD=0NVoL%uRNKT+vEDFneafq$f zNh>cd&!2ZWxjq2hdJdQ>8Bntm0GYGf5!!YOh7^iGudZq;1H zR4(ozA(wpXZRd@&pwdbVde>7$mvUXJ*xmOr7r-hED<7Rh9&_Tb1FdxxbjIC>xs~2% zR7ApW>K=-ixV7F$`DBG_!+D3vBRr+gN|!2FY)dY)r@m{Z| zvySb(Ay^L~k`hh-hN})={#*k%=xbVng#mqCpaF1^Y8>7lL`}rk&k~>} zHIS(HzA+6)j8Ht4Uz?IKwnm9vNu_iGGBvEt_P$1qVj@O>lK(=#CSw68_{t;<;C#Q&>C~Biq1K zXC7?-x06^A0{WkaW3B@1rvauaowUFN*Ym9Yax$f0%;gt?8y9klP}hgS(8pBZsx|v( z{I3b&;R@-fWaoxih9Re@l8NNDx#W?FD5oc@CvzUJZ#7*#-GWx4r{Et0DWoDaR1|pW zyA-{xw?f$xA+0xldAjb~%C1M(6ra4jB(_GGQkbI8%~sa#8`U1!5&-rl_~snq1{i1c z23gT#A%k$=_?pk1H3(K5>Z&^E6qF!F*7(YGHr?$C*RG6N>OZ$w+`?cns9g<721-K8 z58&UfFi3R!9zC>gn}=Bn@?!e4Te;H=g&(IEo1!4Ud$UD9aWT22K4R~W3vSXz0e#{A z1x0Lw(L!O-*)si1mH^eMU-~=`zd&Y-E!QTs|Mc0O^=TAZ+W%`S8CUOaa4ELdMNRo& z6GCqPCsK_s{r4hs*;a!^mVHjs@!*vx>l*d-jDnes@$*iSX_eSnG0oK1+ZUak>}E7f zzVR7af*X-yRUDQN1!{+GUz2QSIgNaoh^~A6ts;gb5vtL*p&x)@_3XMRM+GxNEW54? zO7ttm>5cbGhufv=HfrlRzO`mzQ$cXW8;ktxa-9Q_bhOA?U3C2U5y4JZ752C@^Q{9> z9l2>lRk}6i?qUgx_yZxU!TPJfRy_1~DTV;0uz}M32~xC7>u@=<2<(O5mixD;B3n(~ zn!V0#UbsnEPAGtd?8nr*lJ>=+7ab*x>$}KDXgF};lHQud8?2PLFq>kZKvtYGqFV=D zT0L_@yF%CUWu-w>q!4oAfH%vN`Sr8*hg{}Q95%l{z9`Y>^rY-{135+CPJp4gU}RrY znAhGb02C!G5v0E>tq$%|iflT3qsb;K$75i_Xof?Wx*8c7j2aNA}+ZXO5OGG zO#)419QuQ%``xQ?4243h3`Yk^bx)RWao@1Lw+hGgG+I-2Z_3u~x>TVnpw=UszVq3`6I4v&$D+=ws%$a-}%v&kVxAq z;!4z02d?xpWRceget#AS>RVoJEii?atQF#H>JFU8HyuDSINxsLLSKEH?1y%ySA9=8 z@8qZZ2d^#zkc~@bGx_xXQnK#pOIkN)pdL%DM zqEtl`rSNloC4)bmrE;)<0=H9c%oN{A3{dfF@lU2o2s|ezAz}|A=a4b*b>l7@GD$ie zWUD(}`ha{MsF-mMg#3&nwnPC?;HDZFM^Gj31}Ie?=mE89-8T8>@ib*t90j4c{*1W( z?fb?f)d4eh-u~U&2aLd%q0lbod;jWtqcE*JNz~wc#jZ-hML8YTU2q9^Kk8@{9-s>q z{JpTuVH?`BLiT)mvdgmJwWhnDkcCb5Zar6QeJa_4`p#*Kp(8)BTHV4Pf6xL`sqmIq z#RQbOKcT2NvtW|Vy73sd+cJwTU8~8oEjvp*JR_~G!mN?P-jXxgz%i%wyn}bFS8EOJ zY1S?POc<6pzWT--4N^>Gf9yD8kSdX zdBvmJ-1(b>puG{YeRR^&F1@yiN-F#1o0EpxOS3Ww=?=<}Eim0Kl#f%f=EYGRXAYD1 zF-X8)f}DTfigu`s+b6E#DZ<+3XwvLMH{bqIf?3ZK18xyVKMxXY7853BrY+Y{+NAX+29$rt*? zM>EJ479Tf)3?~ivB_X1Uf!kEAKu3Xu27fsK3{h&k<#tW->}0IAU zH_dd0qAsf^SKsWv$J$g+2q40i%j8z%B2ko*m;e_@E+doDOD-c_&k8Id57=W?ouVC9 zUy(|WxIF({KBT6aiFvgIHe5a-eO}+7$r9FN)ZLg!Pw18Unf@zDf=hKbbt+SBHFjkz znk|jLE0)P9m*++>6TOow73Y$sXesB4g(rs$k{v}3b^F+Ta^c~#0+wVmT*>CB*Hqnp zIu)Eb%G(XIgTpvbSLVwclQFeg1`ef50nXcJ3?l@=h9|bzPMA7BrZ{SQ{5SUv-v+X;ylQq{-EnFoOdX{F-RiIg}(w(B!+?gzW_>o z?IrnOH$$LTpWwv&J(GcjHx!pUpKiebS@3Jgzv5UZB*60#0PZwLi~iP(Jl3?iAndV| zlClQs%pM|p#(+3-+5H3h$XPuf*LxAgev(z-xS=L#Bm$x*5az68A?y!BQ?1?yn2s|D zwPyyt^yoRsbLcL%3#@;*7GZ$6z8FsQGgAsOR| zFwJ@`lk2%VJWpLO2#-D4KxoH#q_DL!U!f&;G43vuzSFCInyxCFqA6y^Nun zp(8(|U^8>s& zy1bEB)iTJVQrwuJwWJl@dTM;;>x7_x%ARf{`O+>_f$n)WJJ73dHlx93P>h^893E^9 zJ6m!C+yin)J1o5K2iRqQZM1Ogiet#MgA%k4*{VJKo6+U6zBX2nRG&0>J_sdGWBKTn zMe_@c-x&=o&V)$oteOriek@*VcS)j6f1`QcYTP59Urk|NZ*rs$h&e>ASQ{~MoWIDP ztu!SO#K`%>T|re($8^ZL0N2VNebiPFg?(ZHAed6<%u;B{avio~5XaoTK9b^W69YT{ z*g6yll2>f8gMbqVv2BYReb+D`tosxBsL{9DrcbMWw<0sb;$0 zva5)DBTACmgQ>Ic6U6&FZ&v%Nj7x%M$V3&Bi5Lj%x9 zVR$4+(WH|`T{S6U^g7GxVNP=TApAVuC35()(19*R%cSuAVO)*sjV)Og1F7kjr@L>> z9a{5g5c*Xof|9lfc%z*`JPLna{Jie-08j+25T?6Dn7J=5+AflyCZGG|M=gprRZqtkhg z7)xL_CNlO73HL;au~WCL1uH1ZH`!8FZ<~@}$Ud7G-)^4LtQNh)%L$GTIq55L03wha z_U>6;Zd*8N6*qfUDLjtyL%1nJ_)*~z(lmheA(d7GuYF&2qL@r2)H)?4%AyvJJ zgIb-2(a6x(zgJlQHsHwr-=iSur~UZzQW#?n&*l6*qfA_yc=`X{bI1;z9P~>SYEt?YH-FUE6OnDDZdUQ-Ixem=7I)?~8+*BmOKvS3gIe>~*v;%cHGGXBhQ! zhRT$&I8Y0}0_%4(Qc@*SQX%z%2mlLv-qj zLm6ZGLpN{vJu*PA9R3UD+4fKwVj98ffNfwqA)t|TL(V}RT2jPsNH^zPz1`c03O-(! zGzHd3ljQQzY6+eCn}_BU55WC$5`{4HTiVP&rgbS!W?#i+F=5uF4I!CuebElG?oa-U zvM#up6ghhI%`XjH)7x#)R*T9_&Sy&L!&EF^wqk`fMq1S~k>aTVj!VK!*=7Tns6i9H zQ&uSYGMp9py!*00d2zh^*}u7plrTqXLlb!1DCra*>ZZQ%C{c;{u>kM}%b#utY##7X z6yZqUsL&8dKu9V`6`E7WXh1p#I~vi{vkku$34e{$85HayaNe|8k`%LlDJ&N2_oj9P zyV@DZe?sVackbd@7nGlJHsVPt9|hIMhSB)$aNrejxO!(KEuj5>MvMRK!>CDXnY4gv zHCg8$Zd~`d`VG{K3RDmDgBpk0NbaH=EqNMeQ309Mo(c&%O7hvq8w0RHi49jwDL=9f z9mYGs7Q^pCRgpr(ps4YkO^GuJhzy`XlDEK-Fdxf(VpN>XKR+rM zpOp13y1m+@^Kjf4^faW)(ViKX1WbS>IwHK6#W$*p`fzgo-w}wEd#42mJRLcRZ3wiz zgm8k!0!~A^OnXTEoORyw(I07^0@hU-KR}$Nt$s$+N&pG0;`+lHbf< zb4SK=CujSIOVxzme%`DdFi*VjMr|IIGF!Zpr`@c+0?$ zRKLM-Zcz7P#g5hEdnPwB>L42q%`2N8S&lDrJ&fnzdsWb6>_tZy)X4^z`VaGDdzP>Q zc-7(P{HC%rW>cz4BT=N-FdZeAB>aXt2SVEP$~ff7!+VK)HksvVyJI)BF|Wyr!2L<3 zjgZFkWrbgrk2TN?tgE~I)Jy z**IzJ#XP8;xz-ww=7`{k&t3vH#iM;XLQD*0JWCKNPX5ai9g(tebc) z(KN>=LPN4UU_<9qqEGlA%G{C24dqv7#XNlgE?=rSr~>?_yhxnhAqWOo5F>+NlNyq$yIOeuRb zZ7V%V+i-htx#WAxQ#)%(n}yH7;UY~0`EgoNtwRGX6^3+p@m`#r1OyKZ7lNj2Z368K zkWERR^*Y++gZCz+i0;q}*g!0K$-J-0KEQ|7Sxp);2~S?}lZIM20X7C=6vxFXSIY-C z^3P-Yz;V|ziUrt*544`vd71NrNrRmB7Tw|V3J}&A8ZXk5BhnMe9$B`syI(7apayZW zh!3NVwHz@e#LQZu0&&6z;L`OBDr8=XQeT>e=Jo7mvG zhG(wH$aR@cIfSMDo(C%jgI)+Y9SlbQo)YJCJ$-(7F3kVE*S1ZLX#oRIMob6$m%05ft@IVS-DN}jirh}+ z^URjCs$)LFj~E-6wUIgL`CO+61LW|3TGGhBoO=ACLaGJ9!*F>)+dne&!dyoXP!gWn z)_=6Ry7iqB-&Gy~Wa{Jx7<9*=fYt#(QJn}PFTyNw5jFDiH*eL&n)+FqM0EO-O$S4Y zair+<>yuYqa@X@lfaz{2qK_9{VZ7{&WD3^1EM$U z@DudVY5enyBpec~t*1B>G5RP(%{F8>@E>?F-;hYu<*PW}EQ`$UFOMx7vhaK2Yw_OP+Cn3(gnk_sVrT z)qWa(_F>XP#divS5Vy4*|4u*^%=TF(%K60)p>zsLU6qAy=g-VaSrr4|gn}>mXzsL$ zJdZdMKMlBH1!4-vl&cFrF4W6k6omjn3Q0As*{MIk({cXx#7{}^y5J}xZ2PCol-QVX za-_pl=5>|zG+r|pNc)VNPNg$tR+~-M?-r%dV-Av23#aLm?6K=Y9MLNh?>8w!jn}}j zkzUIeXo^Zy_fR_~NLB#!s;0qBuVa*^c%DQnUxHA=fT=U11NSQF%Z4V^m6vSr<4V%{ z=5)zj*o*T8_oCL}7FO+YTBi#<)yD6iFDvYvZ`?P&KaD;fdig-O_5?w6-bx!K{*L_C zFVt6>Xx4oeq;GbeKQ-$;>s`W+vS4gulCdSd@mI!Ol)3GSkK~H>o8}X268p<1$}s|p zu>uzE4fOi3Uj1dQW71y`tmzH8I9)=AIohitBIZ#;gnWVMYfCX$j%B5g2G_W&OQa9` z-pU|rgoBQ%vZ)yK$SG*dj7LU?>V#Z8!Bu5{QplRaKJYOgyE+(+h9c3XXf?1<%(x z9A1Wr+tr$++tZ%r_Gk6A<(jyQtkjNXrRV*{>zYlITDsT5K1lHT4ib7!ykr)C>hkWqQyb z4a1GQr(LQ+<-*O!r+i_VJj$;e9+a(0QY0Xc1Yu%td*!HMfb&*Ho z%wVJYK4m43+q1L8o;aKPFp9~8)DmSZC^78<^{{;axb$%u+=cHTS5X(gMlqdNY{xxU&`kQvp<30!+xjwiQjm z1HK7{VW0mUZy3KyHNRX(U*@BKND5$O@}}b#ZgFt)ndXgBCcKPr0rByNIbG^#f%!#_ zmjqJ;7z8(~3qolA-JeSwXu%N9u>^|nd&w7X)zf*wd?)`ysq0DN0AnQTQHhzsF+b1q94{pS7{+01u402G;?V zC!07tV~qJF4jcmW)zl~8KeJylZSf&ar$emg8S*%zgX$)BnIlE7PT2BDWu@!2e@>7L zqZ7@|hLtQn&*WZy+ZX$~LIgfrPIo=pSnxof+;_fo-|JM~>xn%zJu5J-E%Jy?$(U= z*mEmL=v52SBx_(XuNl{1lq7$`4kqB=Yzqz^;V=i4J=0bu?~n@slUnMUXV*L#S=!MOnHZtDT9^C2ZZfc;+R^tAJb_|G)re zL6iV=r%NlVuR@nOPeJdW5CNWWGPtN7@9SsK!8GA4%`NA@q>uP!6T-M_&hFb$WPR%c zoAScV8GJp=mo7$H-(P4rFmEj~rWNmr`*f9IE`kD3#0es)GXPe@P1|z9j+)Hg=8$#+ z>>8c*WgZD2f$Isj{_}&ZZBpS=riP)471L!UGgmF^#`}FTh&PTx04qB|F;T?EIcf8r zT(bBWqI8$SXfpBNRD$b)>rkKQ15?@p>|8!KY$YD@M||`-MgAZJJ3_DKE@`qIS}WTz z>z<5G;m-b<9hUr$+3-((mEhS^wzehRWr6Oeb(~}o%t4>XK!XVdwx(5T$XRtPVimu^nhh2`*ZFfa z5ZA$h(>_Sd=)-CB@;VAT92tE6fnv{qcA=jIBBlrPn#VfC$itY5L z57FEp_Ue}Dlm^RRK861?#yhGpxl<)#- z*bt%hJLTM(Uz;IU3vr)F>}`+Zq1;BC{ho^UyWYyz(N_hv~tq9#Et9LkJU62Fxr_NGdtwIe(ao@>t@k5}i<`~b&Y{xR+BtLo|YBb52GFZ{c7>dB+^HMH-(gxGp)OU^&nMQQL(VHd|HHRN{4lZ*f4!l*`D-$R|l{v7W zr?_3Z17KRDzA~=`bEVEd?J)F;)1|?HTqO_3+@g3jWs>O+s@*#Jj-87vbY^OH+DyfU z(rg@8)aRpgi@H`rA)%#1Dq|4aUPg5%OP1?Gugzg^)sVU@1AZUBOhc{v@nH5BD(@yI zt;`6r-0-C(>8m*I%(9=4gz}rTiY>JiZ}Sf%?BeHl>i204S@yu>KuX)Zl!tYIpItyd zn=@3Xo~rC8Xn20~^#8=8KL4vej)5&XxBOo@ezK0*E*nzNe;c{W>FC)uOT@((-? zmMNJP+^we+VF}NZB_x`{yG2*4VPa?#`;~p_5%Hu0chfsY4s`$r2X2Nm1Yaf$z8RX- zu>Uak78*1TB{9;zehN7I_7he5s+o8Tg4kE$y{lHlqOLaNf*cbhoHb7Ruhk~OYKknd zmPALam&3E_v;68eJ~CbsTUf7y=D~e{zaF{&Ac*g?9e?8nQUN7=QF-?`K7z@VGqQf4 z5k5C7n3``63ew5sjXw92wa??XeoOv5$Fi3pm#29du{SRvTb5=ktPBL?w9`s zduC6JsTG2zMlwPG6BDBP%dAW9NraaR1KqtEu)%->pGw41v8LaUE)D3*rM7{jm*HZz zRNhbv9an`|zA3c?mqt>uYBL_Ir!`5Otse<1wNKBlz1PhpslNbnx(ZEH4NhGB8q2nM z;n^TIV$91~(G6%3E8>ZPCZz$!({5;NW1ST5c$p#QuA{)q)@ZD!JKGW+`-&qHt>c1b zh^x-${m$0kTeBw8HdAh9Qc0wXh&EQ`DA##`XO^-)Vb`Y@z9$YzbeH~i>(yhqv}&B# zF!(41v0{9H%u{_j5!Seh8?`@A*sE0;Up5wRwO~Zw3i~bUmT9xyr`H!qZx{00zi-gG zv6GZ-R0h=VLC{y}(OwCXBuF|Vwa26>rH0(dD7(fUm&R<){w9gM*%>y;vC<lItD9dwN5 z%1gcy2w4Zr@}=h1xtsLp>7rMS9h;T0$&L?ZqB#R{C#<7Q zG^(2tER4GW(yq+%bveH_XC8!?;?1KKwPJbB{}1gb`llVl|Fi=Og0>D+}EEM%09ZIMe| z(8=)GJX&xUJ_>_h33pkZ#dLRBig#%Nr6}N4@;Vx7zP~7h{3NNX{nK;;bFm-d>B&^LxW^sWRd)_dG+#`wh?E57PnjY zNpR=QnP`u+D@=t9H{h$U{)PPd+L3lsHjBI)^V;-;gktF!8$@{T#a9fMGqn?H1GqzL zc2HzJJgjNBCPsl)1ftNtYd3M$$Al#1=L4Y2f>aC;&%E&OIv*)B#6VjYf(*yi88Yr| zE+rWJO2d8hWBa;mbvR&2mA-Y`(D->@J`ya0QtE*gFp_^UgI}6HQs*fI-aiO!?0%a! zaM!Lpm)@S1Te9P1=y~6dMhil3UhFdMq3JxX58@k)L=FKr_ntvylWiD;EVb(LU%IyuP5~T<)SJf z9zO4m`8SPrX2b!^c_aDWGw ztQ&S5D<{a0IkjtYvn~&f+26|-%kVNcmnOa1Y(bN6EtF3&_LhA$fGM7|#&InB&a@+6t_@n1$)HQ9BHfUlbzv(n;npPSY}VLY4CE+D^R*c0I5 zSHcHwXx&--r6K|BNNXyYuPhU&kf`42=DKaMkY~I%4y@r)A=|3c>15 zh(Lje7nK_I4n3UA?0`6;HEeMQ^=fC4nY};>-ziynqH}LOEZiZq{qIU_&-mMGziCYi zSPL`Ft&PDKWOWTAEkz!?>a27=llY>u?oKU%H6`2$}V zaT|p~z5mka7d=;BDUITR<~i*)R@Z@*=YH^z2g ztGNvRb|*zysHI1_xGjqR;d@+)+qwpN`)(_HWrN{e7=|HfMD=NkE)&{QgW>DrmUHc4 zVi+9IEp?Hyz#$PgpC(`i)-(*W$paKDjtj)$L036oo-3rH7{5~i&4HCfu@@H;(X~z} zB~7v8NQ15ZqiIelP#oNod@;po@Jti2+sBqlm4IGq{iAzA3`y3s^qg90RlaCSiaHA7 zSQNLEJ#Ek}zt6(M@7ZvP_F#%5y^`1A(G?LE?@a@LPWsPZf92b!mQWLb(hlP%=@SN1 z&{(_fbeDO*+mhb>Un-q)(xX$aqsL8WluN9Q<|5S|mUu+kY ziTPiIg9fPe?+Emtgn6!fmAYNvCiM6Ufvp$3g5nXze~}9DaScuD&i-u176y<4>@?kO z+*so7y&Pi)NK*i$9H)4QTwR$Xlp%H%2~ZHb{9o@pIfZ@FK89#(IUh{8iw4P|Q1>$o zf}6Dxnx@9c8}M|X1Y+v;(B&Q0t0hr&B$>eAbu6A`*T||vVzQEoUaZ7krY2aI4?HJ= zpJ)r;L3A$vr(w=E7vc~Us?&~^|z_b0>M%qWrk2rR}S%|MEio6 zYQhbJD8;~ry>bpcI}8`jz^9UonvDoXNlFtgO>8+CE+$9q4K<0(ak#3{{Z9HTEYy%2 z74lRAjR@*w4i#0n$kEiYMk+wT{6z=e&-l92P9@sN=fxjgflZ@@0{|eBRg3ypwgdbZ z%=8F$G+XCCExZ1wWxzaNC0dh5lMS4h8y_=Reg#XU>d;@RGG&j*cWW-VNE56$h zu0^x`o6;y$Qh^l9B_edKj>LlROnMbj%#mAoF@Ws_{+-^q${%rDU&o?=Mn6#FM|%S+ z5~YMlX$8}!07u-KjM#xhmxAj=6?H!MNare*3G4fI&-F1pxl#|f?7`z=EcjanMW@=7u4DS6skzivT+hc7Rxs%Kj z-k&nhqQ7Dd-hVIKsuV zHc5kb~-^4k0NIO*@*TxgYkkK1RtQoBce`wR|LX*Ce#<+A}IffCOg87kK&>2a+OLE;Nh z#8_#MH%OB%V20Wx>$piQ^qLri!?SOEGCEyIMSlOKbbx-+xZwKGz4>gA1Xw&~B0qcS zQr&a;o~#SU&1n9gA@i3+Vl~zUsLeEFjb0FZgaTZdWQ~rpRm*~ zNv)2Wjb?$Bi{dQ$pnF4tfg!7g;kHR0PrDE+=czyb=diYt2}`8vq?iSF4`?YM3?O zZ-EWWY>#f9=GaH6$4_!rvJEqCj6(JIUa}431y&hJPL)N$Ypz#FmfJZoVSC{!Oo@@K zXnx`4Xj?TR=(^&}V5Ba;`vp!zmyMz$GbqXq|I0lb{0v7CJV^nTM+52(0XieY1Lx*=3DrHheBo-G_xIX z0i-(|LUdO#zHP7N%7{e7gwnzu1RZnI;)|F(!|>l|C&+&D_O{>Y+Q@A8_V7kd>O@L< zL4KCS;yj;}Eb0-6wno!@@hAUkmE1|l4P>A2w%fDe=+f$LU=BSYQrtZ7w#!s;*P!*k zvd)qT-(RC&uM9I@_a5g~!O*oc?IKjE1Oh9(M@u#obOkD=yfX4U*QIe1lB;KB*wQm| zaODiM^6tqiv^lUqoeZB;aQK50my2lMkIr_Nz=NElzel;s>Cje`5D&HdtJ^oFdp~21 z06yh5VL`ZVxU;+4!AN&I>vlt{#or=Qc$;X=HR&3(*~ZSZH=Sd6IMk+*t#W??2VuR5 z5AwdYRow2gWV4ObwdPOagII!z^9`=$4BPVdV3wO-P@T^8ToyS{ z8(4d!LvneH8c=IfNUP|yzILdlckuEDx%!zB8HO1mkF3M?(^H4xc*dp-wnV45Q9$%?#C{sgV}m!Ea|W?{jgL_igaN(LvA7x@lpPtBpK$f^PC zP2ERAH$zs8J1HWCftD~|5nn7n_mL#74$8p!WrfE1DdV~JcmI!x_rWC=aLA(N%;_vg zoWofC$|*T!r`SjO_Sv3NriTmSP)F?on*3Cs$;)r}r8#x9oVvU`Uscx%W08*0FS(-$ z-7nHz1LN<8_Y(#&N4ZLi`O`D0-N7d~J5AlQy_L}rMS5AN1YJ*7x6clmpFk&V4(0b0 z|K&IZX>)$rVV_KC{$e66pb$mPy?16}u1FZ!2+`>~rJ9D_+vT$Z0w*y0UfHm>-;s%M zc@Vp`prw0)6+^Q6xE0PGIu&eIty6O8W{w3%Et5dVl?!&>97#J*&(`K7lBVyc zhSw&&z73L+IfH>u29|V-l<%gfIx@I2EZ^`&@j9ep=ED?~B#w*(P)ubP!7gcMr6u1r z>yN8@Vq4JzLDg__AH~YcvAYYD70W)aq+&%$zyWT72vKqvYL$}jlaWbtiC>ir(q9s@ zY~1!)aYv$j^VFJh&@fy)Dk2U9^Ka%*zaG z7xGTx5Kx*?VCB!)0J>lF$cA6?0@BDOT5Jr0`QPnk>DJWs2AnZoLmshCix0PtkPv^v zpS*1n6C_Bx9YG00gcK|4*ZhXLE@`|hBtGy(n9vi&Z9_lM6V{F1YYrob0UMs@3iMIQ z;bQ&q<^O)Mo0T#2qSPz<@x}k+l>bhw*IRzB9vUDB(_a;f10RAEA&*VL(~-Wt5O@s z&5|#j=9p$z0Ju!$1isBU!`;R;Q-2QZVA#X;*t?q!GT78CE1uy#EP9O3?EUIMUWCMf z#(3h5!L@d8xZ{xagxMa%S~d6}bMNm&a1McqPdG39nbzJw6@>?6Xo!kub zSeA6}w9M-hCLKDiqP=b0`tOxCT1iVi|4B}J-BfO+p)+^%&;WJ!v^uHN_ z9zSi4maJ_G_5-NlI4k~-mN~U5sd8#?;m=MP$aqP`&0F=l!UBv4gy7<@b9I}OmH?n0nn-Z&COq80a+biw zS$eLzm|wEHwJf7U`MkX!UucQB30@v=>7j|Q!-Z2^4nUQT#hwt9!kSFM4>1BA%Y0c& z>n(SHC30vxnosvZi|*h%k^{39Wi#btogr=rHbXWeE%RuL0(qSiZ(FAE3(KAdUeK3a zDCnm7E1Y&0#RD3wX@|+rXBNA9Ahk>rRksSrPC7}ufrK&#(EavY<0vLOT`0sm)i#`y zbsFmz_|j_!_xEX;^N~7h^t)D9yK~`a`;_kB%$h|vlz%y=~DUO<3>Cz4H2F6+5^sx_uOMxtP?HlFa zE4L=MMB6kqU+CMz&gY2L%QB3w7U<#+2jL}-x>kKo(I|SMK)^~FN?0GV1EXl4RpJM zg7-B&R+!;??equ7OArK)t?=g5bjK^;YT2chX+yNhNf45}M}W%i$xXJ=p;C zE{k^Zy&WNs+MhcC1uzmljk^Jc7Pc9{BPbsn(C{!)JasES1wx8=YFLAFP*_jsD$O|! zaHF`pP!@86y~nL9t86%QqT2yStCOQX&Zw?$(B0O8`XJjV2nN~M9MFH(zRDwvtSFQP zkulnck#q0^sEr|&rDK$5gaSi~N)oQABP#cxnZ*s32VQ~{EUWjf>u+W(c&1Q*Fb@?4 zr#Fp4g$z)r^CRu=ELRA42eV_go!^Pa-jb1!O_ve>7=c0Hq5DIzrVH;BgOze4E#*EO z;Rie7jUCedXg@EHu`9cNF^}x}X~A6zx_)c^d%v#nLF1L!PFx-WL$ZHZsapdtP)H}? zH*JQCYlx>N_oLV~1Mc6!kAMmyVCrV@FPc;(VjcYfDcs(a0&?E3?ze#18y@_~G<`;==x(}$e{$V?8 zFU96ZAmHNt*lyKMSaxXng`-mW^3mIlE!vpC=1~W^IC*2nRlYkUS8KtgTF6yyg?UZC@2AbAmT+%juN=G(hGQ zmL19$1PcN?Y&ISNM?dTgfv#zBA<&@-_96$91l8goyFK|`&laCxrK)P>C7Tu}e@ZPn zKzWsW8KI6e zmWN^xjdxSPm|w3XI9>?Wj$v#z9Lv?MlH71!)rd*Q6`%zwABqY8EcC* zMMt$=O%g&_M@Ef6c(h1}iCYIy5$qyxQHO4=QaJ^vQ|ref@cJPP5Db&`uD|Va;8)`< z)&%bJU-e^X^-=bz0SQuW$S1?DE&iB?w3Y7_B@J8qGizbb>H0}J()ua}0lt@y7$u9+ zKr-Ziz2cLeSMtPo!!6tK4<cmUsKiFM(FKQeAkP*wtiztypoR2?0Ns2xA5eoCK@t%+f60n1 z9Qg8_Zi`t55H?_Vb5D`~9HS)xpQ(P}YUtcKywig0Y8F(V>3BOCdRpyA_#QF>sZ)O` z`s)w0q@>?-oCS;akKYwr)WR?3_Kuk!=cXI%bz9H+g1J~Ux^6Ty5BD9O&R?v1D!ap^rd+xzvVp&2>1XHdeoZe# zvc6Q~DEf{3HdElFgDtkRv*&r@%*lx+t#A0ZqhZp8>-79S4B+jMfx=iI#ief+|F>uU zK@(TrJqWT4MtKQZ0D-E08R-qYUs*Pq&d%P@)>{*&~ z1;6lqNg8Xe@r$=$=pxYaVtO7<;LJBKx%=QnouyXix9^924PpMIrG~{C|KtfAGKCzl`szxLrR~mf5}8^tdO^ z5`N#1>9@Bju}1w>tbVS%Np5e!(wa;ZdU-MOd!#3B0*>QL%PAW|YgUuV%iVw(PP(*}?Gb1PCXW6GBD>>*AzQcEZ>NDzT+IuKuTD8A!Fr1H)1 zhvwey(bn=DBOy(qRy@Xd(xI@=_kiq#v26*hiC4==Z2{SKK5Yetr7q%R6&X=s{x^j#_9l_)kP;ULL!(>lW^w z`}b)pJ0mPJhsP?++dUU#RdO(2V>)e!F4LK;XznP#MR0?A6Ozga@>Af+3D9SO@&J0{ zf%=<0^J{(UR9i9tIk{%QcrQb-2v<2lpDQ>>S5+E`e|U4z>+8?&0>Pvh zxU)n}JSI#c)xL_9EABi_4H}skHQl(9dNwxUOql_tuFDRplhHVGfQ7vZ>PWnEYuRA5!abwER;6%PI*$$QQO;|2n%oXn9Id zNxdA@`T4EJQC^Uc{ccx76v_%-d1C?!ghIf$C((EIpc@8$xSM~z`;rSB9ghnL4*W?& zdxW2TkjeKgL*HDhcuCD5brmIR3-ht$n|)AVfvdBbFV%eX>@>f-`XFzDP*J9uBaII# ztajPplgu2;Ny&+QhX4Cp>T~DSkX{z}9Cw?G*<`8UTPfQ|L^Pi>p(S#f3*P<@R zc@3FY5lD{j`m4%(7BrT?6~G=~3oLH_4jx%85zW`5IYD?VrTX+d`0UhoQym3H`$($2 zQ%#1Kmr?dKd8(3y9>1<}n_}sTnPx*@&y&sB%(`wXYE0P5f;|{Ft8;F@80iAAD`$)+ zK_*rAm`pS}CII321cw@oV4gaz8c)&r#9@k>F+3l!n&^Me^e}>N0??3L0NXm`ng;mE z{z|X5IYOwmYkW9>%f-sI0@c%WAp@FoBaa0RLULgoNDfV>T-Izkl2hbsE;)EG8^R`L z$9aF#zaGgxKyxfEzej<;8i0AY@|?oDPjuclCr_nNy3BR_zIf?<2~sK6J!(Udc~zSRB;a||-8@Lh9lV%F5);QTjsXaScjV~P21eo1jG7qw{xazvveJ+1fp z+5hd?I)4J-lciMvF#npbzsA;b+$9i#J7oN;_yvzq(L=XB+dvvOTK=Hh7Qc21kmbi@X zY5ap6FF1NtHxlcFQ^Nh(vz=kKH|AesEAP|miP%t+xSK=04Onpw{GCZZV+_pMZE#P% zUapn1(_ZkxPtLDpfbg&l?$F}_eXtW|GlPmt5Y2bLJaxs3+@1}F$`>v-Glrb_E(;!@ zUxYqweAyoC3c42zf)dCu)|A7ilZC_0#ry2}vY+4W>afj4C;Ot^-`jL?j$72zaP^}o z;o|W|I0eZ{l$E0Z*u&8`?IWH*d65Bc>JHuu9eVgRxMs)Nx7?sPhpI*kYtRMhPvI6W&elIOh2Ee>~IxNx=NQqc5)1vM^ISjjX}A*5MV_+VuU z?$&S=+`5S}j4pbI$8x6|9fh!)nVL;i9h8=fL*A^%8Uk?5V$w<2mN5#L2SzR#Lb@AlP` z+c+P7_-}^;-BlNtDL;d-{VP_Y(z%@@?IA$c_P+Dwj+}7mNyAIa>MvI6JeFvyYtq6^ zU`{1hS3a^CjJ=){b-+jUGPi*PoUaIGELYULRWYbTVJ%Pw zM7SsL_eBXv1K*p{_LBy=E51jp5_5Q}d$b>tvDa>(VQkRR zl9%P#RXQkC=!|miRqGW7W_;ZPRi2=$lCIol=46)4r`|tq3s0L;^;EZ-Z(JxYur2r^ zIGIs_qxQ^YJfz9gJBtumCc7>LJ?MDMvj-q7yD)2&I=8f+8v9kxrBo+tp&{j|)ZVkr zEkh&XNInRh$SK4UeVrNNpn7PtVWnly!$>DtP{0EYrpe9^`I zvR=|%aYl@Rj4Yj20D>1|a;H`KQx|W{k5O+f+@A(;SV6xSI;5KSu6>p1kgnJ!#j=Wl z%X2od6~CWDmTU+k;Pwis6y?k)@){_leygxGz&Z-bFVFZrEptCNdxRT4xTqR4W}ppRfmy=6?S2(jYTJl|R%<^rIp zNH_-h#}RTz5i%0UrVu!Sy}qe0m~Ybqal9y8PV=M(t4@s?Q~Y`ez~r!YkRDK3KnXjP zkVRsX^fev(h`FPYCIGt5AP95nq++NbcAJO_g5ej z>p9K3^{XUqXVAXE)zHE7d8CFg7u2c@-uE$p;h9(+N zY-?FN3Nd6{b5VgjCdWc3QU@0YHycf2{Gtw|m+C7&RS)uIQY?x@8tr9!FkGHw_5Cgi z3T=F~M@Q2&if3y+#WXLF$pZws%&%?NzZUo6g}pqqHwe)*!S|csQn$g+e_(mA{S+PS zy_(F%&6YwO|1T1Ssgxu8{i( zAW&t@q3%p=eCJL(BhA^h0mZ}{q2wkO6v=o6z9uYx{(N|dSp#}NnWZdHawc>)2Jzv* zE6K+jg!aDs`Wg;iVqP>UZMZWA;UXJ_0nTiukPGn1>wv8Q6S?({- zR`EI%zYM9~n}6#4oS@Yp*=h&xT%CIf)0@7;f0HEb@gvw*3tqV-bi@)+<~|-gF%WP` z`f>wN;Fc+ThX3t{VG;fngRxk57kK(SMe9itdZ%L-S%fd(P=cjt`+$>c2t<8HTpQH? z^}jcCws??iR8S7qWMrMMEJ31*)W5Xk7m0RD)s9^7n&?|z6L;E}TLw$zyzZGaWDyaH z60dfgWZBybEr_`4FDiUJs58TsrOQ=F$}%L8ON>9N;n|xbpy+*+iTU#o`~S-#ALe{P z5Ik@DZHugiZ$W|88oqq5BeI>BwQ}V&q|yQjFe#?%u`BCM#<&bE9(-_=BNJKg4>9$zN!SuS(=(vi1T$_FO7<%}-Z8nzh&+S6xX^&{{yr@@%HNB+tUEud9=T{U5DWwE;`DR@lnX&a8L4%XaPR`T5K z>LGH#w1!)1hd+a}E@4(Ndow+x*aBQAG7PP>0968zo+5EayZO$FH#JJYgF#2L;b?qZ zpih)A6Xf}y;4poE6hW*`@$$BiKME9p%O)$rmt#P)jg{Z+%Ro|9{oK;??(xLeb9 zP;fqPwJ4+SQR5sAbeAnU?jHZ{N9Cc=?_6Zmuh8^jPZ&Tib&r88wv#Gf=s;Lrms#$Uk%N3 z-xZe0VTXGiS|yT5{1Hhcudbv&T#Y0drA}S|>TqmQ+!eqFytTV-(C~N%Sq|8WZWw;*uHyopZ;$gHg*BHS za^7Yj>=<>BesmC(2kx0hB8g%-Wt8145J!_U^{$$yarZsX7HZ@XkV=g9ahcwkCe!Lo zn-#f>%#!fZbT>M`B-WHbLpa@)KZYk{xlUbSMnmiJ&?ok z^|p*5Cs=)3ezsERqSXff_>h6p?H2*eL3bi&Mli<99(NSh_}_1=iqLPA{=%EdQZc=* z4pL<2Kb_oR8Nm`P!c6;_m#Fztjff9xU4bfK86fhayV)w!p|p{z`lGU#VN?{~eR4ywZ=VTSU^aPO*;3g@j%M0gd8n8@-%>&U6`^?Vw^E_rdNF8GNxhsrt z{3RPkN2+aW0F!2K$_vXqLVC9r`wJAu{=SLEhtg?T?V2fpQX=Z4m4VK(K?r1bcUJNc zt~j8a*+guOTBEN9-!FrWS^lWXcWsdRYb~A~*ew3Fj_azq+P;NSnC5(`z%|)|EWtR~ zH`zv0<&AkocZ|9%TG#V|mVm-F-gn9Lx*Bp)13!_53{jehmR4nwt!U^q!)6cmctIRT z(&hi}`-|WDiw?@jn4F6VLIo^T8+Aw*M_WIo`3B{2vCV6KuFGBH+<lcMO^^+x`M20ZxVjqRy#$V3oCzFltr1R! z0ugnFm{JZ}(I5KkPsWGiOZT&pzg*MoDg$V;$;Uga!3bY$cEDQ62Q};1vv%NA543a( zDpXj>fHHM7uU2tjaTib`j6|0#>vhI)^GR->>l*R2owB1FAukS1LgQ(1VaMpDLHvE! zk^A$ct7x^>?=+X^&^>kknq)aJ4A2Z?hnnWgPXooGR77Yte!t9*NICR(+^hg#m9RFr zb-9m{;+EZsB#|YA-ku}@GKr=dO5V-#j(8WB(NLrBsAj)rZ3u)cj6nEUE~4X|F$4d- z`qyTJ6LEv0-!s|UQkY9TQK}-8YZ^@+x3FyPn+iGOpVT;pnXq#H`W}uHrCf&O*5O2+ zKlAy~_YxpuFsoQU>fBV|^nG6;CMqg<$;7tz^EQ}<(vipDx}w;P(P%1TNOFGXbs!2w zU}IjbxpBgFceMi}>bPEou={cmbTb9tX9$N~RH`OlWC3#^zeBl)mjwr*dIM-kBSAC6 z285t_c}$(7aNsas5waqkMRqoAycon(1PCdbpu-%RvXft_1Aj`mUSKY%Ayj8ohnJrt5)qS^AtI7aOFscJc^o$Ql~Lcr{xYaN!i+-J zBmCk?-x*N4dYk!T&q?RXIOiwgW~j;pS%ibv=WB}HDHE-r)4_XFRxC+??22Xj;Y1c9 zR|;}r335ULiZr7Qd{}!0XHcQYb8-C?|8$#`w8Kvq&meLu;o-tA8xhH*b_hzqD>?z3 z%L+c+=Z%3Ka!J>`<>9ExrA+HpFlUYo-k!>;4+DRdA3Ro0nBlDMDKRkx&EZ7 zhKUzkX{5y`Mq&IsdtD@af#8c^JB~=Adc}A}TXaW>NUZTqjIGiWn3|F~QcR%%0T;!V zDrk$6OGxAdP@7)j5&AKy3?yZQHghu9y|uHg5Lb=bmTjz1;Yt4%sa!IY$9 z2s>6AGcy(~n^;3yWiH1)4+cZ>)xa$x(`1=4ESt|zF6>{lE)0(%US}%qqv4390AQ-N z1TaZXu1biQXyD2eMkW2Gb2YOI0;a{Wu$GYK$he(;GDcXi9L~^#VK!-k0j&pupe4a! zOOTbe4W(f)&oPGTlnTSfcqP06=2R4@(y%MS4mm*(d~%Zk|n#@m3QjBjJEmT{PA& zW|fy9|IzM}`1Ybs-J^UCaljfrWpl^8R@AarTNsmWzkBi!!Kb%1E z*vrL$8Qt-6jSu^lEyh`~?D{SuAtz%k$KBMxume2?< zK5B{Jbr7^+JP&ZXpDFa`V~N^N*4-W5I<_0^6hEC#Iyj@^a6MQ>Q2`rgo9_>GOmUxD zliMfGjav4b>y3Fad}luxH){o|95An1Bf}`s;h?IE^Za>_YI0yZtfL#x(7rky7uq=-rSqB_YZTn z@|dXCyEGAWN_X1fQf4>xF?nhFTe0r z-7TqtF)bD3C31s2A_rz%+gF-RMsjW*dH9BBZSe93nQ7dMq!BbBvgRG?Vkm;8D8e$t zO>Y7G2IqP4KBZlqcL|#e?%J|MdR`2RFfKnG^b3;WLwi4{ho3^2jY%uvPkOukec6^H zFrQ4p02@FBau#Op1eKlTu~iUdSKRjJTe#AC4i^M0z7PK@zc>VfFW+MyWx2=p9yFu? z!B_DikcOlE?2Pk0y{BN-X#i~0{$P0uG$zK0ffkn9vM0|yyzfU1i*k8fu5oAbU2~4H zdc7!;F@}R+ZvRhBrG^iA3I2gs$z$YR#AjUA)ivPa|8jtDhs*LeQ-C9Nr}vvkmaMjJ zzs>~b_oR8O41y7pP_<4FRRSKU-!Qx`tBa;^N+yxm)|l*eu^iXpY&CBxlq;r;Hth17 zl!z5%pM`rOAr5m5d9<6EdaQ&jSx?ru`H)3?6u-ToaMT$`OR*&O=Tv$jU|gGE+QlY?ZGzcGrh^mw=ZEeu?Il;vb4#gISF33Ubun^R{LR?3q+_LP%AdtB)Ojq3?QLrf(NUB!D%Svv4IZ%Hd2 zzR?EJ-dvmLNOc1xwjhfPg05+V^i6?Ae2~LDHAw`!eo!bg>pe9Z{2EBNVLt(D>jbQ$Tu`g}cdiS9{r?U&A zn7M)V@GQl`nY5Nir02I2@(j7C0{_Irk3`r1xOx0S5D{9h58^K)1v&kx`O|1I-$6kt zBf;TI*fDmMChqxwy&g&t-<%G8-II!)4=oxV%mX16o7#UU3t+B)(66;J z!UofSt(N$Xnv0><9&{L~aFsRq17IW=Z3|8n1~$y&$1~mtRQHKXja}kM{`B-oZWnVZ z9g@iDuEO7Mo-}N8LsHlURN};xfu!VMJH%KR#~3pP4NVUgd<)MkkL*9EQ=Br@ivfh$ zg?*MJpunr2SG;Ml4J45&T&zfuX3)aZWCC)aPiY~?DY_UzoIAMXv6&v&dvtw_h20(kh6VlUr6qFOs z!)$par18KVo6^RE!FGN~_Kd+wy;BrEX|-fR7n4sfcSCZ+{J`1udy(sMsb+)@fg(w% z1w#Z)!EdAvKg%vX`o|azgKTDJ)Y-O1Z2oNOr`+C*rT{7qs>K#i7R;6UT%%A#{z(0G z!a=+0P@$U)77$u;E#R7!FBTFWyrZ_hvqXO#K312xJqA}6;y{jntB?p=2BiWYyj%!h z?N83^A0qA$p^G7?gI~U~^CPi=y@i1SuPC*;>wW0~$uyBitAt4L{KqDJN3O@J`a^y+ z<>);OjToM2I?`B0AO+e;V9!x@2|PX-B@T=WK;h=RjUc}fhyj1c`hcl`d?h0T=%`zN zf2Taw))$5EqfzaK zd~oCuFGWh&jYxzBgd+6h(P7F?mjRGR4Fu z3YRTDYIT33hGSZ$P9uDRMjj{=(3GS`ww;z|!}pV>gdRI$Xgewz>s@QIp{0!0IWwnl z1*gIodi9fVy*)OHMmHfIFl^Ji^z1CnHRvWwS98~K4_(M;bx*nbD~|Y61-?`VDv7b+ zOgEIG&Mg*8zDih8e;Y*loBJ%NQQ&k>YU}_suJ6C01aZ_^&>J)3%a4((7xKkLKDS$# zD@MizUxQ1bR=2`xLg~9cVRt@pwbJC6uJp+gDxo(&^xILHhY<$~a0C<9JEV=iRB64~ zCS51XIdSV&hgoCQkPaJVm1l#jaj_ACch_O{=I@OiUGl&u`e3I#wHaIqgc6Icen#|r zn|cQ%$f~~bR)8wkLj7PINn2BwxfUVD7Ipi-LU1_EJBDj4Pwf+*<+L*cLHUF)0L_x%6d|d2<@XPrL zEU5Q9RFOjU0`S<=Nt09ennRlDlh}^i8BSfdK$^Ly-g^jxBcuu4P?mdbhn}fGG7HXE zMI?r2k_7E>0eIG-6W-p;_YC&%;2&?F{1G9xEh{u3cc^c_3k0wb@b>q0ZA#rNjDeX& zQ~m2!-`vwMs{4M_CNCVdE^H?rg{a)Vu^|@$>=hKOp5e?EMbAK=-R1~#)(-; zPQ8Pm3QqAZsgJE7_CvKYkC-7~5>GeVACmcoNsT`jz9)TuAw-+16} zx*}Db=TVBBZQNhBYWil(^~8KTokKWsZj|Jqj|Y7uGIHf2lsH9@{9$9lt)HFSrV?D- zxPED|KLrXsDPr&0h znMv8Lc^P!={C;De&|v$#qV&*z_#^|M6jIH0Pi}u|gM}0(o*bV^LtW}_(9K({& z7`d9iQ?w-dnWHDaI}Hzss`(Ci1oT(GJP=h~j{gTVh2GehmKKD{$XSWv3(p9^B&T}$ zgf6OI%LuK(O`~SdA|+LEm1ca0hCv|5FGp_o3s5x7SH0&wSWGu=t4^rDG&+rG#$n^y zmAiG&DF0(Azju6T!njd>3V!*Wujudtok1MUJNBhrl2to7i=v8Onk9{lsV0+*_QEj1 z`_B+V3Psdl+*Utxj9D=8U2sT;gKDomuQUP)E8Po64V(N} zFp6(Thu0pd(uI#6&+(O6cdPdH2x7atMrMkR6Vg*`Ikv-EF0L|98x$@lx|$;;5<^ti zDW45>gTt-GNqOW_MAzS#;G)8e;LbmSKp#tgCm)$N#u)yW8jmg_4?-3oAko1^&)+Z& z!p{D)26|;IlBM`E^1y} z8Q1{OMMvFFuPS(V&`MYpO%)G?@AgebhVrE}r9+zx{{tpG##YkZFkqbRVnc-&C`uJk z$3%6Nt^&D|!YeO&Djet|vK~YF`y1 z>OJ6313S4(bPch;kTJqr;hi_%e&wHTthjC??dDL`v)5sjugu04$lv8AyP!^f+R36m zk2P>&q{m=zbcdjVufj7oMxY|T54#Df1}V2<0AlSQw&*7$jz8CfZ2Cj}%>mTsVq(V4 z)t6gj3=eior=SQh`nV)QMN81q9vb;g4w$hC3(J{4C0~Es?C*g=27yNh4K7#gxM#8uuyD=U@2D^e?iihjxh>(r|IDv8qx|)2$w=hxj^M z3dXQ<MW_bv;}bnjLiFUoLs(8bXipOuwL5TuhOiMr*425E_6Y>n zzVJG&2kl*Nu>3?C<-e2gSW4KTzpj8>HK?*5!8rRm7Bl&eWX|<3$s84wo#T5^IOMy`Op6k7Yb&Xw55sQhN0)jzW;k#mqZ7J?(HPXl@yS)e#x$ zbbq75yI;mBk?$Fhl&3>f$&L<#=i(Yh$#_yg0-BH413k2}b;6=%)kA@JgC%`c7LU{L zA=u&sKkxRP5bxRfwE&)5h_ZINNC=J^`6^K*3b|gD%xb$Pal z#!}zRPo;1SX=3tMGMM;7_DWFi;s1*Ci+6ncr|SLkn7V%4=rZSWFfCqd>CVwuSu=w~ zYqir%uoeAd7&Gxxx5_e{yexkgmD~r3D5yR4a*5vs$toI9)+9hAc@lTOXNB|_;!lXv z+p)%4;<2RpX`UtqHaKSU_drC8R+2PlxlhR|DYK_8Ir$1+*CY#{^w$7bVj?qvF+(OW zMx|0I%k(bcSrg5e5U-68Fm2mZaT1XJbfoM2#35D1!UBs6lbH~2hAvBeH^ed>W-NebM(_B~A~^_IpoyD4HMK&xx&mdQciAmO3GngdoE?KtR%}XFzD_9M$YF!(Pl@HcdC<9rqwe! z$xO>VfvR%XOM{=&_-E?8zdhM87ksv6Qe~TatG<9TJJ^o?d-u3gjUfIt<@{sF0u*b= zCa!b*EBut2QiCJht!y=IkhZYMEUHhCO<0{BZ_-rNbtmUOd0fWy{aw4_#L6ELEQCbp zk4PjAD>i#J7Ug_%zkwN=Qj@&O7I$U%F=G`5}r^N$fLuxZa)Zq=d>OoYsRQG5zYF5*LSO6$V z3*)ABaeT^{{TvX3f`o-@viBwCHAH%YglKu*-P-1Ufn@)bVURykaj^8@)VcOp{z{<7 zH(%4K-fa5`%n$kW41;U4Cs$k!a{424US?jzpsI-#jYTN~hgun_S}gd(UEoUJc`ED$ zc7d` zIv{j-$>aR_BDN^gscpYYCBvUf$qrC zI==?OO@<(|!>DsLzQ*>#lrzB8d84A1+O-K&MY*t+bHYAxv$#q2%3!;{>J+1w2hlAO z2f>x2bIHO=_tCzHxdVL?%0S}YJ921`ogQ+Z0C&^+wIYUP;fAUYA&vF-ukz}YRx)Xu zH=J&>tbuO0c-CfM3oBP!+gN)NpE z*RyRf2lvFcc7%ni-_u8A7<-h{c7~(^iv9>KIMtb>_hC_I^(3n#0Rw_Y$;!;GPLLT%mr9pSP*El$ua}D_V2I^6 z5c~^NHsxG3+@R`$vZB?oCCZ2fY%Nc3-F=q*&parMl{Ct0j|Dts%4o#41`*f}0Tjwv zCjWD~JWlBhzttBu_gv3(iE?6c$eqb^zq6>cuV$ZhFMyy@>_{6~T|uzP;fA|TP!plh zeU&R;f5a>n_Hh%==j$G;N|L^%E;QcXg*NA@=Oa%8M4ymOrb|gjaIvqQybTe_QO6$M z8}M+9Bjkihlo&kVYj$7S&)Y=V)XNjSYGHtPxhhJJ4Tq1sW)b`A@j3>>uXJOX-dmK~ zrLBQ|-hho82Ruit`tVy}&eQ$&F3@?_7<4`h5l1bX#4f z4s2ps#Qh4N^&CmhBBFBqu>|XUQ_K9S`nshy_pD3i8~SKt8P#0ZlA@+JJf%OqT!V2% zanRk2clHw_Bc8Bb!7!$H>1tI@QDWIt%;n6g86cb5LKuSz+Nw-Dd}5c^?XQ(Cch=gt z;twuA3UVFE*>B*k+dykS6-HYf;`JcAim$-3V0?k}Q?r{j52X|?M+TeXk<~mmL1fba z8LdsBW3-r&A|AT=Y!|~r!k(I}xtSe=xD#Aw(Ym(>Uo)?b_52H$e8MzNR#h^%J7)n{ z51_(s$W$B@|D!KQEDtK>yXm{VjCdiv-em3Yho%{LVDU4!&~;|OM2T0SLngj}iyr4d zhpHpAI_6e`9x?6?quoe9BH_h4Z+Edwn=Q?e&K125!?ZnBpyx4U zRy-CFvr0ADxQmkK6}U>6T0exj83#=#J+&PYOOaX1n5Tw=CY#?d%V zzhM{f<&ttxu8=B2d^iRkM>H8p7S+F`ODG|A7}trTB1X(;aoThVP}g|amS0#e>xfEql`EGR zR@20`QfzvgVUJ$`3!z?E0UV0Ba=$Tj0_XQl@^oHGuT(FsxTSS7_S^ryBm+vSR*9a; zL@PWOh+Ms6I>!!GOt&B9O-WT%OP%seRt#+ALAhGv-BtGI78HNPcTmF&&lfc$&@kXY z_AV8E)?L7S*SkK(cI;9%K=|$dm5DMKl!)}Mo04`^@J#J|StQ-C2w>SGf}hd0()&~^ ztK3r-{L$_7p=xRp;!?a1G!2?~TbP8WnFF^kv)Di7+cK~>i@HC|Al1151(o}B72~tr z*}CAxyu!$6Ut|=Q9l3j|6-n6q+7_mfJ8I+=$ERm9=dQfx8wO|FW1e{I{Yunr;i*&9 zQ29B;^WFICWZdNq0~7ah@!s&zA{9* zvYAgWLAQA)EiIXbwpd3!rn2GMol!}(e&qGVc9gGqIvMtOAGW`Ag11gUJw0`}&-H^_ zZI2(g{UgyhxGd}N}cVQ@wx4y0CYzCJ@;Q1oY@s^t`#p%E_}ov-RNtx zzf%)<_u2=kQ5KX%h{pSwTzc9HuWq{TLz8Tt;`-(<)w`g^xpcj^My~J=ZOGF77YP6a zx|s@lX1{zyx4N01#y^sLz&f>0UhFZ#xEjJh~&HIm^TOV!Ew&$n_lt zQRLs*Oi~73E+QcH4UceM8jaZ{M7sSwvZj#Gniv{Pd)`w`no|mF3LW3K_rd~TfOYtt zp74u>dXhry1x<>2fUn0E)s7ZDi4>fv!wdKiVUfrzwVJ0G#Y zZXdRNyAdC&VHpGvAh(C+9IrXY1&sAtv(=@7h>;SQrk3(RJV!k$YNBGJ1@$4GtSEbt zg7VJJ*}8R-Kk~1kc9E0Ip5W9xyP^AAEg(5Y_+w&5q8=bg#T(nk8TC&hPc0+w_KDt+RPowpWd*%TOZULgMP?LkFvY5nIkUNUX29uRGss;$Z`o4T4w2`a4 ziJ!l48YOOAEHAsVhR@7KSlPNvi;eEvm5xRWe|C5eni5*;?dj2S``-yE|4c|2bafzF zu84&`Y{bktT+G}fFs=T7ei=&tey zLy+yv-Q_%#w#ldp%{+qwD~Aj3bJDKbnma%QwwkG--`H%p(V~etot#54hMc zMP;ZUo-H9JK*j>BCPrIo|HAn`MgTUJ?E~2hl6V&&K|Jpc436o;%N65ODo3VQg2K(r zez9faDz*XRRcDgHnlIh^H0dQ_K6xoNOURusw)8!5l!v2)Bkd@KAm8aig152BXNcAy z!x{BvEc0%$c~Trn%;3~#M~@sn4JA(E=gP}TN^;=iH!tao&f4Rk56f^yveXVVR0Orp z7N30D!{%76oiFxVD+j4F`>nTsQ*}374?l0q%3+6P{t}lWVMB}^h+juFch#oEyos?> zM4q&GPzhu0R-#eLx$!E0fn+8hGW~nqCH_H1`=@X7kMa(nz8?Dx(D>f^x;N1!>GtbA z$F&4zHr6%-VQjSAC(ABs?g2Bv8d!E{UWZPPwjdiy{JVHi!J}RpOT9)C`D5k>ojIUO z1w(tcDaEp0I01DyUOCbcI+VSmf7!!m-pqx8{%5KM1^{-w3)U^!Pg{?8hi+CxxT(|+ zaz0AwK%N8O@r*PB(d)n>;q=!GVY#v+9N2;pv$2--AM;(QH5PMLp*nZxi^wcaO$`$H zoVF_`SBjJqJkqWOct?(3+N=-IqNx8Q3d|Ow_?O=Y&(hv?rq=ph+=*lNZ?r5HvzuKr zmJiu>1&4dy;z@m-_DH1ASRSe0ZgNtyS=h$e(qjOO&Od>z?rryWnGSwDY=1y|YcsK+ zJPIXSaUIqfu68Q}?ClsXH`TJYUMcW%QYY#zL_MTN<9e#2e&YGZ7Sr$q25Y87zp;g& zC*9E|HAJOZU9F_*!U{iP~x^o*xfC;c)$ z6yOH<%LprI5H>|&0{6Bvr%BtZuvyt<73gsIroZ`WO5?ZrI97YF&WXIVi-DtoW^{~W zTAo@>n1<;D7i~Kx)Jm#MVOdH}7f_$t#5%wy(;4B{(5D*I^lQj6{`F?YeE!u*c2_JV zeI#tU)rxFV;x>e^ey99-zi`^O4LDa5bh897X+lL#{iznR0#}?IdO^Flj6rdq>YypV zLa6DELgO*S^kFy%w3evUoZ~-^hg|6T$JU-~UMuHux0E+%A>p*p`96@6(xs>RTVUrH ztDtVMd5Q4mPLky+HlK*leKui+*S2lDlJ?BUtnP>)$4@WQ6_m$rtA@*sGXr`t!KVg@ zm`RYLMJX+p#TIGyYsyqZGCH_&OBBY1S5ZKck<89GB}oMVnIOFshsdhv?7{-a&`Jc2 zM-b1hO+2ZtZTWjyKbH(%?oHLK=#(Sy%4igeN&%*_h73!>r%{$iq4lB`OCHJeVo_8P zCF09FK2QItgB*^iUvj4d7(U84N~)^n3;Y zQyM%Q|D4OZo#wDMUyFz(w!+6KG?GI;p>7a!z{;Azb>M3}66v&?#XFq_?L)2q1*(2= zaQk0L!JK-%`i(Jjssa8sS7^(+eAg4-+a`{|GHkq8lJ+f$Z3%8DytkLbPIgAn>uPoT zP)Su!%MOUFQvN`)8VZ5wC8dN0y%Jn)u#S%36b-zOn;*wQq@?7C3=W_Q@p%C#Aj$}^ zjoUO??=lWimU8U~f}`;WfD#X=-iCKD)FQJst(X(G3eu=Ji-l<+U$1 zG9E+Z@8GBtl14bmD+WnH39#oK|EgkQDPjh4c(+)F!WG-%WxJ-obcNXQ6?_Aj_4bNo91 z=91A1_30{tVr_UpmP|1}I;2SfQvYPOr&sRbG#R3F&ZtL3qhyv@l)+C@#YmFutrvJj zyrZqZs>(Rib^;9jKc&eAbK_wW+c|r`_GfXjZtJ8?e8dV zMo%4+DOn{Gyb;$(cg;Gq4mN{Mp7zU8 zw^V_R?ik!P0mX!%p*VgR_Abo@J0$vc$Prc=9;+oo7u9VHFqCnWRV3k8s05@fqe+?! zN5GBY*y1_^KqOtb=12EscyZJbK}D!R>}WDjwAZuRgi&gP-sW+BM(J7zUOC2%z0Lh_ zfB9KIZf?)soymwNG*N9F^Ue+x&)b%NlZG5yq=v+Sg>9P!wEsktUCIik!dLk;W}Ks| zJt4<2O_*r)jkxA$-X@AML}8P&Kngtg*$_>Jpv-0tz|urU1Utac8Z}ppZ8Mk0cfjP3 zf`?aZ9Oj#Ld18qHNHcst{TQ=AG}d}I8_QbVfo~ZHb-Jq?$7JYI z_hi?oH5jwG+BZ9B82Sz|LgK0s9Wt$UBD+dnJ4WLnkZ1W)K7R@-U^eb+ODX_GI~|JU zEM>m}*2-N_XZWo@f?#NS^y}%9#1aUx*1^sTL5Rr<#-+!2?(?#M4SrBNV{3n*DPaB{ z_%&es+gfpzc-PA zEMadAAh|DA`<}HK{|aOE8*HENxvA1|CPR*4SF5x`t782g3NMuwA;Ek$@<#XKbIf~V zMq)0O3?@v)0ytoW?Nn*XkU*W#8b5$O-FCSnIq{GhmIVGvbFj$eYy$`Wo_=)KW)_?!#^_?ugkCt{y=hGOYu0C z^;ipVJGu2Kt#jN7L0N@pQC|}C0lH{r?kp=BLPS7UGv~JgL}pH~(ORZy{oL3- z>SgX+Sr@&4?0HW0uPL7fwpunZ-%iv9bAc(-Gz5n9pIO6|e`0;Y`Faz%M++%cBM#+i z9uz;Hby65Y7;Ag!bt&3u@|uq)5tu8ThZz2}tgCdlG{kWTh3GsE4Ru~cgm-V|0I+e9 zte2&T#pLJzoz~d4X^w&`h!bQzL4yCK%^9h0xUrJx6qu9};EydX#kwG_Y^%@0G|W=- zD}fFvjg&5!_wy=zj%ivWPrxV|ekMJcZ9}Mk$h!>puQpE2MKywcTt+ktK~Ls7R*oAs zfjPnm8#LwC{OBh4jGdbHp1WCQ8{k0?%b`I=Ag>T)Bf!g})l)DSyQxx3SPklEc(X1`EAF;jHyPkcb52R923zK> z6IK*W>DGKnkU#gCm%-VYE$NLj_lCEo0VyqIZvGKrOE9&W&8)t04pd=_-KSN<*3)w0Gvs-M zE82Gnw?!psf5FxEPghv=vPCy0}c@ToL}kvI}16>RK@_E=mDnv&*>& zV5|K_iA@}>`wSn!2a_W|~SA2Q0LDUi6y0dm%GNM$t61VWFoB)_L%qe;hM&#gQx( z7?B;~#h7m1O#eM{KWL-?%w7PA>C_2)Hm$%a7DWAxvG7?L^%iY2I?AZn<&UYTxJJ;oJ6tG+b{lbo``mtoM+$d2?TM@0B8Yx1M$i6 zc_-0uN_#iXcx1QM(5SA(ctd1!Qb?DU`Z}IgGRn0_x<#P`Z#Oy$0ND;aNnlpt2B~Tu zkpQm_g9RtFXD76EVG)R0xmLu89o)-QKY|(XD11#&m;`b0{1bwOLfV#N+@!VRN3qu^ zJp|NuM?XGjwzluG+@8wfMkq?dB z;Ma!iv&TZyXmmd|bCuVx$uG0$2%i-CybkCt)iYfeCfrHjO8J;4c4x)xTG_*#fzl#! zwTfO^Ux79HKbjyNSbx`wgGiPGvDPyDuz+t1WEx8118}bD0kw@JR+}w|47nPdKC`gE zh)JH)pyE%Dwsa7=PC;m@V$9vbP>gMy#{MSZB$GV>h~c!Bo;9MiE`Mha(|o34+Rv2V zsm+?TVlTyAV68pQ^S=9FuiEk(q0~|)Mwc0!-+7?Ci#Kw=&nbr4x`_-4^cm&qJB1fM zS?NSqz|5`$<`DJOIK3wzB4D)1i6zmsb@mxv9idwJ-{L)W1ot}) zY29Px92E5gw+r3&X{L?DM{ukWG7`@br@mB(*9U!V4(R?qCcnsrAJRwXIgJIDp;SCr zwsDYKPsPHaTE$>ETg3el`%<#fZT@{|`n$6%-IWF3V)$IL_urh? z(bL;YUDcF2cf}na{pJ^Gf}fO8FMMOAWH>T|*H+)NH5ZR&8D>Uq>*vUAzT7-^9-v2= zg;a;n_e5ZaHFSyTw5{8<4UQA8prt-Cm6wO*XYFGX{j4QJD!5pff3!6h#VS; z5OuDBmQMX#>Nx>CQE5$SY%Iq(E2NO*XhzKINkOp>ozBOz?Z6+FU~}Y=C;pH3mo=`{ z-nC^#t?>gh$+SjO1;kA&yUMSeb1UF1#F8}!j_}-X@=uXoyKxDDy9Qo5$$u!w(c6qK zJ#eXRYG^6NU;k*Ar&`NJEI0%sP70WQ1FuvSpc|`;t=ItH!uBqd3!2>i#lVW`S+_~i zgdZNrds#r)4CVLZ)08zwTt*QEl`ntDImD;WUaDyaN;K2Lm{G;3KXl{^#Qko$PaA0F zd>^^5m&9^+H?8h)RPV(KZCn* zq%(W@^-Lt%Ugv@qm4nM-r%v;4Yl^FF0FqfInn~1*SLH;3bw&yN87kE@@x9==|c!CM_#=wlL2^}J7$KXdF0>8EtEyw3fG9cya`FYl3}X^X0n5wE}XR9i99?uv8O zJ+}kAmY;2rSt2KRn%d;Xy%L$QVuQl`|Cw`#fhWyyN!sr}U>8Syb`7RNUdkI?VwU`8 z^E-HImWm7Um^Sd1UijP8_>A%W=hXF^+{DfA?LlllCHh&kVZ}~woJ2YwDBMTP@psyp zNpM`RTkEt%S01uNLdc;~BzIc+rgn%l0lMZ-d+2B!%GYJuShw4ql;l7U4vjr81^CP# zvOPS~*-RU_s#9SNc8ao|5f5A^SgG&$7%0Ft;grt(ZG+F$+irGndV_IFqtLlx8jTak zow7BiYjr53b<~S4^fe!H2xyLpHO)K2c;wjGHT*ckf=yC=jTtFWIlfD1C*s5 zL_>0c39_`g3?aN($8|6edhg|=!~3msH!XtHLq64eiiEor!Ap5<8uKJFdh z%wokcq`ZgcN}TgjUVb{v0-SGkf0(RcE9moEBF5EM=94$pa4}wcLZCEQS@GKAH@B2- z^D8ej2^8+o-CO5#R3jcetYWT}!*0@D&ZEpo{#T0)Biv&P(Ik6sk{M*1clMGqfpGyx)1hw=c+H@vZd!;Am)NGd=0eN@d zeX8=(`@uTjGJ?vRmpel~r(5~IP_;$qe?wK9d+gk=G7LZFgSp-LhPr2;X1ceE@+ihe z6S6FF9jdmAs})P0iqi)A5`-@pz!&__EsW^h5=K1x!zmg)E-(H}-%O^qI1+bEc+yZ8 zHUmWgK>jg~06wWqQRA^BSWWyc4i#7{I!~@|+8_MDQvqRfXz(wr`>~gGq_{!G83hFq zPeug;^1;>N^N(S=Y)0zk6ET2__r3GhcojUDu>d~bsGDbO0X3_bPIAsG;P@@Sy3?2@ zsqZ5O5i+8)r>b@$E&9yVD)iI+7!|Ikco52k3)eRjWyQR7c)A;8Ci8*EM;0&tbA7vW z(_&sdKL`yNhWoig{OfFVnNSL3YGl1*TW`j1f&aQ-NIBJWaqxA#RrLrLn!izFtj`l9}Vp%Q()NUXkkp?+& zBxImf#`ztWg8d{pY8)=O<4%#Su$(l%;^k^I9;aIv@_OiGT8Uc#k+3sr1D?zz+v$MQ zq?W!B*MCqVmZ620Z$jAA;C&zWxNGUa=e;6QMF<%k?v?;H2bfg=9)L?Gk;z%rb>w19 zaV9!pwzjdm=*tNx`-nV2(l2UEvQW2K16yRR1ZQI{JJKmhnasI0wO!XDylB$MbTa=I zBype4j}~6OYB|M0^i-UV2K~eoV&47}FZ`N44If(HOG@?BcZmj-A`cKG<3bl}|C-MX z_ya*r31#86dlXy`xDc}hku@@X-uH(4mi~ej!b!fd|2hzIbvio|wAKzoXPfY_uQc+j!$u zow~CLQUfIir;jDR8FZtf*{FST98TjezyaucL)@G&lSM0pQvjgm7f7uCekZoXS!7fY z4z~ZlSMpyG_RmX_QLe6ErMqQ_la`MuvfF~#$3#KZFKQfg!B+hJl$eP^OPBI#3vB9N zar-pE(IbhD&Klu#3w}2#PMZ{zcqAk8WQYpU(4m1ikMR^aU%H6vrRY90kfQ*HQB`9T zfqEsBQarNFYDyPd_4ux7nA+mTVT6EnkDyWX9k^6@r?#x*i55dPnZmGeQU1_pRn9CN z;y5dci+PqHOw_S|x)RLlz zic&|we>(BJp#8CuNg9L{)6R+oVZ+W283ae=$y#9?K|pL#ws)JTKwT9^6ln$UGoiVN zw$JT+p?=jpx-shhHH|^MO}Yb$x$ERXRNBdu*ZvF6$B1Ll+&$fxUQ6x2v@`GK(tBxR zcYDCHum9H5!I(kJ?F)RXx!zUl-_RtaEt}`djx9e*?0Im;qucalEy*6bJY+>_9a995fjXb`uXEd&Xu#ba+7A9xV_#n0*enL(sD>z0mik80V5Z{zXWg4Zg^KdvJ*@{wv!9wl>Mu2*LC&P( zg}GP8=C*A$+?Xb$1sv3UW5r7!1T>a_J4X{$5SnE9C0sK(wCV8vxCs_OC-ff+1Gr-l|xr}R%K`!B|)oRFa-Tx&>DM9mtV znGCnq=yzBP2SJbP)au!-rc8)6e;lh^kA&~tkeoXY60k@0k0u_}3?%}KiMRE0eIbP< z@meTOezG(qUWl5uyy*r#oWs!X6SF$NUXPy^wpDS zIcSVYvDh!ue|&O82`H?JnZ=rPcI8AzRJPNW72&lG2fqDi?cf` z?(SkTTZx-Z%#=Ltf}<9O1>lZYGXI#|2Q8bB1c3SB7|FDG5VcEZ zvx_FPw_r1{Jk7-4%#$=DM%^wc-VT%$yRfkCEo8nRv6`+IPT#H5j4~}DuW>GUHg?@A z9+}UrtY(0GHIIFV{~I=edC`RPwID z&M0{t?&-P?i*=Is0m!akyrTb^N!lzD+?~z5cNnvQe?bA4>62Iu{-B$vX!?I-y<>Bw zZ5yo{+qP}nwr$(?jMK60j%^#AbZpzUlTNbpthe^6UA3#`hx-rA>(m(I7+a<#8KY7= z9VM}PL;Q|k!$j_XktKlx+`2+#vvr;+yqF7{U$MYo=Lj_qU2gARck$2~fh{h>rYEw2RJ)?oY+{{>6YXU~>DOop{ zv!W;6WB+U_LX27(#>F8b_AT37vYKtq?bhI`!o->4e6Poz5m94HO*7}LuxT`cqp5;j za5*TG7s}GxTEymrg}T^ZTDLNx_C2!Gmp&iMp9B#zc&cz5${#79kBUSKfo$4Y9?dzB6VYrXSb%Bjpru%N;KmbQ#Oyk zG5&2rcjdbI!{Ta?)~@*EAuBCRy^OadFt=M)E?GwOgDmuBZf#}k{2L!@v=R|1vWP?; zX=P%d9=gkNra3It`$WXhVxaxMi@x-CVK7)=_Ww|A>FZ%XoVK1c{p58HwD6lZ^v;wr z@ue5Zo5mrFY-Rl4A1Gz;1-#!pj^)V1~!%u@!pMn0mEb>qOgSXB}6^l3CHtB!I^#KRQ8F*1n zZ$M^ka_!Jeuj8%bMW}LjC2E9bvict9=+_>ed|GaVWK`+xIe{`s zuJ{I%b0peILa?Dmf$+%-0>6~fC+|-m81_VbY6$5mKoIfKCXES#L!loc*!z8O!sYW& zy7Tc`n=Ta|A^4{dF@zJ^^!1v%38JL;qv2^CRSA3fIUI8=@l+{f5Q2{H>7@1~<)i6dA679rotnJGjb#%}RfwM7bPCt`ezv089Fk+M`mBX<9Drq5 zDg5~a{=QFGZp~fyHiUi~qM|09I>A)N>R;jH1)opTd zI~hbH9|l>1cVfyir4+L?nI*H7^bZ8U&ahDq)nXm>SwF|AK9w}*Dvn6LGZ-i0O2Ne! zmAY`Um6cQHy(4Si9Gx;dWJW~>3t+Y}iC}UsQc3V0Z`P@O6V*Q_nSth{r{7iE7NmOZ zqzh3!Kx>GF65GS!59sxH6B1@}v>eM?dB0 z-YwUEL#JsrOehXcsqyod2Dq&CgW4PX)?B*i&M}0ozZzJZktpfQVMy}ByzxQ3eqRpy z6INEsL=G1Ew&TDg0gRhL^@rO_$Q$gHNJ|)7*(3dm>28}GEq52RP_E<_kRPqi6D!(h zc7%sF+i^O;CGDN6UT8_rm<-{zpWudoKwB)LJUzIzTuOCli9Wey+kjCK6x& z*C&WNy=PJDQHo!QZoJj}Bhie7?b%6z$FRsER^S%A+xTf*J8~s57e^@`2@77qV*c+_ zVE^A&`nNC`M0x-V*blz?M_1_dUl5sw{C}yFJr_T^LIqN^e6TrPb>2)LyRyhb1G{*L zG@@wKC^hN7aUT~=KvLo!r{#HhPz)ITy%GM=Gc~k{vp;X0JT!-Q5^m^ zK-ia!ij2~gO6YYh(Gut=9>_Wlx*Ac~P)_jGi|zg3@gHB@kNGplV0h0hO(r%#(LByVbHS>M zm@b<1J~d(NOqOaa2ZDA$}jru2XIl7Lzk zla%n;O`xFw1Lam}=g=V_%7p`Kz4&TNkWnLTYMADrM;Kc${18Gh7Xf+NH%FnaHIV-e z?0%TwPBYfte+$hF(5un82%p_VlD<}n%*(MimJ3m&U^b`We$2-B24TZh{v*EjB5o>y zCVDdj&W3xSP0=9%&{QXa_#R&`o;W%Yc!2C{Xf zIhyko&`Ybh+-Bja+>TIi8-1{4)-97Iw0FdVz4>*Vg$N?UG5<^ zmTyn~zSQal@J;VC^!0Z0PaA{&Y4Zl!9WC#wT(8kbbK>4)AVn!pr`XSsSNLs>UZLji z4WZhlwGrzr-=Z?eOY&W2Lw&?$N|GpITEVmCfj1|5i><+Of&9rL#OtK+f;JAUk`Y=I zdaiFlO;nwmZs7H*`t3&jsJ2{M^>E^Ak2r`4;ySerQ0W<~;ztN0sRl=+1xxl1MKS55 z{Ylv#odq`U8$d+UwL&`X<;;j^HA27#o+%{#>$QVi9wI;_=w)RLQaS0c=OHXKvt6FP z1H70c0_S+{>r-!}-plavi9ni>RGa_7YYu0&cD=zeOI&KI>acRG-<)$*$>3MXgZe|V z+H49%OhNfLEEDPRi|7LeLJy_*KXU{KJ6C!T2rw!r(~o~MQTs=IoUZG7&Ve+#^M)4i zU)%5}>8Lk1M|NFqNE+6jFiCC%SeS2gbvWJWZ`sXwQU|!nyxaurb0f;f$Bhj+vg0xG zO}8h<`RAiJmExY%ct5UuPoVKYw-VGO2$Nj5Et?+2!uU;-P@(W8?PJR1KFt{Gw};!_ zos{ty_~dh^qbUzSwz2*816e2Y1xX)WfSjuCAJowSA3N%^K)g>pKgZDx-zOmkpWmTt2G6sL4J4!%Jrhwsk1s@(N&hv(z(+ILfOsu4)g96 zx8MSX^U!`05-p(sDA~p^C?P@;ohv~HJSi*>&Zxi%IUrX-)*fYqydK)+2DZ7<&3ge! zb($N8VkY2MGyGc#VhG~<{9!}Js0B?W$)jbOTFDM(intP#D;B+Y{~V=$T(sGo#*DBU zgOk)@v>7O1y{cS=K*$`#RZ@ls3_P*HeVyYvg%vN-9eG7fr_8C#i3;ASTqpldG{>B$ zr)qyK2pYWr%yuV!c|~KOF2DL)q1%5N+9FEy4GAytZ=5N^;cjRGH`hag3mYS^X`NFl zBX3c!+&mlg6W0ty34D)SV?$L)BMWRMwA$K>pN&3Xx-NXVe(`-{tl-{lc0PE}(7Y_r z;z+-6!c1kIO0trv)6h2!tOVvJTIJ6JtF75bztw8 z{S)&=*)4XE1=E7Ua>Z3}t?VN>Ghvm<0`^rAJE!e+L3KZTX)d6&^tb~~p~gE9_OHgV zfw~7E(;enKN_dSLH>x^sNA!cYg^9`)j8bg`eoxo|2kE3xB)yN%Q$!B-6Y7Zh3hWKk zkBZeFmu9dgh{N%{0b*f1>yjm~o1cuKLq49jFYY|8bIGX>SezzRAX67oiuecbv!UglP*#|`bG&3EtA2vQ-pfEE_ zArFx^uCAL;wg30 z?SE-db<$UdHXZ1E5+WS34aU^s6Qwe?K+silXoe>`;#i`WT`K^UO<;i;mU#0ul5f$t5__qj^$pvzLHmMZbTSIc9@;vdFKDfW zagv!e$DVQ9V2}3ETaw3JJ2}<|p=5iHa+NP?@OlMf}nm7LY97W>5Ln^ABeq)3? zCufFohZ64J+^?%fW3m%Inw8{iT^#j#H*94R7<7KGA$Kxw2=aD&c{lzyUlBx@6h>IH zD5ce#Oa5R-er zt3jN)_xg(g^@zmC3 zwsL|g4_;oN<&@H|M6-r7r8c3-D4b7nYk_Da%NG}iB=YLi3Q<`yO~xGoh4gS zUoPXT_?dJWX<=A8cT+utk_OPUF+CLk(hi#tY(54JWWHL0rf|n{{F6^tIHH0v?msJD zpS5Ox!yV2&+c^(OUr}aJ|bq%W5&>W?WalYTDNn5(I{#2OAq8%lTS4dNUfQ9wS z)`@!3z_;i;a3kKSgMv+F7*2d`f+oqzSJGM{vX5)*8D%H3K>axIvIOBMZX0P&HXkAA zBozi~O2Gv^2pbv6KBJC1zMEWMw)!H*kU<&V=<|VZ?7zH66%*N(Y^@e&6&a%gtC5{+ z;dMSe*8jY@b@B0VL${I@;x0D;i0yL*sEFpi}ca7B7Wm2TvM+*}pN)@u^pc zTpD!@@IvkP{jtFL03DmO9y)azuYI++5|wtE-$qWkqa5FMGh#9>nemRsbqw>IEib*!PRND~df)I}p2?ovosJ^SyNv|n%lcQ;$rB_ALbGwZ0M%o|-R5=8}84wAm(StlAX(u|w;^gb_; zyrakZUH(7?6Z55!FvtA+XyI6tcYK zFwz-vckYl=y|~SndJ`*NKa054ir4y;gUGXa_Z?}Y3h}4c+6k`;%s#L3BnWvrdX5R{ zJKG7tQK&E5Hb^W~-n~it%(J{>a~%k1A|y(6S}~_ClvlHUOWx==m&3s~=%n6J^8bGx zf=nOuf;Kpf{#)x;iZ!|R9l}c$B#nm+UtWV2sx;CIp&K`( z{Yw9Qzv_@m3$sg>@iJyR&pcajeRrGS>Wp-99C|UdvP9$#4)|ahkuxABaw=It4TvXJ;+8qs+3N*k# zTXc5#00tSz6ar=(HL!3_aV{9Z{kRM%DF#Lw0)HkRL1nh<6oIwN+xK#Vu3rjfil=C) zeKn~Iss9T9s!#&p2a=?ogTh50^!8(WD%3TTx4`6y=U4%MP9bK@mUejH(c>{x~9eOO8fiTFlLLDOhyh;TJ{H!5beDq@n}c1 z;O=*>;_MDMabmI97fcril>$cvad|_~a3z)h$5VGwwcm>#$XqO9D;D%NkF<_GR@%=0ztZ$H$=jVpWGq}^DZ^j3%1{a5h0xG+K-@q6E2s(%nIa!RIr3he-rFW#(rUxbJ ztbGQ>stdQ=lO6tWjm|;w%6119%5LX&g|b{+&@G!X_{dbT$4jWcJH8Et-F~(NH;9G~ znzWqaV~r~eSD}byNiE#>bV4*hzt6dUF;sK{cw#CwCp>?@CDjmjFhkdqJtBOmTw0N0 z85#W?d{sm~hbPZk+fdsl&nYH-=Wf(~*^~CnU_|rH0^n&5hJLcnQsc(aVVh+i3OV}I z?pN6Ik-$3{k%_m-Int!id{nE|am%BJWz-KAaCBsVGRbKI=&I<7Z$JFJL7hCfYl$HM zk7eU5+iU!&Ly5aA`$;6EY8S+6vvwK~A|gY-{?cOEntrr6J_q*+r;lXZ%&XOL;yQIW zXdpfu572t|ZLK~L-nLprvi-8cSGHPhVZ*o)L@lll{y_Ymzmn`isP?I8-k`Ggl=0PV zDGU^%F4d<(8&3Uo-K}&6w(a7_$LD4RSSY<@4f6luF5~`Db)T?BIDq~YY7tSXhy`q^;CH?+^>D%@G;+#vXHZhW`?c09 z;z`0C;7Z@1@#5JP|2xTXrU&i)XX9o0U&H%HTUT>K3MJq~^R&UA;`*^i_W^^*=`RIn zNTxqAUR*-h95yL;8eZDxldgZFUvdLcX0;)myJmW2?^k7~8p#|P$=un%-qOGasx?W- z&xOv-oe(;lJi0k00~!lUa>eQ~WoIRX7!~3(5f1J>PceyyF?wKXsqEJ%1TBN`#sr|z z;gpFn>CFhM$kMlN?vI}kG|h!@%y@H-P8cL%9YQa@(yS!Ox{hdr1)U5bVy&YTTX=;c z@&F0PTr#R(44LX~us%nu1SEhUVV5YzNV?ZBMWq`J(8-H;q5?kf5LTAHFAt4~-Oiufg3`Yg@qT42rQbIdRGc&?gjne%%5pODq zEylotl~U7OyeIfclVr@w4H~dGQF63-(ZrI9*~xekFKtinlE+{T6wVYEcDS9ySftuT zBvCMDm}5wg2VX9v`SpDI5UA=F@W=@GNM$;z`wRHRC$NoIk~Dj}DF4EaK>hVhk{g3|4>So1p2I7>(Oi4K=OZ zpW0o}yMgPCt2QChaVIkkhrgZd@CX1HnlDq<;%VPNpzyC~A7RUKpID`QWBMT;J4`UW z7NSB%6x}5#qZai=bwkLJn=>C4NNUv-@1Am1&3g;jqG+a9&0E?1S_6!;?yg7I(k$&& zLXfx~>xb1S|7gSLPtxyywh0p)K@42Da2=(1>IPbM;p8PCwhMok-%P_V?khyAfFs0c zxyI)ku_7|+?te?;tJ^OyH!Zrq9Q9yw_h7vRmC=1{*cv`K|K%Q-ymhaQ+9ki(BL|Oi zA^kg!`po^VcKO7*Y7gkvI1z5}>Yh06@mCsvTpxmLTDhhnJgA(i>$(yM4%M?f#3~IJ@ z?d{{rO%qpHQwj>94*Pc?(S(;IlTgn+r?5U7a&Xa>TqLM>=nf#Or0k+{FhK|VlsF7> z^WLMZjdS5!EBHXlu5gRLvKOG$x2BiaS z>RGejcywe>EN46i5|_Xp^HVZIV7NY=yYi8TnP6%b`<)^(w-j8*5~C;2|vfY4?(|Gqva zg7hbQ#l|n+{sM}uG|;H|?f`_a34hgoFf_J%=t_X`JqKEy1q-F4xJWljWI)U{te9*B z;jd$*KhAemM5mJPy-39ZN196zaE@^>4qs=Bxk;al)Iw6!>{+P`C%^sN6&A$4+=8H;3a&KoJLc4|bQXd+>GpzF#Q1DDs1m)Qw6-`Z82@-#=;30Gyk z7__ejV~hmAH0$$|Q*}2a39hO(#zX_tTbM{86jqRRiKJ1-!CSu^+ZeH`ZsEybfJOu`%10Th6d-Bx6`g_3CxkJWksoVp{>`axQp*ev0 zc1G!%4g&|5qA0_NRBpo|=(X&Z-NP@KAb3q>IErX_g1b~kt^_7FzNW&tN{C442(`k% zk7IIlqN(}>H(l{bX3WP3H88>Fs#Pa5Pd=$QVl)zS+!2D&VD?&R8+GG zbQ&;CERYs_c`BPuLqMkZ8PS%W&&U&|-BxcG%BX|NpaD3t+MwP+ zGR4g8WtBDY;^yHaXt>30ZwirnYbClsLleGz9I|A5NhI+2Z7mo{J*5Hmq)jQX9uRUc zB9P_lhM?V;t(*WhTy@&R3+*J&44F!+T|m1MA-5|C&d_M{7TZSJ>JI0Zo?YlKAF#rS ze^*0A=HJQM%NsX7MH8edWyV+c&e!LU6z&7Mt(|3xWRhEGXV7BUT*x)#mLX?}C@tle zk0A~edCoKpby0~!uBN2cY%qUC_AJQ0e}MnLaAi)`^nPA2DtMOv4^rfR%}x4}FbE<* z&>|e~$ITeeLq7{5oFl4B3i(GHO&Fe9361FU#XrIYpL)HuD=Ay2SF34rZ}N68fp^or zn!IC|t(?@QLB_phzpY+&4M)bAo3f0#U2hoYuQCipx#={LjoTnH&8vFeo`O4h)z;Yb zrKnLExC04;2wT?@8HeUEqYWGMvnv~5BT8_1dBGt8rgIQoHSkS`NS*cftE$U|QDF&8 z3x?Z8Bmz#2ewAzxQbPEyN-+p~jN^e?v@CVgmK>IAEUVNZim~4^zcY&{u}G2$%DRl5 zeZ6i`EFK39CvLs&k{))w&~mu&i4?XCx(NNTkiG)#aSUc6$qex!iHG zFe2#*=wI~`T-hlV87yiO=J=EswS;S;UEc6I%6cP_+#?xGjb-@auR!bu9bB#?ARSiS z#tubr74|YIU=oz?Nv|NXI8|%=CFfS^2-;E(Iw6ZjYEDtQIXYIP~Q z>%=M&`)wvw6_cE`*WzYx(b_Qxwsz9!Y<73@dTmjGQKMxi_22Yp;EHB>+Mov_14Pim zHmVH3D(W%7)T+fL>GiZF;v`IV-jYP>9LX>$=ByRuoi@oZ>_Lkb=(e>05`B4@+GD#p zV`dGJ*1X)QPRnZ)S5BbYBE0d1-ERvB-^I8HX!tUM zHK_is_FV&L1?cHN5pv+F+kR94J{-Qx-p2H^BoE=F%2u4%3=7+?yzS|D{g4(c1?FB; zaQq~au9`OIK6S4RLyiVsZLs<^nT^lGAfNspg{cQH}kfqUIuzN~sOU!H3hJhwA3xmNXrQ9W-6)x{A!=WgZ+_t(prJ1}8g+XlVq44H}3W@@7HZP_I|zpM$eofTa97O){^Hiz@ZgZeP2| zx~nRRVc3Ll!{+rHdB-ctmi8a?eqqzpUuV3(teGoTZ=0fwWxV%rcl4}}fn1DiTm()# zf=Y7-nHY!yD82!vC$90b8C>}g>MY2_ly%gdbgg* z#cWEj7W{a0^5x*vIq%Ne*1N)Dri5Z@&v)`(NXY!v?9;}9=KR4W3Pu$#5l737y`=RY zjM-NgO9MvU|0a(0w<21-@B8=SkD%&N<6!izkIwr5xb>WdTps;0TzJ*PcSfFWjypNX zOQ>5K=0wuwCP@x`g$ca=gwDQ)8c!n6{(V05OGkM8VJ!QTxr5uID5=n}($5$w(ppj? zMQ-Fo4g{9zRIe!uk;lr|RPN)eDkpV{L%QB-^MFK2W-`N#Z~n#SD|(Cj%!LfTC}+m_ z@xF8jQvk@S&|Z4O3>a!UzXli<@c)9sf7Y7X{|P+;R_b<1xgwP|C3pPdS*>%_91Qj1 zBhsuQR5RVgXdK=zy11lNQQW<7dXc~|qWSyu6UgGBr5PkfSBea$OQhjiWg-vXiT_i1 zSpBFxn3!c9W)Dletmc_fA^gWxLV7XdwN=&3eSANO_m++RkUMS2UzEi~v*-efO``+a z9b*L;e`Fp@#Te=fHrGFvm0HOi3AES5P>*?~YHZn3#iDH8q)DSQQIYz33h%p6#Yi(4 zHK&c^F|$W=F%7hoY?%L;b1x#_934*gT5OsB2p}jm%PfuE{LT*fvvTAIUkpPlm`J{n zyd_pFE6C>0_NHw1)Jiui$N<=?v0;gO!xwej39?~%J>d7&%A=9i?9oLZBvlXVvE)AE z7d*Z(u;TdJv782E)1by2*+)%NN2R=V)9Fn%i7dg5jpkbXp;P!v%{p}bl-{3usZGEA z;F{d;v@9N^)=j@MID703a!b(%b2*=b_UVM`$vLzND8V39Oy|sFZ~=7$-AycD(qH!4 zev0hl$KGq9)PzjVr{)kYGR5$!ea)yc;d3|CZKpgXAi4iAqzta0C#K?0x<>?F*XyyN zM99f7{79kLS9C+1h`Qj!Y822gSLd<(H4zb8+K4ofB$GDFP(H2haYm5zQ(WUH{`46I z^8M|V9@-T?*(QxHn*=ocHkuI}{|&4vGfsE7k9w)0;^daKvLJr9NpV|HIcZYFIS0~yh&2yaPq6TTQHDfFTzFb;jA616OxikT! z3Htsk&M8TeIM38;Nt`UQ6`}qxs3^Sk7c%OXc8v(GX>4xX3z{Kju-YCA9 zgkL}ozPKxqunqlz=1=`{j(x-tRJBr|C$M!A9pbK}4CxbyU{SZ}&OF3Ed?e7JSlQ@s z|F)?ag)FLObaRUAH@o> zUxdYI#U;hf0|ZMQ9HGLuU#DF`ICV;!Yhka#=!VD=cGYv3a$(av_UKw9F4V?bw+}Qs zcICQ`HE8gHtAn-HBQ~3szrT)mJRX7Ua~V!gxrL{D&#LX^1g#V>!q|!M+Ij-H!yu=v z!>lcDw+O(Ln2aaN)=)Hi;lxRMWx_9euZ{q(o60SVJrj4#3jx+Y-Ivk!1dh|Di%3#K zsEln2goipMOw+S_!vMj1pZ!eqrlK&HhPb#~e3$UXA|JoRb?u;0zkIwWplA>1i&|-3 z-B5`8q$YL;{f=79zwP2>pYP3X5b!e)|++r(ba!;dM`h2rG({11(D_7tLZ2j1O^zF7ne6{l;P z(+eWdDU(pC!IIf;YuZWXbZO|g@EYY^s(tFS?|NR^UKkOWVfTvPy(@A}0JX}X*ztT4 zY!r~5pVN3lsfM5gZ2jI{bu8XnhegkB4y$S!~@Z@6aqq*KftFlFxwqSv+ll>)by@9*v zkXkx!Vk0-0(x2ir3cxj%XDgQQi`5j|5&#s~c(=ri(3d&KtJ@;iryo;j4F~04PG7M2 ziQgL2M!ILU&hRQVFgl{*1g|Pxhy9F55F)b6#GGu7I#^MEEr^tf>-S*dC{`0<&Gvf) zNu7`v#M}}WPl%cKoXC`%q&`rIJ~tG-Xy;X<2BMh`Ig<*^3aXM&4t;m2mmE9 z#7+jU+dE-RuIvxc#?OzHr5Eb#=UL0I@f6#CB7~MyZYlT+9FK9T5OyMhua*=xgJ)Ix zH%!Q18D0Yq$d9_dM3LgKEulG)a_G{^1yx5tUAp=ZOkVPX6>vzInB6dQ2pM9JcMaD* z>2~3YPZ{ za&)@;Gr3Ut5vPj~__)PIwd~BZs08^6Ch0DGUd$za$qDc%QBq#ckIb{Va|gn%!4Vnr z)sp3mAEC%2V7pkLb{>=uM!BYG_VH8^ph-Q%-EBiaE3*V#Y5sUv!Jk@q8%E3I+skcc zZLPD)V^4>@#C_)*L2wZc5jdUfe;{E_eERySEzacueVoxIyTedwM04i6qHn*i1Exg{ zW6rp;1p!kekN#R|b5d%f)Do*o57fXLH7)v>42I(#&e}a^6Y6~}$h)De%Y*FMZ1{*K}HmV%46KG>O*ntvCycc=^vj1ia#1V!@6ziHwr8R;mYQ{OnCPtE5 z@T>fPWVpDmp-*NVlWFnkA2$odwGY(+WRmW<0_V_G>(X0xl`fg-w1OLlRV>sXiZeR| zC{V|%Zje4wf61+t?`s0Ds3CWFupvnJ|$gGaJL&L z*&0nFq7?{#D5t|%&*bNT6UHgy@e3PuV&viVyUDnQX<_~Ht9@14Q#S#P$tK`?wW4}uV7xLoO_=|b1Nehq3>*ls<1$tMSI)3iPd^;Gu-3izZUPzg| zSj@4BqUJ#!^BKaKWcTdcIRyZs*BhOj67P&MVq{#5nIu;lj2gQyP|P>0ief5lg&EM6 z6J%Y&RDL&XBlw6NMGb{xwc(e$*SZexyoBaj@==f{+^iiww03B|-l1Vz#EnXoBY{a4 zc)0Jf++qIAIP)bmMy&~>s(?t30m;4w#a`idCvkmsn^M|!Z!I3OyAEh_r%Bm(0vVjs zA~#bCj#Cm5r1nZ?WFD?70|%(4#=^TYtSDr|lO@-MKA^?b5q~hx`Ut~O|00aaWh5?c zR}|8eMgpV29!)5;liF7yZd0SXiWX~Azk3xO#*CBFC=ExAv>C{TOWYd6|`d) zQT_a#<-jS+75UI@*YwUnou~2Y`6B!`?wM9MVoP{ZF^WO6Z5L2wo}NBIA=|c~n$?yd zK;C#sL{C7rKVohYxt)rUTT<3u6ZLytJ^~?z(Thk4&r&OFyZ0nKTxspYc)#gWYjG<2 zcb?{i_rjuL(dQnlS7h-dxQld$CmF9(Sc5({gCW%l^ZOf?6OO_xNYTidYUdksD?Uj?HJWPA8; zLs4y=LEt97_3d7#;%Z>c4TnM+NnK>0K~s@{YNy?om8b8RSShS3%sI zfD7va`ah-xSNJ^R&c^Rh#3y)(%Xf?k--8KvDoRSEkx@Xti;N*!{*!|Ps1Sm3gWS#N z(PW(0_|IdakaQ(+!DJ518#G*2t);fnIavxA#N7BpLW_zk4wON{*i=lw@Vx?S6|6sr zjfe&-#9ze*;uec>O8M~%8Fl{U0>{=_t(k3&hY-%y+98*pz7hCVlzW821r?XJ5LQkim50ZThvA1Xmnli?w*~4r zW;0QUfE+${pSNHH%9a(_O@Mg%rx1wcO6Luv40tYfGgOi(wB6g9u7k+Hp0om-i2Aox zK)@Grv-$nQcDMwcd^*XtTox07N^w8ag~Fb114JKs)J!aHTAZUY_@~qpPg+y!wZLfW zqn0;P1+f_!p1vilUBO&bH(tU7YgN{Q<7>M0geo7#Ge^}7YH0J%P@=s#X)nzviaV!A ziRibDp9iIo*vVjTc=teAosR~#hI~~@joTpJoH|d7!j2H1UDF6Q-T$@cj0Jdt z12Fl%Lwgi8hWi4Qp1nS3Q7nV_UCR@XUyUubzOh_|rcCP;3mJ;7vfEyiIPLUZnR!-~ zP?N6*<8h$q_+=+<+)j?#?%+AlvjVMEH5Dmqn^S3C!|=_N5<4pCHZu@IvxoFU-ku#u z@4i>`C^BdR=JjIx%2<9XNKV(&J2nO$KoiK&gR}9=U=!4J1H3?B)l;*3@BV%GiGaNo zZ1;QPiGUo8wn$hh_|F1&20taFV0efqvY0sH`x01l?Ru?yZw}OH8d@h~B^lAJtVZp+ zBPFsDi0eR}E3%xzm*sC5m}aiHawROEzX~E!i(|j5EZ8)({tfLU0wM?jK>&qkE z=Y(FfXm3B>UNp3BnZGO>0d^gWGskBv*Whnu051=h_88%bKeBj-CXIh#2T%R*_$B-O zbozO4ln|8V2z~}^`qF>rDpuyfm^b9N%35+v{xLSFPdKI95bCNLabt;$<1h+UKpy@E+SP{Z=PW1TDJvrlEi63~ z0890-ZWkJBQ!he4orA0^>C5-}f>;=Wa=3M_qr?!8plDh3S%z!w1L5;4hal#0Rg&rx zfAlkpKC2?baMT5hty+16DmHXW9dov;10yaPQ{!yX1QO8i(YeEW$2biJpR!iEN-`&# zG~db#?DoGFZ_O%_bGAIkzBflyz8PiSfEEGmNlnHkKE|-e5}hvDlLZ@*^K1}~nuyZO zsv=lR&N#^H7D=n(&hgU9O;r*>a2dQ^oq7F*XJtwlg+lhh2B74G=8MC>H5bF9x&+mw z3i#Va(!>qh#CvDM=dbz9NpcUG)9}Ay__Av#CN3+O3-ITF;@LClM~x!5_;9AI0k_#K zIQTD6+))EgYD@1h3W_qMi`6vCT)g7YU=S!1hoHa8b~*#Km~@hgzQ)RJ4jE)B6GN&p zguYe*y=P#ioU0tWdpx1Wm<(%!#*_&4875GT0FJ@+_d-;u4WUc0EF3Pbj!LJK*&8}a zPbky~T%i|tR48}<)zO5h4zA2f!1*Kd7Qb>BqLw7&EP{8Fv~9h;`_8GU=LYdzDEPi{*~rF9Tpdf$;9)`h{j+6*iAar5cFU&nbXwJu zV2HAWFymByKv~O+e(&@JNl;a~5~&B7_1dN=lzf_z{Knre5Nz$Y>>qJm`lB!yayo|b zPbg`=NO&r9k>a>_EDdLyWyN%aP6)8pVVt?(Meb zWR#Dhq8l70!Z?mwJB*jc^}-oKI+y;60k`_-tOl6(P+j<8KQ-PW>@3`Fv6!&g$)$wJ z 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 uHh0*yqbnuB>w@i&G~-- delta 356549 zcmaI7Q*@@mwly5v=-9Sx+jht5*nDEMW2fUzI<}LJophWxwrzfUpK->y`~OjMtx>hE z)>YN4Ije5ci8o&e>a1bFc{6_HfYYTU!{7pAL6)PYY5Qg&G{%$!B;fkk2?tuYj z(4?>9eoh8i|1pOVOhMz=){90Lw8!Sy=F4Y=%%_-Q^j1F0e$b&x*Sp5xweDB=@t4p# zJM;>UBII7jRTRD95Pm7ZmvR`2;yF4fR`7Sf2UDL4lJp>C)3;|*l)_ZuU!?M3a)h!c zUEpOHfvAO15HJ;e?BZ+9OD)o}X-jQD2HbawZt#Zw2TIYFzXYTPd(9B5E>1z`Selrm z0!PS6n9&M5G0J~xlJCbL(@2wd)(F1Y-j9%BxW-MXj-iQDj9P@?_XFdizrluTfQci`m_y;1od|-1wAjmwG#h?(g`Cj6$Po1e2w@~S zlz-!kaix$ZL#-+n)!}tyL3Ln;HLf4wP3xg#!Tr-C;UQa2|HDIgFS7=B(g+~~KmAMJ za0=G8Gy@DmA6je_2UZ@*615>h8v@6m`i~P7?z9)wD2xsqVcoDRE~&v^B=Y(dBLSi6 z#W%pZwfKfeK*+LAXTZ$vde43ufU4r5c}lVUvge-E>rNAik9bjfBRt$EBZyyx4crBx z7ZAn--hyc6L94Dkb$@x6n2ARQUToNn4KV}t)+wrjO-V94j|Pclc;ABdIc~XyKt^%a z*5|b8sPQEI2uBmTtTQx;<^>XhGtQG42}Zcl{bu~c%8qV8Lgq}}*V7nK@TYw1=;b** z;Q8mqjBCrYA!Bad;_34ISY5$P{~wc9=9O}MY5@3nI(Wfds{K>yuyj=<0;&wk`1}GM zzIw&JGCoDr0ld=Q$GIJ?CQ=|%zqWpN*l5qXvUp!n(FLnp@OHHh_My?TB|IjOJqmM* zZ*x{6T2gD+|MgiNw-@j+osI4*h&(K1HAXORWc@aB?e(l+`hNPC_mImR^|bf>I+=#D z>Fd=Ls3%f$u3*-7Qh~wro;IGkm13m1UnB8Z^cyc%DSii?jmMj{*Qd-_tr|@;m#v1f zYzkkJOp}!RJjk^Ru3nVHi}3R4b!#wrB7OiZpCsf57 z7f*VCJCC$gB~Q*&VON8nC+OhvQ}E5dpwYP^4Zw?+iB+cMdwuo^;NQm|ufL}wnPGTz zB7~3R|9F)7$sHh~i{vza85D58WqfnB4v@6hg}1;O>i+hAx%Pf`toL}bJc=iA#J^hN zp~>3W$lZE(IzYFYN)-uXom)tC#r*Ld@mll>DLtuk8u~QC~>az zp;L8>Cxg+nvA4#^*L4goz3?xLga-NjB5RDftKB+LLWW0P(vq_^=XH< zLp<3e)uasHPdlHp{%Bhan2)-KzFW;Q-e|#?q~I1+0_5q>m7%p*5=#X8+E=f52fazg zEBcb*4&18C-BRN7R=#Sa)WNt1xz*&a^{akwNM&i_`Z2h543H*9A9~kK=z{SO)YyGS zGIY+xVKhCk>o(ko+ob87YTHv0{7(1tRTGZ-2UerY#T%Z&v(IcIIcM2Ns_ zcPG#2>=1Pg?W4y=`qi&I4=lawj}OCL-{Z5kk($DQq1FSxinGd$KTJ)$s>@W(kb<^8ccWH@1l! zamU~{3B8#d1pTAT8-r85XJ`*7i3md#eD&IAXz&(xl8awEb?< zk~FYudgvN`SELxaYf{M=(l+Yq2TCy>ozO(m zM7b~!WxJBGfW;^@c~NXLE1N3>eI#fp3iYz7kXFcI#&CkF(R#7MxFRqb8l;BO>Kj(k z7N`<`KE)hv(|kuYNlHUf%WW|j*RlXO$j}no#5{c3S+SJ42pEfFY01&qCg51?u+D*9 zRGFFRt^n;?J4Nyk$p~YPRhGmZGAc@x883NoCxgZXh(`LkJ4VV=lC-}j3L}PnNfA1n zTqo*I0t;g%@|b3>R;!{1Mwts$Vm zK}w?lGfGFd0BaQSIp0<|L>`)s@SmjJ+=>wg28q|CuaF(FbFjT3;IbMuG3MBanL%-L zxN{AJe>!}v0UH}eVTi!5&6uYvSf|6OeGcUT*OjOleSNa8lz-YX0xPXZNteM9S{n0h z`rMq8R?E=K#115UhHeQ4CX0IzgaZB9kS#*a-5oVY558+=G*zCsi&c+HDX{zP&1uSn zI0c#*rG#>a1D}C~)OBWl8(Tt0!6~8y`5)u1kgz$^lE1RC zgKP2)3u8UT_1ZOW|0IgP(z;>CRw=s?5I&j2$`qXJQs^n)`qFZ95Fs@vt-I zuAGN?1f~jIm4KNXa9)$|x1rMy9Z^^yO++5Ow$b~Coe$LeL)9dz?NC^e6BlkX^hIe*D(=$5ZA+~FAGsP0kV`J59!&`R@i)`3qnf(k$j=_Ixi zc9_rl?cS~4Gv0hkz1LkZ%@0+4?j3dSXFp``F?Mb0IoY?1`fq#3);@6SGmmSezx6(` zq^cfOtOf|o#$`G^wXz__&79fr*>5@B`QAMz;3is@j|${5!meqdch8r3Jw<*Tj(nsy z)>QpGc|X*e=osjI_j~%=FamHHf$RbW&s)EG&dG&P=gah+9JQsw_RYhJ_OD+9tWvi= z!JHhkL#hhevIj1nvd-}NBR!gZ$P-4gj(JHU=wMs<{Q0EqySujnw%oKkj@Sm45@>*C z!;GJ&G;-;Xm#3RuV7RwN8~n@dxSv%62Qj0!}rizK-+CY4f2n{r&4nzpfjY~h^czP|Bx z7#>s6+i1*(%9e&|7B0Nhu>?j^_}74|wlwheT0`++%Zm<@Gu zT~v&c_TV9dSk&vzfA_t+a}>OC@{~B0;l!OqTi<>!zFJlxEm0(|_xUCsIVx+5QMN+N z&dauf78%DD&CY*nz-NKtAOCyTrUe*l+{KyHTpEB9&%X{EJn?nQ;g?JxWy9@5rz8%z zm+ez&CNUzb+Y_@OaS5|aw;`vHQzVai+AHu_JkVOcbUEM;p{8rUfZdM?6Tcr8&Fue0 zlQpQw8s4+6L^-}8*v4@CCM1Opt3hZ6^%U@Ex7V{qUzYhMjfLf=JXhZ3Fb`;{O9?Q=+8u;9)~s4>v}EC?UfF-*b0|hb8TpwJGQvAWLn{=BbOV^?MXTP|-+(#P zd}5?coh#&g*fgj4mQhcMkqXCgELG2tCjIBXi%{#qb-udGC%a7wnr77K0+;G_EFm8g zGmUz)x_>I&H-t~{zlfLj*#KilYQo}3rO&3oo08AIh=$i@Ft~p&{1sb`56rEhUJc5z}HLzOw|=DRNmIe_VMc?;&)zHcn0*xyS}VPw~l9*OSVSoJV(D zdB00-d|@<(x$>EvCK2dDS7>4cFt(bLQ!WB5sbBe&{rcw0NrMn_UqGb}LnnPA4kN|P zLYKeS0228=6qlgt9i32Nc)z}HLV?a@4ZKuX9;qDE&qto+y#wV+4k{LDcoDH^q*VW` zR#Oec1;PU<1yAbz$PR^-iyIBLqI0?!b@LpKe2D}b@_@>2Hi25>x$_2&l-io#lfO>lD6 zZfgs!n`wz~=fU=CYzl(HbBgBC}(WN6%x}n$8){4>YA)D5XnP zq+fSi@Km(DOhCg!zlla^pLL*dFiCL`Nv{?uy0U1ZS&&a-OhoNhkD%IF3XZHdhZus@gGQ)k?-mIm0^$U`;u?4fv#I@>2uF`O27dDM78wY|Ct~zS3zwyT zMKN=TLyUakF6Si*7g=<-S3wNkXe_k)TY?X@6HOO^4FHxRwl7BM8J#QiaH;vyS%_+5vd|Oo`7UXS1+mbR!@Qo zu2(ox)=UD=VFCpFt$BD7s=8x_-0z-&{p&VTnUDt^mW^6YZ>g=c^dS{^6j3Cv;o$l=K(kmD~d#%UJ^!-@;>WWUn?G@Gnp9HH8QZwn?p-Xp-mXObq6FP&zAJ zs%U00W%n}H46AHHxH=e~65FP(e&yD(=2K-oXe<;_l%^E|V|i$~VKGHn+0FE&e>KFf zSdVv`7mYgKC125h7+o|~wcOlTimgAuZ{i$Ly%v=~TH%K{gVcFLc62ln{T}|!qlL*0 zIHMitD0p=2*WLdmcY3zw(vn$SmGKFG7UtA^FY%9b+rB_+KWxLxU!aVn z0^c8pS1Wq3Q?Uh918VxpRMuhTfiLXHqp9mt7BUL}eb8A1$AIG^DI9FLJG^1vdG`36 z+LuTbv0cUUA4X%LdE^)=>cPXpWiSs-PEmjctKVvvbe*9E#2n@!Wq%wL1c%`QDXcXk zNlgZ4*+kznc+2~ZP*I{99YBkgn~HaKb_OM9L3q$Qrf=Q7D`iU7t&SI|uAtRE8ALxg zSep)(sZbUJ9W@Ov*pqS!L%L!33)uWPOs!sIjxtllILf-5CcQKhU}z4)?t5@uR?l3w zy-vit4alBoin&JOu{2t=GV@XHZp5yLmn=XyZ!3rU;jifjy&eK zKyjSor^7$a^h56=sC#miB&fr9UDb?N@w@&RQ=Cm4TmNJe3Sm%%C`T`Gz zJU*>(>|dfYB%R^gfgsRUQMJoRYz7aG2@BMZQ6aVl3SIJ2ogd7?U;W(}>6^Z}QhKKs zOgqCG>@axO&1;=K&&$wW7=Mv8$Q8xCPqjDiZ{{VcO7d1PLo5+icq?Tn8TUgZ)6>sL zuJ!{^ppMo79lVrU`cz@y&V)(wI20zez{$O_XzZ*9g#A%tU=e7^Lkv~#IW8)VM?tZU zSYmNvQ+z}sS1JX)}g>YV1$HGw~0SKUOgxFKg8;Qml+hXnSMHk#YU$`}p zUhbqp1iu5r9XQyeP8K4C11do4LK%xV#MJT9I6U0M5P0k;e(J_>qDgC8&)(suON42oY+#KvCHd-E82?4o7tEUzGUAMj+$VVQA@g_}>-gw- zNZM6GWOQ+3@CMup?IrIr+ z$rg;*#-nCCo|q!?jAWF&2hff?nIa$>Ecv>kJZT2K4ZtR@-`Fb1t{X>`}G>0mFvMT z0a~Tp++^x#JxV#;9=M;XlqDaSJ5qysNT;sMPjkNRJ;A(&P^Oa-+nu&=V97*}a1dVerZYZy=*w6-JS%JDZ?3)7Z3)VFf8A`a z`Gvs7AWoMRvr$RG$E{Q}@HMLxjU8n-CW{{8s3}N61ZSxu;hjC7t_X{u-)!>Ysz^j_ z_V>$q=F%iD=gRVDHb`sahcw{ksM=`p(Gya18feR83b01wn6K?NrkQNXa;fM)b>(X- zMg)NQE3L-UWm^60IMgS}3BGn=X4cvn#hr$)y>2Sc^By4VY9=w(V)*JlzR_wYIgo8< z*ah77QWl=Ac9{9GmBYYNF~*w|%qKNO+-s@PVsO`+vKd>&5+kM`+_#`;33|}I@?Ax% z-G01_4&|BfMdz&YIX1!u^1YS2ub-{3UkLbWS5@t`HPzp}X`g)a_lHItIwPU zM1L;KJUhfK;D&0M#ydBrNl@cDSht+^joGyn806k(#ZgvLyBa@Tm`|`p{Yc)(`PJS) zb(_K7ghrP-v=Ylc0)x^&;A#+%L^Q^WsZwuKq7n2&n%zlIHJ|=!*d-4|w7OD}r+`C> zODZO#sytz)49ruv30p5GH`|&ATOs?? zW>^OLzwP(qOvweky6C;rGiA){t`i1sPRz}WP}qm75K^3aty?U5 zk#xOjrP%8$;t~Ah!f&clSkahvZ3-p_AGSJze0v)eSz2_TGxb%exg76S;=ZV3gZ!WA z5!z0)byH_xCqZRcmQQTAGC(gwyLo~f<`d9n@axjo#;E#s*BPG}6@s8&gBnaA&tlEl z^@{SBH}#3pcg%XmaKd;SjBCO;DA?~DhH!+S77E1_RSGmOmrM0w`1~+oXRswPTo*e= z=WDA7%IKtRx*Es3UoH1qM~B~=DfvNPbCkjJG@P|~dB&*HmRIv1Ab z)HhC3!KsMB_YJD2Xkv0%k7%A`)TDYUd1{aaWAG2&#lKG0C<@@YF|Y~p)-q!ze5cmR z>RzZZdYSpeSYbg5Gd|#{C}{~a`UHa`719C@`d*MB(sWhA%Up-itSAB3p@fi_V~Pi| zqd}}3y)K3RSi`D%zkot0c<1eZYF|<6(E6(L3^3`VH-9ZQo(%5pZ(U2@9vsI=V-4{u zmH(oG!NK*8^%^bt+NOghEH{{0c-l|c9^k(k+Bl6|^wOXiK5sh51Kn%MB>Gg<1n1Ji zT3$OET21iMIM|0%7gg)R621K49>ka1Ps<|yDDmjldUd$B+5qNO@R%`tx&D0Zk-;xG zdqQzW0ot`|C?#8&Zr`-g=qT1-dTj_&ySJ|NmhlI&D|;C`{?e!XAPlG5yO|ue>~yM= zlNtXCMAZB0?yWj0&X9;itc8rw!tC=U*M^G+txpt~o9!GIx4zU|&dHEbK!O!D#3+0_ z?)xg(N6x(bECKKgzB?z)7f397{!w@(afDHM+})x$@m#ItY7ypb5^HSkJsj=RMLI^W zr^IWip)=T>>oiSVpHh|W?`u)v>n5!YI-8aCF$Y7t2W6N7D2fdam@j{R~7jgIDaCSF5#P(xtk z>YQ?I+X&)K;dU*#IEHVUYAv}!XLb1z=Im>}Lss49si8ba>U!ZGvd6=+?zdq2H;$;} zGyjzjgg9#9Da$X`)3y}ierf3z#M#KE9K`k;1964=TUz&Q`ZkXi2PcEf#wAif()M!} z^_AUIsybkx)Dr`oEvdF5DU@|zJPqV=F?U#%K@o;UMtgVp{nh#;LI;aS7myK*-Pl0- zQI?~Q!?$|ny^d~biskML-S$HeD2nR`oUdO$9-7UaTPeGB9WjvbV&9$zvC`{RD=19l zvW3#C1?+O`Wn0rAV`-jjt-!vu3UCBU65?5*Bm*dhyF`aU7FIkt8lPn}lZ7X~ebN(^ zcGPWFmp_uvdLmI~M(QcCjWqa^Q#e|Su zVo`)u8l(B+=}cf^qf|D!!Il%|hpST~M`NSg^enHw4Daj7>FeWZB!MY;d|awvhmlk+ zxflf%R1qP6!?AsrKdtuE59Rh45gHC`fMH2a<44tMK`RNl6{os%P}9*7&|;4m7=2*4-?6YaieZG_?tK0duU-Oillvlbf7{O zAv`WIYGw>(GBp*L@YZ`5nD0Lpsq6DX^HNbV9uUZy$||D#WUHMIs7GuK(9{r1PCq|) z46&+R#*%cc&aG_DpGvdhg|Xy}q7_g`Z4;X*j>ht@Oy6@p90XkL~E}*tkb~6=C@n z+m6wN{DJNm0teG?EV{apJs}6hB7#Lzg=ENmPmBI{1tPln>{G!a`EutpC9QB+OH4i?B}}) zhFG`D564cXJJwlKvCR<4vt4TMUyeTyRY@pF_1-uEk)NE<=}~x(+4l)7>fGaa|8ylV zJTi9*0qP(rcba~5>3yay`v9mB7wbjHAE)TZs~|UJHZfAhY>rUgo8T^QMQ(xC(r6JM z3s~DD#&F!QaFzS3(`}qKC?9zU}FME=JJ+{dqp4+stHZ z^y8WKW!Br#=|0}8n~-o1{^%YXr(B%O=112hU4+9fNY8gim+BvQuhWNGy)#mcOLn$R zqV`|sMD4XP$DH6Q_`N8&Z}bT&69u0gfvtvs|NH9NjnB>U?#Hf`q<{n(h2WnCyo%{= z`Ob%=L~w)F4b9y9HLd-4gF9!FlBdh&_$p?@E~13r`g_6e=~8I|240{JIIN#T4=sX( z2F!MyrJSB*c2%@81`hJM8uUSizfG;&(Nb{&ch@28KswYTZ^!|8PI`sgleWj3KM>r2 z)367~to+D<74n;<&CW+Z(q6E45(S!e^ZVVL6j*;H)xeQoGhRf>9TFzc5c@!L zM)QPj6q00Wl&!;*YKy|zY`LqCzP+A$n&EI6JfaB_@r5YkTdt0UZ?TBp&G4d__u_l` zE*6J2=+cPeg$FAvO!RC;*%KE)aq`_G1!!v*a=c-HFmhhw10kF2w}3Zj!H0j>UwZpi+4*CoKXEmlc;}xh ztH6*}|&9ibjw1SKau}j}u!X(<8CUgL=<|d8gGqdwHE+2ZTXf-~gRk`G&NOQjU+<%XDaITF06)5cgC{O<* zIOXXoxe@Rnb)V^+C*v<8iJ`q8PibSQu-BN&(|3)To%=R+-40yP4@vVr* zw2u9axuxA2JF>W8_4;}15!$bS6V-k31vs!1)pEzaotUD1wagqnX{hdAvVD9wwXWglmhDM0mZn zXAm28Bj(K(ZNl@tbV_o3Wvbz>>GYpxz|-?@qV52X$K6x-&8pQqvPvfnhV+~;vIz?a z7`X&|dp)VM{IdC91plHdN_k9W0c*XA@3I)C=5h+yDVSWZ0hP_Ve|p&&L?v%LoAo~D zrJr(NCM>u?Ndgow?jr4;JaT&_>Y59T%f~87k_^=-Omaiu_E0Xa!cG)?;j8G0sRQdv zR0nt}WV&dhXH6c4VdWYNyGl<20mM_oPlt_dB8i9H1VTX8BOeY0EuJP00O=>=E<7;b zxTQ;0Zfju=+dCBH17ogAoZI$%CwEM?-{NqLZ9|lY9`$lFHwup?Fdd%-wni_#?1Huc z_n}4jQeQpcgiI)KT_16MNR`;PMnoR6>%*!IKPZocqXuqI&z8Gv#=3~xB+rJsmNtqd z!T5tS4R^N&Mp;cNGSm(WSdgi&Zqt>UR@DnT0_b*6A<=+q6RKynX{aWM-*9DBl#h9! zSNX~?vsl%&q6oEsOXQ&{(phbBzWDZ=7L0LQCM+BYc*iE#pNP`|?JV9fblTyu<2$(F z91vvB*>GAmCY7_V&K)gOsLC3{?JUnB+&49%rK~(2Q^GQrC}n6suo4R4aw9@J(!i^P zxi^Fa6w!r13@E6JL5!u6h_;1;=V!;m_g`TL@WtML?}b0h#vTe$a^;sZ38`LY zJN{+_3~pM7o%oq775!9}PW07NItJJG5>6GTy&a3tbE<$g$~ZP1x)aq@0|TlmpN zke=kxqAO0_ddw~h5Rp}zr|SlH$rJP~>0TzSxEIpMlwY8l^ttTIar1a=BTebylsVZG zetT3O{6yLO&OFoeiK0n9vL$e#u&*b12rt34AG>nfTt%w$Mz@0TLhrJKJq_E~CJ~P@ zyi~W>!}AWIYie|Lh$fKKnklxrr@27Jf-*|XO(jURz-u^AeqSU8fgBXEht-^jz`{=mbWrjTauZV#jyl$Ty>SSV3{Ttn zS)4nFv#DX=LSD7-S`?U|+!F%2Wt@=1H!sPF(knvMC&dfAYCy8R}ftD+_vJ` z_bJ;#@sC0QENmQ%6ZTcxU*tOG-4ZU0vjP02?@>>?->djAwL|J8M;eCfJz4GU%rleO zU??j7jny$a{drVYqO#Fj#+#$%M6;JmHMb^ur5n%1+tlM^4PyrZc-w2*EI zNZar#Mk)&+W5wRrT=l>GS9kh8hRFAd;M(2dKh{nSyi_y@9j)r1W}j^A4Dq&ljtq3!W_{A@h=n zFjEIvY}T>~50O&gbO|<(#Nmx3eT@uWU9UU`McL%BNPUV-MoO?A=Kt9QZ2!A!Pvx9> z6^&x_^&Zu3Q{;ELz9IYHWAnI~xff@x`dL4DJy8;kiNLeZ)TQ@AhV_a}iEphv237g`&q|4jitNBQa0L%^W@(I2UkchpisQ zFV{`=hPG!w%{AN{?T3mPjWiemDBa!b+?@+3>6;yM?o%=z!umX{?8TICS2Ct+ds0rW zHxCdJk)wSEE_IfeX3w#)GXS|cOsg>Ns9BA<{{%iWk}?!)i3wu-&5#ogEln81w~>W1 z=azhexAIm?uQboF;Q9ksH1l%e9|l;a;f(CRO)kft*9YOq+(`FUawbxNO)eVbh{=(( zxJDF&U=F{wK5MMI_uj%pTz;~J+%XZf<_z^bpA%TN0UP3H7ct~|MI;|kxo-S-{M`Nf>$eqG+d;R1sNbBQJF!xN0o4qXSzdZ`wiv$OHxokct-}COyP4 zCW$hq44UZ`AWoD`;a=ssNK;?(((uJkP&6^BRYv346!}^frRu`0rWk2C`OLnFiLcUl zZAg8CW3L^gBr?Sw%F^l6YYO|N443fz+o~g*_-SE_14@@AJ&x7kj}1~<4Ut^pXOi{x zfBi0Xy5a1L%G45#KqhCSiF&zYyL4eBum1kl%2YP56PD9^WY>{D)B*c7*UVQ3{O)%G zteo&|*v~ALFcZyl5Zx9xPrZ6qo-Mxs-1p1sw3hAj(eb5dRXRpSLJ72G*NQhz?X`u? zA^CHC@mYsIg3}PWy10xCg=AFkw#T-dztR2@4!TioXtmA_0;%k9FTY<|-S9X@`bCh- z!QLTV?xB0WGDmR}T$b{)jqu*izH1#{aH7KKG~^Yppw@p{61#-JsOvc$>qoj%mn_InrOlF42m+lhVXb3P~9InPESiaU4&so21e3tBmK;)WaJC&c;? z9ImX68BYf{3M!Syd!h?0J;AG{(rPUnlwao1$E4DqYUrE)&h65dbEZ3IP5bvRRCDvZ zPeG&&512?R$EQ)>h)Q9k^F{Q?UP?Q$*4ASb)G{cPP`dbrqt>x5i=A&h+td@V=>@xK z$S|FnV?KMj9L3S*o2%!2SE^}wE=~_s zBeWfxRY9o;$YRl481tG!~D$ag(phYE-wxyKPM4Y10hWKV=vu)#8=k5kMKLnDA0jy>p3os zOg8S_iz8yHSzKGXbtC%Kg$G`W8)IyD{!^BB5a&EW$lNofufJALPwe~G83@e~@B=N^ zQT|2j);r%u+2cDW1vG^ds-&b=VWYq*aL4#S7*CFz+RCXUM5x@106RtBEN+_mxH8$& zV?s3yUuJ-N!md5mRXZ`7rOdv>^^1Fx?+huJOQCGJb(8Og{@m;e)>o+o;rAIlXce+| zyCX{x=Vx*Oik@kX4GYyV{!N^}K3$P+Gh9*Dbzm8^{h_-dcD>N~=T$YvtC8Ukz{$7_ zb!>sZY>64A%COPBDPLfgzq$UsXS~H__u}q9l9lteOpXVmij&36q5*r(!5`%pJz=r= zBl!>F>#fa4{*z)EW?k2(!_U}-ba{jP}L2Vq0QPw ze3||XOzv&>$;~gBK(*wtoEPKVtAO#vP{UCVG!dVIQlLr6I6SApcRfQNSa0%IF|O>p zfc*M{5?MU;OG0$R%bHL6J_>mIdj23SKr8#1<{)(Fse_ocS{vohs6fSVHe9;o!7XB- zpEx;MHKP*I%+~~WY(K5Sf+UW&c%xGyBNV|{>C}V3lC~JBBK6OB*|gIB@@z+7@6v>a zmMzjFPT3B>yBa#t7?@r%y*5UM%IPL(-B?Xnx&yi8T$VpG)sAe=nR#txehelW(Y8d* zzE&&TY_b_P|89KCLJ<2V{R7}IBXZKAoHYC9=(}^;Kd~kIRY#XEW0r41etb_%*q`3{ zAp{P{-?LZ%>KVV_p)pgIgy@mE`2O#eI6F^9Uo8|pFs1L{1d_)1tTCzY3#hmwn+V7W zpbLR;bSP)uU8&10@{&UvWluS-j1rD^{P+3l7lA*rv|8`ZJ>O!(O4;oHxO09!c^(&v zJYMm=5rHv=9&MWLOwZR+BP?!QFI}$PLaWbdlV7$Nemi!&D zpDuIt#c^=_$gyen8Tuhaf6yjPcSmIl{9KxvR3VX#$@zLA-zf58O!evC%VcdMn; z)^B!ns>S93-_$p8@S(o@+`jv&3sVOQF%&TM8W-M)#vqX*t)K(-1OL!f_KJtXtvB!u zp|rJ!p@m6HIY|fRzblPV29EPSuZBPbBluKgBYmR(2r9JS4JV~dLBRcakY<6P%QrA# z54@1i2NhNw*Hu7K&+UPtMv}}+eX(yym?4&OOd-Cl@#drAr1!?_5U-JuxPWVgy5FLN znc9z;o6_~c!HrYss>mynSf#MncZ=V~)%9xziSE1fpW!u(M|ePLj3=0cbXz#BgK0Ke z3yGVqn(sta$13H(9b#d8CD4R5Z>KSK0pnPvYCpa~#nP(MGL!#+f0SSqw^zImrBTu3 z(p;QBEKyrbSkpJmz5RM<%j4w8bDuj&e!cAMU+TX;VaVLLws_kgN~#Uy_jh^sf6MYc zsB=D?-`w1szUAMIeJ@5%xtB%6;GJiL0;oqRzDo(*qNo!%3DmvJ)b`*zG8W2ocg&vPy|oqj3Cs+m6PpMSIaNukqb58)ejwVMDn=O{N1igu*uZGXMqVx3&k&*mRSRc~-bL;$bv=%exHqk? zpR8PhgD3fOl$Jf(aMy)be-p9BNEi@8TO^*!X^eFd(lJm;%>P|}l_S-OJ416+eJY4> zFH|dFzk%1>ytekTgokng3>!dNpOWOf$FpsHUl((0aU2~h8B$)w56tayC`b(SyZhs_ z-1SnQrSjRAolxfVch7~x;m|1}MZ~V^>~84b9{JdzfUA7PYW`%XDDSRV$6%zEn5=tt z()Fz7U*x*J4&qrxfFSPkto_Z-Zaq* zBJkE8qHT3prU<%dk%TOzAU#7B)tf{LRvde#M>wl0Ew z)g*&&B{rs41_Rjt^`$Qb=%>H;lJ1M~le7&&iQrt`H<*Z#mD%XD-9l1C8=}n1MlPRF z0MIl9NVLF8R4LmU=GIS!j9iFH7gDuDXrW|JDh!Xv|^XxzWAc ztPqk4)n08T=h${*nxVxqsrljR{pw_l7ij+#s&zie0tjUD?3u=E4J-)wRr3E9Y1W~t z169RtZdEY*`puk@d%1O-=44dnr_lcg#&A_y?U6ppv3tydyqP}UP`RXp1vQL-S2~)5 z(?hOEk3;si#>D_DbK=PIQ6eg+rrh>D7>1kmi<{iC8nRvD-QHw(7kdO-EFL5mtI>7a zkn3*#;ZyguTx}9*#7sA?ns0Y5S_SbB&m=Pyf_<%&p6OD@CLNP+v#@W8BqFCijk?Er z8`|b*g7(7GWmCs-PMhzC9&f*afI0%j+;#HkkbbfmtKG5iS|x1ZsJBuA-TFVL6OEOYVR?=|CMBOAcc+qHD%X zw0%T|$aOrB1WV;M5E|icf{L$RK#XzZ=}ld-GGzBmmD3@wz-pYqLemZ~9OO?-A9HEI zS(+Od;`z2RZ4$<$2z7y^EBv!}sJ{x#VwWM<&m$41ceoAqJw=Ql+yN^z5-Y2Nh%B|& z-pTW91Ujd#2nLBOb8rnDcu}Mx=3NN3l>Z#|n@}5|w zBY6Ks`TykBEP%38{vU_ZPYrY|i zm476ldW%>7pQT&K5tK^9(J{1&nbUp95wyyG+}RKsHnteV7!3Gg$$naNR{85#jHe=t z12#BgG{I;oHn{xf4cQQx{~0u&tT9iqyU*nC`R5<9Avj94UOHFGzJi(KL0s?QP~Mg+G95QWPmraqxFd|?q-pFA#}2zbt9N_F_97>BC;mZ zvHue1&sY;X7TCI*zTqoZ?}VF@Mvaez1uisCUE0B5cs(IMQ?k=!E0tbptWBW*wI!Up(e7o}&H65tOgxhph z_kD3K+_GFw|4#sr?1)g0UOMwC8dQxYh_vGpxX0i6_-tzR+Hy8IqLElZ_W#Iw=P2J| zrd_aY>$Gj1wr$(C?bG_TZQHhO+qTWqKCRpD`^}xXGqdtfQY*W%vy;76Ri&OMkti*L z8Ge~4s&xoGVj5}1+cg1K+K4s^Hp6TqYq+zSyJ?Ho7z}uGQTJXr4#Z2+B32Zb%rC&5 z;MPW8f_OpWAmWzd%4>^mx&qkwX>FUUd=5=~4rxV&x+pO-P@w>Ds4haJ^6m6=%(0^x zmnobBAdQdKzs#R6h|+&RYgF=sWh~O&Xk@?1+-b@)_xFJgH`sV1C3~(twP-hq=F>De zN5UTsK_d2Lu?zNHuuRZNknx}IQxq=R^3%U_v{50VA_l3K_W<)&nZKo>AtW`V*u=Uf zKBK2u&N{6t56%JAvLV!>=bp?M>c&ZTKwAI_bkb_iBZ6U2NP9*w!t3h@am)l$!6HW{ zpCH-`kv%5N2>}eWGJK;ag>mhfLb?jee#jJ8FZsp6jUYc5^;0IGJ#~B|j5ljgew} z6Lc_7RTF~YS9wLXK$~@G&@=|$oOM3fF*n_B83P+DT|_{+oH(pXID7wE)9G~xBynqM zf+^n6ACLx!b)s4G6n4{59|N!ozr{s1lCnRXW}qCEDoy{;PY$#bdWI;yM-cdkZty9Y zUQmvuxxjQ%Am7+%P8TVxa1V&E(5i+HIcH8oxzvSE$b#Pm7qZc$42|5)(n&r}zpA)c zg#|qrU6lZa1bseD=c$4}-je<|V{3N&6L(=1Fz8bZAc4Of>aVYA4o@%RnFTIPaHDE77;QR7zQZo$9FYH>NttR>zSw<1$-AoDix@x z#4p8#;{Z0grP`D~rQx^Wj*i|8?R8$p66Lrazu^1^|&8GkOWxu3V#=mJ` z{<;HbfRd8wsiTi$c!|ngI+=UL-QMW=fi^z-a!?egY8MlVn2|``$<7iZp*_<$$)&%l zbNz`9x4}Lsw(SxKZ%&0apd0XN387JsvX@z|z>)=syFQfh8bd&<%RN$0m$VF(N6$Ci zha66BuB*-8%&Ym@<>fhq_ClFvYQkl1~loSH?(CL+y*+KUbm zzBN<3<7q3eu|?*OyxnaJ+U*%~(iJn3b47c8D-@KFO-9M;<&t_=5TTindJ>Ep_J>sz zI)&S&8ZoCcC*+nz(I+c~$FHZ=dB6JSuU4tv60O<#uCoDV)?Ghb1{o6>@68&v^wb#<_XL8q z6SrfV6x9TUtZ6;$f&*-%9aCI6C{xX1?L#a)rWyg;e7*6;J7SLGrPmE;RhwR6t!XSW ziPt@af1hI>2Mj2s<2qDD2bK46C&B{k+NZ@ER<8c4_z0PqUk@y2Jy+S3GMWM;4?()H zs=A`D)`wZ;?2GMCRJ#`fQmUxklkuxH;Yfl~O8Y%o2!?!%J`-Tnnb3_vDyzP$s#Im& z;2GlGPWf_L#aV?IE7;p6xhSHCIaRAG^ruVNJ-wr6$cTQ9Oumc6jA|s?=#NXusi{Y#@_YxiA z^f7E1WAIJ~M-o6HZH?P{q~|^oMkt^2QXYvVHreDyX+P*c>S;))Y0Pvow7B*H5dm`Q zkujU;wRxcW_1a3ro1`JZc+{OR!fn|g<9R>2M8CZ5QCC?d$=Qsx7*Rk(Ey*TU?#ts3 zNZ1!{o7V`=_!e`h=l$*v7Jn1nEr)7!^{6D&+CCCJ75j|MHG3lIpy=#&krJ5S4u3Ql}+iTpV!G6GOem%$MKuzqsMcEjF>t3bwzvFPvH6+_ z)2QYj42+JCCQR9y=MI3Yhj>Vo(3JUrSAc4A+a-%PotVdBy!4@NGJ7HEB&bakw3Ot0 zsEpy!CdXQr;pN{|Xio%;+R))$f+`NVOEs6m45ULAZjDDM z#G#r|1r6&wqf{Y-Hg3g@vS9p?h)I^o^+CgKUfdjH8=K`@`gi~^oi71cd*>lJuMkH! zGr|Y~bl9&^qo&Ct2;(=MmA$T9Ba@;h1stsQJV8*bEpPfSaY;RlIuB@vFuU5O7*RX= z6v2eN*EHpS%0Wi^E|kjO|7=TpUsIMs8QMtNwktuWC<}mz z%c}rOGF(jbY=}GptO_Au{$osmFta5xu2LW{G5$Ys!=Gcz|0a?SYxl?Cwjy`Ws^6vQ zcxtGcphH7J*w8qEkoxT{6UF2WYT<(k1>qU9f+Y3IFUu@Py&L3FUE>p;VSu zEl0sL2o(uZ3k;9YfG0Dm%Se#WaP*X25-fLVC znJ*QVa1d4Q(ts^GYs3l@0p*$B6)yT4tqJ5J_&K`rih~_+$!{skPR+}R8RTR*M^XO+ z`~_$nfjMHPq zLGgh;BT*}zhn%aL8JLC0X-)+abr|J}!A>x6{fAIje_C6)C!v_>hF@lpwr*Wc zeOyv-rrM}a4a_xZZxm;N#AL0D?31J^nY^-jGaR}7H4Omp7JatL%a1PFec!#EF1~%; z66Aa}ZUWrBzmD%d*e7hBJJ;%kD1uh7Fx=BDX861f(#Q}_j~HNM4?#p(3pe>H%|cxCip+nCbZ1L ze5C$@2WQlLCeo0sIoA|f5;Pc7&5Y_;fQn0*3*A818CyrV0$xEJs?eUO>;MlReH{Iq zbZa#g*o4nK>mQPQ;6z#|!*NeUROn!#=+vm|3Wamqd0hYr5q4f2>R+UcQ3|kyY89Vh z*}RpcT`@jWKfW0XVhiltIdOKSpiCZODMYrv<)Dv_e7Y%mmm+-mv37+?01~7JKtLvB z6eQG9kWql_Au336qz!tLTR$N=%BVRW zq5L>(_;m)zaIUOo z5$VWFhaZ7qy`OTWFgyw%RM;>hT(@KR?&vp;Ae2)+{j&=5T=4x)vFD?}_}rMH*i7+? z7D1IPVB+2Bq`BASORS&UZ0Zc@FaaNsWE48RGvefENl1 zOuyUYEQwr2;G8Rerq~#IzzvlIWl}4SFTSG^UeEyN%+D5Vb_IYK^>;7dJcKn~5C(0f zSOFT@qZKHJ%%1I6us7Tqe-u;(&Z*{G{%mtAwQsX3!4_>Fd`BI;AfuG&9|h>l|Jb$R zySC3B!XADU6w_mw5a%m|t%O4+U9;tiXQ@NxTf_Zlv+r|V18vwm{26j|y=$izZhQ^m ztDE5hY6Wswj@ibA8F6uALshzeM;BT zEZcbP#ig?Z{5|j6B_4JW4Qs2aI2laG!+gE}Y!{opzh3WOKkhCM--Qb%QELh0O9vm6 zo&0*eIX~|lJbCa?vS{4i)kjMg+e>S&E``fd-Di1%M=xVm z@oKsCdiNw}^a4`P$o^<{Rp~XP9+*BX-1q%og=c0cQ2u{6=I;OhW$b?J-n#{w6aT*@ z2eQXw3YODA&#~*kWBA@1M)H3u5r^obG%@OUwOo3xT^AmFIM*zHmHwx`e7|<@?He|W zc>hMk$3Ju$`ugGV((D692XFrtg|Jv4T<3b6j4XFBaMq#vl^gX1S*22L`Ct2kh4KGu ze=xGMr_OhPQUQiD1?{)kki>4^X*_Ix>&(E769JP5Y=GGM=Va^z;3q7F<^|&w&E$Xg z>{fAh?&OKB6N4d>BtU6-dln4I7wA+5p;=A)JM}k!-L&Wmr$iKoEMQJzB;lm+vP|b& z!6ad#CxakcsUHgnd6!YQ&@74aR*X}p3TRb1!7p{Ft^oR|jC(gglp7~_>!7Gx(Krr! zHz*xURm9$_q(V2q98AbKB`RK@)B+ros+I_qszd^h?8xXOn#r{g3n*(i=+6TZd}+co%>+r{6zk6s3o8-JRQaVQ zWUMX|Ed}|`lcjp|jd)BibFlw{rC_%ER4E_TYyiQ+x4H-sAymj*DF-TrpqlRiJN`X> zgF>7`c{J2TN=$+oBXWYo(S`S47;5jF7U zSfjb~5U!6v!{wyDTd*4jYTCj$S=V#^vO06XO?mJw%2j9jLB=DF0!)tLrHcvj+dDsx z0t`D9U^b8*8LIN(sn&l4^*v>Gk_&rc^EeW66wL+EGHzdevgy*iTU)p>y&q5eY`FS6 z+uQuOF|~Z%J{-2+k6$-0gZG*5vAx^A-q{XMCHk@axBwpC_Y66l(8Jl*Tl@iQT*o9U zylCUrO6F0Uin5`RD68Lt)3O{rFr&ACTR=PF=vPKtwQo=AeutlcOoHwP8Vx(f(9J27J4m0QhjUrur z^MppUj;%YAM=?w(DH&Ue#bJteDH8wbZ!Z2GwiRz7BGk!2jVW6(gL3>I<QbTqaG^s5`9F5f>BNz!(PO|j(@ABMVCN_`( zlwNSVP)8w;{}_u{U_YJx)eZw5&jh}TS`f$JmoG!(3NYRtNaq5s&IGbxWzNM2*-2OL zJC@%1Y8?fgTnKB}BATNG?80gXUB@33F@Wv;iF#&M-u(buNSbloLnFiwfM49%4GKxi{=hh@%jbt_64D z^#kj4Fs-;?+_Bv8XW(`sYWz3n(q#v6Vt<1aqI53?MJJfiTz$srBID)?fp9E%=<9hj5o zGRPGfLxdcp1`yqtFv3x`1wkAR^-p%)WYNrjWItGpv0Gsr|1BhvftJNpUPbHH*onN0 zH)l476drqy$@LiojF*JCNt>4CZia-)FXsynkB8^j&DWdhP*j9uaK?E@@37rqX26w$ ze0=UyqZA5D(YJ32hK|zA0G4@#DPp9TqRC$h=gQ||gi|)x42&*PXWU+b+W|-J=HZVc za3uB!VjmcDK^r$*fMPG~=rvk&aPHbXSQk|Wc=)=d2DrNVj_9GCQ*<(Y<20MILRyIf zMv&>~z4(GIhaKc$k)D~NV{l-MIl$r~AdSaj<|Rv(M%#I(i?UIx368YYDMhw_695dFKi34wdfUOGxUGTl;~f^&|1 z8oNPI^Dd%oQRbtympu6|xTpn}v^nr@vmf5v^5<3iOpB1rllI&BXdmc}k{$B%0HTUF z>)uhSxo^-1_NZ;%-XAWK#2`(iR6i+j^whjaV49ya9_ycT4vfzn{eJN>UFHN2`(-=y zddZBN*LlBE>q_$o;_fF z^QSwh&EA4J@OXtO%!}-3b{;a`4`eQVFV}}xm`=zgYH2Pu&d6pQCW@hsilj}M86awV za_8N2=TlH7@#_=?<8yM(*_#6D_f}=!{RbcsxL4 zoDM)wHu1bRZZE;uK+Tyno8uN>A;f~00uPHCWdf^7M`{a2>b?)L-+s-#Kc(p?Ak-aa zHvUDZX@nxK+OVI?rx+r`|9ZsvO#2AR?Z9Cs|G0Dhjy{!1C*(NjTey!l~x76)K6P|{CDxzuf6^BJ%^+x6^9d?+dks|``lpoBgy8A`Y0~zJr!r{7X zh(&GDAUqMG^h1KELjef{Dl-U=_YH(sI)~7{BL~jLSt!}~!9=C$JonpEmcK<* z({*EDGJbq;-U+X2rT;s9Uk1QElL6mc^X$qR0@a-w2EH7-x4H1XaFgmS7X$%T1Xz+> z4=FmHq}-RFekkhrjo_Z0q~^j5QXXx9hy}WX37Rvh&%#1Z?}>AQnS_Bj;mq)Ae?$9< zR^#)YK+_@+saJJsQ2%mXvf@>@vB0k_>InbN6=6ljG-U2|miVMF(%$CdZ#LilL2t80Y=j)K4HGfR3ODk)*> z(uuwD2Nw#r9U3GP_+KRH#IMs(gXf6l^nS4R?NCCHZlThf$NQi!r-3`*gND)>9-KZ4 z!yU++h6PBXYOJ3wJ6{0T#~O$W2#0@YyTsGp%mE`M0}lVfB2Mj)49>#phJ)+}CVlH!_+ zdasIlL9*r1csg!Wg)|AqW#*Zk1fAAgbMt7GcAbo1PFB=BzTE@f$Ads(=cijOjEP8j zJLC#c*xq6dVG9Lqs{N|voAicdQ{RwXEVo>)TNU3Ny|SCb{Y+;Amk*FOt@dfTd>$ zLDaiTE{|nTXRQN}{do!=fyu>_^b$LHiZbD+H{nnZSW;H6Bb|C>H%xXJSjiomKnpYQ zyX*Q-*L9qmW!PO=DiHFJeUPSs=dSeT3wFV)#UF5}6d{vD%7%|DtyN(R{dqqYj`S2o z(j>g}t})#$r?7LhNm*1aQ^t%j73U3Fuc=M)yEFb?!4v`bk6z>_jgU>4|KNAeRdN_w z&cL>M|2}~x4K_n)T0`5N&oXp~%R{8DhsfdmJfNq4yQ~8BkhFi0GpR6!8$G@)%<>3Q z))>jdE;oL+o=xY5{c7l4h;_~pA)^7iF$gaXmm)l$uwUdc95tN`gn`TYD^Tmk(?yJF ztf}~xvhxYxGTQ$Bg?zKR_si^i!G!DAM1eTLfr;d?N%(|?$5*0pQEx;g`=gmIIc_+V zV8wc6pY`s&5TUafBpX2OGiI07881QSliEL*Y?EaM1;GY}$+Mo$e6n3QQ0R6Scdkm$ zVwBnJR?A|04DFVrBPR34wI#$?rhve5eJO0y9q|#sDvZ3?sz$PdQuuZJ@jUKWLuryq zQ#kY~7>qaiR5O#o9s!^BZku4D`Y%an<uw?ASr19Y$YV7~NO;L^1tn{qFG9 zv@c3*0;|ioL;SOlTMZrBWeflPquO9AS_PBEu=p#gsI7ASPSTJb7 z+yV^sqv3bMF&v0NURoUxBdG|%JvXzo;cOw)#UhEt5y~*OY0m^+Z?=x+aJiTWKrw-A zt@R0`8Kt$wsUANWO80+;8AJ_sGX2XMVe>%!!uuu4@&aI=Jw!|^r>)mOPwvk}_Ito5 z352iTIW!OfCzkP;MdloQsk|+Ic(Rhvc(tV*s$t zvKV+})Zgf=lWAzji6Kv1c9L+!Om_UoLY*k8lQe(8nA353|HAZR*e-)C35?< z%I=5$lBVbZq4*$UrmrO9@yzE)9`%dssdP|m$_VL^fqfZ-(aH3K%e<6(o8C0 zSknv2Ir^nVT;rCY&)CfV<~5NKVwDe)4_4IR#?hNT9nn@*k!EU@Onx&CNqcvi50yL7 z=6Csn>M0YfnjzP}O85@JzT;a4QJ0|FX1Xt+_L&qlK_-a`zRiOGvH)=gMqjEy=~r3< zQ3S}Oj2r8^d-*3|8kR|IQ$zRRf=N~2=d}qYc=j0Ig&JWjg!E*-jR^40yT0io?{O(- zgj{lbDYd;>ac4sr?!{N>Ynb!0L94*a{oyS&tZqK9X;?mBj;r=;KK=@0j9^&4Ue4nK z^5p@7a85@f*2&uQNw1Z6(`S>U@CKPACj=mOh_y|W)XelBS@rQgzR?WQ##EruNxc}v z7m_4ZHkIC>4;c3H0X|L*m~zJ z5bLDh*AD^Kf8PTR(i7*{fUrlzHr6iP{Wx4RPF!RSsj?JjHaFS7A^g7L*Qd=aRsiJV z)H44g)qzgiS2~ZwHP7WkIHip~8FnPpw<*bvBMkabA+YV`xY(E7R`F(%#{D-Ejm&g2 zpL=uqw%q8x>V|e*>7(PHXz*UJ0qJjrM57Z>blf8u*Ha+QDyGC17Zs`#7*UOL2fyS~ z>65#_^LP7RHEVh@w0lN6B#5VSa39bOl7kt8X$pJ_0zGJrm|w8GpscwcI(Cb2rN>y< zLK+403#S-{xh%(cs>(0)%Y3P)`L@4` zj!_2-dpSi+yTpnXhzi`hS;M90^jH;HJu^;05vNe2}VdpB6x(3Iu{F z)>!uzCvQSvVqRAZX)l-*yT?|w^a3T&_S!4&Kw<=2ugTWJ8dOP{#&HZnrZg_yWi_PX zZ?>LUVa#z`v>dH&UHD0u6?7RUDIx!FgV;k!+xnhz~4+m=OoiQ=qDPuEE*hkf>;${h~$lZh>_4 zP5Z)}c7=Eo2)A%5mS(;Xw_U{~U6n%izK%9&Zcf08#YS{r}&)VVO==8*+~1y zNC=FPI<{Yq1i#>2n4GYF!FM$IVx1N4eVeL0#(z+vdu{N5Lk~y@M2i60>}-E0aAe=K zc$9)`Z=Id7gL8`y$4bh;Fa^hZsuAe25ix70M8R<=LOHuiY$Bx%tou)MGh-?`#2Uw~ zMs>{g5-4Gdolo4vVcBFM+Qs46Gx&G=bC9CSKZgKEOVZ^D9tNHf?^k+v18?Lyyc(yU z^VrFOaFv4RHDX?64E6#N-Ue4NOfTn5-mkyr(ompKeIe%F$A`g!N(k+Pw7Yz;6FdX5 z6|;K$8Cojc(qh$EFblMTx<(1SIL6Tuwz9?~fsexlsG0Swo4XbK2iX4+!Uu6v`J1+y z|KS&!*uX0b48bKoKEE;0P2R(x*)`Q~@V-_zIGRQ4Co>z+|4;;M3%hFBtIya^Y;`Ao z{OPbl_;^ux;hHVYB>NoHU3m{RIdEIG>+K00#fOLC4RZFKIlv`ufS>~rOV+*r6fw&g z^IF;tFAApfE2xsy`U_fgy)Nk58Z~8A)%Zo&P|2J{c18mB5Yj^$l`87I09QuD6tOTG zI+hF5t7D2!MErq_%*3@?1 zWW(@X{lTxYD(APM2<$GblO9fWxEd92ZnGRRp^-UKD^*CSx%qzL>qsb~nM&7hhKdk+ zcsTSRoG_adQ)H*aR#vQQ%&T@%(c+iT|Ms|EnB=qO*@AC~M0 zk8O3)4px<5Rg79(^HocomCbsDMIJhyWrE15Sl>YqeO*8h!2$W-CfY+$t%5*R?n?3O z>0E}jNdpiSB|J{p8vETH|A9`#+7Xe^Z$>HBDj^c~ffo(qt=wWb=SDrmtVM*^y1Nbj zA?}A@7;{JTPW#gt3MT-&KAkcEvV2IV_WD1 zxX}7+KgQ+!ND%h#;o0Fz8^t1K_V&q&Vx0EmJs-8Hh9QVFbqfH=G-V?S1EcgPvWVdU zL1TrCx-+QQyfKJi9t4Q=AffTTT{@Yxy@WAkSW+g-xbL70`A){j-M(w5$g8csmTRMK zrK)5vA~lFve$?Z=CMPusKhJ6k>Y!uZgoz3;WDmX3GB)4!EpMy_VN zGv5@C;FfGzKSv}s$P(9;sqg2h7xObNKiH`zybmC?c!SLna}p4t%VQncVK>) z*xK_Ee@tUgyNBpmCD(J*H9PJSq+h;#ZXrwbV#hlQn1EpTAK(FJlWx(Odly)GLx*1Fpxh|l6y(pYFa@dzN&V1G$_Ns zFCWl9;L_N#juS%P8c-*zmEt{w&i`l&HCo~3BNQ6~ZH)ZL^r(>IMLxDDLn+afBw~2u zJP3HX35__T4Y@fxn&|IM?G%m&f$wv33V6~y=c5VrR|+cU0;AT)KO5Xd zcj&Zk2{A8^x8R?o3}vZLU968AN2?H@UI8? z1D>_B(!x^3-=7EsHy@7jFJ|+pqVuXf)Se(wlH!0z=gyFJ_fR;2;;Eww%8ISI*g^*? zIO}!=4vjl*LYKLo$G);LV9#RYF=t)CuJjjn_7hh*!CWL2Mv8<;3!?o&WSqA7H2@^Y zqDPR

>Ne1|t}zqvy{o+*#Hx2?1(lDQG#c78tsfNcX+rOv7g{Dg4I+q*a3oP$VH z_Hw_>on9^YK+9)_W0slkBgpY&;Su{1z}O-1Ju5k}8@h%KwQ@h(_kboD44Zy0J~p2k z`T&p-EcnrF3i<`(kf`%;NrHVgrvM+Sh=Zf}WU^lNN9aSsyTux(Ur`D}#WuVb0-&Lk zd2<^IclY8d29-ezBl^EF3v%^Pmf*>0?lg#&C62lwKjbtQq8Zs-rQh`n9)z zdgAR7s>P#ux-78Y;n7{se$>t zVqmEqZX^(22`%Du_$U1>(9)T=8n@Q=IR?SK1ny8YlQQg|2*Z~01m9}C%E6hc9 z-MG*)_s4-rMv#f{bFNz{?pndO5e6% z1z!wH1}eQU&wK-Ww1FID{Fnr&z>NQ)zeWRL$D&&bl<^<}5hd6u_w&H`ipY*LuIV3mhnjU0=-|g*j6=ZgjVg8eNj+ ziKy>M^Jx+bWLg&Z_k@}*FRb8=K`!2yP8m7|2d>x^W{^yKM`k}ZAnK87+x%r z_&|?+$aG2YDH@O&kdcr}lOC9h1|&_kjge=z_dYw{r3Rhfx3a+bjALZZ4sXjw{JJNb z`ZIX$jeTO@_{IZA@u2i%hGE8%a zzzOE^#BguPn@RTe68cU$rCd0JS9pSijD11Vxdd8Pk*lM^>tK1S5at&ix5V~U8f zQlC+3arr&&W)+e$W;3c6_Qk_!<+S%|jBaEt3!*y?))KQ#M_ zHXiAlp~Y?{|b6L?YkKfyiMQRo?Yzy0CI0Fy|4&|uSUu8 zJ*wsbk*hL`^rnMd7A$N%*rCb4)=9H|E&So48aQUkREfBITMkBgyx!dP8c?$MA%RIe z8bm@>u*8;UBU%}zv`xGIt3;>$pm)TWMNqV{$Vza={7?=G$nXa^t_cF=2pvlaCqX|7 zW`S0F!6mDwh`}r4sqAdjx_m6_dW^oAsFq&pHe_Xwp8ca0+eLi;+ZC4)RU@dzbRY&o zU^jWDLxapBo;mNRGL#;#4b|+6eUw01%tfV(6gqKQ#yR~sc!p^k0m2*Gpg8KZB}S9t z)_~POl$YfTfH?xfvO+}bVy9M@Fd({HUo0#dzN|{ybM%`>``v@D@x&8 zM{|+tHyncLO}s%6{LSN`-w|n8EdPuc-eh2ZoBS7sm23dT94IYw_CKMf@ZQU+Md^Q8 z$lyM1A1=pFAubd!2wC`Tfg1%Gl%wyS`NkqJ+b`vTFaz)anE=G-KVds%S;%WJK^r9O za?isATS;50IK4c0!7>k;xif3@iP@8FttHqiHm6MUdLxfj6i&EE@Ie>nwfW-l4p~g# zHlQOTxGAI+LMM(|+=|&2+dQNC!hzb;)mJNC_?Gg%5&pts{l-Q0KS(Sh|jia^GoBBVH;s{He_+Qm>`2 zaiiYD%Or!oUCnQu^;Ow^lu{1;aa+TB4&BpDwoo|=xi!l4U2o}}pm_F7(`3w&oF#`- z-CSjK;X&0+j8ThBrZ32=y7!m=rWvua|0m4|k&*rXNONXnOwDij@oqEaV{zC~hHw9& z@sR(DQ2o&MLnaJgT?fMH8+)w_-yifKrj24HH5P-&vhS_!h+Lr5q?i(j76TeIk-j>p z)&DiV%Bw;*53Vlllmun!wuNcx7+z>i)fR<8r=~9CSUqKHRUTs`UB)7wPD6cAwp3Tn z%3&3RnT#tbmN^j_bmW?rvEX(Vi0#80@BNVGf2U|R!t~Ys99UdmMRn~Th zPi}~hRK696R=y2GpXa6?9~KMSYKTlgZr@jO;G#xfE$VJPQCh0BIZ!%jDo4?wZY!Za zQX*+Wc9Uc}kZ|FII*@QmCxIgC$bO>d%~Swe zb@&2X6&9H@QLnQ?Sdn<+`ENkUJe+d?K~i%7gVq#Kxnduo7`_ zjtdr=QIJ_?9sop!?b-;4H-3?@3sGW2jU#j1m57>%he7WW!vrrixs&RTAw!AwPLBnL zOy>E~sG%%nv;u%T4%1NvnNBP0V&tBEARE>KPP zpl;w41tC!$wWo25_~ZXtGbvYA1p1ODu_=gH|1buXL@fUZLHFG*w>DXNE3OB#rOLKLJb6rzl^~68E4&PtwtI9Wh zy*vPIy>AX)th#fnaB^Z$C`J&F?NQ_VlVgf8KMqA&TA) z?Ev0=R}A^(Ziu0=FYcY8mIG;g{|sLyJ2&kSa<_`y=F=50VS2i{N87pjr>{$Jp8WJ& z!2!w`x_u`~Ck+rZ<5De5TIp3&Y8W(hdd(io2dt5+w0eym)Bo>Ejs{P?htd7eLHICg zBn5^%?T;Y+@En9S)r3qNt6E0Qj3zR9dBUuCm?TmhBbF9llV{T3?5z-XK}Uo^rWSOl5q?NSzLV@0^1Hm!o9a zp@Yl6`%V*gBJU76Lku>Ic`>U=GrXjBZh#NykW{X(LBg1$s}I|j1Gn)v=DYR2iz_yd zFh?nZPCX(K!u}BW5@VK~;mW}I#S&1Ihgzv90V(``5jbFp5m&BnzYSYXog%;LtxC?+ zB`MV5FUSQZ0`uEXkeDv3My`r4S^UDJIouVhlr}GB-(eyRaAC!viwAe-eeXfY7yajN zOP}YCqufPRkh5pS&_UdVCY~K11y+B2-H`Kf)F7jW4{IHU9H0U1AwU?|2+pvuY4hr0veDrs@`yy6>n6ZuC?ddeWXUZi|16cY^1E@M<)YZ`x|4Uq!LU`equ#?%DZ(JaHxex=}iqsT5=HjC+EiIcWY#1(gBQFT6=l;&qujao-a z&ttLPst+0B;Az&-X67 zSy5aSg_Rl2E-9UnV$scnTXfZ{Fna4c?Z7;MtvU!<_||HMky0nq_2^CGzipvc zNRddz8pdZ-Cps?}`f6EIksSOXGxi|ZaFl!dtAe{dq-J4)x_O(?U=RSi3>XFi)%vrI zXD`2f#CE&bv35lM7M{74VGCp3LUkpTnPVWryRSE@!%H@WEFtKRfSjUcVq(~SP%xS0 z*l3wCMs_Zu=e<{v*&7e{Ry$xJx1Q1-|JZ3Up{!h^_rep)0v~ln5TV7eh$g`|#{yeG zYzmPA2BWhnNQTLP}=d=g)Bw~6oWl~-JoK=mcNXtUGe8E^J5 zvqDk4-o+Ajos8abqo*R%%X*He!GI^uBYfG&a#^bu7sK)w&PO&gKt_}DylHCu645)Y zaCLW4Bs*ttZYRoNTD0I_(xbZYeBwf1GgQ&MXd#ck80t0~TWr*LWC?(W9I)GD@?0F# z6g1P*EFL-Z4HVUEIP_mXnJLv@>c>xJW>4*}1)~BKYiRyN&yoHcJ?Dg11d3#~=QLTx z8nr_!_Hkgs8!0fIK9eA$76sv7O%ip3% z1+k7JQnX2ss-FpW+va%VdSlM*5!E1#3xM`imrB04x?EJo#zPxOIdpU08Py&%QxrO&Xf%10p2wi%oYjE(vNiUJzGs0(#g%%6B3Gt!BY7;FD{^HC&$Lg>V`?SSOti8vSC&&MitAw{PLX>$#u%J;NcbA6-LVGc!1` zxqm4?{V=?|-VDfa?`Lp7IqY@n0j$ef7KNahf>m9t#zFYhg%DpE)SbBy(~*q?E$QxV z+fGoQJeyOWugaA4RyYODPK_H-2`el4Gn;*zlG71X3tAL3uPZv9JTy7vn*yDe9#;)G zNK=!d%!8m#mHpfau5D+x+Gr2&GYmr3Oqeps+tA;K3!k(QFF++&1SO`_1PE1@(9}jo z{JVkzQDQh>eNWt>9UBFVosXUV=dC+SoQ3fSpzo3-C7XgDy7SgS?u69c+z z_|w)r$~2pV2W@~fEQ;B%4uC@(`g#-Ack6^rubVPy=?a+h0uu7)Egm}W7xYtxD^Ag< zO;8}ih9%orA_vtbF#K(8$0BRLm(PACCq9R#^g^|@qo$p@VL@{7T~HZaC}U(kBnd>@ zR#i~>jSyCXy^rntcYD>7K+5$5xRlbK%GhGmSt>JlMBRgk&p2Y5=5(J8%?#Y>*^nNPr|`5IbxJn}TfjOipnoBj@KFflf#4 z=DH*TwSiO^Q!Zc`(>(d2N|?&@MGGHILZSNjaR!-zbxsV4L4~!)IR>5aH>Lv0$@3J? z+_+W2y%UdNm?q}M6p%543BKR6Nsx1*1Q~?=mh(ePSl=9wLKW?&Ky!uomyvKtQ-KK` zl;{G;10QOhf+#n1U?ee-+A{|CL|rWYJzigs@o2U0e{uCr;hA(@7-nqSw(WGxj%~YR z`;Beewr!i;v2B}^?;l(_{RCVvQ_5(WeM#o>P$4jIACEG3zJB>#NU46i)GdSf~ zNdyBxYWt=@_8p2dlcdoQ$_#?|xa8C%n)^(pP{sX#&t8_9MWdeTQT9IStCOZBoI(e! z_&tqTKoc_zw`iuT4rq*9_U`-c2_Hw6ksTLDxp5&qt%) zY)S#1UftK20U{H%BWH8M!;Zm0-tCS_dN}-!q zGNKSvAZtB2vf%XTFcB{NlW6rYZ!2q;$(T%SR71ms7VVV35{AG?>D*?P_R?Y$o`HIHvdQ#D3O0>zuE)EdyoAJ3g; zI*|#kl|Vkt9M7Yn%fAMg!6z=G>HM)>*I9x>=TsFu;GjLm-d1|l@vaL5%M#I4al$jD z=aV936p~~`xE5mCv8a}9gnmvBcP351?bhKB_!~1Q2g2U>bBAw@{uuYrlQL!F@Sdpy zZ`PKU)`_^Aga%*J2QIwxk%$8KbS4BtB0F?ammoEQ9Ni@kHLw9sBIbh&pe~WRjho`; zIL)Cx>(0Ox;(-$$3OMN8$e# zidUq;43*e~AY=e14f8#|c<00&Jm5)g2w^FUmL)2iTIo^E%P=?HKPQZ=o4*zP!xN4-e>(v_jh-`3C$XD&v#AE^lh}gp z&&?K-KXvllL{R{ld0z&y-3V-oH3{Ww(Vx82K(EVMNH~A8v(wrhxYyKsa;T3_p4U3E zBuU8lfYIlqfxTn4k~Tf<)^~T)NTtniCO@zhLBc$esfu$^$(u)_Mtl*HNwIgsVtn2j zeRGT_8g~JoJSIY7^7>FP&w^C!CvBCz4CXS5Cr<(4pqK!*B9sYvu+araDOqVWqsh?r?;<3Dvr@TpFcUS(bPR~L;8>1?1-IdA-bA& zp}qpYF!y1dIr88TAAf_>LLVi3w+4VCuwWsRg{}gGMiq%2hYv*M4e2EidNT6`LIVgP znK?w@l|g9Ra1~9HBjA**jU2c8ZJq=DD3>CA5p=qPa$wUOPFf$>@Afvv!v=(fW0km! zji3~SC5?~Rj?%tQa@wtV@=wQgN=gfpU1JXoHwlHka$QgFzp@oCS@%A@oq4&X(hOw$z;buxG+oCn}Y7 zvzMS^a(LcJBq^3)sx4>sK>`%{&*(X8^H7OR0xdggD@vkvn>rH3s5!-gPb2|#_`hoo z=m6@UJo-xOC2{6di0>&44rBr4qWPqwx_%&0U9qI*+YEWy!@`B*Z!GVB0$;^@I#gL1%El*)PW;|FTxM4rc z)(*hY-ND<`{aqvA?BESVE%N(rguZLUWo4e%ih4WMQK%W<#+Yye^Bc-^Hy*YXW=l@@ ze83jtg>j%f1#2tv(d z)Cre#1>l$Za0Hf3M>wlnYWgx%s$wIkZtAD#1M>7c_%aiaE)lkN5<*-D-0uo9SaOQyc$>E%>g8-dS+=_s` zJh*yDTecZszbSoz*M2s;hrb~C@ z0Lfl9wfq5K1*CQw(W3kfX?D&S2@ReE4~nqfb?D@nM%P-$9oQ zO2KgBue*nSMN9=E3?&dPgqJc1#NA53f$bfE0@fAOJM@!O13!5=6B#si2w5XLj!j9u zy~Ua*w`Hn}$sm}$9gmku5ptCMXH~fy6iN|9f*Wg{qcqm#=qn4!oxmB0=(@6F`USK5<+$MH?@|F01^(a#zTgpDb+pAZZcgo``X zpWvrttyoJlaZ&QW=HGk?50FTnBAW0pA478@gH(dN>AOCpAnQq6@P>o>gVWQ`$4rT2 zy2^i$lS6)IV-pioZ+B%ZBr6ak?moAU4!0kw3E-AV*rd1~&!x@*4$7nhR~;4(g=F|vklik~p>r*+PJ+f77lSh4 zOtpB5?Wp>-;e|D?>Dq?6$>>>C#$asj9{bI++|3`K;c=Vkz2d(xXus` z&1^$W8-3!GiV$>h;w!7XBB=O-_5-&=HDk~h}1vhEABSjYA9q%o~XHQ{c_y8sZ`>VH)@o?*0%Q=v;E4<u4IxhP>;(pQ8J?5KbU~>k>yjJVmL(?$2%r`tC`gFh=BpI;Sym5=dB;p=~HD%r% z0)7Kl$ahml0m^H3{-BJ(HG@_e34|Hbq3dI&BxpHVnE@ zl-$V;VtSaAIAg?SSN@Q8b8xNZf_l3_1!>zd;tO59G^!fEj%V|DeSl=R38w0s_}*k>_-X__`mBFo~MD>xhkG+3)%Uy%yfp;pm!HY;@aGhjFGorZw-lnRC$CiRauJ)%iZN~~^h z%Q5S~Lihv^fb2GMLrM@9rc;$U<5F{=Mnh?LrD5fWos;`om|3sp+|g_E_GG>5SB|X< zlYt}_@&p|^-<>6MqQlFq1q@vmrHY&!TjcA3Mq&q-=Ou(45Tb2VC6YxG_(7S=B$)Hc zK04N~zH08cev?_TLZhVKc*9YVY|73F-hs&sor~9hfORVT0M;$+ zN9~?IfR4v|h<(U(F}jknBkkQU>gcaM6In+J!39^7ZC%+Q1~{zsLFGROw<<@v>G(F9 zJN{WNhaAHr2TVS#ITqp!f9}nxC^-C8mn)7j{6u`!hKCka=tPSWZYPueJ#D3yhjX^FMX=(YumuJ)kblhNr7I*? z0YcqC=29*K*mlU)1XS8n+wOWBo#S!|_mS4e)*hmQy?R#_vl5W-fBhpLITRg|a+iXn z4VG%SSuW7UpYZuEVmG9;A-)va!WG!{HzZ(7sz(iB;fV+~BPI?ZlRi;+On(y1HI4sU z4#?z_mYiHG`2~yAjZfhN?N81z!q`?$32>K|+^CP>mnBTFd-EIySJm>Q_yq=o4xOBn z8{!Bv6ib_jew0B5?Is`B6ZrC=aw~fcfAs`Hsz>bXF$8=d=&Qix!6Vmk0LGww6P#Y* zleUtKE^slVm^E_DqfQRFYDt<-6@TXK@6iyi#i2yO9KvT+)bZ&`wdUwERXG~%0!Uwu zPQ;bdeL0fr74lK_{PA(QPS2x4Prg?3Pwl*k4l<8)@ke_b zNJL3Eyb8pGg?i~Yb!3@}=*Ra4@I^4^8GxHHB+q6Oj-%gh;4pSfNw;jY<(mOVa4+wf?+dXi#0e;x z6uU5CTgzXLU9VFppC!R6`J8}X=^zrU!M}F$ALR=e13%I}$UeFlV(+m|9Rc>>nWb|H z%xUZ{0v|mzyJn7@HD3bbmvD;vXqAm)VGs3amCi{Pr{yIIt_^WBc>pjVqhe7qmUo4( zc#r|11b%z3`8c<_90igl{L1L)m>*BBw8F6thnMJXw z`|4lNXZkElZ+8>Puj*f^fzVcTe7C8x&$BpB+#3bD4e5W?abQU( z1dP7kktPba{nsGLPa&+=61f^^6{ z_gWL~7rx)1k50Yt{~N{G{%6?(W#;1eKV^r-8k;||LnOfS&(S-)f7B;8CcS4)7@`DT zA@fc!J<3Sm8omLKEbK*oTPtz_~f7S!(Q~9R7_J6 zU-}l=k6{n>Kf@l>{lRaZc3QhNYngUw#z>iBfeEqslyjbU9-maEY|>(IN#5ymNkHvH z$BKz@_SeHKAqRHSFdv7}a+e{+w zXqz-xvO(ac8hPUUC^7=Z6QFz8an=X|qE0j(&oJ(|>c!a6!R6M_k=^Hg^t>{1a(t+w za zQ|Fe3p(QTYTJbIH+-PI-;RIhRAK8UH09U!yv>S@fA@T6BvZTtq@xLgY3H&cYx&S<)$^>gVC#wj8ESz#P`SYAf;zVZd-t?<3>Yl%63mjg3vl@*BUWe? zQQY|0;(DZY#)5Pm^@?F3#{V2SGPU&BbqjZ%>5or^%R1iQKhk?q#Pml)6Vkt$vN_&H zsY&~MxIOq{7BkW2Qr+JsQ4vmytys*FtDtd^VE6SVu6sV$?}-E~L;wRru6S)5hmR-n zY5Sd(ZulKWZMv!~%8l-)gV71R)Uc@jsnmyIy|^)9_b=L&TzL!)NcC1t%``QXM8?MV5Iq-ZDk^m55HB@b|rsqng$iqd$rA|N8H z5t@IK3m;0}8O(ddW&mqvzq7=DfjMOx(;-#&Za6HM{Bk+{6t!)FB-Ih;dV;|o6&_775lDgpFW?%O?Hqtq=R!J+ z5%O*IL+-$s|G;c}Hhm3ORE-d5h8=&*9aTJNx~@o}Kno*sjzRL4-^wivQN%aORb*C1 zTTZ;Tl+Ey-H>^L|`-hkyyf8=#|jv@veEV!vLH**zVt}g`*JWCrlX3xt9|m zJ^?R{-@*%LHNwR?1f*|5zT`w9zmrQ3_}=dBue!=3#GJO`6ES$IDAp#6Hk-`5&h>TW zUr7_o($NbQiJo{w$JML9G_F)d=e`I6cH0TcHM3TsD^h~MK!nw=BrFM^i8Op+j4jq`!zxXAT7LviRe!>o}V{H4E57io&zNWpRB}( z95|nH&*IsFC*Qc^46};=d&1C zoe_}{VFjAP6X78(g+WFG2a~!U!WwLHjs^sOLX0&(jD9C8W?=kVnt_264@)c*{tKZH z&9z(_@kaW09D5+bbrGa6swnl`lhJqb?I&@sfTmNeP=ICi7F9gdS)G#d+-lwDY3NzY zQye^;kj)M@tyH8RyG30xsMt5^Jr*>n-O49|k-4Ih;>Y(m24wL5pan=GQAw+ob7YP#gKM@HmK$V5k_b#kx0 z^r!Ej4+&Wk?d;nxe!!QenLC{b>@sxDl>SK1bakYxK^?VjMPz(Qx6 z$IDK=Bq=)d90%PWK&oD;W*7Xx7{GBkw*|Q0S8wHe(%Xh@W{ckJdkTtbh@gD>2eW7N zoQ;{aE86|?gnUu%Mcop#ZMR^_e*GIQPe+aC*bK<70{BL&f>S_1_h|D_fxja6_CM~{ zkHrMrzK_=TK1ba~*2caA%AL1ws?-nFT`shr~+;z0PD#?lJK%m@F+a+SV3HPBpy% zU652Pkbx<3A-N+O#)OzV#<{p6L7`A;pTkK-vZ^;yOI&NRT=gtD_3^}Qr_}`FO=X*V`7h#i zh|3EZywH>-Ru@q*aZXD3#?eTmx!wT+5mQ{>UPK?IB&*o7+Sn^V6x}5&e4m_izARdx zK#J0>Dmp7GtF}g{EOLNS199?}pZ2HQDF zg+B&_l)ZFD67ET1%3Eo4w9y-lc)&SX;At(q%q$3HpbtuOe4_?l6_Fhoibc+Y{Hf>Q zswP#HeLZLO;3TbPVQ<{hZWji-5K4J-i$aNHzcij1CrAcn*Uq(+8RK=|GAK3oXv9&| z7|9e+CkRJ5zHK{PyyDZ+Ks^Ap4*qP6t-LUsu;Na+ihdO;+kt?8h_u`l?U8+zV2bc{ z?vfxHF!uys;Eck5Ne0rML@m1;=+-YRHEuaj_Zj1YMmlMCI(s(~-y7fl}I3u z+Ct3*)`Vg$#C`(l7h!>;z=B`)Tb%vGAWTNveCQAsR7y7k_Il^FY8a1ac`1&Naso0Xw7aRq@2p9s>~^^ zUK>UWGIymru!LoP-V91u;zVNuBb7J;$ZX(=U3zw#%UiS)zb>J;N+6J{E9oU z7b)QNXiA>h#+nz>Rq__-=F7ho>-=ylp8V4YF(k5S&4Gh428YbTew!6FOi;%Fu!=%Z zB_xC3AmJ<_XXfILCWGi6%r!M3lj(>S1RH0Ao6sE*9>FYOv_%nol!CbMduJ65x$_f) zQ=UvoNn;!~#W~4G?h9)6V0cyji&MVYt2L)Tljln}#ygBpmWX${lSWb8LQzf}^F$aR**uy`uF(qd4B3F2g6#1noSEv4vG&NxZJkg5 z`h3^hyu@O{mqwD^6#xjkzSw!8(t%Jd=Yi`Wz9uxM33ODUF%obwRn*s_IrU`gR#o2L zWTM6v2dTuMw!5KyYYt7aX|r*jVI#!+MABP>sj-h*2p0AgSbR>M<_cl*oXPd2)=cj)&tOpp= zq`#rRhrlAQXp)Bt?DYWbHwZMFynPZvGH?YNZ|YN5jqH5HDs9rs=LZaroHN9yBDWUJ z!I?@XPWrx|)U&>#EHZ@4;|sN2)PhSvus0VJx-ZR|Esl367btCDD9C1Z(044$!xWcP z-vQ||S4&^xrSI0h*UOFG@zaU?w=VU~b~&lFG`5{BDc3HX!v*VK&eJu|t?@nxCTzChlGWaLgvCU5Af#gF-^0PMd84XEBC$+n z9!Bk?OqfWaOUeMS--ZLNr=DMF{3`S7=Ty>2Pc{A7lfA09*~Gtw8?F-qHxtdzjc)`K*tPG7HV1iQ<;z-F3N-h#3%Kb^LRfFJ(DC9 z$sgM$7mG^J$R3W4a?l~_A(qW$Vq%PRE_sRI!?qZNl$yryAd?ayR5seFF{c$}tDl#9 zt}J@wt~cujPM$-w)=t)W{6|PhGB075lJot89!T4f{6F?e1HM#?M`X__^#lNE=?J3H zoB_!lef+_v*q2K##*n%U36qfOza>E)P99TPeqKFb)D-@CO^W4PJKE{@W`o91v#XdE;SnW@5+BP^D8RoZq>>IT5!F_Dw znQ5Kc-FOp`1z7$kFNB~~FTd9uCprigrc+X{8#u^lmiyrkYdf+to8+VWn(edB~!^BCb`hpW1Uf>i{d0g zl5`*ComTC0l8EgiY-s#$_t)!it@n!BYHXNexX~IXKN5z$u%luwg{TYZlfci)9_Bwn zf^agWGD`uYf^x92CHjxj0DkU3f0EUff3%mX^CnlUFVhU>oUTUNf5yiHFQpBkrBui? zU|pA=mP?O8V4-w5&V7(U%rbuQmzK&SBB%i)Fi0?(73wpJ;#r{m9uHh)*+GNGp&~{) zyfHxbhAVYjZHO32s=Tp5DZk;+CRbHEm_J@U_Z!A3*YIoJH@+;y1Zd`56gc4dx;-cA zirQ%swg^6QbXrkGbq<(jKbEe}k?%$x6EPM`bGYxlqt0-9GwfaZ( z(d2skBUtT$DtkG-XM zZAY-ME+)ucN-Aw>09q~eG${-OBNd~JLtCODgz^j)rra%-0H3I4ESkyF(bAl-Zi$DH z)(CR1>zytzb*@(>6{RAQ8-(xS=L0>6nNs&g=K4v?Vm&v64ror_nCXad_{r+&z@~a= zUm}a)t@;?Y*>U7%viZOP(hPBEUSO&+_+%%7XO;#{Fl4A;FqaV|Fk!Ze6FKsE0P*4dtsOs`*Jm)9hhC=vNxr z{r!9F+|v#V4vh?K-h?rcm`MVZ{GVW6oj4BcF&PAa%8b}f>DJd9Zrh||tH2g3dPD{W z+4eW5Msq8uFjgDs`MjzFr$Iar+)oVJ$$||!O_nJ@dsZ>g`RL6}R5Y#Rn}-x1%lJR6 zx~T_y5k0UWf#4$jWT{~pI^s-NDeC0<4_^YWZX9bhsx~Xiu4(^kA3I1S?)(M2N|unn zJ>tv5@oBPB(O9>MdQBNX5~rd=^9feAWS;-ly|Q{)IacWz`;~rklGxwL54)w0Om28q zi3v#Rrt}-*7j?ub_yzx`omusrtVX>jY<-RPyn`MGd6!^$_}}KH>A$t;4sG-M$4?pU zq@Q^4u8VRjkPvQ_#&)SL>)+Lkc_B=EzhuCP-7J0WEojWqkrvvvd!zyQGeN* znvI2yHcqR|KW0BDYJ*-wyK65Fi0j;5&qa)Msh{1&at{&T-uu77k3FiTAnsl+lmLK8 z;DEp3-`CHPV<7$ZI{Nux91&gs}A}x2BVfxsjj%QMFrURHiK9hDBi9HHx8q zYj>(r8|VB75g9U(piv~$uuF3tv8%oRkp+A9FP;wwj;dy)3jaraKULB_|?sEABXIF;Ms_6oV!n&I->s^2|gOv zghlF4TzOt3Ixzv!|B!`n8YUhvM!et;KXbYd1)2v&pQWvSlF?p=M1YMcuR;*}6$ z5t4(J{K49E8S%`PM3z)IR+1P4xREISqL3M;BGa0=Nf1n2C=^Am(OcCHx@CX* zuEJ&c3NW1@OPP3dQEEPqm#83=N62lj=lbf()7|>8utCr;+*J*$(7u)Zj2t<*N+?q3 z!H>fs95DE1a6JaMYwkUUS;$WxJ5j`uk`a0Gw;6+H zP=><{woc1>-PnE=fU753pl_m#cgW0`I|*}pvZ!;VfuCbDq{*s?$HP4B6) zaqK2~_2`L#g?eay<{ZJ&IygJ<{s?sii4exb@dMC``<=NxzmXwX-5+`S!f^5V)KF9X z^H7*pW-GjKsLZ=8)DbT;@;YJ^G6Z+Y zx|DRVoLGRGo*QKbqwl9J{_hMEQ>Ao{^vBt@A2Xdkpbtd5%AVZTB;(k17u#AR9Zjy9 z>wa+(M^tg-uw!L{YT?2*UZtzg50^ABdhj!@6#FIsz?>KK>34dQFS*p{z2OJKxGgpn z)cXAt(O2btrPs#3TVlxNu8WHxW=t&eVs#b5*@)jyhfIncAY0LzELAGifv>!qO7|mv zA;dh7sQSnD;?c0InTvr>?()LT;5lsof7Ipg;kB0e-c}~D@lU&-|1T1tf!88B_idGT zs!X&EFd5@e*&n?i+kRzf^E|VuMs*<@JTPr@wu#XwWGHa%-_;2ElYd1fYVmm31&mH` z5fI7N80mQQE3IRvE`kifFtJ>1CiLRr)wAB-jj@*UszfIB%hZ%S&hfZ~`<_;G0G#m3 za9}#{cyLM+NWAJha7@0nc1wqgI=0*;d&ztf(3Z7j_p2T@_Wt#SS*qtDy}u(g@Xlg9 zx61sZNit>QEp$DoE-yh6|@qKrZ=zV+TCKIvVh>H?HNpF1xbw1Nej ztyFfQmjs_e;`a^=b+I-H!)8tZc)xp4{Y@)fGZ;o1>=>>qEOg4wEMtOEhcw}t^`bcy zAfMbQ>G}YIX(}(jXpKEd0R;Oh5eUNPhpyXTPnX`tNQND9o`1yqFUjLPHQUB3(hZ;t z^J1#ZQ(ui^ML{$JK;Z<&QE|qupsOp0jB9%(M1yin@v)G+{u@`_ez^KZ6sOtq)m5gG zGiUFCHPJdKc!pLn@ZJ8Kwh=Gd-wzPnuJT3*bn6TgCNKjmbSnU{SF0@e@lA)c7MK_M z86fB~lmr1LAsAM=_(+pOP>;WiG}p=v6-Ndhqz}aG6dPCFps8c%1j?G((_4~R@ko_d zwMFlURrU*x@m*!e)B$VbpXV#LX0t9qj|@g+Q^nB5eMeb-$rebai7y+^od{rl8uNA& zd55CMpos?1C-WBTxzB?U=H#NM14*P+=7;NFch~ps{`)68)D~%59514SMel_JTq(oG zEC<8m;_@q(tTQmeAofaUu;Z=hAo|(WWJr)4Xf=~I08X(vB+kYNlSB|d80=z&Rh#fM z`$~-66QkLNA*-}%Y0*&^T@X+mVX}?hx1)*H1R`^1{2 z8d-4|^+#yGx@Zl?fE1i`3Fh)24Qbc!2ovr6*$(o5zG8NAN&%#W&`#3!L*R&ILEJ$+ z^hvD68|0w7V9>$_h7kBfrwjhx#QwkLWDvsol92!>32vfLCnC+i z!J{nYKp^|kfN!u!~*D7xw~!?M&K3shfb@GH$!i3F0XBmCrU$$5Trm_HJU~j zP27}pFP;|cFmI+U4RFBFV5Df)z|i=oP(duGVhstZ)Pmo1mn4Ijd1Kj8SP)Ci8_>C%8gY{lb|YC_4F5?u`o|T1Va_6c&H;2u{y<)=PvnxcE}_STX!xmV5a*ddq=Wn`}SLay*uS;=fOdX zpK1D#t?ij3xnun`%3>WV!menx0Uq*WdPkf{E9fJo+Q?U35N> zuyUPs9i>=a&IIj@5%p>j1Bccxy7v$*;~xyRC0?hfOI1%CS6hI6ZwuT}) zFyqr|O*jOwfGWe$M+#F!#^Ks&vocA#>)~ug?nySzW>OjP0-sWE{$ZW6n&<(q3seME z4yh@gMn4HLNUH)5p;i(k#Ax0VYSGNIQqn9`fM1Ki`~+1X(!6>9%_*hRhMGw(x=W1H zLw{`;`%GgONlAS|-GUckjDieKRJ5Mg{ZR=U#!s*OQeO{813tCRhB`asHdl2VROyv9 z3RQ4d^!;mvzCD{P0=a*EOq?hk16O}PjFcq?6Y=?0-uB>;=iZEX08vrq9f1j41tugD zhn!hg{S6myZqWLF%VB?e2vkra7M9expr1zaZmm_v^){5BQ1P3~1XWU<3!r-rsS6br zPCb(8j3S*T(bX!20`a81!*jbpAZn!o46SfNyac4VlSQs>AgCu>{)=v24}PxK>vSmo zXkqGhPAsng#TSHW$Qf2cuD_qKV)n$PPu|#(g}!o;PZC$aPc-R zCK&b|I?wgcYd~{}>)V%f^QhKe1`JTdVh^G&qbmVI_25S#i73uCw8w>Q&F)Ui>&76(2r3Wilab)na6g9*R1e|mublZ~fP<^;$x8(8cw@x`r# zqMK-NZwWo$vdCVpcTVy~vvi(->k_uQ~Jd1Gn93PwV!F!ev~ ze2yxwJLY0-+rojyz+YDoi%08mTy2ita;_WkEeW@CeuYF(>5NRKSkOV!3x8>`sma(x zkI;LFi@d1i452B?RsqNvM)vvinpVfkG&H~h6p&G62o;j0YPYI$`M}p=5mWlmm83aE zvsT%`GyNT)jK8iIhmbT37>J7dQ35omg}-gG5Rb>JWP)r$P_#(IU&Yrz1~1r>R5C+Q zr1RoBKZ1k^BhqIpbsEnILw&ZAhKug8D{V3qNgX_c zHo26!zD$2&=UcTPboVc8q+MJ+bYUDO&nU&9a@!ghH^B!zqC#trM2!3h1waGg#Go$` z#iC~ScSEdr11}aRFsxJggFMjf3i#0Ws9)YoslWRf$X;%tparB+ufBJ`jM>Pj5K`Vt z0CVwsK3wDVG5~QoRDm{>3AQ4ZF3W7KmV0Wje+A12**Z46zWFaZyx;KPk)FE;A6}g| za-X~a_RZpMJyI{w&Zv3SjapSGBgHXez@-G^(f&Q=J-P7wA}f&HuqPLXVhBk?@5kJG zyiD!AMf^3SV^7uwT4r9x0uzheV$n)Q#PBT@?h0K53L2B7T6_ZlC7AD`NT+qMfx_48=19`@8~JgR22F6_6+tDm~MGB|Hn7OaIO+f zb>cKRz>`+0n7vO8W@B2TkXzd@O5TB>Rt`e^9Jli_LeE7hpilwTEO{pk_Db=FYIrk& z>W_5$IP?HCN|2yiG}(F{TV?ije@-H;YJCAUK*S%44jCNx3dtXqILS5w368otHc?S{ zmC+b}qN6w*ikL=G13sY1Z1iSC>g=CrGm^Q@uVZnzr-{a9ym`JQYLQDKqK)1cCzrIj z9nDVpg=o3MlCI>uOp5k1h*ojM{J5aF<-9VB-4Y~8V_zsv@;$MM^@C(ltj2wJa$*U8 zK*s3py3i_PA+%{=1`H|A1fh^Dr6nT!@)7OQ*(V#rtidGPU&ntp%(%nZSW*LWQ5#J| zs+>ve;?mFp6BMMnEJpN0NqB~1n-bu%aYE5i#u~+BMlyKgwxNeFW##?V^;VZWpn>J5xT{1azN46pj3n1sGrtQoQF4gz~7rv<3T0lQy0~*2#;AC)r$p zA`kq<9c7|SQb?U3#kS7J6YQZ#!e^%*TL>Biism9Fr{8mK(mHRzv#ET=&C*=g3{vnj z?6xx&!bXXz;z-S;)57)>IxtkIVV+Z4%rm&K z{Ac>Ax=G)Tey*>lh6(!zWg43geF%^lH42=6R09oDeoEut&3pZchL=qoUbBfq<;i96I}g1TCzj2!{f@8%Zw;gO|*`Rsz{PvrO7}sRY+|G`=jeQ*0q2 zr$nG+{m^d;!;%l2egTnmN*)3O>|RHlZV^-p+m?Ekw_-TR*(=UAn=6%gpQgQ>7d>*g z+uEzKBZOnCjz4TA!~$E-@^XimJaR}n_&1pSG4bdR!1Pubv9$Ql5s(%c@f%tGkVuAO z^E0ausGjrt{2tCp7rH1@?PN?!Sc;9FTge~XWW6-Gn-cviX~>h6%_OLGQJN9ghzZIN zWD?b?P;YpwUxBBQBxURPWH=p{QbxJE*jBSv+C3!rq z&L}gju6AUHF)_K6ktm8TG7BK+!2pG1lu1Q3MUWy%+PL$0=iC&V{Sk}kv98`wsV*RZ zPE@H_S@u%lh^SmzSqV0XCIX)AYKyp^;*K9jrS3hOM)}jVDe{(L6C$7bN&w5YL= z959ZRZb+SNjUOxemHpx0jR^BN-}4N}s*4@1Hlo%77@#so3aEAhz43+Yy825YGe@ZQ zEnl1)WnZSzfmZ4Y2n5Tu34EhX1Cxk`4;$1;JfOsqQT|W)$D|SbQBUk36h|!R_xzh1 z?-gK5d%^XNsrD}SR#mX@Z0Lj=Y(WcvpB#wgA|ox*)*Vi^NP;9U3j0d2jG`QSpO{;$ zdmsI9&#{;#Yin;4`8%$3vc&&$dh^`xPzPjY21mx3CbH&n@SV>XVx zB?G(;(P8)0pD%Ry9LnrbTE<*?&d!fl{ny;lZXMpLyzlIRpcIn8jpye!IMyp5`74;k z^mm!-n~p#;QXa6dE}Sv};Bxf(=}(77UMBo{)7AsiBEMe}a4|{c|4TQy*?_de6zBcT zQqbyA(-l@%(dCO}LKfe

if;FHy*M&k0v@Fv8A8nKu+DfooDr@Ml-_@iO=>E70s z4V!sAzN@3v(w{9F<&5uG5-gm6_($|J%aqZDjHO-uw=Yrb7$i z_nZkUT)>YtA)sFSsC#iDtFw=Aoyoh&!;s=fLYRT&@r4=51cd6#+rd4vD?$ZX_~60t z!RENpMQS>QQCnGUv0qnBSq60c+{<6eAN?zIR3!8%*yL8~6cwzg_Y|}M8PX#bM{3&9 zg+cMftm$U%tNm#&Z4@w4L-8D3@I2O&#fZ4%e(;NNYQ2973O?1= z8YSdJApTIsSHFTO1|2hY!ujtkRCR6(|-p$umLeB6%gJw-hbn zx-@71*%N~Gb3l6nfI~Lq)~R-ZgD5E0u|D;ixq}_F5QY1B) zIyG29lO-PjA^t3>8I}kYi)w~p0*oII5u*5G{G{I$$O=`!E&QZ6B!F&?zTGz#6mI+J z+5BuC4}1NqbnffNq^6vdz9Lu5onP7Wo1Y=^lNT;^%poj4;LCD+mH%D4RG&Kgtnuja zdyg)ql1|o?B6K++w+}xK3Ha}|=(fsRHNEESE zf=8in=4y6>oV}%rO8d$iTeH0o_3Y0hO5iaV`!bozI8JI{aymN%_cNW_TQDT~3pxcO zyK40=xpG$m05T`Q1QuCwW9q=^g({Sn&g%8c+3?<(lM`7d#cDjWW3`r;0rgECmMv~6 zCTUTVBaBm?X9q6Of6&X8hWSx!_qW#U9)z2jmhQT2unbqFqu4^%Gpfrd z3S>5x_qL)mP@vIFpaxyAuZ&ZgPZeP?_Gx#lW_Ota=9akNY4VVGmSusTn|E} zgc8{N=4WJPH#a#cWbXYlQ7REuAV68a6R~t*sj#Ta-s)Hiw|M}(W3i1{YFeDccMq#A zS2Ch5&VOG4;GurZERX@hzdKu<(I@U1wCM z$I;3XaAE5;yKDAWM<3X4^XhU@87sT!l675A*RvtVk3zG)P5m(-i$80xRHqE*9r3 z-RXm{R9xrlYS=Wt(a)b#kZgS2kN1Jw{yi54u-`rwG^PH8@Gtq8Lx&BtklEtoCR3$a=IQtZK5hm?V*omINsF{e1y^x2V&=aCso_UX| z_O7dkDR+L|6A%Q*Titm3m|LARPL6DP(|q?ynfYP6I#W!ys}oO8DTVWRE{8^yQ7|?F zpv+Q5W1(VPXbW-i9$P?})Bb`n;gypLUG>QmxRmbeLff;um~C!ZhV=C$O2~R-53)eO zUke$^W2W@mAQvo6)VbeZn{U9L5WEP2G@*@?b3>PZF2 zgl}k<>B+j#((OiTsh@GADO*$w#S;Msc$8%RlW8VY{L$9-trFaD)NOJ^7s-AqQ#wSG zL%Hzyeg4FN#1zp{62_L-5TJV~Ui_1D%Q6;@{6g#5AZ)_Du#j_!2oISQsx|Hx%L>*# z&UTJDJCPUNqQnUs8w|BY+^vPz)|uGnU#;>{l^>c7iNC$2d0fB{bMzBsXcPcQo;n6C zEQ^YOvu)n)u5%pQ?=9szvRY4@WSYwKfj3CIE92L=@@8g|64NAGVUlYN!Yy*+V9f5= z-akoqGgIvL4VUBcdw)%LPR|aZo1!r%9-T(r*iA4~Hi5lhsVSIAir^DE9jc?2(BnDZ z+kGZaA**yJ2fMnVd+nq~D3k*L0|q$ZN7{U$Xewg!BL^sSq~9bFdLRd8QU@L2e*0-( z${a(QoFKRzcXf+D(D1L~7RIF4#o_eGaNQ{1_jcnhBe@`T{~~Qg?&r1X+qSwuGCj3P%D#FF7ojf?<M)C)OIzr=(hwX|u|#%TN(hfIfBt4Pgh%W_l%=rgPtGxN82E|f zBxB(mX^i!^;Im_X+q3&K z`8%+{S=l(#QG0+OhhAN|^fhj*t>yabxg2zMAGtpcbKY)NNj~fxxe`fgw7|2z_m04P zL)ZI}8aMuB-TzDT^}vme&vtj8RnKllAop*7cyN$Vyid{+gc$*?A-J!Bl!OZv5pqCG zVUrDnV?mP-xHb(=5{wG{CcMM33=0k#!%#$zbWYH@L1KCJ>yHR{HH@374yj2IjI0Ph z8zYRg0C%1zrTsVCN@sX0s{9OA+-|FV{`MGZbH^G zpdUK+A$$f&@wNM>^@rZAQx}0U!5F-n!0aWVdNh*7#r+&Tc9_vgttoZ-U58uoK7Y0P zM9tzLR;<}dp2qH|qa4G=YljN}le+MNV+qQGJ#SP-^EsVeHW)t{6jBP5KRz`G^1f3W!6rcc1J>h_8_5*tXpWn;@+q)!~Lv#&UI1CZNLt44>po zc?p$=A0>2Sx#D(?2VT+u5tWYNntTh4FT-IR4$+hwi>#lc_S`gQY~(6m&J70bZ@Ur9!MZmO>?yU(R$Hr9sh!Lk&h&PhPatBnt(q zGkFHVuII8832NK`yY~G1OP>R2*KB(JL_3O>{(LC$&@n$(QC;SN^>6>*R+8!KY7a_h z6&;SsB!o&HJ2YV?CRs?Uj^fcZ1A9DBJ^6~C_#p?a{-=4>hF9&KJr_HIBQM*WQ)uW< zf44Vd=w^2$?b+XllTB$?PgomnZ<(o#R5q#W*$N5FjQ?Q9+%U@c%TxFH zWn`SUS_?qE5n}2{V#qy~%@S z<2-&yHnlzwb-oN-YkiZpY0kMG{J;`Hw_nh}5N04(vwwLa1zM;>nDRSIn zECBpZKICq)HHa#$et}U)HC_#jv6LP}gHiwwXdXF;;t!T-C{T!9dokDwgqp(h5a8E; zplfFHduFmc*{QJ%61Mbf187q>8Dq@wGm}<~Z?j!8q2^kSX6wjffX2dS;`3U!gY@hy z66p%5*C~wG?;IQ3^|6q@l6~&&yvw~ud4QpG^f(;LW6VAfad=Fpnu1kjB5&;R$}#B) zODRWa{RnT|^3Qwd=m1~Id$!+ZjxWem*&=K$O5T5^G0Mx`xV)}JuxG*ALLlW`tvS4E z3mdGyRmR7_!HSQ{bOK;XGaSix^OV&zP0eS`}YTSO3K?okB}>?kpmDw zK<~D(rA;8!?}UaQYYm{AZFO1;Oc-oBNUJ!ZapZ!=bzJRwr*n5QhSZPUHDtI~F9m(w zdU+I(|Fs6@L$q>nRfHK&Hf4EyCk#wc6iI$2*mAYbtS=bjQ-{vrxt8Kt0zI&2l^x%i zw#R=Sn5?G+OnA!D@vn+Pg0w~eq{aGzxHw7{4Gtt35>EuL;fxbQWeCqjySI?(%#4s- zDmGyROPda%a9-!DdIVFD9{c)!ijS|Vzst<8X+qzPoKW|WTv1XPiR|2>kTkHrkuNMQ zDGjS#F{z?t2#K%svNAtaP?)ES+ag@FCGjVa=rASOlllWw4V8uH)*Y(>oTu?qUYC^a zNT<)zyMOGJNQ-%+V)-mPcwqOSa7)E?CpmHb+yC%#f8!ZSXq$#hB?-~RJw}n08Oh*I zULl%%X;cl7GW&qnK7o8_Zu)3@fDWnh;Lh~ArP#Y5>E(ePg}Px6B8*)d2^k`)(nH-t zI{HS#JE}4=p8#foeIpzSXrLV9DT$&`FTRz(<)x9ju0t#>M;V==meGXN{pF?rrv~6? z;3Is&YpI@dWU;Kyk7O@8Q0Dqi58|6OfUCV>i{wF=V1rtXQeD-GUeAgIHF*SB8%Kl1 zTMu*ug2i?{eQ^XraVu&)a_6%w0kXC$hV6?~}ro(4@Qh^S45 zwfiBnR8mwi6!UdKuS~15>9@}g0(*kPbB*~jhMFRDfZdW9#p#MoH?*ivMhSniVy#Gg zNhXx*4d>*FTma`JMhOw(-*XkBD+^qcHnKCsdSwprYfCVyVRgYUt5#kNPNRq0a|ri9 z88k;0`zP?z@ki`0A}qsH*Ok5A2`K{D8YLDBcs7!6bm z9eccJ>GVBV_H%CBbwNakbM?G?z>vq8Gd1jAab`yt8Io13I69XRRNS$XVg7(!$*p=; zM-j4j6#E}%dL)G);wo{ozgNWXh0L;9Fw%EvfYDE87Vdu;Pz+Fxf9PX6z-ID(8zNx4 zUo?JBz9u2%x$wSH=91C1mtuL%hA1gkif*6ZbX z^p{wp!dp>gh>@maFO5neK%RT*k-47KUuVGvpC0Wi`6FN(D&<+h@zY8nifyY$ck}%% zd?<9JSjyR&2KTP%^r+k@GF@z0FFw?{s0Y{u^3H*s0gXuAx;?t$8nN;E{LX8uSv2wavI)vkmCi@ArNB{aR16p=DG!5cS1oGSv1{YN&!2P<|_2fHYPHTQd-< z14@6uV2y^xcmY;zFbfG^)zR0(jc9+uRbOPiEVrYHt@93$-uza2Ivo48kC~o)1>fGU#QF=|z zhsPeRb`SmaFyVxP%`hr951Lbjc})j=asIX#<9+v=S1E1U$yT$6p zYTNAEbzaUqT26MLbTGwdQw5s2`WP30rBnTlAg68di% zO-|!kNbaZx55~743P=wFhnWLKaC(A?R#A&P~nS>_MIJ zABqMmzp~a~0BXg(V&t50LlkKwe6Z+A2z)5%=ypvx1>}+Tp0)C75 zV&&_QFrdN{7lX9kdR@2#0?SYk=EOS4AhBee(vnP;!9dr+H_iz6lzU2_+uOwQx^&}j zZ-!b=#q_zqAZ~(_gu&66&-hOs^mOl}PCtziSi6qH{1j};K`$44; zGhYBGEZ0nfoyc$F%#+SoB|CJDDBzyR_-8JXa6I&uHv{)aA9JshRTVkM87Rp8LQpAh zx?i@`nH52bL}+DY6(fqM?iz_bJS!g^NMLS&pAW^9WyaIm(hsa; zdPZGjtR)rYzovfPnb+0H^~{fYJi+h*%w7Po=_T!)EU??1)A5dJv>wj=^fCU+7%%&& zYD{JN^N-zSa|uk%4{DfkiTj~; zIIEQEE_iB*82cN+K}dHovG1izX^uIuOUlVLwe)PHu59K;)C`<-(rk>oVnt1zduRYE zRF{deWRWO4lP;p>1{_=FPq3|c*CF>TiwMr&f(GNqi{Eal#TBcikkEuA7a)fSJqszWMUEPAy3zld}RajCMNI_Q@?w{U{K|+KH!GJl|c8{=6Qq>QUK! z!h{l%Cr?taQb{$j@Nio8=6%lQ8uk*vow%wf|2kwrk1~TuC~xn_0=0hU*+;Ts!hN#u zEErbQ8tsz(f*k9P4im6RTp1TxiT2~0Lz$01l7|#mTR`*78ykC`g83+4aApF~Qk64P zQjP0ysPn8nW+soJY&JaQp_4Rl@0lXyZ1W5_-@NVWE+`G85;}*qPD#%bI9VWR@$T^U z!Us7TgqIJYV$xOPY)6FD7FHW`~Eax6Rf1t7E}q>U8^qUbRf4&(9gIGi4| zRI+62Tu(n=fqEVwzlRHsH(thHNJ z(Z{FW-j!>JH7LEo^MO*Uc!a}97f~K`J(~_H`d)TwFWZySU$r?WP}Cu(z6AlORKj80I`=-uW+5FCD;7A&< zNzSjZL+w2QY=S+FCRTAD$a<-dmBa6747@lwBF+6wh@gJ~b1mWZ&E3CrR{W870Axx| zc`0oZHEoTh|4My)xr!}AMa=Y?o7^uTRi;c49Ou%I6qVgbJ{4jB4_89mys^L-(wD}z z>D(^86gapj^w?9olvYk|z_sHED}^%GaSO2dGAb;}Om7qcj&L3pZs4gTDr9aRmj8Dv ziG`Ene|nFbItq>iTnN2a^)rpV*5c7*lmjpc@w^N(U?RC@&O`YZoSsIjEEZiSZa5w&tW^k{A>bV;B{j{A~%zJ3P>+u$m$2@Tp?Ilr3RL z^}8V`M*(oUYeg*T6?>~vKMRX0ca9D43>%?jhr9rTLENYiK{EwOV222p{KuzwlnG8c zEeOIzIOw${5Ynq)nbRac7MW!c7iL6Zhuci8cL%P7{CUsHcz7t{;&fz15V=^VMz65`vrJ~ zTGIv5#)ZXtuuZvD`q^FbAytlP9rZZC#HY`%A66@}>=@9e!yCDs4j-szpH}@_FVtJA zIU~TZ&!E4X->B~bwy6Kr=H>KZwfN!9>68frzI}{|`S&X2E15}3?bh(3ZCs(EFPRHH zSK0YR%*ny#qypgc=HWDc^xoS4#nyW@LXoNLs+_oNynKO}V2Vd`uz@Zqy+ItX0(Sr7 z2)8b!V%3@dyp0!je*WRkJ*oPZ;fyJ-!~VyyT0iX_lLB1_RUc2C94 zNuFi2Tcnj-O7jko_2Mr&POb1x^w`<2b!FM5>~B2n&aW-buT$!~#o9tL`I)p;Z5he| zh!suR_o}DNnU-v2GMx1QV zzaUynI0f87=^NW)il5$N%7yH^pGP{qC<*=#b{(EqnNZg_Sm;><#2p%G{qo7`my+4iz~ zkLGJ7$R|;o=(0Z0AO&uK^|5Br0>3DEAGD%ej82;sJJqpU^rD?3`=4)w_0;Y?c{$ae z?8k_jSsoYsk_FmE_lR-YzkJf|$iRIAgZ1J>G5C1^i?MjDW+A`DDpjtS zIan?0V^_vf999ax>ZlTn0NPh_uJe0Sk%^7J=)r{#*n_ohwvb05iJhKI>1CTK4tD4-K;;T*P!MB-#B8P zDbO=`W3n&&+9mj^C=L;mBJTWq=9P)jaG`F?y?-sw>~E)q_WHOZ+6_M~`xmi}Mi@nt z9xl9w-t7zIv311FX{e2IH-ASqT>NDrY$_XQJQww2QmHq4$K~H*oR?%x&e*@*7engb z%YT1j-+?zm>;3nj3C7I&-z{3;y@!HqVCfoS#V94a`*~{O>|69n{ z0xg%G5&oAt2)A%T{}WJFEyiA^AExD8GDLi0?ee#3~D zeVzX1*Bb+a)GYStnOIvpI=lYz_boC|gdjo66Gk-!D(3g!BY32=>%}(^atF6-wyO?U zh*T6{BcE_eavt>&b;$^RI267l6OLjylGaQCKn&z*a0UTzwS?A=3$!+8IvUs+Gii@7 z{Z!@Gy=&vsrT@r?8Jq+!#CdrWk#eznj zA@&Q#G#CMN3>Pn*zV%v_kin>Il0q)s;n=RpqRGQi$SjENKo~IXO(Bj0(4(%45d~vW zy@EhaD*nk4ocjn@0+C}ZJv>$eLS4*aA{p8P$sd%cdC%@8PA+1O@14NVKsH>F2!$$; zutkm$=%$gC{wm&a}+SWk(Zfq=?Lud*GK&;_Fq#n(` za%?g7^9lj(tY~8#jGeB&_TM8zTyTX8lPOLOuQ%?Zn@0qTZsG&Iw)2x0nr-;K?&2WNszYxqP_@nAHqAl04p zNH_t{5GKcm*CXNO@GAD}{(@Ah=}uGqJYXay7^tI)q(7-|DPf3wYt_TyzC|WEhg0Bd zj`GUwCsnr5w(%PF)3)uNwd4~o(x!=F!e>LmK4^~~^-Q#xrUmvvZSAB^Dv~0d%2Y17 zq>p}gWJ<9~lv>X!|9s$$PlW4*w3=sXYmtss%AJga#riUn;DfcLu? zn*pdDV~&y32$LEsLhoIW^Vsi?NW=v1AuR0S{=839Owhq+GOF@iAGu2(J1fS{0ub+v z{Dr1CgEV)gD*Gs+2mM9~gQNqQ#5b)CpPqC)I+&0GOI5+a0zpe@@@GW2!=Gl@wJcmA z?t$ljf7^8W%9j9abHMd%z!PJfarp<>x507|?qL(dpm^QZYVo(;7)g&srD4x|G!%N6 zYR>RLvjV$R7m@+SB&&wy008ugdItnN1Q=loqezO@r9pHmRcF^CZw}$!@Ni#2=&xrF zBZ;y)YkQp{qRF?#HNlybI*hc$L@O+%1TP$Gjs%9EPHU96wW6k>?ilp)Dj-o%VBomQ zojnD9x0g=Z8%Mz@)#b;&!>t0r-mL*X?d}rdYdT-ka~JlFQuQK2R)CX7axSYmTUxKfm_2?ckGVmkeGno0kDoS;?+`QLqR6zur)mRkVVq(0G}2a0%Mt zeB;Ln&O8m}vKTQ_4FGxxsuZntc7yo*h4z#b7;@Tk0qHpM≪0jQhqeCXeCzV=O51 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 %!Fy1e9&n)k6U9 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
  • ;aC)O_U=5y2EKx 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 z

    fv&F5+}w|oVFhx3Ml$lMPjs)&o3T8wPyL$g-15qNu(dI+ICsE? z-)?%T*EkH95B5rUa;WDPg#oW_-ciin5jA!~O8@pTxXV56XBd3%CN6nB(Ubs3;Ir1= zDD~Tse(cWy9$@uliOiqfRiOOu&an|#(4=BPC&o_AgoUkr6}?N+7p+_Q6wV_yLy;x~ zkTu)hdekT_oqR!X7X2j(?Or@~gchM1P4t>VHHKG(#VYViX!C zh~I}=6QpR6VfA8zeX8JoMt#c0PP$?K>Bf*2UM#pj+QOb`)X^1K^>6*b+`U+Ijj_tB zlv++_IDBQFBNw!UADtB%k}6bmcPd?Wk~p`qa<==gD|D^r?bf7L69wq#N6q+dx!gIy z;fj?E_F^iiJpWchU6{}K)L=QLGY9Sm3~U9JUmDjJBE*Mn31pKeeq;%#UGF(R^WDTU zI}fB62;IIn*oIQz9DXxHV@;Uv9&L(f6kQK!(!L@-%d_>X=XLj6tBGN$21WkxV9!0` zn7VtGd_w&|Km75(11+pP|AE>g{@+mhZ#mo9x14QDcPAd7^IO+sv?u+hTqF1tWA7$L zCybOJBG&a?2Y@>iqd~Rdl6%VixPG;KuBOLLjZvQ0=SSY&(&-L0Iub3Zar0CWn|NeIu+xbZ`Xc@UL$ey!>4A z(E(C1kBaUP|L!lEkdaF%>`nTWa~FUPVs78L5IWf>DXvQfL_#~h0H5_9`-Zi5*v1}oV~{Te$5g}poYFH+}ndXsjF@*nki`|hO} z=$R*H=znAtbI#;R%hx5S1~-{N{L$2z3IIx~>V$#pO~oPy{@FOllZqCq2qK$$H*{aTY#8Hh5$RtGh<1ge9+t*O!f zK}>G+2NR~pUhSJh2nBs%udu&h5%EjQm9&=S=Lka1MSsiRW5{QeSKWOAp^kFBv;(Z0 z&TEQPl%{$bC!m3A;=rQH{K7_KQ#MsrC2JCg*Db>|BhMdY%_M0*13~_wD$VjnIRMp2 zrmHg4D@rT*9wG12OWE5t20i<`&ZRYvFiI$2Ge!ZfjXYD9`-)xmeeU<1Y6?!hY-bdt zfP$QnRAC_l9dv4gs|^^SAc(SW%NmgKl$Lt&d$)3KUr!^VLcS1XAM_=+A&6ZEdw&Ts zRWpaI(nZylMP!0EY;0|<@NH9{ERcNvwX7`Q<(3+K4D3W=%=Vyyr^{S3RBv-cmMPb-Hm2#Wk9Moo*j$+$Fs%K^t9_>EMSsg0@PdfEDlSP zT2q?nD$BRYXQzI8Mvj*E_Q1^bZpY&uhT@#%n#m&Z@Ib3kyqP@f_C9L`KJMV0N=;77 zjtiHZ_4_~Tn#QUI`bM0W&j3fPiXG~ulE)+9YjM`5U`=;;#IlB0q)s2wazz{iI5UTI=`Ru`2T24Pio4}WQ!5zp>NR}U@{*2j-d zYF}vTxB6eFkduC?nGw}9kqPm~gR#yfMkK9E+`hnBxLBzu*P-B(zRakzL_tDvkD9jgQ1%3$MSCKG^Ry%xQAVYc5 zZs0`O9C!MEKQgp8!KUc^JOgVNzgaYoj!HoYGl>yL9r2I8jnAnutsno_u9MZr>Lq{d zD6Wmfw9M_-03e=F?jrHfI^Zw3ulM+MU;K1-bHq8`*cR76`(VW}(u-To_`*_#D(MgL zJZ;d+wq1nL@ML-RF5T%%yLN}N5S0#dA0^k$7AJ~^K(f+ka#g}{I3^^79?zf3jd~vA z$*aG_K$rLAXOb9yyM67Rq#+d9sk4J1iHO05gRPP^YyvtsL+oK8Nk@!T;_&v(6BCUU zo0-PFT-)7P_XktosD}fQzpjh^s9n&$iYTNWzGNm2D434kHs4m$-6oh3E?<6mF#L*r zw4@9^9L<_53+`)Bwex7N*>ox@l6(AnQMsfnXw&lNEdTBEbmi@N&QYOZJ3wD!=zjrq5Z&h4tXq&@h79sFe7RaGT6SV|6@GYT=q1X%{^uM zXzJTJ1bU$;)Lq9z!h4=IrGix7zf z`rK$*eLRtAiXQAd8-@7kf6!CCDO@J1Gg@A1Mkqkby(=oXEZ) zbU2-m>!q4Pe$*{a0dFliSa3;HBU%t3%N9L|NRA*vip*Eg_P}V4+|QljdgR(jl6E4G z-vvks4aSmj$Z-9!mhFdDCO%oawO2j;5hhw_y3(;a_lzS>*v$Oy5KfqY89%ixJnQTE z^a*lx=(X8}ANT&fY3s8EGUPaTzrkCp=X%^=mh|p4xzq8dBo&%%Kxyj&X!rZ`E`RKQ zmambfelyyuxXhDV;J*i=za^;uS%B+_Pc3d2X>meR;xmzh+-=^w5&XN{}Q=_Pb|NK(D63S0O1 z7EF1QAJI#&cp|W!9%p4Cp}*;G@`Al#qy?-q2E_p9{2r{I3kUn2dSM0DjelR8|6k

    T;bp68tw%#~qHBvggjYq0?G({n>7$Z?`*YBg#GMPi?9jFh3il zpwvX$b=osEbxF-5;Pqf;L ziztpUq<>1aUL5Uv=-`&rhot@zNm6&&8Q%JcUGO1a=M|Dtux~uGIxm9@n#3KrQvJ_4S0t~q&UDC*TxZr3YZ1coD768Uc3cV zTV2J}#2#@4C0MiJQdq+Nb1%>uy}E4uw)o6LVF@X{9B|30fuC;6L)ti-C`-$+Sd8qJNjQm2P>Fg} zb_?o6*GE(mE{-QWEMhH6W9eE3Zcd#}1cwS&Da5J^7dssJtHhY<&BOIy5A1QT)A<}m z>Y1XVBmYkdCeVw;o16Dx7=7Z9%~;1@@ZWNw9Moxz-`7{V!3iXYp)AcUpr0(W#(<{L z^QW*!k0wLxHA4x#GiN}iX^H3YQo9Uxo*^ML1a9u2Yrd<1G=x=%c$x?l{Z#xkMSGU) zr_z)?8-!@h(~lb`0*_xXv`;U7l16pssHz9UA|@BCs_~No19ghM_8*n-S0-w3=}sNS z>Q^tZ5f0^BkOUTqwKlqy*Ym>tK>P;#wO=FZ?~!WL(wXWA((XdKg7O<*AQ^kDcmGrF z?mj@*hlj{aNvrIMIHp3wDO zRuV)Q1tVoh(?|G~ogLt3q{L0t$3W8ex_kM!`{-)}9$ckL)|w6V%VZ3Uk3Nd6Z- zhmTCLH;=hk!Hi1joIhLio%!#umK9=f2gGH~U(F6{`*RxrirD47*?j4*cNap{Uz*;x zo}IcpvB91z!8_n^aIzvTN8eU@_~D7ZDMnbTn=>!<1XiE56DLVg z_*BKS_NCWkA1INvEeoiBC^j)ux4+Ca*Q+}Xj8A8DmVsm@L#1iCHl!i6xNTkGJac=* zy*1jQ3Qr+GE`PM6S(f^$MdVfBiCLtjXKbHCuZsPPPxhKrw_?b@R9WB_O!lniP&KGH z<4df;KdTB0A6plpP938QH~xU(M*!2lt%gmX-IZ4Gzj%tSSHI{U^#4QDJ8);Bbxpgm zZQC8&wr$(C?yzIqwma_FwylnBCnx)P$2ZQOm~+)!Raey(YN_v#-zj4j-4hlufV;9H1{K_+Sw+Vs7n}Vdg2Y88>a^FMLUYN8u}%+0x(qU zX=3f8G3PpH^OJ*-D-$#5@dTgPlmt5s3sK(V&0oD6qg61mrId1M4>Yb)3)Z+z!Niiz zJpQHcng(EF#2iZz#NEeq#C_hMTI<2Q@EQUeRUS^TP^g0KiR`7Q8~t7RMU~R5qV)UnHDeyOBgW{Bz= z4DbVM;5Tm-St*5_cJ8YdI@bdW=i*gV!brdeXoZTwBWJ&yOx}f%T}QhqE7WGqo#wl6mEllT7Ah6He{XQ7nSm4U@ufn)PNs|2Cm zqz%i?vhO#`^294u0P?cjutpLWq$}ZnK8%kTJ&-_HK*P#Urny%8*TiKMsP)dLU+a3Y(OTclm||BiZ4RxxAmge znSsC#dbuCS^E$3JB90CzQ{1b-H zfWu=ytU8hq6o=R;7tVPSjDb-VCa-g&u3}$Lfg!*#I#R(zpsVQ>7|CK#szN?-M$^KG zV<5x;8!;3Jo5glq0U)+Y`k{{$qf%PjXnbSJh|Q?z0oKag^hwA&HN!3doh6fW6D+zj(_ z%xt$NpC88*#GLvXSJ$>(O*oVeb(98_U}*c{7yqj{pHffC(!rbBD?>yU-#j_#K-Cos zlD_Gq*Adr9nt*;HXc4f9JN#dsHGu@jX!f|XExm3B6LI5=dymuKceGlMULHbS=~O*% zWiA{|DSMzpV+y0K8#VO*P@p<8Hm zdBPzgy3va+9`o^7eq`&ZNAx|DOx_L<)(v;BL{pJaSppV@ zZ&yn&B^r&G8Qap!P(yIR0*OoLEB!h|#dwh+*&m_#wa4Sc9DqepplRH{iV*Yho|m^QmGEg|#qRH9)rjaU7Ct;ShNK{`cqp83erRL} za=4|!R;{8EJX1=CrV#b4V#Rz(oo)nqWF%qQ`J&Ga(=QCb(kIhK=p$nsfg-)`C`~_!+VaZmaM@=JT7ga=TSmk zveaLjqO!o<1pixs|&Dq7uNKbT8WPT;Jd0HLAwwIT6@*xp7LRP?$Tnpj zDpoftMPjaUWTc`NB(9jS@nj+!E>acKh=I|JE(SxJy%+;r4tvrbT#*)glh5hHoY z5GGtmEa=Y^0$APa3C~#}RxH#W5Lf*LmVBE_%)hcHV0Kg1+0g@zqY!&HvzHS_^p|@` z(*z=7sA1JD(eAs7MkjTLoOnS9)^5>#@ulI^{PGevX1oaStk|lbFnHc_GrRT829O9A z6HT;$Fr#>c{@sF!w1LgFfqeCN*{wk$;0d@`CrAi33E3Js?Vq=xTjoOK*Plcf0%|$^C1^-CB>?N;TYrac{fO_;^^g z{piMcd9!T%i)}~s-6=1mUtGZ)zJ&F)EQ~l9y=9n?Va{k`{JU?+Oeld^|?C-P$kW5|}d&Yz5mhM$59}&TK zMW`IwP~t3=a;(e`IOuTE!ya61oT@M z*MLs$oh>wcqfssPnbxY7CjtyzJHkHzIfBu}4l<;Co0CfzGL*vZXa6A!e8SQbayI)p=!;Q8fS*gHr)EUR~{#F^) zBOW1vl9pZ!d;+-$DpyckDBKf1(X-@pF_@pDqdgp9Z$n<4hXfjSYnomSkDfaL(#pS_ zsTuCn0={_}s+!W9W1}qMLJ?dcm6($u`Tw9z1NnS&5Y6$4#?P}EsVWvXbIF5UMclZ~ z+z2n4{I0hy%*_kW6Z9Lo)O(LiL>4{F2mHZ9z-p#|;o~{t`9QUV8s8EK$!Y@G5 z#{bamCsb3av^#N|nN3;j3lbwnG8D^{Z104-9=r~)0&&sib6ZRKY>P7O^skUh~529W>%YKqYa z-tfVb+g<2@BDHsYP=&1}5h8yvOrtB>+Z_P%K{SGZ?neu5ouakw_V0XH5|a=IBMpYP z3JIe!HN0Op!&-LtIFGbf31W&3n=wnNI|J_4g6-HUM`J`r!t4c5prNbM~ zBR7}FdsN62U#BL*Uc7G)+m-CM_@(nPH$5C2ScEguLToKr1h3aEL^wvmn;1o2xy8|! zezhYhp(wVRC4db`j>7>%1J_QfF5T|h&2r7Sd&a-{h~yPOasKzeR>Ydy24oLQ7WBY_ zkHoN(9X?RIUyan&);#TJCb}<4@m)>*E0)Yv#t3|4SdZQA1CBEUHo8)PAp;ONG(8jC zZvR1Guz0cGwjU){-6`ezN7HdM#lL^3dL-i4M-F>G!8EGWSx@nl>vi zr)hVwIff?BL(Xa2(_Uwgfb05czzu*x}u&8+BF&T+ign z(&Q-b{#<5tPIANv0%2Z$S(4lJ`GMUz!D`OK%)wFL#H;)2D#=t@$RZRSk;p*VYZRzTR0x==14?8}y-f$r#QCN&iz zM3Wb}V8}})AjQiv^oc0LtXy zHD{YBf#BTy#wSRda`?_ul7nB>f&7_HEx*2_nL+S=9qdy-*W~n!?j>2nc2&fN0fw5q z$MN*oyhonwqt@ZUBEElk$rMh!d1#FbYBl;gyv*jcT*3F@rcZ)n$YdKY$2gk&!fJmc zwA_o((!qoL1Lk!;q_HTvKX=}6C zT)jrP*PgUb2M%UP!-eqv$C`MxEHUVqTAhb51Cqa>xWBe|&CJUpj71rDfD;E_OE*8& z29R&GGU*79))4KFw%jj4#X|B5(_6Nb!2|8RSJbRrvdzCikN;r@r1e#SP=l~={Ex#0 zsL}j?vE~~|`Cn+)683T`7MT?GsMKAn8E|4k%w=dL;i@RlD;`1ttYSabz-QycS>uMC zt5!rTiE}84I!cD)q&)hN2v%n0JIn6K|0hRiX^W~npXdyh#*&@U4N4;-dydYVrd!SK ztiC9W#YxS;EP3cQXuAND6Rvr(a=zz1-__r)c4aQfuP%E935b&#hht|>W*@c8+R*F+|PfTGampn|(0hC0^H zXX^9~rp@y#?nTpIES@dCoQ|s5Z`n%cd-kp|G1Cz=O7b(gsbT;&@OYwTE=Zg-nSWiv z1KZ7CXYJS zCu}wRKh?Um$wP))kg3jj={f~lw%+;V9YTBk#rAjlua-IA{UAZyu@UZv*-)Y!?ZLT! zVild;w>@jD9qj;%6cacILPOIa#O#PzmZdMoiK{`M7%Hd)Kv~yRj8UAO&+C z>b+Jhydi}<$7Ecv<7@GlMU%)jd+@RQGeAQu+(V#_x|XuWq_IzwrA)OP{^3R}l(f+? zZ#_2Z1i%Nu$FhsGM2)i#-TzYkt*^uTX8i9)< z0OC$>%QhgDYiiZ!nwD5EE3EZE5L9|Sj}!a6Vr2MNYg3E&FkJ z^0|KXlOl}$aeO45?6| z5zG{pUwEe>vt9b9MWan-p#~QK$0x_S2!NJEze02V!aD<#Tga_MK7*UK5oYJs`CDA> z;L&n92tuf2%?mxGSeg?cUg1gj{$93srliCaUcp&P@*qjWO7;nbj{du&pQQqdyF6iL zKVdIiWXLx*5@QTdvM)I{gaQrC29n97#tK*6PM7MDU|z5p8)G98jm>J>W~1zE4vKzt<49%Eo}?h-XP(P?$c* zVNxcNnyh&G_O!{2;yo947RT1T88;81y)*lUna>KwhHGUUrWJ8UQ08qk*(g_`m;C5^ zoO->c+y!2tVo`8>8Zb4{4FJDOx3D!SAxFAG9vbgBGE`tmaExVCkxxe;C3BFoPvVwQ{Al6xyM@N%IF)(MA_ zL0f3RO(a4Y>-gzcNq7AQ8R+C1{@)=et*{XU4V0Oc`Tq#PU70^M^KHnzJD(ai37Hj& zwEPj>m4OIp>|7%r>|O`V^H)L2P#(M?sKemae}5Cgaj zV~F%6cl!p}3o3cPoN-Q&-r=)Uc8AY9*~C8Oj$u~2O=|Jit&8&}0YS^TXRD8sM>eA0 z`@^l{=Ee-~WR*Tb#`o>sN!`mNAo`wH-ysq5`I1$%8B)6Il%xMM`+Zwss0 zDr8jhIVj;!$HlIHJ%6!RryPriz{J5vayz8~mBww-_dZ=e#m3@aCWXJ_oI1Cq&$^%L zdN+FwpY^4#+58U~-*!o!#|N~lZ_p|)$aRnaye;q|PO1|*4;w#D0!#|oWvh?&vTD0Z{qtCO=;s#Eo%D-WI|Ah|$IENXB3*#Lx|ot{=i|(u8KEUZw6ja( zX=~N<<=qvWf|G}-y{3CmkG$mIl=fTN-$gK1e84JN@P+cdi@Jyqlewx$Mj=aqg;-W8 zh}u2;{N_^n#CnbQuqhAz!~c`SG&@Fn7xcxfE&K0|@cw_s(88!SMZd#wkDI!J zgYR$hu-Inp5@8~=EaJ97Dj7|`>Bg2vE?qLJ-tfptg~$Xc8}m)X@k75(IHj$H0^YIZ zl?cVXs48_G?H%BL_DQnW{$%sqV>Q@lqGF}(LtCS%s~E63TAyf&e^s07u+=EQIkcTB z@<=N-RWyC3cn}X}@^sdMDT+#|l6h^ar!$%(&vDkS;pPv|Ai--7<*7!lB^_C%YtKEZ0;(=;282H4-!-b>TzxSzz@ zU{W!YTUf27i&cZN=9}b0J`oJyoR;+ED%^_`9zL}izDV%GH zIMEz-%{GjME?@*IBQ+S^WLR=x)z6Dw_RdYJFS{5X^xY47)?Rh`d4jh-(=?}75vsFZ z-cYRyv=o`}v`Pm-Zyb%k48{kHq#nlJXxPTAjHEDq4B^jjFgYa)o-r&yv{dghTp8ne zB%`Rwaigdwk3QyHQ_-a!oGnD~jW0x3z7vE_SJyC+xwOHutVz7QQT=(~6507Qob~TM zgC?wEJqR{>FLUB@yDls9+oCz8Rr^#Zi(y?5r<5@+?_kuS7dW7tY%@8tPVA)wFS zOw(y&I&h^_z;@LDcCD7>^UNS1?E@91Ki5C)% z$K+l8dQ}2H70B>~2tFJgFIFg_-YB7Z=Nb#NRZ8VfeXH_=O>x4s^-*fKa4=3ay~j1^ z>Eb#MlVG}l%sX`$AANomvEqF(Lo+iiw??_~8bY4I{vNL@pY|QWlIBoD65Y9;mcU-e z2hXKS#N5VD-Ks+G6x9O~{9*kbP>T>4u0I`vq~-#U{rPp#&Y#~leVSO;^6s!pDsE$NOvosAm2 z7U}lZ2-IxeXlzVQW6qLLM^cWau>zSz`Upk)iI?PP6(~t|$*tWRme2KIk`+;C7wSks z(~yB7uv3VX-$@rT@xm9ovo^ZRdlE*i4r?2d59_nxqTbnqQA-V!He{bnWT`3BxDl?) zYt%u2AGpvHRKj>-xNr)7uMr8U!auRv!-x*yk1 zEA4_ZcA$*~f9&bunWHXy1x6_$;^#*2Q>TIxg>}f4TB}3YK#3 zDl)DyVtJTD|Mp2J)_TljxfJoW+#1%EUEAMikx(-n@Z{QyzzHUWJ?8X=IiS$B;0+Ui zP+N=X4F!^n-3^TO1J)#%8>7ATz?+cl@32!83JLLc-Z~AQ7$#eWR-3<;k?#_MW}4TU ziUnBnLdtt?${UnY^ki&*SirT*`*9U7xdIpX-9p+kDx|{VJFY>q$$mRUMMi2{{^%Dz zQA6zOT#g2Tnb*B!Z-=0VRxGpX5y=Pyrr~TG%Y}^CZ_o%CzO^(VSkV7yfq~NC=xH-y zU^Hm~+aO?oEKa1KY_nrXrDnpScY@A#%EgswW9|h(A|95`lcLQ)b)S@+|7VNf>Th6M z1!pEK?HYgIEdyAbY7m^xoX)mfUO&=<-gr%FWL*Z(zKDN;sfmt(h!}mxj!%4gsdLG& z`1<4t2t6fL#j^LbZ{DB$0jo&(GK=i=I(*&<=40%D%;7!1&+i$#LCf^CrE6XTo|vSS zm85S9IQ02|%PAvK7lKKSq!|ON`d*D|P-#)ypzD-fig?`uMEf=FbUA+c^5=S=8a{Oi z0#I(CK=a>fbY~J9R0xO|>!Gd1H_BStrDNQm3FcLlFOuoOM=c34&S`*1;C!+tU@H6j zEpH{t=i%iQ*ObGhX;|gM)-h3q+!Vz@sI4hLBLrXiF##AZ*lz?hDiEM%J;Kz9{?rkO zg*N~DP-$<}v77ED@a;xvh&>1zPK>M)0TR^pMz;T0Saj$PG|3Je5mkr~NdEl+CKo?s zpD457J!91|PG7UASN1L&>1qzeY?N6<5OPMwq93#mrJ^O7-4BO}K%V%YPaEOCgLD8R zqg=^#dZpQe6B84JWvF$?(d!ZYjIH`pxd|;rP?Y$?7Rb>2yaxoNpNE|YMuL{WcA9Wa z>)|q50P46LZ2IQ=ko>!ue8&>nx>VUVJNjv~zVThxt0sR(;mknN7prBE!I`4k&V&nZ z<|V0tkMknd-`uJDP<)Vj)&TbLJWv4Rn^iGF@sX$uA?Dlx$bYaO#8J198af6&%34V% zn-!&{Pi_U@^S3SYsyp}DAG+A$ej>dX3{c?ApbG82}4U2CWDs zIC?RKRz+6c#g)*&5R#;l`2F1Pk9(7BYpH~wMnScT3kfr>4+m!QP`4UkotY*Z1P!zxUbd3-(B~@`EDnThZaqNv_;DMejf2f4(mo!j}?4_VXTo}xN z{9u-ldj+diA7^cek)*x9@c{bh6D&1R=9zs5ZX1oj+!Gn4-Y=mFQqYzF2iR^>uc9#J#d4Yq* z!EL+?Arf_ysTW@tQQ8Kb%QEQQUdL$#j+(yj%OzX&9ljaqEHkMcL%@(Dn2P2+!B5eZMu+5nr~#53Hk7zax~`7N9~p+~>cne>l!mEe<#Xrp=vhF#v?g>3Vl zpgV-j-`Fz~ym;s{B|NuSe|a>YZb{zbMiJsTAR>UMl*8^cm*!MqLAzALfLJ7*dh6%% zOOb<+>@}7p+=NkJ>=k;eyz!KV1c7u86;3UExoV0ICLFb_Q~^We(-n!1j9sQ>zCwEb zg;+JL5esF%7mjgwg9e4O$DEyV%y{$ny}6dX@H7;$cqUbBIop67k1!JXe*eRPd|KeqSErK zvYQDHcaWJtl-_i75lT!_%d8UoXnT7p?1TjxH8UYI#V4t}*Ukv`nB#|WOcK*| z>hZTr5$f{)Mt|D&(0}5bnfZU5SU{Jy+<#n)uK%jWm&CDrL9=z3QOgpyIOU5k@Um4S zQ>n6=Q7XbsnR5+#;6d`GA_}QDSTLhN0>wRw-n;BaIoqHeZ;mdOJ}%N+kil`pl;B{8>y+?Po)RHv-e5Ned@ZJXBVHL<= zR&U=fcn}G3HD>2N+_LQ*ZS#(Yd#{5^PxML^jZS(#%_ISmxH;mzb%KRiwt1+|zfG&$ zjw{#TWrF);^Wg}y{b5|S@a9E0?VdHWu|0^_aes6UFP4Na@p^Fv5RK% zm%m;n_k1bQmQ!~D3Or4t9zWo06nWiQq$Oc!5o8S_>>?-$^}CH~S@#WZ=Tntk`Dt06 z_x@hFM4^Y+b@EV0$pg1H%(gu-yPKvN(cW={xAqrZz5S7xkum->e5(YO+-$cUS4!b zxK&DgUti6d$YNXLs>3)2&E4||sO$0K01M?AU@|jiONFcwfShZ3bZRfUvb2Y2_J--! z;)@^_tiS*uqHpiV*mBbgfe>g2E&1l7OzVES+$fP(6mleq!bYO74xgMb;ln-*3qA{P_Nghk(M*qUUu*O09h}o zvj}C=*7#e%7QTqITB=(^szp*9PpPGRX27%q(kSf~W9_`?*3iw-`>Jd2xS{myn5{Wz zb3K~zp>SQ-=i)v=lT0vQ#zHdzC#+dyZsW=}M}6b=*vqI)d2S90%|gEb@CX%!L@sA0 zMKlPYR%zlGME}>pOV@uc()sr#664i8%VH{n&j5mB@Gb6d1P@07nQvZ6P!R4^bX~b6)q74M5^WX(yk#z{+f0Mba6yZ__C` z&Cj&PjfOhX7XZf5tHXz&0n?=QZ*DHKLCmm1B)4e}V`OfG=?uzojEjMpeM}unC4-7=5`j6W8MG(@PC>SMlFo}#cm6z6J zCh;JmAD9uXoE$B2b7|?=YQKZdWpx}tK4wz6C9ilX!q6K=@fLE2dr|rvuz>0OJZ&sY zIs~j9-fRn`9=<5KXtvhC9wQYCl*y?+8d9+K*@G%Q;Hj4(A1)Nkx(dZMZfGdP7k*om z!t_(oHQOW{&5SagpQ)22a&r0!HEATB#l!8g6OSQx{eEQ3-l%Y0AoUbsAA1S7n|dFf z>cYs-Ob*H2-#+NGj0CIn;=u9Q8woYV{p%03mVQt5J2=*{xX(r+=n6(b^5qw@!Mi0P zls2Om>xX==56mU)Z$b?cHB|(4abQ4U72@?{(M`8N`BS5U&{G0LUl@B{GhMgQj^ z{g$ggpk3lFO)JAxi&qrvI;pKZa|5~K!p%L&yh|f&@q$|NMaRX+j{X90S-G=Z!87!! zHd*t=r}uiUrJ0qnvEvsL=P>p8L!@}qhkbsF+aPmN7NEVCQ|6v|piQtJqaA|*-1_hn zlT}}7-RkFk9k6Lp6QwJJw*a3VfC2gBclKk+c)l@(tju2?SWz@V#fg-GxC%los;_{4W9Sl3|2$E%ecVYpQL1~GjW#=Of^-s=VPa5D80}4a0#psYi&JG}n zku`i-1s-(YnQnMuc~1$25SVtP3u`9$!;SX=MU^#&;iSwlD;paxq4-`JX47V(ZN!mQ zJA7qCib2Q@rh`w7_up|m8WaDgWSRd{vKap%BYpwolCs2qfDsywqH1%V-rZwUJIz_1 z_!8&;>YoBr;!`8R{sg$y0Q|fS;{`#;YLcP^XBQS6j@)_(%3B}GpZy=s+#mLH;CMwq zN>#d^e5;|LqAW*K%S9b^i&+O%HgPD( zSl2#QZBJw>;e7}?UJG+&$Zk-Gb?C-Rf|JNV&#YL&a|WR#i1#EN@=@!#%BP8g=eL!|8Cc}!p1&!?S415Z@BJ7Z)WZD z`;1?F9PW&)@)?LrHN{v!A~edeM)fGxTKM#Y!kVQ{7e()O0e@RNAqh_Ck!G&KZ^wcH z5b2#4LbarTBBKPQb}@+M_jwUCZsRz$zLf2p+2FUE_8Y&qWS^dh>D2GfzP9| z)4Y`A3}^TkyJ0AiSOti$1?^Xd5|H=sDAGQWzxuiAc71he|4=#X7YjWe{dXd#{Vd}h zzafyuEvDAcU$Djb#=;fg-U$8y)-E{T)=tJ=ayNN_XTRq;#W-1zp`#>C-ocb727XhF zn{Rlkl$jq3GfB7cYf}Znva~5mdjM$BAf#;WRHDO_uA=lxFD`=vfH>SjsW_`_U0I-k zImHXy#nt-p-a(+k4GUY|k?Pc)Fs9~BbGayn#;PgQa=6h~@cg3W4qL#j`ngDxGceLZ z2L|O$K-_Q^mP-}o%}>3PD3lWO#68#~8aX|N{#3(z+F6huWr(y@p_lD04FZ%A2(yPR zrhjX!Bqr@{Uq>Q9^a%Q2M+qmm5%b}ueF-?G4B0p#)LRuF*qXcPhB63xD5asR3gdUxmJ zEo}b|Q8F?~qgsHeiiK4)mIOTiN;}Eit%c~(c4NU`*ITdt>1IrGGaGFkqGgcwZ*D5N zjwG@P&v#@t;q7a{?CnMR*NQx+O8U8JHveTaQlNHO<<45cCx=sO{n5sa<7K_(#%O>! zQk~r7=vs%&!(8chESsN44@!Ike1igZFbWm=!AP}OTL%^~Ucw5VM*v`fR;)myNfG2) zrW%3N-H%yjnAHS*iIuh^6yMMS-vbiipUpNxX(T0tV@(h^Gz$CI6bDN7Aeu&BPJ*Ia zbw?j-3kjYnl!AnY8pKkI%N)d@RY6*!78aijK}UXirp+BmL5X%g`6^v@>x&Hb7(kD6 zg&A+t5d+fkOIi?2#0&r)LL@s8NFQfoi%zaiLmLy>;reD1T|b~^q(go2`J1PL8xI+Z zWXh1iO^6eM&S*z=Zy1;$Zr|;^^Wn>!yXH!t!Yi4~XaxZ{_GtZuu#mAzdUO3si0i`c zPju3>eexO?`Agk`9hbRzA5VsNSL7BwLF~T$VwPtE7U+GEvn{|l4k!%yS%L1X!eHCA zEA{Ge2T|!?r+;?YIhDt+1t!sU;svTP8h@J&@n8efj>Z%I+}z6{c0ud55WCOUal0!Q zURs&L@)L9>aT{ctm1hZ61DTm>y(>gq%-FralZk#FR|HMh9`|NOv_9vhtT@aQlCn%J znD0<}cHPHwV>^KBrfP0g8X?Oe>nR%0qf- zQ1pHD0)BAjxr0Z^IRG@}M69A2Re@@35DAyisX$ecM<@UtQ$iTOlOhoaq@(R@iQx=# z4>wLkE(jBu|FHxq5XW#+^YwuPgZ;c)G~Y-3upS#f2Yki)@xMH>&s;cZ&8E#*?8gBw zRzl^98L5O6@L~@;+A^jRhSdt-yMKSA`4Pv&zCR%b8IO$?ll;$IKoAO5(&!uJk2xB(o1|aJJ zmny)IFix#5RKojm?5Wd0?laO?2T;ClD)aidxI8^Z0}0{9!}EYqO9zkbUo2qa$?h$5 z0Fe@$@A|MgAw$s!L3G#>M9*yJ?P>RKl_hDmkeL$!!TuPBK)a+Pqi#1gZso}KZ%RI0 z?wx$!ug(s_WG3DwcId91Ua(b8w{HxNj{(PZ9ug%;(OQ8t;3M_;DNFA8wT7a`q7AMc zTfFI(gXvIF%+xEPerbDzuih!-F3(0rktFSP7IJshvh&rBJ*iSkf6+IVNOZ-VEK^^{ z|DdEk?pn|~8d=jchfhXQX_4=Taja+%UW~#|lEqpk%58nDac60YEH@<{ot9>#Gy?ve zg+`dZz<*^_SAT#8S7Qxvy8pqLUakt?uTLEP+c(Kn**`xy)t_vKsa2~n(a8v2>08uL zI3huYDH+K}s3iON7C!RM#+d>`h8o`6A9+}{R?VnyR4sf>g8W4#r&KXH4Xp8>Jj5*n zNN}@CsO-W}m++8H=PYAH#L)F?0$!M8YP7(QKtSw(Bgr&_s=C>SOjGEyZXRf0eB&(t zV9MsF3yDb`Dxob)n(UgASExPpw3l;}W;PpfVFhR4TO-^>LBmR+RJNMY{Pgz#ksXJZ9E~*A zJn$22{%(4Z1N8dpMQUx$lK8~%btQXYB}NbRtY-QY_d1Y*t<&~HMh*5PwIUrTgT0)S z%TYX_>LgAVwvZ<9rE3j*vQ-qC*-j2t>`e9)>F)nXpq-{V5_Ph8-qWPyth*l0<7ndVno z{KcW~`sw=kT(yd<^XVbSr{m^W@~-J69v&_S+rOA^XbH~(3&q>dB!)zfZMtxuF2U4Q ziu?N~gLV~ebVT@B;!jJjbQ)Qd+Sb=%)tWA4n(LyXm9(uO^`{mAtvh4}79|ypFrk3miv5+jCAG7<D?oOG{TF_Xe&EUt2q;X_G6G8H*O)4C9I}Thpq5MXm{gMdQsnL`PODzpewT`zl&Sf~Z#O9_ zW-|}6`pI{0Xn>;6G7NQd_p!$$*zu^onB-Eba6EL3T>*~*-Urig5;Sw?v3Iw>(y0Qm z%z!bmlyErkV0J6U6;ts;1%=-l!JRK{n%upmmd=QlT2@>z^lK;&|3-$%gDyUU-Qw;= zG`V#nr1wh(bqjseS^Rjh_LK$0xANTaC#@~nLd4-ql%iCNuxGP^Do3o%Ed-AH=$@Nj zTS!IYj#jS##T4L#)Q9g2WV=+$A!;a!zsbNDK%WmH9SV{p!Bdd7Js5=pvz399VE*!V zpBq=Z2_pXjqHVdYr-!e(sO^QO6k#>w2KUYPVWm=%#r3XyATgd5y{Q>oLJB~%rC<8g4x0_T!mQ{_AlcalCG~MmZ zL1j&~2+_$c7T$)9QrfoipWFJeBUhIsd9_)Jt?nKEJ`Hn?1|-Bt#Q)GfpE^iQz^MB> zzD~da`RkM$yN~e9vCR@p7jB}04-W)JzWoBIl3)8#438!d&ZGL@Jixcq!Q7z<$ATXi z75;+`6tC8)CPH}v5Dz+=T>^69ezRq&1r%?w{l3L%|*4J;| z9Z7!z{+NRa_5lesV2M&sBdZxhd8CAZ;9lU^gs^$Z;*_ryFhNbd7~*i|;>#tVRc1lf zYMd6jBs7M;q-k0Gp~W6Y!lazP~t zYX&WOC^AbUyfDJRX1ZVX3HeWgcz3!_J^+F<@s^ zThjAQlM44gvg_Huo-#3nuxvx-5gOMGTOFikk+A|wtZpO(*!ikt4_zAr* zkc$P8j~3*TQnyGxQVyBVe`Sm`P%H5QD9BqpeE^wIHOWw+9lt}6MS^VTsnuAOby*yQ z!5kK%`6W=~VX2mb{qQIm7X5=82{ z|Mdi=+?DgWeOaS)Uapi?8uXATirml;Y5qdA_gGX@GzC3i^YuE4*%-G5e_Qka=~cPQQrJ~_Y7hb zuXP$q@s!rf7Jo(5DF!Rk zmu@ezG^eCS*t$TQo*;t->Tr=N_032KNtx;an>PD8q0G_Z_Rv>=Oyc`wV*tmim|EFm z%iXz~y4vZV`*e$?>dEUr_H|bZ?2vyC&7JC7y++5wML6>X=#KmoFuiihsy?jhUugyP z4S{q+W2!jNXJoW5E4g(RTAcYtNYNL^6@!}yRcE1Gnu18zn>3w8npmmiue3h?YN~2& zNh8PW=ObkAv_pUcJQ83$+|>6noB6583dUyXrt?T}&A;)0890W&(2dv6T6N1}?lO?} z$nT<>m5I<>`f#Al@|8ph*SYy0rdXtt4U;!4M5V}%#0s0Ri6c!CbJl?t_K1Yr(~bx| zj;T;v9QJB?c^nOf3TR+Rr;0)2ZJcA5g<&^o&vU6Dxyu&v9hSkr}G$n$ocXt9gzs$0oYAhtx9}TuuV2 z8pAZrrRC+*{?`Ybez9Vw|MNk!{qKDKqh4Ub0;UF3rv0bs_q~2YuZr@Kb$8)~k`rJ)}DGk;MP3i(g1sal-J6DzPqd@C2f`lzF&$`LRtmQ<-0;Sh{xAQ` zu}E&_LFSKz%0}!FdA+4g5?Ixlu z?QRD@B!%!H7IvN1`YNF;SS^HmQRtkgBDy^pB!?Ud{A_|2HuJhOVU!YQyp?zgy9>e{ z3xYop^1`ei8q(^Xwx(ghU1-m21SD7?eIKLYuoUHE3vFJJ#O6c~l6KWBu|FiBR3b+0 zcUo4cWuBTI!}H4ZDE%nttyMvv@obRnxUO0MlLN>wVWYNkuK{_Qe@$N?VcH312CXrH zGwq;>C=9naat|x}(5>%mj>OzCYU|I%B?ItSi3>mA>Qt#lvzyM&4}UZTPQOpw-rWTl z?P`fU%Efk98BOGX{Buu6u>Al%`K58hVCHwfG*LDYdZsoKM{A6r8p0HK*M<}?oUt;y zF~R#Pyg(tOrFJDX<BttT(lTDOWEN+5fBu%#c1t?BI0F6H$^Oto4a^8!7 zz>>d!R~G)V%M_#dMreXODw~IArjq}QpswJ^RU;O?&QG?05eXY{7^du>C@8@Sty3zL zz^^Eq+leufeMLt-a-?Te*C=1(`)Hv{E4d_m(k|Uf?rf{7C-Tg280J)+ZM+iNuSz&D zkOm*YBnx{y!%rdnGsX_MQTS&-GKx|X(6n!y(59WFIA17~RS?*#rR-N&0Q0c8G~W3% zKg{!M$L8&t@nM4SA#H5xAC=?3Y{nI-G0pom|4hNdN=&DVygD%PrVJTJe?_)9?c%W$ zBMckz)AR&yxjFC?%k$PHBc_UVeNRLyS-hWj3K&WoXbUgb><$N9(oaEa{pL&BZb?;~ z6ekyf2+z--n3@DCi64JU@S@34@_FdY__P=&gg)C8nDL^vR=k6iNT*8U4P1gR(?oDrJ%F_fIqvrFNu58Uvy#g;L zRzTGxl22uZ+jmW@uq&N$HUDU2@ZcP&w`cOUeY%ulI4>7kXmTCk)XKiwzU@{9+PfU=XJ7d1gau+;uS1cJ^D zM_}(~B%+hCM}u%`}T9|f9Dlch0yQz?oe!aAZSse&q;B`{v@Lsu zr5m{wo!+-noYMPIs-u6v;LKcHFuviDC0R9ny#T30JV^NdrVh%Bqrj5%UV*~4uV7Vb z@RvE50vJ-mB&r!{m`$;c!XBCiA_7rrmU*W!q-GVM#S|SLi!vlbNQ>_BM7^_N8VF8H z^)c|c6)E(5f^AP{NBp}eCv4$e?~5|yj(%(SackL$AD8Dad)}jNi;S-*iDKAclz?&3 zhl>Zz>-~hWK+t#rsM?b;nfh8BJbuNf#&)W5zvH|rhv7mnqOy+O_Tl6sEZ0E6+pjU% zvTGf{*9Y88s#FEF?uUdu3m)hX5*b-@- zG7-NZCi8Vcwkc2;HGX)yA%B$q*oT2DdwM?k^=86t9cD}eDx!Uns|S?zoN7;q?N0HT z!Tt8>*2rfh$n2l!#RfSMiH8TK?x;a~;^7J)3OB25K45;`Jz^MVT4k|f%$Z1(6>h>Y zt(~=aD_l-12+*)=^!1!PpueetJ^m_SM8moxv5q zF>$EPEd;?UA@AuWFto2WGeMZ5(9EvkP55`{UK=#kjH)=+Zk?TuKbE4=@MKMV;#xYO z1Q;*qFgzMsRN5)@w#rdj7ucc|@4}esh3K*yFD;no6R0WUB$Iv)Gt9M-T7jcWD&nK13*(_li5D$t0!XX=`Lc+HeBUvNOZRsj#atW$d%UC4(xQ`xV!h7%9vGqWD(k zzkd0z?1Rk@;e4yT_l`hTtMJXXarGiQi^GKI;~wH$W2^b2hKrY>Q^noYsMa|drKJRgO}E;)yu0*V?}S>B49?0NUM)uT+xk_JWQjor?oF1<=su|< zW?*Jd88>0W2~ThoP~d4PW*f^xRG& z<3E>5Ji{^-90waTgN%u-nX@?|6K8TyH5d&*Q^!ub8OeKFuXp$U#L=?YP{p1Ae|IlS7`#ZREc_7<6uaks$qenBOMK7Tw64ftmykOo^*hh7d zbVR*^VzKD2S*ha0GMhzxU0f7HX9R;o3_tm4%G6(6AlD)t{Y*4m%UhqW>jojr_#Kb(0(F1t0-%`QL{l>BKK{wQ0ob8556r;?>x)@P=?E58R zTb*$8ccY!0Xo=Wb?P>j1b!hPci4a3G>Uo0DZJ6$dy9kn5xI+PcFLmH-upJLeM)fQ0 z?f zZ36b%1pyA46#LqB?F)YKh>({%&qkll*OpIbkFM92XdI&pyL7#+Oz-B;3^^DGSfX4P zpYWh5`deqpG2Pqs@Nha)p3ULnnq#$b_@KqNgZb(9+t=!A`maV!Ky&BEk2ac|!EPC# z`)%_1Nfn7;FwN!Kcg6+4)Pgw-@v1!L?4!jfcj@koEvW*4@sZbz&|xs@NjVCo zNa&9B>Zy$Do}t#gC69RKaCIJrY=*F6#X?~rz5H|WEr!$MD`k_MTulU)8TGfHUaTWT zCV4wN`n)=V9Z^d!-elXg1BYmQ*b z99>S8OsSIH>x3^l$XJjoD{P?g)Rvi4st>*@`?u5egn~ zd99v#3;e8QXFI>+Kg-m|>>M^?P2uT*-!u_R)icxA49)nyrS#G=E@=bGb}%xnI%0-) zzj_gbyO9B&T$VzCUHLr+kOBMrQ7oZk78%~mlJ7_XtWHrhoJg!dtn`P>)-2QZlS(-K zx=s>)GzY1CUv^w?rb4$nOIaHkOOD4aDh1w9;cJTfZ3Zyfvqs!=bH67?~z?6b`O;Z)P{|96%3dTmP z!US*#Ec}79?3h_(SbzR955>TEv*yDzW^?F z3XfXIqu^Znz6k3aP-QuOtLrSz5mr2e_GoXS?GTG!GjQh zaY5>Rfb0q^W(3Op-$FfkmJk>Pl#7`)9_c5{qfu4*{~}jzBqs-G3HHi|WtMqXN69Z& zED)qjC1TAh$?F;t4_eao2qX&*Bs!~I9c!r&!EU_41QilU!syMa)#~-o=ZHlr{xE4) zDo%tRNJ>k&!}`N|4~*;7UgdE`v-u>8VgqRI3TV!#-#Xfa`>^vW!K|Xs;q#Wo0Ew)# z8+(7hKmVdIg`L~J$e!0VbGEBbeq}K+N+PBA{rC%_<|Z%p&BB;h+JqAZmU1?8T7=?g zdS(b{W*wh~BOn5czwv9i1!;kN1=FyEd$)Y|JUu*|UTs@DG&)k2)K4YYK^^5yd- z7u_}ooAd(%lFD*=sxo$5OdHh2Hd}U*^?tdzpvoLAuH@E%wrUlqXN|CRurdVDW6OpmR3{EgdXzRYsh51q2x}{F30RT0@i|) zd?M9Zxt2JFq4=~U$cGVc8a2)DV^I=Hj1w)Z@cC;D;Us_Q`k}%*l(g#_1fvsPIY{9| z!A8R?8rF5X3DGLAk&C$&fC+hq0wrl6yn~=J3oH~jglySXoT^Ah_chsQp|la1xkIa% zA&fKoU8Y5Nq?nh$FM`@Qa1tYjx(B?(m|bRFZAWL&7XeplqL9$X7~nSLZPVGsUjY~b z6D=45{bea(id9c~bX)SIHb9E6?5+D+(f_WiRxLkgpPl#UJV~JdI2N`SZsqFY!tWW9 z4?xSINicE0hb>6YqYYmY;u*~XetA=PFE&#B-u34YJ1c*OoZp8nko^RKkh}PHMwij| z;~VW;;*E6GA%A7jr*AJaQe)EkSzN>eA^)B7xcIr+#%D2nPI%>kUYnWnq0@5V*p*Uo>l z_=1yYcbX4iJNPS$kjwRxuzHL4U%Z$NV7bcjph?IW_8mzPdAOx_+{KmKp!JzChj1Pq zL+de%!Q$Ahq|Lj%{kkE|oB2O~Eqn4U00i}?U%X2LLLD!c1OrgD)Fg5jVD4m%=Zu$$ z=T4lHjvJjpHgOVGjFKF30eE9Dq~%dk;S*Tv}j6VmX_@QN>$D3jFkz!*} zdDN*>WDpCXkb&jllBQpv%OMwc6M)0`I7jeu{e8>f8^jf(;m0BUvKA!hacyAlkI9tf8u?H zl;4oPp7%h`cPmhpt*p8N=6xNhGaZ2_Qjr2`6m*~W$N||?A*NK;JHKRWp_I})s_M^g z>NZqmRh3;3!^VAp$~0F0HD7xEB+Henz+;|2B$pyusO#7!YjAB;mh@E(&Si^a_GgvX zkXk{cajeVg28~V#*sj+_jrG;3Y#oe~>-|s-q!T64`2t1m0ZeL2?df*aec~KRhz~QmpAgnG4IwrE{ruCCHST37r zlaUyZdZ6}G&_GqTf@?5dLmHy5*~f_a@F1Y$tF6ruX|6eq;(#FYq;Q1eNGt< zctFyjwH3;aa?vZjm-%={Qy|lix8ce&T}-(nOXvzXm7b=>hMOlOcqx6$nf2V`gap(* z#tfd{V9s-0GmFmYyEh1em*@B};JzpTj~w`FExM;EHQy47=&0kq5AQ+DB*0%0P14j2 zPHMCYa6cy?5fQ!wROG^Fj}VE3VMGdk1dy=T?-<1{b|YopSXu2AaXo?IIzH1HG0gni zk<6=ajpUfSsFE0)M%Ew%Mm>>Z`XftUs))6$$Q>yarHmv+p#N^vU4A|BSWh@GEQ2Z? z91}b>Wu9tQT8cc6C}gq$KB(f-Dg#d zU$pUGk9CZuv4d@xO&F`QdN#;t0`B-uje8N`I^%Odu<*G5uo#jpVoI%Yb)-1LWtxC} zB1_u5&%QgR2Z7z1>FS6y3Yc;Ssk0q1?S@CQFAgX`5-EgH%|(d9_}Q(hV2$L&2+8mU zV^ktwD=b>^s8kcK3@lu%nasak*8Vq*0r7E4NK4nPU0jI(=;E7Q9-9Hf8UsO(o=AGIc$Ck?{)?~)J_4c_>6=Yoe* z$NkI#xtv->!|Yr35lNj}a46FcbN2ItCx~#@yieY-?2~BN4&cvq)Cd_#jqqHaTrjD3 zRP%PG2<1+J9H9NA5L^T)0f;vTQrvkA$1bp5SpKrC2c|#^!j&iSlIX0Ho@L^a>?_m1 zw340IEl;(47q+U>-cv@vw(=KZff9cLLC7Rp-A`VFhdmbe^U!DHYP{*!#shk(@N@Hu zLMXpjlpDZ+LXoKb;Z0q5gT()lz@I)?IKy{kEHm94ii!{6N|~dk09ZqY%3sA|hp%Sw z*<*=tqE$NhmSE4RaY;Wi%gYmpdLY!*@HNjhvisCud56zpgx@aTQn527p z*^?g@h`8&eb+n$9fCYP^#<9t+%-v@F5W~9RYxx(hS7u?y7G8a+=s2$eE-Y8W2tsOt$Mx->8Aw`A zVL;3Ei(F1}N&7ZAkvtLe_}F?nZ3Cg*I<>EuXi8qn91;aMf}gmbt1l)C?7=ti={wT@ zb+2;#ANMN13Mh5*HWvsufF0H6xq2oaYy$Th^}Q)iYSvJe!L>cO2@*B6DQGm#YV@*B zuUjPckFi#lv8-QFLP>xBy*Doh_OEcDUknn{#rfOSLGXqJg$KRP`2SC%m68IU-9H*_ ztt(;lqtS~0(P(AS#c|VwpPWCq^f*T(pyymRShGCx(!|LESeJG?{{osrA>qf{UIpl! z${n29@Vs%56hc7fQbl6&SS8i+r}Z2d1LUhgBU+*Y2qJf=5tTt8+G!EU^PfpBkglTP zYcGgQfqcQk2L2;ErH_uUk1kFgTn4WT=ytYrzB#*~AmPhZE^>ePmpaS8WS?7AJew8f z)HW$#TLRduMNR6F5YZwo`3G!RbWG7`W0^BdM)N4kxurMX$COp-7@x#~EHoCRRNZIG z|Wf7TtC<&CE1Mho+18Kwg1r-K^7{EmUQW`!37l1+Fx^Db6QsTd5W5 zFOk&y%^l&QPGN*v44pe(T8*}Tz?9-^plpN0GyvGJp@@BWw(ES<-ROzb0RsUJdKm+D zq(LJ6bgtZjHio&v`?S0b)z?lG7yN_lWFK#pqjmH)bB=qhzh~~vl_yPX0(+1z=s#Cbn9zb_- zMF0sUf`9xtA8$Wg`Kx94jK48x?VV~GOLtOPnGyfWKzP?mJ=viKxM`R9(G)0m&65prl^}`9^>JNU}57g+lHFq6H)Tg z_wW7?{IxYv6AYAlW!1XNxcNwC;g;Q$H~ zTAcSboi;4|Kh<0}rt(KYPT2av-?+n39a~#9^3o~L_SLE@TIMPf^{Gq9#c@~sn`5@t zXw^*6R{#3)jDkpl_u3}0(ovO=VK0najpS3u6ogQ)-1fP*(pO)@22BwmPf`L{=%m8{ zDRfuvjR#;9*Ewbblk6xckXMvDN5F@(azW`UfsB1wJ#c)abk9qmD5Cs; zNzef;$~~`!ayR)w@EJ{xgl0{4c{LCVIlh?9iA;jV>g&vxq6BkJg2popDgL(ZQdhpB= z?FVwPpH-HGqA%mOtSR^Obf3X^0=#URqt4FKB)b9Z8aV8(S8_?kAo}&?P|`DP)Q7D+ zQ$J+CZ#>~ia(ULg#{>ho&8c2&Dx0$JX7Kp z%<%s;CxVwo1cC9KJvVE}Rc(YYemgQ70}l>`8HHrj)!8*A!~d7ldJbYz$f{+Z`MnhB z2ND&;SMrG^bf)S$l8mpe?@t2j0|J|i*~A+w7y@FpyEniVAr%2&B(;Z6s9(zD7yIe9 zdRbj_!&V7WRC8x?sS}A0lp1@ra>($}I>da|-w* z+lyeRBirknTPsq>##zg+gCAD@qM&{1)PrcQfqbPpYGp3$euj9U0q7z}*R}q@F zsPHC)?XmG_!1g~$9|)YXm_Pncf%8KHTmeG^{{KM%*M5>W?rEG8s101VqBr8!RuUKf z@e=-Z(543mQ>{dVN0#g8_W8@oLg?4yo*6zEp~?5@0{F!Ik5TS;W6J!pFPtJtLP8cz zejlPlYF-d1n9x5&+ZHw~aPN@``@?~ylvVc1W|-sFOB{VX@E(W|AA_86)ofbzj0Ys2 za$}{v^i~Q~qWJHtY<^@`L6uKfLb3ti9;gdS0R}>+%0q(ih6_X3A5R}=An5jKd%a=D@^^^;0RuL& ztqp85CSGBDxj6VCxEAI>Xpu&m0pK!3Oq}3fsIZX(D3h*IMs0L^IsOcZB~9Hq?xK(X z45-D9whvS;gU+?BX&EnTqJv8@5J81qVPan4yg)ZN1gOU(&l|Fg zo92YKWF8s0bCc{yz(7`L3ep+~oBs_VY4sfjcKBhKht9_%W2Y1mkAn5Bu>ADybxm9d z7|&y`LqiD8Dl8E-uyz>Y6}7B0zSB=Qd9?m_rruO^m~}Vkl(E5uGP+%6ZgxPz{IQDA zNkAqEZV1#{woP3NPd#x1pxr|U4gUEV$#MTK!rEgkm)eG+lOlo66WQsO_;3Oul7GFNTd*_v@&c$Yy$?<|$V`pW-!TMJ_ zY@(-8@YH%q>ADLDZ%Bkq(T2m5%YO;BImj+d|szovARV`?(^ zp>BXYlNGu*O(TN{ONR<6j0DG*^;V)d>%e4g+S||InF4f~Ze5JGghEE0bC^!ZB-Qc{ zn1b%32h?OUO6(_vDYLb*yUtN@8$U>%D(*lE4wfMEGUOj%E^LZ1S|^c&kt4}PUf_lA$a;& zV%&d-&I4awBv4xLP{CHg4FNY>S+<*kWg2 zPVloC5j<=X5Xr1U5`7QtVf-X-GZZ)!NX`Y_-zW7W`)F`(X`U_fe3NWxUqXw~^$H$t zmklE2U!n)Ugmd?w?rwoTk12?(Y87EbbKqT9%mEaH0Y)1l;*c4Yvt}`~e*{bUng6Q> zf+Zo&a8Q3%(KVz0ZnN*A#xlTIlHj%MLw{G1a!D-Pz|i__26C=o3Fz6er(BGl^!r~e z5OZd|j-B16#gvmj!@U=?3ib~Cb{+VqCDHZ*{9kV;;OO9! zOuZjcTVHMpO1=hyv~X@62R1)qAYWy5Y^$Rqm_G~s)fI9p+lr7rLg=vzH*(nLhBiEy zU&>M*u^`s#)|PcE6GV*{*)DDM@q}vvu({m$#%n_GJFIx%lCu#@JB*A>$M#vZuIKt5 zy1?m*yj(6GM=r7D?`UgZ^@t0CO#d!OBpKh>O;)Ng03Gz7;%fmw81D(T7-~bBaXT(^ zV6|=S4a^dgxWA#LUG|gh?vtD`I>f$yAmPau)jpHaG5s<|@!jHsz$rc1^1t;xSrG{w z6@-aB*%u##IvGm<6b?|SvdQ4R|A+GuD2SYoA>kBr7kRpik5k~7)rk9@7)D7RD6-ohc2$XvtIB$K~fF?Yoz^G z5a4?*b8uqz&Lso=(7kVzq4yG%gn1{d1KefJHNd+iHwQS$^TrM&f5)YO@Fe!ajw zfDwHWS|D6eWx~Ed4*XcP6hI6weI0Q*1HeKbO$6dYzEB_lbD&kg2r>E8I4-fY{h=kd zAkE!gmvY1W!f>xQa_n!nRl*aQs8Ss9U&kOzv7j5sq6>rPHteZvz?mwR-K>{IwNUz+6OI{=a9emC2M+#T7pYt8nA2%_5&lVT13~ zXW10=aH&%aRsG8V=;y zyk2;QZk?9HQrSQDHr&sin-r=3{Wd;Y9V!o;9rf=mk^-c+URf$UflZh|3;V>AfOs<= zBgH?k`d2$u#8MhBtgVd&@$78&AUW&^R0RrQJZNP%)8cUhq|&!&8QXc z!WHizOW_(B?ricJ9@}%U&C0GqkAx({a*F(u&;;QEH9Zm-1dLvx=?*|WKn+P4c*^9Y zA`v(2iBv^Re>8qcS?%zn0Z|ZL0wO-S@i8n~nXj7|`i`0DGD1aRu;A;qz440HjY~jM zg4j(6R5NLrAIdKEG3MHnm5z^m$R`LvLQFchj{kkd2ZdR##g%RnhXyHxnw z9R&VljKnb1JCVunSVx)YMEWWmE*Jun=kK1(7-qY0$eFf!^OF4 zoLfV3Mza5W<L*>^Kf*$1~FlE0L+ zpBY;7ZhaKkg-u;fYr zyX!H#3=H5uJ<}hhZc>B|!H7_S;#dauIZZ>(A ztihIx2dhGgQy5aM0DHwv+V}M?-?kwcQqkNc;6^xN(myp-u{SU`Yl#olIb5(8c7o;r*_-)eamIj#VLL1GqqPj%SU=^cW_?BmOc4 zdS`dW#Buq!c3x0_IyX01%|grhO%(!6ZY{&*mSvpu&VjrqA8N6x?HXGEaizpSBxU|g z%2B?g&$6K!WhmY|9u1D`RFI>#(M#};aO$9{3!6n0t>hp?7_UO^yII}>Qy$$nl5xnj zxvP;0Hs=qgCEyoQ_X;NX^rXu9I3>xIn7Sf07xzh7{y^7Wf-U4+{yn{rB^xv{JUqfv ziLvh8Lj?ld+VW;!hf<0wOt_|d&{-YTF~BSq$MB&Jg{P4SmTqeI*7t2YQ?i(F9kn3S ze*-29KZC1P{-9<){fUnd%@(q3I`d2Msdun|FKtm`7_h!STIah#d%@%Xmj{MXjNKw9 z{D}|k!=KuAzk4Nh1F#`otF9a#?po~Vf>@Nx88)E229O+CW*hB@l{Kt`^))f%kSH5|^>{e^!>TBV5?r?hXso+rpxt(? z&+m3x=}okQ1<#ND>`y;yeMk4j#|h$3!>W!om{7_hMuuB$nG>_GJQ`SByL@K~TFyTN zT0HDTAfGQ6%EyuKG4pd@G7SQ@Dp}#Ha7UFfk2FG`q9%Dyi5ezEWEj5{DV7!BHdanDa^S3YFzw zh;U68rV6;I@xhLAk?N{4HD+l8JrmBfslQ8f6Jbnq>g{Oqd&Iy1t%;{4ocX#*e~A#r zJNtC9c&+BvK|i#YAXu<{NyO8lZ)WU7i$&8FH{4wz4(RLhhQRNEF;QeG8UG?}f%ip~ znlp;h94l%$x~6+6*jpjuqW*7m4RD?wsR1H&a$iz|9|m!zOP~gxVWp%W4^%A@0?>q9 zPM|d~G>vE?g3AzKD)W7=gh&bugw#8*+X2L?j5W_#3K&xxUK%gXgpd`CsZVq<4(3qQ zn1vT=D5M9u6W0Av_VwPBJv*w7x0AbD{5u`qwr!{ExxT>!q7O?UNcS!l3cswMIWlsc zym`i$6AZ6v+p<>26erk%`>$0RE3VK7+}?rRy0L*K+2a;~U;S^i*cwR75o$Fs>FcCm z5?Twf-^n(@zGA!<=Sw+OJLM+85PzaB)Zz(43WOH4M@${l?uJ2D-F^T~O9Hx2_@6`4 zUrh^8bzi!f$1@-$1jbDSMqp1f(NcT&jra5AZb%>a9Vx$O5pTz+&D|H2sA*0;Oz2|9 z+hpQyyRH$yzpBK@jruL5_2X*wcrjS7Bpdu7bYO^#Gx8+mun?hweyv6I8RJp83G&MV&7>2 zF*?|B*@IUg-p9nAb93}?u;IwkQ`*nNGIB&A4yM~`YXda9VBwgawZe@=x-t#&_DpUBlg`g<6jXm9TzA z|B)^1Q8XcrCv;SJ@{T)b#ZOHMI%fv!>Kg#4?RrkV5-*!5%(qxaI3Dc{NFI^cSLeoU z^fY}SCyDH`6= zA#Yx-*l;0RZ-lEKCLQi~cEw2s@*co@IBNCh-)sAqg($0w@!oWYFbqO9s;Bx*loM!< z#z<#P=HiXA3}ld!BS~k_ae<9l#(mpmI;3mU0i>j@cAMSQRW3u+%5sQ%HG8F8>G;)d)v0fZq!*VIT;hrU9g?@ zid8O$9-Patkym%_G$v*x{tces|4waz{+S;@nzV!THLGQp=0K=&UWWE)Dckw43>!gE zn%U$w=7^SP{56SfjIDp2X%E5VENz(tZ3(Rm~|1MH+$-IzO@10fn34T3s6Yi+tn`-fWwPI1b0R?@?-}kBP|MGgVEQES#ZP{2SRYT$-*N*VH8n@_z{HPkb zlEE};AAgiKqReojT^n49W*_qU9rjSRB8LSvP5+kVF*>Ta-js3&8DB;uDbL>wm8O&^ zzJoq2@mHCd!Q-iP-2BC)nb8id=(10du0wNCEInf-Ccn}#aIIRInb!xfT>Pa(YJp~) z?%zOl67SsCxv@G+LGhG@+ni?+)+)UBFXv+>EV}hXl6+#KB8zM5O5vZ!fGKoMe|vL% zkb@jNuaGgAM9hk3pd%n~skB61xkZ#fli6sBm?u#g5CB!x2uO z`?i2#I9;M_9_$#S*K3pk*#0mpdHjq?frGe{GnjWaxr?738UZiV3uCaM5)!SqH%Il9 zy!V2r^^+h%I7;$=RV7-og9JDlFl&5H4NbD8%1=!xA4dn+z)=_r^!u~6(FxSg85L(f zRV#9V*rzxBn}$p744M0RMqRVg?YUV`Gucx*+Ot}Mp(ww*O6;gm2z@w~L&qHn0qhx> z2m~M4;L4ly`ER57CsQ=CWBfbRYf+L%`PtYvulIhC1~zFbkVW?qTLDJdSo0Sr$*+xV zTW@iI)Mnat9)07$Z29TQd5E9jS?v@qI%&q=LC=SuuIZ8e!%)6ZLgCgHV-;VoQBRH@ zP3QY;Fj6C=A2K95InhOvbai)UyK~r9D4%#hglWYwei9fKB}dG>FHSpvZv36oG~th9 zLxjriIcfzYg3(@N-jxKav9%?e|!(Yu;T9` z8WZp%6OHRj&#Y#yD#nnOEGaK`$%V1P#jedH}b;m;&j*BFljc$+5I+3qC zbEoehP#4qg*a-$kxB#}WrdFW@_=gKH$ya*<3^4X8hlRQ`Y2S-yt)=zBO`l7s_shK92`j|Uv*=#bCR!7*}siK zJW^&`AtXMyoH@`bSU~|D9cp%R6lAKT7RfpzYsUFBS$hxmK$Nv=-`Ng`Z1e%}dAviP zZB|_C@^w3wBecATdPLB?WzHR+awQIys=U^S*;{Vf)-e|3jrYZf(-*kUa87-w;yW8I~%-gOevGyPeq zI_rjF{X}C?&tzPy;y5+`8j@REm$5Id;-qp=X|aCuRJOI=e1GOkbIep;QC+@@25zo# zF*e7%9s@37U-PRlft9*2jd>ql)(X$68{)yIdJI{^%o`qXX}sCRwkrd{ zLl^FlQe<4msWksO25FwbwC&}cSn|puD=GUNbT3wE_Y=pNCjIO5$<}edK13#1pI{#` zXvwE@&Dw>$mw8TQfIO3#cPQcy+f@`B2o41!>*Fv`ykyS!oE#$C|AuFp6fb3@--B#` zIS|W9P!q@K;oO6biKmn@f~*e;s?PPZ8BA=fA6G1RYwD9c_;xQJU)(#{9(+C8I+mfJ&jyY#eIT!7^Ijxm@nOvbx4m zovmJtW6|U8n#MajfAK4Lxbw>eDaz(Pxu@lolgne5V?w_2^@3yK*A}Gz2iSS|V%6KV zbiR)^{IK+-<^C){-ewufGk(b~V4SukeSAk>a3Oz9Occi6xsc`<8K0IRB1Eh%?o;u` z!JSk0342LFNSrBxb@!WA5<&$JngL`!s0Q33b5Jar0e)wGiRj&_=bKTXc1mK^*NL;? zHzqai_(HH<`#GE`el``M~@8EC(q#rmoKZa{(5}ZE}mcx zxq;`$$3Ib1_^ob!Gf{w2+c%S_5NeHsuC3}TOF_q~%90m3?N5MvFmm=SVbEHAEjZaR z#<4uhmn3#Fk;{JwZ3k)a|0!HKk{w=ugb1)EpiqDvNI4Qzpj$#uX>1-8`Llx9wea)X z8B{Wde|e~}VP#)$^fjcitIBgS49GR@E1P!N2gYKY9vmJl*&kk&cv2}W;<2xBl%ox# zs#fG^i0B7VQ&EF;p+$c*Jk!OKeCSjyl&s57e0)R2|KCEoC##{_;x?% z`H=w`w&^$NHqzA&j%?XpsgMdIp(mS26ThYECJ(N%;=yZdAv59+nN!OiX zYXxFKh9mA5yT7M_-O*kIscbWCXJerRH9gUcf`9m0FAtrhnW z(_)VWYA$j_S!(u3QALY}I{>E@H9G&IfNsh3B{@YGQ*WtPdxxWze*4GXn7H|UZUn&F zhineDJpM=sKXTTt&e%9ObC{)~F;$QFmgis5H}Xn3$+JEGhy8duxpR>uzr@2_TKN%M zl>Qx4JX1EvBRzPJ#KtM*;7OwqG<)8OsY|3BA-&FZRhOts#f6t{5jlKK3S(oxh~k1* z9C1*1A>51-9CYro^Pt!%=32v0pILwgdlLqam9Z)5Ojr_TsXA^m-D52s`gJtJ@O>Cc zD7&-j2MQT$Hz^6-i1shvciA%)i^3BEm03achFN&>iJ@+}iUPZP?sbfITiQtBN4}GR za3YYIE~v#7q!L_7VG?D0*-GSpWnGWi2jDBJGcT9!yaUKV7xu(ZRH?I_3VHxRhDEAj z*z4fSV@5`=2MD%b%}qyr_bk`BOlT~E+~qurZ-94#5BV$G>+Wd6byZnip{%apon<-3 zmrfn{v*v&$_)!?CMLFi;`0r$8;6#H^IYA@h*;;n=KL`V`0gWpjU-Odgxm}_J0kxJf zbHc9!nIpV^psc$ateXuEC~^RW#g6NK-@f@5$nI7eu!}FClj98ZJ_c|Bs>GT+MFr=) z3p?{htLUnIr19M^NzxxvUOg_aI~<21&7_z5Y-_#xPbzB{2w2wsjLN|Qr?20TOX`dk zJ|{3a0g%e)#ebS#$;|wlv)KXSj8XUAn}A%(qLh@PL)*+Q;jzhF%S~*IHZm#tLrK@h z7+SxP##J*)~urK&6_V(mE$1V7mBbebgyZE{<%q zjRP|W{XHkycGz$S-5K?l*I#@x^88Z8 zoy+4kfUdK)@+&ny_FcrsBK1+kLgjbnLg76pXD6N)p1u7D@m6rZ1+^%v1}wj~=`1RL zrbNW=crkfh2PCRoqF-jJ;`_aizMUfq-BU4U34Wc?Z`HSdF=B|!^26t6e-+rtMa#u- zV{JO;S&?4-FjQ)P+ml3fl)*+L{Jq7<{ zV5a42D7_m6Z4A=M0SzUp=(6iM9htvY@ucVGAS@Jf86}>4wG?h9Pd7PLaIDNX28Ke3 zx(9#97R`H=I31gYh1FzFrN2HMz2th>YPRRxGLAY+&ZkbBM%pMELHU4@y!JJ@9wNli z0O0fgVbM;Jx*1rA;L}!}54G92h%%B9m$5gLZm&sXz~n43`ztdh z*xuJRl1R$Yq*Gm{pRjMnN&W2p`)U)oHMkyl;03zdRugQZplYq7B<#$gep9sw7lm&o zMf6Rwr$vbVT2-4~Kv$cPtG z$P~LiM010zf}?-(x<%I*qWRw7Ox9K5{P;5}96Jkd!>04cMaJw4;cjx=@E;;=#`BX#3XyObP+XX7nRK~mzL2K?u?m@?HN$FlGkOk;5s8}NfiOxTRUVSs0-Kg zV}1xUo+bV}e_P9BR<8FR+kPl^J|6r zQZ}^FVuEw~j6pDwZGzw!FuXT#sJF1IdWCI+;9&4UzRv56b7_+8k_#==5SO89(WV-~6EvW)1?++PvX?~C$tPP@Ih*k^AI(-ht-1C;(DV5Na{#otO$*F{6xQES z6dsaxB|Bb!>v#fDNCM5{KW7F|2@q`vZl2&k`aA8i$J^TBFq_=1kD=p}9TM^E(RJ=#S{6bHvJa%!?^?pMJ&0tez2P8=&t|`+1fV znrz@_A+$#_nfN^EI`;ykQyQfC7uQd`EDD*gU_nKRR|fjz`*(cFsbv+I>~bPh=@1?S zRqYw+l&ap0)6LjNBt<2@h5rpEfOyci@418>kc@KrP03K*RN80#{>$m*Hm}W#CK^lC zy+J|R>bKyDIXr{G8{v`7E)Z&e|K+;7eoHZuvy1%=RZCyIvg;O^!9jVjaOg;R_a0J8 z*ijC_qE)3dO<^MC7^Z<5LfwS8r|7iorwTV=7#GBTuUytBKd0`{($1ljsgdR|e`~cK z=3G)~LI4(9+*nVmt;fXW*tTzX&_xW5o*Ld62?`JkGz1IP8p9tR9vnsGki9$m!bHtO z@HqRC?MeF}9clU=#aE-z)HmeVK_L~juj;$m~`xw7$yS%GBfBC z@h+q)?C1FL#ImI4{*hvvmMNFSll?{RH!ZaCSEn(x3Ti|KBee%PBW?l86weAhbjnJn z5*O$(_P*?Gx=lxqFxcxanB1l^o~#8Dwv-_+{hLud)okrFEq&rRt|ofVexBzqvdve5bNXxr`G6y$gF{NQxH!SZdu(b_Pf3h;4c3o6 z_v>-X#TWfeRN1zarZUj9pqWCvy7DiCcz*mi161QF>%gQ`g~5IHm+wgxT${ggx(+zE zAxrv0Ryp48F`qC!ziJL$D6k9LVP{QF2g6}NCC-pqhb`8g+KAe(C0m^S4&8cK_~rIH zE*m4RKU4y{-|tz_YqUcJvlw~T8(Vul)um*t?Yw$M?iU;t*iyL#GS_?kmoHyy>SpJ) zFSg(e(qucq`za*XMv>#&zsIV`sWKoq)saQO>IlKx_bU2As4%wyduU+bDM|kezqG#k z-d41pm|v!$=vzp{B9swo7}Xs~ID@Rdnpxob<_x@PKObfz(qLiP5`zmO2R+$Al6OJk zXs;O@1`&2~h~o&Rz7vc=j~PyU1gL21vE$-Pa8s))GcX1HG|sLxn$1dMR&C8yiUfG9ww>EJ&3 z+oS`XOQOGAs}Z1YMLdWj&^;n`nt{v#Nbm&>^XXRpf2;jJCp&21?99ynd4_y5D;?(< zkh_l6zN5{V1>+uTT0m`5opK;?+^M98WfFv$qI3+OQM`G6OUb5-r5d!5o-bMwZeMvD znnz*%V|U{t=-^QKdAMLnJL?woJ+5d6Mj^X2@xak(uedSdFwWGRgFyF zVvkwNMyl*wUN>c)bykOAU~6^&qqg-_1DLd%H?Irm{D*r--EORUdWnTR;}MHRVVE@# ztALEmf%!}WB@Gp7=GDaF5=B+{N%$t{T9ucP!Mp7pI3)V<(hD zJBn<2nB$i-QtvN)L9tLCz!TlUyTNk+E{f#|LnE@n336;MvG6z(N`52|6R{#Pz$2B4 zOJf(Kc7^sF1bdd9D!Ixc>~CFG+gxK+D8*n`um*%9w%nSCB44`rMn(D(EfuzD(EhCT zu*2^(IbY955DtvOYyw}BV*sOY`FNdoNB8$x$j)T4UA|)<8G)V04(|fh+iF2ytB=Ye0m&wcX+T8bP$qvob_9akD^M| z8~omlZ+eM2X4k3<{xzL82HCbKVW&p&(!eWSsl@`%Gl?flRa%=$g4i%U$}S4>6NJ$B zk}qEqbP~T=kOP@(a*y%RA{l$l7Ke4D07HthSt&kdy~h6B+^0S;Y!fwbnZbg{5iGu( zx$B`@VoT;w0QaPMs90yT+yq6Nit6@xtl1}aZVU{YrvGvS#`7X=bZq+(-l0a>yrAyw z4YBZ}QP~DDVT=Pqn<8g)M!f3w)l@3`l4BrA`dNCZfg%0g+)Vcl8q?3Ru{Qm6P9?X^ zD|$|Gl64`42m}OpuJIn7zD%6v!c579m5-%w zYqYw|NX`hoMK?CEPs$M2dtOIZr0_VZa_@4hc{axAGxR=AQ?Hgyll6m|F*3n-XoOb) zl4|oQ=Lo&83jsXERU6~)r)m1042cWI-^~sp;TNC3E!hpS&zntlm1kF9z79-S0v~eI zYIMKH8>&=H0FX9dma0);xM75qdhl)W*(_D zl_D_}*H!g3*bl{};9nl@D87S+wbur>Ahr4gH9Pk^^KLh9sgnKyMVjOK+&{j{3!?V> zwZI_lujO!WY-+=f&Pa}_ffX;tG_9$WxV!nn9Woa%RO)Bm{p4IES2S^EpAu(wp|?bA zR$vMIt}klqf!1d#q91PAh{d(Yy~Z3ZokqRrK~vzOCTS3IQ-822b3y$xRUz2? z%R$!#OP*2g0vJ=S>pt&~>SZX&%<}1r^Q%`rU3lPHN%xg5bhC90_PNk-v@R%&2<2QV zxua+hhpphs;cV1QdSi-}86tm2VRE<)!%hIh_xc)@?v&G)(v$zr8{a2CK|wPz%iOJ1 ziLOl~u*)ADcIfP!xE8Ir2ilNgdIcz&d%|G+4NBP=`BRd%JHl+m)L>0sM7l1=YSoOI zmOd;W-*J&QnbuLb%OFYOklB3RwlUhRxr*MjZ0n1zrIhqrR4Iu>O~vL&o;}bx>_Qi~ zxzD=!%;oe=b9b}|9+cY4!$c-w)HsL-)>w?OW`h?`vqL6FZ`@VwzBG+mE!rpxr@aqz z(o=M)RV5?Y{?KNRn4hlhPf))udc2k1jR&&B%)Dwv-BGnz5GqI!D!heEmQmv-t0lzD z!i%xGU3Nenr{1AV>8hrjLR*F4pX&p&RYVkcTE}Ka4h|nr`u?=zGT1EEdlH5aKd4j>4+C=R2t*dtB9T?EIPuXlB?a;^9nHA1a{0Uf@j15D0;GD?doFWtpfQ?Xm1YygD&!)hIi$r?Zk@(<9v4s|0j zzr;itU$=WL-y%EcHd$NxtEhda<_Ewx9?8YbDxL@ZwFXGQ|4&0F*bn86*JF#kcl#4M zwmT0>l4%U`3uxK1YXe~j@;a>eiZAFX*l9nHPEds3v5k0xL{GC7pFp559)jgWai%?# z8*nU^{@Q+oD!KAqwZPPFf-WMvYTx9zzN!wPht+a=I|3`5(1A($(i2qWm^mS}Xrd0~ zFM~qPzn8>Li#nQ{>rTfm0r?GCJx2Yyfm+FHSI;0DAxgR5zus$oKbEMt$$KsSS%%eR zDvH0G4?r~1!~~>z!^RQboI_8Ye-Ev9;HEQm}V{`JvVq%E%NovrHyI8qwL2Tmf)7j(C3o>ciuk7 zNlXmOBu(Gc(5`v;d?}O>0ZT!VnJ;j>U+Y3@Foh)o^(&8bK2E(dRhbAY4tEVmEh@8+ zI5uZzVSH)?kWDw#6>ausLTwMwDDGWfZxV1)PO!iLI^%l{eTZPd${x$SnBJE@ubd)q zBH@D~a-f{sL)0tASueG=9vZ`xG4-W7!2X2`V#+H7h5uYhc;HIL?+To`AVG)Sx91i9 zXaw$oJ3PERbh!S*UtU%#j+J+s>AzH|2KtukY2#?$@?`*d-DxpY-H3eEp_e81s}Bo) zoI%r$RmzV*lss%nMUJ^JzAKwO)-JmGu`-Kg}@vC^Y) z$f{VKhFHz~8{WAGY)`*j{zcD#G=sH*cIf#{{dv>hIe%`ku+x%%+vRiGVOeK*^tORY z&g5-5WKLr87Rf7T{hq>e9Z`Xq1Y6n}w&bh^h5-`h&X@?*055fGkYc`%YnsS<<=94I(jtJ zU3%s9^o2DKhFm+$6#+{ZQjVyRGi?!Su7Np17Df<$o6=Z(&qDl<{ ztc~*?J+GktS$yhJt3>zu`ccD=dt88iW!;pT*7P50Qs@H^O zcEnbefS8QQ-KK#qN5^#x(7!AMd|Zp4kAljv&%e=M{<%fW=r)1M|DxQ+tFXiYm@@lr4WtGhv~&oI28TNR%8}Nj5Kn%_O6R8}Wv;hUygM z=s$Y(kg|aF-(fQUtE^a$?~{1;Wc}A~I8>pEmfbu9y7zVUP5v(hBd)HyArp~weQ;H` z)tQ7w3!G9J$-Ro6>f-^Iwc4h5Wcpf1&#TWVvoJW}*|*vB)00DCP2&(1$(&O#SXolB z?{pDJn4=RYJ-hKhsUdB1&r~uTz66n@u{OyrIeK|ZgjrR;=40p16B!K?8OEj;HQ>wF z0%^qF+Us?N?jwPi+5BuY3V1Mjtqx~|`P8g6Pur{PEM62HGFcx^!(*5gX{#TOdp$-Q zffvDSH??vw2BQ$=%3B4WZud1>otwkw?!`Ox#kQ`F>{R~y`08;@YoT@^{>Lb#iCm$d z=BC56+P zTu82-hM;NFbpIFJguH9Va$l_Yt# zetP%w2}IJgpl|u`dSK^00f@Mq!*tucP~lZyfc#>m^3;+bshP6lY-htfe0}G#l#p(4 z5uG%K5F3XNPnGawT`EaPg;5k}fh}1$s{W&>W(8qMH(S73V3D6sXUsp&oBKAxG4DXO z^s>0xFO+Dw;@aGK1TW${P}xl?R!mk!D_!W`NzC$;+JOq4ftRp(?#U!a zb!gKYl*Q=_{kxby@xbhfiSXgvm_ z_VrK(&*GMYb|9CK!s{ci|cAcy3z)UGqZV|bc<8m3vS+;)z zCNgH_QOW*L$HEb+#_Mg9fk@_&72Ymj8p2-CJ*{IV<&ou`eC$|qzr2cSpre&H3hzV4 zWl%;%CES09v9?3}739dg{w=!~nInq1hM-y)H8@7#7PLUY zSFYehLIL5;k#c!OMhpc7wlqH8PQ0vQ2HBbktLzB5Ki2y{CT&)}zH{78N-4$~i%<9> z6h9r*{N{cJIhF@Xwc64bn!{iY0sY>7440#?AoP#EbEHGA{e@j>QYO9l`cB*^5MeKkk)f@i^A{)7`g zSX!ikidb&i?#w2s{g!Eht&u_QTwJC5TEjZN*aXWxFD@{%9$>*E5L&q80o+s9Nuu}C zCH2;zs5~+``*P9XrFY44`PtXjjC}G}5xUhqF#zvD6&!#dS?39(yRhnj!G0vu+P$=& z68wA2-X?WXpk<{9`dDqi#46d$tWH%*0*h-@^Vh^+1&>lRprBPi6DF_C$xEH4jCtit z7{ht0avsk7CqilgYIL2Q0x)7;id$Pg&`vvHEYk63G9GZEzAY>$Y`)2zji{39_(ex^ za?E-?@m-^Yn_RLs9t_faJFsjLyF{LHf)Xjw4?$Im=9$HL$4n5lXSOj*)PCAHsyq__ zIof1aHb*a$CN!8?#uPLV=Ni%N5(xXb{-d?KV^x|MDZ?-8LkLti2e=cd>o?9Ox-+h? zXtMo@8(_yI|JrLR*1qQJ?DTjNYQy-}E)&>*z-tB;HbA(L=|)ML6Lnr(X)0k%^Up^p zGwVLu#~7t-nxMNDSR}!t)j7ly9P^|Z?uvx$_1xk#a$c1Vk;+Z!?)iKhjOO3Fo?BRB z7vu>#$?%(eIydo)0r*e%t$RiriI(NO!+xP<{p`1arb`{xv!v_X~|LM7j-o08fSh%5JVqQmKuiu58>?mF)`uyi=Bb znMwbfA=7O+aK_(Pg>q}qu$RDqV>;YTGUYxBiQr#jP`6bTm;FAaGp~ZAWDwq8??~Pe z=3Bw6%V0V#>Af7`v!&%#>AZ5%MMNhTxUi8F7g}k?;`hsgdu4* zeh--+kRfU0VaGt#-XWNyLhz((@! zjNudyi84ZoDE8eEzT=mWXz2-*ut$q(dTj^`(k{8-j8uN%$u3ms(iGJjz6P6tRnW|9 z+^=&vmFWUXFVD&c^KHHjI}ez*lwEAUsTj~8P7V9pfd@fZ^x(K+DP%xDhxbmZ;Yi=i zxBH;x#_L-_V)`BchV&Q0^qF6nb9e={iQ|01Jhi6%p3aYz^mJVId=&CZO)DQ5M3`-D zg=AsWyQA0PY=a^caX!1I>P;38s&D5B{D+X;te=3ny)hPjl#U(^jn+rJ#wMv#b#p5< zyu4XNWrlR@S)nQ)3~kKRoSygYPM@D=|28^1d4OIn&X;^%x!f*t5737XdF|A#ceu`8 z(&At{tT@y6sDr8Sm{T10sKMvr!K?k2HZ*~W$t6dh=Q^6EB3%<3cid7GuMS7NJQa5) zhuc77c4v8w7CT)%O|NEU)>FV!rM=ja218E79)ni%#&7vWx+|;bU-G-|``y~he~WF_#hMtU-D&K#-OD@;gjoVuWnQ=(J?J*qbx3VAcJlAB2ni}&pHt=F zs&*{4_Mn>g%aM+VSdg0kvRs$Y&YgL0m81Y8gUe6t(@lWwiS){fnEO8ov4cq5@N`w$ zuMD2*4@uJ(hUUvmrfq$<-N8Qad=ZDcIWp)}<0p7D>R;NaDkVJErkJ8lk2!c>_6LgV zBA+x}4djr1{o-nzp9dJ{NpviKCo1|Q*UbSB z0DWE)W?&(4Wmo@jcS4ARcJyAN3fAyL|0Kw& z)9O?<@sI}+!8R$=8-}p5N304oz#UZ7u=;5JRCpZkRE9e2|Qzro}>~ zxJ#w>TTO>qI}Up~rgHWi9G6FTP15Ce1Lmb2jN$IIz&mPXK?O*zK&$$)Kbm zh-1;K{C_IkBMhgZ@^Xv)(iDaS53rXTR$`3} zXx;|U8^Ie3fdEh9f1WgQHM60I;^Bo*zi2=PV@$(vFf{mi^YIM1Tj?PB~Hd;3>HVR?1D7{e`riGU|=Cq=tKE_P4zc0u+c$* z3{%<{$l`jr=?S z+bS$^U(z59;u?X#4%`a#&;#DbT%X2V5wU)+Gcr~1?>pnZvpryZt%+e^?$Qw3S>O3J_8=3PIHC;w6kTDUB{({zw>{i6J)Q3>(Ayg!a`#Js zcNP(<#P+vM{rUm%ij=DPzX9<3%c()4K>%180LcbL;M71Z$9Ya<@9FBB^;k36fUCN{ z{<#bc8FO*=Q{X08Y=2OZzO9OM){jRs+R@N`&SY6C`cT?x)wjwnoy#yc$7r`}sOn*V zOgobkNOomOxBXNKtfYx~MMH9Z{WC9-{B>j1e?sKUoY9_<-emVB(svVIte-o#3_Y9) zIhQpR*zUkgXG+&*_uGndX=5-NUfB6Dm^5$5P! zkzn(~V9KshwMKGf&QOQluFr}*MqQJo)SKPpYI*M3E-j5%3vFrDQRlcxF2~3VlGK9Q z5Bp5H<)?A$LngmGlZ$)gk3*@@jkZ_n(E7SnZmbrWF_H19y&~NWIwR|vZ4$18qj*aE zJ_q1fl}*!9i|M1BN;wm81lZ1RrTorA$JDClYGcpG7D8Cyn>O`nkqM4oV>zr(|t1`*a+#9b*Bde6y zQjA^pDyV+#T*uTwXBW|DRI56 zC68#h$G%g>@hZM66`B~%`$s}VZYisxvA*VpUSx5D&YI4tQplNCJs*W;!DI0o&SnAg zP{}pZc_&RpF6P!SVh468_rbDC`3lk~nI*42dRiLPf~ZJlwZ>}-iQ|1TKfur-swE@@ z#gmc!g$Njfwo(|nEF7%q741{uUi>3qMi5C<+Mub3Q_yU31qJ6HRc-25RI~1o!I#LF z)iM^LmOE%F8f=d>#(J_Uol>`-N)mv?xvn zX=TlsDNZ}(RC@-%~n~m*MzZH38mc33Etm; zv2a{9WS2bg_6h0^p0UJ*P|2E%DrF&gnhk!_1~t^$y?bTFgH(W{6PX7z$hTNgTy%rv z&i$+3F{d$|C@W$e#WWu$-EQ&)szpy|7TjaN-&!jK(p+-W5`*PtdO73F1!sZ<6i23J z4?;y)3c{bSlS0{QOWT1Mm$$~MEB|GTx)czS^d5tVY^Dwp2F=;vQ*pzLfsnAz$tmB~ zRpblt2T@i*9q@sE$1VfxPbwq0b6R3bH+@_E{83`UYtv}X)p3R-I-3Z%+~DQq4FJBf zo73{1ajv_*z=+{O))CM3i&ZiN;{639Bu-tDs0@zI@xQ0I1E8yqP@vZJI%tbQkNaLo zp=UTQ>_-@_9i%o(WXLwBPih}sa&5VY&vOU~G5FmZiBZzfaBKpT2$23ZJc0x(#V<<3 zRWw2)=ENBGF6O?$gN-x{v-FScelD9$Y;q|~z3%=9j--_ox*_avU|;88~AQZNKKd#?QXOU_D<%FUNkCk>r_X)!pBaCut~h zf>_-Zmwcgx)CwW4tRb&;@k?#mce~P=eNdX`EbPO8w<#?rufTYm`HT*OR&@k11u_4@ z6y?K4j8{3;@kgRiCHMYZX*^s@T^>T-wM1D_3n3A%Cz0OMgpbgL_SPSy7rz;A8;?l+w|9bQO z6^v@8Q+Mu2*Xq+-zlMEzGGF{!o1SPTPW-z$CXh%RPC5Js2TbY@^sv?_`E5bfXNoBY&K5T=O8{LK`S^Ks(M=(wPyQ98D`%*s$^+ zr3qClwm@5>AvAQO$u=rz$pDT;hnxzp3dp=OTbwJnMj~nCiEMq;5@WS`Fo|}mq^i+n zTb7u_2(c8fsIGr$U=%cZ>clO}nvOde8x5$Wr$tbus)WCNHQETEf9i#*ZY)B`fiQu0 z1%gNcmzEkW^})|DeCi*0N?J5VF*k2YOugWjN<*W2vCl?!Q9)XNRlZQ`RFk%J6Gv~!d>Z` zKK?DMop)pQ`%gZOFFxJ}>}SyhX9w#A1y4J6tHaBwsjc619G5%UaKcsoNTeq}z zDtsVKJ)H=G%*vnF?OTzq;}7-9fsoqjc53IBTGjAr>s(=WY}ZxQs&=l6f`o52k9UiA zy+>XrJyuUUXT>+8cQ{K`D?F=Wxl{ZVQOLjWI1(t8oEmqKZr`MG!}rRKU+sMji)%8G zU1^Or5|4MgxM=KdcXTIP`I0F(Wd>qFI3!C(Mv|0ieu9vYqllar%p2#=0}B{4aXs3y zcZbxQnL`nrchGfwkvLZI4`XLj#FA`#@?9he4pof=E60XnYY78FLcjE>%4kX8>{-eFY-=!sXBI*W)0 z{j4m6toV*qUf=Msu*GdMuN^#MUgpe&&t%3u?etirb@t)hYHJa4;HkqOTTe(!PxL6+ zfq3xOs#Wf+3j>y4$qm@8#uZvvtvB(1uTA}G2J&TYT(gI5{koMi+hE_?2*Y?{*2i2y zEAT;@HbB%fK`WwsCP#SnxbicgRx*%4)}x?Vi%)y5PCtiNhA!JdT;6#Hy2bI3DkeZw zhk6trqIF&Cpz1adf%+VPX6!>ik~37&{uXp+dbi>`qPQd@RMLr?erPdxd-2=lLHT}d z1$4~jw98BYyGKt&P{XP72R{icF$WZUuqvsBU{x3N_pC!@9??)=V0J12^ z#Z387Fy;4fD&i)o+7MG`N$}Et7T^}#`xiAbwz`NXNl@K^f)uA=?t3v@W4}0Jeg{My z#~vtk%d3Fe^-$3IGGFs{JR{x2cfDER&x)HCFku%nk2dk-etXUS_LEG&fCd#R2m23=GmMULaw2q_TT`wZSXI6W$+9 zbS@bKt$@aRMkA_A)$IKF%A`LGKkRSZZw#4V&J$+@A{r97v1GtyV{?2_!4weD;&-In z+NX+~nG3W7mn91N^j2v~>+3?gBDbKVhs7;Gx1!e9N-;Hnu{8O)h=dz2`-~*)G*)k} z+DAkCJC@8Z97H?F&;+Gr>Pl+*|iH)5+@Yd)I~X^ug42-(U-RJvexxrV+#9>@g-1snb0^p zrq6CSxWR2C02ZEDsP`L@afV67TM8VT4k7(|vGDVMS*Jc;sxr7+iccByZth4#7*yf+ zWZJi^+LO0zSm@PS^|)KRr|X^e_9nyJQ!!LnW$%C+Z<877@VHnO75KPxL`D5`$P5z6 zwhfWV@d&zZE^fVL{+OZ~v&W;b_Q_9%lXD4@0E zQV|9?*MvPR3}cN&!I7feI=6M2*20p;kdsj6mrh z6BtDHPvSnXDP3Pd8|tm$fmMz0Q%M2wbvM#UJ|{?)%uSgeI(i(|659b% zYPnHYLhXL>p`aL~ecJOj>BD0ON+K0lhX!RM71Z$?D%IE5V%l)lQ^jTZT3c8yP?>Mu zogtIC9*$X!sld3Uq@j@@E{D=OY+W@^Rv=bQkdk^gZdgh42GBe8|FH3yvrnBo zat_8=suSe-jla*Q9|)p2noIii)xZrTJ^vv={6`8dG_~L2i2U$-g%!}vE;}I?6i>U( zw=0}AJ*qZgY%zwj9}$pDKK*RWtxFq!+b>~QRmSOmm-=s^#FE{st(CF%*l}sJj@)d` zbWi&Qoe$D8om9@ZJ3jK*=U5JuKyjBU=gsyW-DTTrc14K7EW_v4B4(aDRfPgLyD3;# zT~_3wKi56)`tZYXbLQ@kSU0R<82`>ni&KxYT!ONpx-^?X6bV6kU&7lu{sVi_qUXr? zfL(ukL(1a4f2~mv7Fsg1`OA(-(!flv0h~<)zjPV7ASj?U3$rg2MQD$Md$_h0+6K+NsczzfMy~NAz5fbY7rG}< zXX(Nb>mQo0*)PilA5o-fa=NH6JAFw|E$xh62iLD#=O+w(JgQ@7p92`M{s)N0?L+IU zeXEC+z`1)`qIg7b`T-bA5oJ#RKgPY!Qo=BmrYNgXa+>`zic%isG5V`AiA0 zh-z^wAi||7_PWsLPz1Wv3ggB5{INaQfALH#d^N6Lok-s3GP03k<}xb|BEsTwc2X=k zjj;X~?S*fHrLRd0*AC1^_N*7W7J3wYUd#jPCG5~mhk6S)J|X4!S8u9rlF|q z&2)YB3KWWi6%=n5h8)`oVUNFN=xH@)7WKOBj$amvB-{XuH_-*#$l+HZ^{+_5u~xWJB16;8qo!j8BUxwpJ7S|#ecfT66aBwEDT`Rpb+n_`9vf>11mTz) zq`xIJ-p&33dA;FuIlD4khs${`iLryU&9<_!v7y-*uL2COBaJ&CQ$Jt3%b~`fzz)Y zjA;^2uYFDaYT)iArucF+KzEK4K37irv1%OU(+}q*t6H_b%Nn^#?kp4TbZoki>YQXn zo9w-@#?}$yv~qA-1z9^bKjtPoyyZBX!#NG?GA!yTbs4Ir`NI>=%-GnPEnn!IiSgTCk^gaZi)DJe?~Vq3LTqNp zq`eJiWN?ALc(hPU-34S$ieJ8cQRP@iiT4>Vj#~@k(kHw^SI-eIws$TBpLOG^_!cvx zLBy2J^$MUU(I4(?DgxhWtCYha&$jSPP({`JwQPU6pb8I^=Y6i{Y$@8?K~(ka)LIt% z)5^mecvco%rm3Y9-O`&!?8PkHY%Xqv5BIqcLyYASvQJlX;w=v-xZ6k^Bia5AqyO$6 zef6`zB#PtK?3h=wB$>^IVfeD@?d(>Gq`fM?z~6SRr=RORNFs!bn3Ek(DH-J<+qf@m z!!83D-((}xv*~|-N!yHLKS~(YJeLm|>Dzot`;H^i!>ti5^1sCCVpB+p_WQN-QaID3 zMC%HI4)VcJ&qL~j$2AZv62**F1q+ktoG%&lQ52VBa z5cx1uZ}Vqxgk)J1d>MxNk1bfXP1adaq7^VSNo0VFkqxj5vWkh80cCL^KL|VQnN{LS zV_a9S+_`sA0joMNI8YjKN_~AYhoa@)jO5BW>Q4FRcZLI`XyQhzQGXwICphev0v#|L zR9^HTRw-nF?6}}KNqs<93(M^Y^xjR%sQ(~ajMbRJ(qW?rZL)S+_!$V zXdOT~%43uLM(0y4Y4g_Kavzv~ufC9{KkRNueRNO+zu;!e`Gg>2`G5fpubO` z*V$;_V9(aq?$a8}qu!DwRV(u~&9o=!Mmo@7s-j9M#HD(=*Mv3Pnr=~A#QPW63PRv@ zFnB>8tRr+FF>JIN)M#YSZ4Ep6fhPPliMtYhfIkdBrnFx zI`7*dif>-SyhJOf(8A$^o?H28nUedigN6x&Mys7f{~nba(?stuOD?DO}Sl|lKz89leHKClG$r>?1f0jd$!9Gv?j61>~0DM*yY7ki;2U5 zIksAAppqcT&3vhD>7V`27-IdeG4y@G!t}p`HI@Gt6{TuPZYmLmRNGu&!&qN05nr)B zPCmao)-X^?pe3=j@bMTZZn^yD!s&?wl?Y-FoY&{ue#~Pl|Gr;~t}YaS1W3X*tP=PB zH!7+HWbo(aUOK%un~4=2v$q*jB%!AX#kT9}@g&BWj6g%|&gEN^z~h*!3vgr!iZJip zdjxCn1HH>+dxAi%+g24=jm2IN!V}aVa)g(7dG^F4qQ(B56a}M{L*H8?@|_gL@U@ha zz8H)l10x_rI_``(C!cF{yZ@CrbU`^l30SDfe_)V-*Crss6b@+VzW%XUggsIDu0CvTbe+I11=8*5Dbkru5zluEl;s3eSksa|5inP0hqB{%G$_HR{$Gg2kQOzAR@F$mXbnWijgLSK#ZD~9SK zNLnG|>QQI)qPeR)uQT!psRxY9jSWAqZCk`^pIVCmEZB4;0*mU`0kD|CEK0gjCcx56 zknG6GOFO-*oG7HG+wsq4w5^osaITx&LXedY=|;gsSLa`*b=>#6f0q-Z$=7|ZQ+?C7 zJ7|a0S0{W4)Q)8)%0*VPKVUMD|8|%vy#*L+*ue3S6A6aLdO4(&-JkE(o zSKfWYU;kceeDf7+yI})FSvfFfJX@enMy&{ z$V#@`kcE%-IOqhM5_rdc?njh>Nsz(BTgcCf)$y+0Y9s%;Gx4-zROsPulF5TPpl05j zXf0`T(P3G{+?BGge08Ljq30EufKi+v!;FxpPKNQVd8(4YfK)_&Lc0hzv_0XIbJrMB zT@pj^oU`6%zK|WaAPiblXY4igpCpvAqSRmP`Qpxhgk`noHvg@$pRDXe3`BN@mT=tM z|4$uf1tbeleEYD8%35~m-#e|}NJ5l?!TQK*kBTJG@TE#LYkC_M1wm9&FzgiP&FXDX z@JWZ%1x!!&rs(c#E=)hxkeonQ43F#TKmi*Gm4_=gD7R3<<^Xr9%)`&n0$w zBG4l*v)n15Nh=?N*|tYhZ4}a+;qT%y z!td_S{0VvZOHh3LCnL1zG=88t!y0B&@~M|eTv!MPKP124{l zL_B)N6k!FuLzs$h>=T{z_$jC@3E#4o*i z(;U?+3q=X_%Sj@Y=;XQM_!)x3ZzJcaNtJ;&Qs%2$k{X~WvNw(>J60cK?XYm;y#Wwg zf}o_ra(DU5t7!GYs5Lm2k1IA-E=B$+@5!e&8>eY!&@RB>`5}XuLKRyJQ-aJZ0gTaI z7>wUQnwE65c%$%N*;(^B&3pG{>zvcqnh@a^h7Di|tIa|Lqf$KQ1F&Cx)dK%H*D?4R z;ITXKfr)-p*cQQ#_!4B24SJ_{IA)n>A>Nc?X-6=)kT?4E=~N9ZD3(RPJ<#7p>ni_G zJ_BfiVSod^{r~SXDn{Uq0+{N?Zsvv2OaXsQa?#Th8NyFV8ZJRE3tA4Fr*l_I$vU!e zN&k)&5+1xs4sJ(43>oO1fde4@-MbL4cEN&n)LMYFI1DWx{ScMy=zulta|F{Q!`>pV zdu~No?v;`D{*t^aT?cKKhDA2F`OmuLImvcGJNutmM|I%FAUrV7M#GEOT5W6pz=8FZ z*Wd&h#;V_7!CsbNDSn-c$npI&4J2_YjxcdIjj{^GpRb8zesmIo6Xuah(3EQDmHLdY zn9!4-?w=D!X9QY=>CYuSpYt0CK2SO*V6w)QQ5Cz>3sltyt`F&n4(t0Q!9B^2j+sa- zU44x@#LamPH6if)a@a-zttDJ10YgLMfrj@;FPxius~AbIU#Sb0=E?fHdEKE==6IEE z33)bbCnyaxuTdENTOTt2HKCCQO&YM0Nvz3!-~);HsY`<_5pw#2vL#yOLE99PmuUmi zD9_?k&pQ92B2p;59B$t>(_L*%;9;8l`JK`V6ta0}UK$94-8mf=tn*o^@XZz?F15cC zR)VoXFJlFlZ!PGt1PEkc(MpqQnc!WdE-0U{YCYv8MRWY5+=rvjWznpdGXd;KQCbSH zsb<&x@(!$uh6fX~;q2dn%J?JNNQOhBlJcPfBjm$TcTr%TmoYeJ*j4<0h&l&{Otffk zXE)iHY}>YN+xAp%wry*&C);+DZQFG_=Y03O|HH=GYp>t)RA`NQ^mj?|{0a}L;;)|s z)O+*ba6?h`c8cXXG%q-Aqb>?1sZywHij*;wys1_Rcj!}X?ld%YNxiSpA|95}+}F2L zxW9!u=^r?dpH2A?uR>7IM}P>$Eh!}Z7Ju^*g2xom1CVYM^M|TM*9=^+-?S;SCNeRO|JIGtdrp@s==U01_0uX8dU}`FkK`!QG!xq3T--z@nh% zHXAxeo?|T-Zy3poeUIaU`c5JqBd5CHqwXqu)gaoYzi0}5rkrk{0uH~jPwg!ZQ0X5f ze`8Z+=O7+JX<@JNcS0mu_F$B9Nro!T*u$=cxz$I?E>VJ$oNBL4>6CTGw)gLz6^-6E z{i#cGG)@h=g^L#Nn_^QwrkYcA7`kTaYKeEOcY(<;Lx_iN`di;BPDg=M!}Ac`tsl?HqDh3kx8T;YSMIPm-(Hzdw3T)nQ-`#9T? zIHPcH%T@xzn26n8O!B07@P9cs*L!xkII5-}^6dgY?O`3{K=ykp1cH4)l6pf^_Xixr z2cv{R;7rXcw~JPFAo-6Ze;c&10vq*4z;e;_42iDKFBt$V_wt*pEWYvsx*pa~px>A= z17pqbnXSIJ9|-&_eB=KfE+Fh2sf6>OC?K4i|CNy{Yj$f4a6V7!$BGc>(Fv{_#xsoq zwbFk)epyELNoEg}p}03U(0#nlrffuJ!i_|V&Y})Fj}Q}3gX|Mw4)+c_AB368SxfGc z#s^ReMk&cixU9!hbN!k~apgdso2iksIL@_6UeK(Ax8J1<&oUjNoOt~DyTm%xEQu9^ zyYUA2FvW7p6W#E|5ZyF^BXhjw-cCb=0?>sr6N72m1XSPdJmdG^1ikVK*Dji&Oh~4rOt@l^buV23GIz=tO`p^8_q6%jikjV!#_dklvigBo@TWXWy<0K0~epQg0i`?i2< zmRKUm={YM!GlY*8{2**ebj}yM7Q|J?vMXhWL&P0uO0DKb&p~vIEK6w?Iw|UDbRL97 z>8u{F>?p6n!Td&we3C0OkXEapKlT|Hy1DZg<$6DZr&%MTxQpiem|+trywSeH zrNJ=P8ArO}HwenPGtJFNn-`IXcHA1R>FPu{7RBY`8wHz95gyF_{SQD&HVHH2yhOYL z_ZcHyJoq4(p>hk|LcNw+YSXbT&X~WKkn5Wdn+A$>|6cv z6~2I(IaKogd$e%;6KD7qWh&x#7#_gVuC3KhFcGc~JL68e*FG8Gvf@B=r zhz|r4ZB8DS-I2-1-BzjwNSn#;Ud_6&BGAJM8n!8*H*;YESs0auC`J_~!nY-$1;53% z;x2(l)1FJg%=pyrgCQ_qV;Ifj-+&G2DMb?&MKQlWU*BTe!j5`b4rUL)#a6292t{@K zPUe#66(fgaKrZk-rgJqYnIV#F}#&Gd8J>86pYGlL_MY=`yf3r1L5<>+stJs>gWRl-roV1AMsUfi+L@k${cH4 zOo--IFZdv%8i?q1x*)$L@JMEIW@mahf=y6SMw7&ES;w{5kv~&lUJ+qBE_GntA(YBd zbB+Lh!k2k5z}fTpva*)H)aMkuRS)nM6fI;8IcmlNZ&P-yd1T*ROr)1HF~M ztLvvbq>FU}_rlVU!Ww9m!y0RaOThzMr290l1+iF*_q-Z!mOy}t=&LD?lN2W2+CA|; zoSR_#$||FQ39~j2?FBbIr@pH3t4tJ;9Ou@&es2$(nliv2t-bISgY_~p=fBbn)DjdG zl>NIj`9zCW8Wnr%)S@&F-P=fu2dvkofIhrtwP^_re=^3NSEkRdDGcJlpG819iwPK zD)Vx(EZ$bhk%WeDV>05!S6AmrOXUVrjz$OI$I-ay1chDOXC`ZMET)fCp*~WeA8Or^ z3+8NAp$(GmmeM^?_Y@LoIP39mcO8OJG=uA9DwgOj(R*;A2W&#-puP{jGx~Yv+_*t< zbwRm#4K43`-a}})z>^RsG?v%UIh1B=Q?=*&HzzHRDC#dvQ5266D13aWBU9MRiCslN z8`p?xr`26(p8Cs#=~*8AZL@0w4{n4)jVOof-KNcThh=+jz9vNRg?B#TTXm&5{W@eE zUvS%aujC$)8E&AJqn>%7GMl?=w))P@0yp6+oBp#LzV46=woHIep#8*}^8kiFva~Hl zpR%TE{@0Ud+{b+6&>g8-3q7dDxIZg^F3f1L%4@iaTlI1^>%I{Srz@0?Dn1ChS^6jK zz2NIP796PeyhL~qMG0s^jp*zl=!Sh+(No>P8J)f0(|exQp5+TWoAJ~yZ<^<S8=Y3E&j;4cV0`A2m$6% z5|mqW=3Wj+eLN^tUz%U&wXol{wU9LFFiHQEU?lz&!q#y#^P9Gl=CcDC2)%!nG}^z=eGo>*RKyOD??klv{|}r= zOeInLqxuTJsLO0?D&9Bx#ndP=o|R7`UXaz+-31#k6G(JY)}{f}p>e*qW}gZsizJ8< zC|}rnbu>p5SfvCKofBuE!BkW{Ak)(ewjtV|`=X3RE^~a$743STAwSQgKd~1&i?+LD zU`uLomRc3VcW?)A!6Ik#x_j$RWh9*~sQiq<2%hKQz=8LLqo5!Ovzy4*U=A5-=-mJn zM0s9DBht_a^i>OBCP@eRx!wc<56KQ%f0WO4ABQco?Q8mw+Yf6V7i~8kV(tjC6!rf3 zehd2-Vy$5;z{naQh{925lVgq{M6^Ar zNJ>OPrL=MA3*GBv1+kv7O>&$dBhYmN46HN}xu1*xz>-wi)m*%gxZ1MvcUepkg!B?f z6foN{V_|HmSj!rc*yp%|eL&hpqLcV>#>0&EgGAZSh4d@lT72%<@*L;`_<;&@l1U3t zc@mLD@j$BRG)V^Y#)`y9Oi`1N8aR6#hi@r*UFs8kgCUytKXO?-3{~lt_ndTR`}L6A zJ_61Fy^iIWWCqzYbdt$u{16%_@P=i8gpaCrNF_mag(NW9(U@{Xw6OHUk_f52PAVz^ zR!z~jn!1R3$wUb+n@-NDA3)vt>ll%J889TMQ1KZOEU4VGWJaMt`2oVAiUjry+yYQr zmMl7kgD(&SZ&Wmi5&~B&WB1=8+YoS;Mo>He1k60AQ$)=6*c%si7mKkhJP_tCCCi{v zt#XgDwUnDmlV9o0CNO7kSMz+z>8HlU)7o(});Vx>r>;x2~6=}f*Wj+`L4JC$5-8kz=BVNS@yYVwmSi}wkkX+f<&@;(D# z{lqV~GR+2M(u&LO%=4F@rHk5lUdu&$bh4lp&_t64PFOSWHaZvNo&@r;@~<^y2_@RM zLoy-i=N<{TA`OJgEh9|xIim|QoGH&Q6O>9M^bC?kAH2`yDn{Iv3_CNNDUJ<1!~VZo zK9Vhj={@&G?5sVUajv|H_~^dlc!xQFIMhSE+|{y){@U6%mC!vULqskj_zjMI1~I6T zC%?Z#T(k!7KXIR6gyW>0`2&7K*knKiU5!A#&IA}g^%l1|t}{8Zgwo0}DvSHnl|w#lM51fU06nSGE9$GC;bi56<;^Dp-Yr zxE~Qv`&?cbNZJ;cl| z+9lxC;9|X;Tw|Y1^7D!2AUUm-P2;JO$zu?C{A!w-wK+HVGa%9(v`KRkZE5=}C3lmG zcL!_~SOimevHr@L{PduNmkL*;5?nzh&60>|ObQ|= z(8!bb`0UhjQ=CAF-rA2J+A3GwRBh*aP1qnZR4RxDv*urREjUumW>*B*To-P2TN8=h zR6BPM+8NVM+10NsV}S;u)&+8Zg9#MtvVC5KWT^BqnqmL-+^_{VE(}*BlM>Y9VqANtHNWjM~?>YpZWf89)LKhvdN`H+D)jG%qFLwWDC zh|OPqH`qcBtyWX5Zr8XPIV`G$4a$e-5AD_5*|uJv@MDtJ$}0nYV!s(inJN6~!qG`` zJ)-+lV6R~GQbMoYz42&E(G{AfaFt=(_4_kiNvDssxhrHWt&BMt%80<)+_faQOT!!m zPAZ>)RY@o=h!NrS!f7R?mlbC}RAP6y+Q!E(y#!{uGcnbrr2x6xr5GqI>$k`@f~#pF zEh%dcd#Y(ar>`QQSycG~GC@x0fD&o@nzI;aRX(4J7dY9{Xs(A8doY7Kn3LCG$HNa= z80dV4cD1_B_4xjtQXC6XJ;tlqjI2^p*e@th$&E%a)e|FzFwLHCeIvMlI+M1Mu#5^r z!`u~&3SB^bXtKoySgz8gkD>cVh50F0iP4sR@cj=CU%h+4Shh=Kmn-rKr#b0Hn^ovy zn)XlPvPe)>)JNMqJODDKRL zoI0ELJLO^k1hJV)5U{vULQ*NHlL-Sp$xN{(cnRZ^2zLGJb!2-2JjGi0f(RlLP{~}o zpc8S7%#Yso%-9hxt1HzvUJLG&5VOPdEvxQ#iGz!Am#`%X!J)>VsOp1qo+o$Z}Jv|7IwoayRGi8buK13+pGf-3aA>fty9%SFAs z%LQneus4kaj3H?Ad3k;#!!l2?zqx)6NZY+}wM?5JI*ygDrkDgMY%54G?%jF|e8P5{ zIl%tE-Te>K4>i$um>RI5rR}`R@$cu%Yz}2L$y$ALe5GHWOYr+Gm z?BntkXM#)*A$*Vk*Bi*(>_OJmd@H7j5iN~TCr(x@B>fgd9a<~nQ5S2DHlH)7S+L+X z(@!wwvq;`o!lP(r6JLw3c#eD@QVdDr@xB+fPXkZK{SZeWK>LSxHFEYi(eErno2}!| z(y{yjI-G~}6s$`Q4`%##=Db?My5lk2(~u}lOTOpZXbon}R|BNwSmLwLj5KZFJwM=7 z(M3#&H$cpIa!B}{2i@mXm@zS_PrW2WoU_O4udPH*pBYJnDch?Snnte-dL>K)j9 z&m|!MH2pK@k8H&@(Zl+3P7r8jb%2$k7o|c@M1dmT_a^0-C$VmizC%|uw6-EcHBBZ@ ze_sx_VN|x_c{9?270uI%CO1u~(Lv-sHPATD*V4pBK`lIcs~}$8{lSIc#|Hwp++>8g zwpx)_hbp;5v`aS6E42O@_Vw}3D#A6=1XHt=D4E_)yPl%pzRG75H)&S0qa#r23V(SiK{S4Z^Lon$)nmPsB4_6t>(iRI}ecFw&1QZuUl zv>6)bPEzfvnc(?H+_Fb5ILV?Ht^RJu-~zf6YzTk(p*K$zI&ciV5w}Nx%n(5BD7UZ- zwTe*`RZUqX$D2J+htzZRPaw_@(&>%xaExpO0}62htDFCt^+eFXx**jYpoUial%Ln&>E^Ha!$lU03|W8d`_b$N4) zrC71ib<@+W@trq_$*5%VhuB~P=*+iB*i zlJI*e+F}h}dEQ?`wv5TvPGSZD2bfL8KPzV?uhk%TdGng@ftcN**10dxFv9YNd%R6N zPlWGdL2s5R=%4v}6U}=pYdUy{KtJ`V;9z6>uIM!kb0W8ui`G4v6VFtK1o?kW3GLM> z=U4v_|8O}N+8Z7jggMe01kQ?;8I@Od>^QcdSdRFSb9lFimy1hC?`F6PC>Ha3uH?7t zNaXwVbXzMQJLup_(J!yz-7$}z%QyV1Xb0Q5dH8)~%3Y%8FxQ5?Rf|XB5=#$>5}$QD zSh9Yjdxv|Ngr6;gCUr2-!8bK{V(r}#6U50IZuFraGvN%B;dyu{u344TP2#h#W57Be z>o1B&a~V#0|Bt_Si@C290M#c@iXPbq+fe)wU*wXfyE@XbfMX5sqm^owrSypNX%=xE9X0w2I$^>x zbj2L{>yS6f;o>6l`mq@Ld_i`xF9OMoZXsqDX( zRw|4SD0*uA>36T?Li2xnE!W?0AEB|c;`}zijTG3tgZ2BQ zK$Ei13viObAsD#o*T`>gXwQ_VbRhHGyEzJ~m# zpcpuqEbEwP7(BnVQnXtQ$Eu{TRb!nRjdqrc9$PmD3%(QKMv5{b?iu!EA&nhSyrs4{sv?M zLnBwrl)_!FG7754yY5P|(D!TZ14?MdIKlxzA5;}E5*9{y7rGyfluet4=xB0mt~@1n zBBy0#CYKqKEBohf`&KfIE^CXbez$Thlglj+l&i^lb|&1PoGRg}z86X8-D>xV*X=HP ziYV)*^?3H0I&EdN7Y6V#0qp#USHMlh;AwSqPFF3eIs`$F{;lSomcpnT0D*VTu}B{m zz#}S$U2-a~(l(&8kLG1D`}z$Ku8Hg&mBdX;zq?4ar_KLsRH%QYPT?rD(6`H}UlpUZ zrLR@V5$Gs~^2L+t2LhLHtCGvPC4Tqig8XKHOB{M8g)I{?f%mLCj_>-w-?9DxH&I7l ziot0OZ@siVyg3I$XEt*pfWQelGzav!1z+pn&cnH+ll(dRdW1NnhZ^~c*6@<2cvkxB>9O(9%Fs|6nE^Rk*jt0p2rK9%P#9B!7qIAH zWE*U9*Ca>{gE2r;th@ikWt5upg#|<77kSsNg$G;x1+MBJ=X)s>@j@1=2-97PF>gjn zj77`pCX3atOu1MikrFp6eb!pRa!-flW+O0VrKf|>TP&4~4vi9bL&c~5{Zpp*LCH<} z!=@LNB_grECE^s4oai30zu|v^8~?)p)?!dN|4V(* zBJH)Wb@-zr5@WhaZiCO1C31u}`9S-m6TUrYH~(T{UipE%np&j$-3D~b<|?rWrSRhZ z)s)2xD5Mz+U(_l%K$nz56&IuIBgJGprq)}3vCW-qWqEEJf$Mr`FL;v8_R-fPG;}tq z46x~ri7rv^qFV*n*xfKzec3RJInEDnxhjW5H7t*>#9{>oq1GvLMqy6Pwq^Ky$jw6N zsDCrdoLw+LssCY?8ES{4H*}lbLkoTA2hotDJ`R`j(`<$W(D-6R{Cc6JMIV>xrFy5) zC!c2@bA2t~r!;+BA5-;1tXb&u*9irs%wU%0SUjmc*aWyE+JaTeO_wne_odcfcYw7ykVKrHcWLU|mw zS{ve&10Ff({;PYF+`JMtVciV-Q#mF7v)%6U6m|P&3`R@YVLUo8Gil1|cOrU!&-eI^ z4Ns$Zu>^pnR-9@7?v}|IqsvpL*DmW+6WRPwo&EDs^eExClPLQ@?bzan$=r|23K}2& zOAEE^$cc7vB{4BKlKP7ra+Jz>B}7&H;}9;>DC3|r?scD_cP&gljnKpE|cHk+x0s7L{%pE_?2SW=+IHIY>3Q~BC}7Q2nt z{*RIGhc_pZ!u5+EaHGD^q8SJk^T6Sr$*heX$-G9+;VxlL?+S8>QBsWHHL3}|JoR3d zg)2;X=&2ci#|7o2h%_T7=-8`FEq^cIjDsibkPQ|N*%Z+-zfG6dJG%dDbbH2a2`XHvMAXs(4@RB<`43!^uLYW}f92`E zIjltI_*xnF5SHtV37^fjHD zzQ^JDi}8iaa3l_*QZW>1(vty@rlU8z4WaJ?MS-*gwk6#cD&Q2%)-qjhz{Z(7lM-yT zCS(RRcqLuMKP8tX#P)ui#GUb>w=o$*WZ572r?m8nnC!a1>pk5`Rd*IZc`&?D3X+9a ztWPTiI2e;G?nNbySS`hPvebLoCLFzcru%KTOQY@kM1NaEF*leE*a_czmv&WssciGr z5oMDhLi6nhj22k<+#d5xiE0$xxvJ?BU$sco)6jPOUHiU07B^hy!gP;DWnGhB5qq(QEPeeUC|^C_j}Qnh$y=Lne`a*0~Pqk2(;Msz~*v~G!0ge zR}tWBbMK;Bsv zRt@x}tX;(P4YO~r`QhkIv)Nx9G|0HvVkiD#dxk-%PUq53SQN~w3NmCQfZ7!^2o9a2 z^iq(ggL3-LBC|eNC=v}9a6T=Ne{>HA!+krZfj8M*Jz)W`ZHkU_?vEUZnC4`?Lfz&1=jWeT(D@M;Hx2=h{Vi=t*NNe*h1bryCF!|? z1Nh%zcRbPBBWGMQU`Qqiw@Qe74`AaeeU9~GAU~wR1L-l}DmZZkYi6}aceM~oo5O6* z{e7Fm>DIqzg>`dZA|v{MbK?D&LX(~I=VPptZAy7L0P*(D&%J?y)U-e0K4=N77m14I zK0J%)cvr>7>w;+~*UyttZ$Gy*=m~95ZuNwApygxasN4RWw=8F35>&Hn5G-8%`Y7C} zq0P&(C=(s-_oGs0D|r-nk_a4}8!xs>_1~<&vhKB;oX4|bn3uhje$Bi*%ZnfcG&@6n zdp*G2dF$(zuL{<5>vs1`c&IX5%nj?uGJ(}O=Nmc)<1Nnog_d^H&s7<#^*O3BZH+Hu2>6p51#JCmfoHa+^_dnLQmZ){G~3sQ4UJ$U7%R@o4#$bfy#=`M^jzV8eg}| z2BFn@T2K52^+Iz8Uh`GD0QI6$C)u;3P*#twpwg>srmt*0W5FKseoqty*FTea7@)gv zH%(`~MPUFm;q((Su#sZ==w@XA`Ln)bqzgTVHGXd6MquEW#Z)MB7|FPZ6PppV)qrsT zZdQq@%EY84W14zPq-DTb{oT6YSone(H`0WrDCwT-i@FZ4X9pX|;hw0?IX$>42=o=Q z4RfO^2y7yY)XF;e)VwRh?$$Nc4iH#okbd||z=?Pvsd7I>NEJfaScEHEyQFvw`a0~? zn83Mc?nBD(Ud$S@DRP?ljF@#-X6weR5SE0sMmhcdap9x)Bg-hB{$e?s^(I?hdw6r* zjq4YIF(oG`^%F6IFY>rcCp^sqf1mf?=|4ZpK9@yKrb)({xAespsQCm*3IJWc&@&VC z8Adydu5e~kXU`m#`kjh(;?gh486M*!gNprDJ}idU~-=9P1c+_%vjMT{AZO%!`a$DGi&ClIBO zQ)BC9gE~tC=QVrn@9Fvv7f!R%KaAY8FmmNy4cV7q&h`s?M?m$caQ6*fEitIYVyizp zaU94z*0MH92+Fopd}7lfW*pTjuj=&+_nowx4`CN0{Q4EFD1j#e&fw@YB|clGpK-)0 zE4TkEw;AogzWopksqwNP)Bx50h7R7SJ&I=14!Z7_8ZG?@+Bfv(3KVRHkO;=ZQ@Bo+ zzXKR@yCd)sdNxih`yK3eW)ia?iY^?hxiOmn#UGlxjVTshfh6P+#D%Ck$Z*as!Q^M> zC2~VL*xngr5MN{Hmf2Mi`@{E8(B|QeFm`Y4_SUP@5sflKKllMdAD-z95$djQ+}Z~_ zL$kduF8oFggrYW}p-BCl8MNZ+{1h4erNkoPF6dR-!=y?&prH;l;)%0^VO<7g`phON z3LIMneCfCl0zUv;+?>$Qd^x@`A>)COEzfeTG1RXDCtVxOOw^#SY?(id9Px}4Swc9} zt}&11w%EG@-k|^l`dhEHwJkEZj}7N^ccNdvWhHdpLThgtN-o#uiG0(lQpOw85=|;A z`^{y2mKSD?vkyG)TQ8?nGAkM`Srk4!v!G(8e-s*?R8Z+YTOl-y2_(Is%Y4Nx`s}yH zR`4aj#|Pko7)s%~#ydz?*^Tv08xJmP`rxPo_cXYCb?^YvvdCpLWwg-lA8-@`Qxg8# z(qbCASs4l(pbr?wp(i+05HB@kW{$b9e#oJ9%AxvJ`hZ)f2w)`-C7!#3g#SJ0hky3A zv{t8^cSue^2GG{G1rS*tp4NyhMYcF|O!7e1v_Gl9zmL)+#F zWrxI=qH_TxZ~M~(%|&hY$70vVCOJ=t-*3_;$MS&c$n>8ra$E%`^B%`|YjEh3x2vf) zGq4lJy(F^+UW8;T`FuV&uBxe;bsjh#%fj}%p9?QdwRe@rQ1?D#e_mbGc_|^;UcXL9 z(}*D`A=x9Ks>dPKr#o2ukv0nf>~Tg4=xarW5|Dr_9K@Jo-4bY)mvXr~JEy?wes92p zx@BsLu|7>+tGk2x5+X4D7=I(}#>@BbXc#Io zXgJapj>#*#`A!Q?D=$-~#dMAX@4Pk`>?p~3^;GC)Ue_<6boPsZ|5`xI|N7N{+5gx7 zAp4J4rSqT3*y)9Du}c3byp%x*Wv=8e;1I?b6dsf{18(qduS)ZN99U@IeZt7u;%Vnb zsd>a_wv!WZom4KTlJ86E5E zPRA{r5fQVxq*GBtyJPbTiz)DKaq?zj} ziMuRm=N+jput%*KAB#Q}fM<#ez1^uLB&$EhD0$eHk`nAw(*)ijNeVmen% zt+FCq^CeiGPmqsfzW}qaSzLY(q)G>6Dp#_A&}aY?nLML+hm}QJc6znLw9h74Bc1Cg zm!w0wc(TVto8Xd%DF1FI7r>iYv)L)rECLuXlC)uPp0V;E1?|C^oMrJ2kCR@*+JJhp-^-PX zd$=})Iqe^=%Cso**Xc`kY?VfD06(h{DD_;XuN-0#SIo`~zS1DYC)KwDXNW1a8a_D? zih2S)p7mjUn|%*Wj%S%R#L_GTIQ9BC1;h>40ULs3vqRG?AR<@=5`+wVZ&y|L~v(1Wk3636Vx$ZbL{;rv+* zEZ{$#_G{%o>WSzA{cpC`zW^0Xc>}r27xqlk7tx!J`<))BbR=PPefb)UAqna3PXaTT zF;j@W>lXK`*i&%^$P5~PaN#?xV=D=h)}X%QpzmvC)1jqo1baXAa&p(6eRXg-2M=sr zTyZ#Gau`lXZbRb&`(mE^x9C88-OqS-klT{pH}xcaiMZMc|3s`s?Wr+|%bY5#Z@_}F;mMzy9 zW{Qzv<5=;e3=YkxQ_g*eEd+N)lbkgpg3wqU*djKyC&t6zu%f!_cnbpPbi?jm9zd&* z&0sD5v3;raLU4JjO6QVMtNE$R3nc_=@k`xa3SLbDGlKOhL?xAhOl^WBqaI7I>LA-#+2*D}6p z9Gid8f`-*RBn3f{;^rdqDhTuAhFjrgM(Q|kzFKqOt+}P@;Cv&!!wLz*=LM>ErdH+_ zo`rBk`uhUJxnO`=uvhB~W^a;9#fN$i#Z0A^jl~aw6HM**%=E@-!j%hYtf?!C%f?}>(gJ*~w zA-%!odq&4;k8S&^KctR2YRC2Ki<5+CDIt?T51%|MU&|>K;PF}fJfUbAD!en$VKNLD z^ksDOsJ%E?YAoYQ!CN4Z(FPS}1ib6R!^M8=jV<%qyC$;orHyM&EBopn_0sq>=&3#J zkkaGmH#JSw|E{6rs2VJ-I5b>5(mE1Fs?6jwy%;xZ!Ic97bVk2n6O5zR#{<21@nmEL zZwJ?$*=&9TZWaY@V^XldE&QLVQb?Ir*6Q($z+!X)qFj2=5OlJq%$lwU0Xj^Rc40&E z(KWq?+oqBM}tJaduR29W7J1nmKGmUqh@7&j6$qHZAn;p68i`hTy)^zRjtb?DL}YMAsYich+H&)N}$K{z%DI9^&ffIEK~oe=Ad} z-4_^w|B!j}FusKT-%oLire^Bej$hvtu!hEid zxzN#aww1F!d<}H^=r^if$c~8ywj}G1#%o^I0D5{GtS9(a>dwb_p z0NLt%`GyS;m@+yk^%JrpUsIx_COAbh zwR)AK&wAAuQD#u|nMR0)G|TvUgR_GqAkaPPtnAOtDzXo0k3C{v^s#lde)MNb2ZTKi z9;IE+8H>k<4Odk?nKpem39DABDnscv@&}4#qI(E>Os~N(OTtBiyH-a7fQAC+L+1oZ zLrVOKMzh^W6qWx`iJkhQ`{vTDbO7Q^+$HUj_b6O0WuN~~K4R1X1TzX*qS6^~Gn(^C zPkKh)Aw@T!$}m5@1z(JuN#5{&sTbwV(@?(Z^m~Z|sgjis|JkGyqc`?5X*#Lg>$W0$ zy1(Gjy>&`58sDzI#Je)0t*9q=^61ekXHl@M`z;vsHLG_I!o5!$VuZ{9F&fqa1H)y% zyLR!SY^>Xi+Y1Q4fgcAHG*1o1Ej(YzVekHbbOnTs&|rG zOzi?+^Pwx=w32Y~V9@E2t>V_ve4lk{n|7Cb1~J=B6ngGcUf1hXO4%+8?>IKmMt8uBXC&R$)oDD{>)ofh|VAUa%DO|p|||`oiu2}`?XxS$i_bfv0LUhkh6;Y*JALZM!H63SJfjHF5L2|d9!3CsVppoyKz_tt zy?%dA-Ls{AVt2U-Zs~-ckdL`y&Q2!*^d4fXXzJ+Lr&onYblN2-A_!qtobYMu{SF9e zOV+%#==)rhi|@`$8RYtxnQE}d&Q@}i8+epxw>!!j=17^P$+2!cv>C`5tfA|GD~Kn= z(i+m_p`e)RAuJ6EnbDcv7&28gFCKQCN(Pj0d|yP+9&VO2!Ho}nk_bbX8n4&^6JL?Y zS*~jVKW%P?Dk^n~1!5?H%{BI2(FPMJp^bEbdC7vBTXIzsnE*DVz6q!pB4nr3f*|SU zl9tW^s3<{Af>K;iLOWK|iI#mbzXtWdLj$X5c5K`sEm2{uXyn`y)|`ui>Wd!MEl#{y z`zxq8GCwl=C`jSzZ96*Cvf|1C?Y+F|c4N9|9Iq&3;5zDS)o1o&Van@Ez~eWo|HIQe zxMli%|J&KNZQHhO>&~|CY}+-tCfiLlaVBfBZM&Y{pYQK@{)T-WYp-js^*T?@2pRJV zMeZ%8+i@}kJ0L8BL|PdpLko{SKyoGl;&Au+y4?md4QbIlTk+K1H$;hn0|KHvw2V2J z?H`fnDQH@2ez%ZKf#CW;#XXbh4gvs439Q3C^L@)wYnIfPZi`1vQx z#^D1Q^VCh?-wFQ@b6j?9am;m9AKa#GL(vSC3n-ZIJNr%7UhHEX6-SU+bvjRJWmW zX{Mrrpe~ZGMO#AHic<``N@S=M7jN=O2s+QO3p38#@f7+2!vuOoZadxR==r{wzHKLf zITTuokcbo(hcy_?-}epnI)mnl9j}m7MJm=fqocjM9S-Q(L0lFt=X?^298s3_j2zcZ zn#MVtNu!o(k&%~0!u+2?10YICXG(@HxqLeDGJWnt1f?>$T=!Q|p~n-p%dO(AWDH7~ ziLoswVouzW=tAo8(dtvmd0iog5p(%cJHHchXTCtYC?OvIm*EBDWd9!kpNsSVNBppU zGqp%NA^rp4D>~szBlMnW|849&pGwLjg=PWUFHwST5kWbcS-Ku@2_vf{g^U3!{pw33 zC$2e%T1k&$l@yo56jKU@>l6t#ht1%1cBI4Vi0PkA8rF72 zqHI^>)VWurgi37+N(xylR~G|pY4Vg>_i3>CR{7oJhLe?DO4!Ds&Um=?HPmBY;Ac=T&Jt?qV)gify+vquaHFj z3N;JO+9~6dSg&&-fs~85Q{zwC6|qn?9E?~s8DL64sEA4_=>-21>>?(^30ZEiGhl0? z^#oKQ+&u(+c7+m(n0Jc~6e${`?5>A%(_6z6(9x`H&1=cOR@tG#og$@OA@h+7Lvw|J z2#*kt&~Bu~mZ3(s3G}5>63yX zFT1(~H@;w;p^_C4&wydt0Leg8oB+eCoEkaKnx-b85CMH{X*xrL1iD}{iAP3KBPG2R z6ih`hzW|8=oq?m~(LL7KRN^$&4Ht^LjR7~jXCjl0AuUp=_g7E`shUb`Ea}UI)7;S;-Wq3aM6Cy{j@y2R5(;dk4Yg*Z^&q35xUW*>lvf0{gboC z@NyL*V{mbIJk`%Jcd)qs`QCG_00<1|fAyOc)_2-u z&vF6V8wuLWYZtD~a4mlCCwGqr!;ik*2vv*>uWlAK`S%3*lqDfKo4nSAsq2D8qftLhMNP;NyOD_X4g*E&15x7SqGs$!yxVmW(CghabA^2?>Q)?DbWwHE5_U zlq$?kF8)frGER*Y7gUQVBLICsh{+@!cDwW^;KO}Ri@dhs>xs4T|DJrd-hsk~s$|~C z4}8W(;*#!RC$K4=ngM2p)5(>h@t*) zyoWsb{R?eWnD5_y@*ozCSH~M@ni{&@q}lb_B2w;t?L$8|z0$0Tb@$R9;YGODY5_AT}F1V25{%yz8mvGx3kc(t7(kr=?E?&jgS+@ zo$jdIBDA>?ykRl^{$kAd;O$6TNr3RQcsCaU`-i(n{AUkO*W2QKuWGL_&V<+e-5kHx zizzXQQUA_OarS5V4kH;XRxXiGX_H9eOQeu~FGvx23z)dupZ?go9r~kJe z#r&LP&Ogz`e<2A$ngk)V3ocr$DN(E(I_rMDC!H+?`yH{Kb;pH`pp0!v%Ys#5DCXzz znaXq!un;TBWmr0_9*w)htSaBG29EXBUKdx$0qLCoLSaLv{FyH>=ZoN9`U)_DEW7A-|0Avg2L7 z;^lC7H0HJtH?heSt?lv#5&k^K%Ea@y+h+bF4oAZa*}3IukKX=W4UJLHh;ec{ddnJ9 z6IYGRvZ#*sWVF?rv0`p(_qJH8|A)=|D4CeE98fJ$2AgMJ>M#$K)Cr$iKvW2@{g3Hy zdy;%yk-fQ|I`=fC+3(j*jgxtbIfMRO3Bh|Ak~8;Go>4j1tNWvaCRPVyo+pWv zQJvz#Db1fQ*`4ZNA$f{rp9Z0|>e~6o~8IzdYO#h~iA!dW9tu21af; ztk_QqM6S(JVX#(aWoMR`z%w%lW^~cdkZ|6$u2@{nYE3}Ue-his(`qnLk-@$L=t`Y` zMU8`thjR+#k`@#Dnn3?OAre~whf8%%o5>&Nz=G|0$nd+oi2U0~I4G|Q04@C~*y%Tf zO@PkWUlEw`P~M?zDD@hz?>ztAZV>X z%vJpR#6v^Do+y^QWJ^9u9%!C?bT(rYrreU7kKk3%;Lp7Ut2M{=F@b^CK*h zidVA+zhFHaT=zg(%v_&-tZ{>L_mL`eqJBdxWS?qtmYi$-p|Gr~jqHd{#uU;wFYm+uBt8y1=68s%~1V?V6k>Uu>)^^fX*s%${oej zoTBy4;Y))fIF6t8CMvf{TTkDqF&9NNkT`o=df|fw0*~IkK%RK1vuu!HCBBCPljevP zE?^c&QvyX`j4>tuTZkS+7 z0*#fZs+Fkqc#2bs?lFpOTr#C41*!)3X?8@jEEAY}24vFSpd1cEM0HahLWi}o`{>Oy z`J$=XDBu_#SK|F){*3mw^V2-x2K%za;u(G~5SOdmQ&s^lM>M6mJw3ZG_`)F%2UM!m)5hWrZzXUwS z^Au?XfK>qy=T_X3g|>dSWmIMSftW)dF_FzdYD+F0r%r%_*1rLs z!c+~!wIQL5i&q6>F7-U%zK9J0c}eW?O6iZ8&*q2t#s{O>KTyk>T|Wr|Op5@eubdmK zK94XG@nH6Y=)r>qbBJQFS(m9)S3kOcGdyEDw$vped#$C4U+?#z6iI4e?9@19-`W~z zwI!W%yuU3Y#pIcl8+kyivVhzDdU!k@f+^3v{yboZORu#~v`$LQdK|JK<3$E~X2jAt zY^$$i;g}k3K-|A(iC}SymKj_X+I~VRKl^7o|2Lv|ZwJTtkAhQ_3rYuU)slDG`!+KF zH@*h7V3?bML~k*X5vW>w(SCVZTfkosDrNs6<$`ysMi9&fMZyvLZ`i|H^0r6bK&DDi<&#PfE*pC z7%2r0v4J$AWy3b9gH?Dn7_Z-m!@l3x2++@lOXn*scbRPS)LXPO_v10UNSw};n+w6v zIUVUBkTZv7NCk$M;uVEYPn>wiVf^y=OBB``SiQW)spk$$-q>cIq`3C<5P;r?<$%2# z*Y^V@>DA>3Wa|@2TBjlJx7D<@e%sQK6=8rdPd=WhFibuFUxYCt0qvkUA~cNPu~b@W zAtUW>bWh?{EhUw#r1^z5Hf5SF3*;pvFV~!=3xTYU@>ZaxLuMsmqrY$i!7_#jzov`I z<#U*lbjIjMA~qVWRb7q5&uNj>Jh#lYM6(P(35a@V5pC|ZZ$uBbq99cT<7Y0C>hZN3E1an~ zo|8dps2z}V;h=5Sl#@lO4@K?u%^eJ_@TeS7^nD}L(x))0(P>v{<;JJulJ~I}-B3fV zfX&)R+EByg!4g~WMreP=Q;z2By@BP^tfs+Opfnc5QCaOSlY8jW zNdAc-_96${z(!AFaM(E7pEVy>Ay;`rd48Asj@3bB_^mYnCAPBt5-dh|cjbHah~-yK zU&go4%^A9Z>~>;@V85P72E}c*Q zmYhb93M;B6H#DMA01^bCz%+~eB{1%alj)8=Lfs+$$!V=enDC@+o;h?nc@8=ga#wf) zvOg)COqVRD3xUjQNkc;IpGivCAxirP=wgR0;HAE_;rOd7bmi2M;OD|7OWC6(+4FIv zqdt;8a0VLj^7%`mGp~Hc0%&PV@DrkT_vKFu478N&u_ur+ZV-Rws$9=RRj#6IrRE-b z!NAc$rZA?+EUXb7nqhkiQzY2=R~q)H;XCm;%l`kW&-dC)upA`jHz)Cb8pc{3dAE6) z|0_S3)}EWlj3ah?A{|&SR zM>2x^_yp<_VWseB4mP!0Yga;-7>M{Zlqgr7Ea}V}Z%qSkS-H*_VT52 z?Jbj;6gdFGnxEk;BLNsI*`}a|F8um3%tp#nhxY{3O4r&up0v0RkPsnFknti6!6=(O zcXam&FX0vN#WwvNpP;35&4l)C&FZd=8!1sHCqNm5LkpvYYCce0C=3idt!ht*gOP&5 zpJPW>9s9L|)Fd^y@zzjx%tnc`=PfX4OTB3{v$FMTqpAgZn+8Y;<-!yqn3y=SsdZN~ zelF!z(%LUVl%$Tnzm+&$({aL;^L(c&rtscg=s%$Giux%%u=PkcB-ZTw_py~@F7DNw zs$CKhKP=(uwrk4Km7mq6TjwZtq+TOd_j3924)Erz#d!GX(vDLHFYmFm576b{l~a?l zdH;+zF5Ec${`^IOZfkUt8IpH630<4s);+`Pb1gNNTkkA(i4pu$pacb^v?aL~yNc3S)~wD?@^#g)F=p z@Dr$R&Uy+MW8X4Bp?=uLq^0q{z|A0urQ3p37f0bHVo+C+N&GI2ooVGM#T(RVlejPH zjXR}=55|G=Yhm+Xl}2#{pPIHniNZPydYCsu8n`MD zx0fdn#{r7(q8GApHSp}_yloGHW~MTcvQQ4)ctG-!Rz*)w*zSZ()=f2q6YoR*HcZMo z44m}EK=N_%y&d3n=ML2NOtc{f*?%vB`C$MN(xQ^!4ea)bk4q!7esb?)e(FN*po>aZ!P9Qk59hW_G1&@K4HQLlTGU;3adE!V zw+!gdoHM-w7bRW|5-Wq7XSU4O*MNQ|@FoxY5L#8@&^<)P)Z7JoR&e*RFO)ld=OZm+ zkNyBBGlD<4h`3eWX%_tGBE;QboNc`4FNSd~B!w2aIufB4E#?)|YOBa8%d>D@u6Pa~ zWTQVl+B6~dUE5>vL0Ya3P>1| z9hUp_pn>63@h)4XRYrDgn14K){j)fc3&!6rM*56J*32m9NQylq5XCXx5v}_ZlLq1Z zi2~;)t2Ut3dX-jb<@6P8lr`;OSW?Yaam7|n#k=mrexQ5r?G7FOSYvaT5JLY~Q3&kj zkRIVwceX(a!0fSBu{MFJu!9Rih`wZy0n?sI z2kGL3^bJyji-+A<1TDhpssBhx!1^=K*Vb@84F%dZf&xA$(v7E=JU^(q>`C{&wYskQ zhH@36&*7t#3nIb9-}%E@e=Qmp@(QSrFb3Xc?i4Mc zAu?vEcI{J@h3M_MfGNkPw@wx^+`OsjEL^>+A;S1LAuk_|6+H8z#PDeSCSDY`kavw(IRj$Bky99D{Y^HA zw&@R;cnxvZHZ+D4{@266x)#)C`NMb2c30a0x@|=t)#R)9MNoySJr@EBXJ0uWc$G2Q z2z@xpWb=S8__6x3FG-X+LWUwI{i$7dyVnaj)`XmF5N$XO$pk~>-1lQij%Smq@e2fJ zBPZ?uUck6BzgN<}`&PF98($3nM-<>e`|ew>Wfmo1HbIWC)*9(oEY2GR{9Fu}a*6>< zGNoi{H@?6RE}~M3m=x>8)Lt2qf7V69{u|aDE-bLl&Vla!0r#H@62Vf*X#yRAFg%hW zP;xL5yzX(Kxz6`#f*PTu2Xyb`M3vXlT+u&k#-Q7m3&F8$O36T1fscPy>-HEDu|rKU zgu0LZ3Hg;+sUG!0N515b`kkQ{0J=kBtOJl84Oh8YP@8YdxnXx#euLp1uPY zEzX694qL0ss4!eO1X!kSbN~IaPgWYej0hrWnqvVt1;N*J(d0gI+0E5HS)WL^F{=IX zfe0^vXE;FYLMYql{2Hfl@=6pl%ux3?rKXCW?3Wyf8bg)-`0{KgE=qXOEGJW4f-oWs za{b2McqS7@d( zTATTu-V#p%rQJDZj(p+rW_Q);i{)NDg>!)k5fj)W5}AJHX5wwx8w}6o3tjd^8)08G z6oy8--pKO%zd)P@7%mvkll`A(x&tOq!qf9;4%dxCZx9_Fr9Bq`F;)4S%c$BM9Y5j1 zmZDIsR)&Yfv-MK54o*Kr!lpI#_y*BNba*B{`DaYKcJIm&$~fSr8SpZO#pTHGKGUr* zMc}5SNns{US}<7NIT%wVx$4QaE6Q>}_g1v>K>s}I(E&9h%VNl?%GfbIrECeqdw#sj z5oJV^%}UHrmV}b3Hvr1ewa$!WVWj1jn>4xPRW$`XtQSpCoFJra)b`Dn3( zNpr3U8I!G0L$pYk4kni06MxyLwxil>n+DaRxWU}eZw>eS_4ZwKyCNY5kvSx?EK$^Z z!lI)Ow>pRjjQjKR-%SPU$(01NMO80;k{sh@Qv(eTk;`&__&(+KJhq zbBHIus_c{8c!Noj@9ZRaIDE^(*t>5i0i+5PER9~QmiM^@JTaZ#z5Z)5YuzNeUvRQr zautHI-2nKcGX?&h4_*2I96*aBp)Mn_b>{KsDNuv9v+rm{R%j5mes$wyS7TPscO zFafJq*CA*WTj7Kcq4FB}$%tZ3TD&K2qy6lO9Rvgf%~4&LYoQUlt!+0ZE@gmBl1^~G zT5(qst}ZC&%Gldr20K5=)lT~*uax=izi9mY7M z)kE|DEO^Qf%7f9Do*PbdGAx-Deol!f@B{yh>YCY@T73Mo^rfF^MWrwFf-Qriwn2(3 z<_WuS>9!9TJO5{)+fQ@5xhD0u>JP=0-|6GOj-gyjQX(~~4c&lG?VDVV^^afD0 zYE6@WLTLHLIGyGX*;Ciw@*DI`$6m zqD69CNLY{V|7-@Pf#E!wg*|`NlLgdGfVa8rxF0B2%dVBfLG`LlDmBDqy#lEtw2^*u z=g6E}^cXF+`okBX%&P>HgpnOH-4`j0(i@ZXhUXolCv<(>_=aLJOI|JxV4I&}RiTz< z=jtKmZHbutOE;E{<_YRzDx4V_Qxm7#+%5fgXc4g3dZm}Q?-XjUjTtRP;0ok?ovxON za7so4T_k`#{3BER$F#~qX3x^D4%#46Qj=IJ6C5>1?EMbo+{Ms%&RhmT6yBrifkRH>XOqE?3TB>Vj?oHns&Nx0c4 z$TZfsPFv-UD41Q8fk%J*UqQ$auyB5nKB=y%W3-ci)j-&P`n^tA;z5&Q7qLCP*rCB6 zIUEOmQno~QnXwtx*_>=AQ5pgT^@Ss1wk24~YHrCQ*FR=AjsrJH zqDN4pr+g!qdyy;Hq7jtR&}JXR|NnhSGmMR*0r^jr(EuurE*bOqz{95WTNQKW!9X>Fl2P8K||)uJ*g0N~A?eqOE@-4d*mkKQDB5 zQqIB{1;oH$MMoPET+^l~1S5K`P~hG7-H)Y&+ir;2vIIXUee;H`w0=M!LK%N-AKyOz zPDGln9fS@|4F-NHW!;kBawk)}dt}Iw)e=tC!=6v1ZKO*81HLy)550N<|AH`~-wVW} zry<@=2;y@vNbgJr6lm!lj4JDDmhFLz50!f9gG73rSf|A=880X9e7L1gN*!=mLX-{j zoNEZx6h#~?RA~xk4%0A?e0roO#=1Artrxjyy^UM0G&s69tUVa!>Ab-z$?RSj&wzq2 z;J6bFj_5)Izigti&qo=)V3X67n#e>}Cole;Ab`tR>`D{oz*2r3+x9J9MFE6o#S5*o0jG<|W=Lacak zOZ}B!&K6o$YIg!v?!c*ef}~D*T9vV>0mg@uN-|3|Mu2R)E72yww#RVkhG?bb(_r-1 zR1R{fd|>HCJ>u-POuQO2R05vBLLBB8#YEExAyoe7>Kqz64Mdha%(HMe-t&Nb#>YV! z^UA*?V4jKPv#Wiq3FX?599+#nd=WhVIoo~NKbxbbO-GHt1((eyn_QJ9;2T3w&FWWl z#5><=z06H%fa>Ck#jc!Gzb};0yHW>HNFon}nC;eq$06|@DoThSvL|gwkaQ`x9yoZrchfhbk(Stw;Gqw(+f za`Lk~@#hH!kmB-PXYG_+xne=)X)iJW*Y=;};mx23D?Co61Mz7ZxWX@f*ECs~N-GkZ zjq-BHiDP47;V-qV@rx{r{#D=fD!}WiBD?EVB~)4|OA>6nsqs<8@*~FYzgD5joC2%n zb@G3&6W0mBb(l^S+rfg+>z!(@Kwz)ka(?VVXhw=F=*k~ks2-dl{ioBq}6IDOWjai9nJ1SSSYn45Gb{Fd_d87cu6>t;A4Y@_ppP zg1W3x^yv=KTHkaxrUu{*?zw3JFD4MHswbQ38~&7#1C2E=X`b#~#2rM8L6PXyAi z05S?Z=dgb0O6}tyJVRjj`l-pzf5V?SapM`g0X6@cco`{%CUQndxRfN-o>o)9dElMxLYH{4ZYj8YhEzlVI&C^ z;szVKg+f;If{qXA$Xa4JJwOqW^>Ewl%jSf2M5pRSCRjuAlv7jT$*ib0xa0*uB^Qz; z^mGffr4XH@cV_$ABvOVb$*RzNY6ifa)#mkq#BheifPcMS`I8Blr#IB7M9>-#{R5AX z2w5!F^`8%InLpteUoaWSG?I|tI;`ONJrx0pdJY4~gAcX}NG$7Q`bG}7enl?$L=%Xg zxV_UMNFA+Z7*nbU_6anZ^=pQ$o$VP!iqnOdzqrupTEe{+#u(7t*Gpq^(K0v`@l=tx zZ<)S0^EXVnL`xO3k}6m2D)QY7y7{Uy^>m_5QLl1y@k;~U5C(b8&zrO~^W6zg7}B;0 z(=V{i)2`b8`)TL>zX|n!0;Zn-gw(pSZhLM2@26b{2Fq-x8^9&33=l{ilSLxRj43wB zexOk!9aBv+{=P<6o2nY~yf-Dma!6)A9*}meF?Wv7_a6?%k*|F4Xw%@5B{I2H#ZW7f z_X%bpVE!D_6*$D^da{*8$1yiW$Ms|VtYJL0bq#nSHLDV1J7`#I2QKr?ofS{yjB~_$ z1%7sBqYy0DzD=IZU3%YM-tH%&gW>N+A)KR7(8k|Bj4yH~WLzJMhpDDiTc2Uokt;!t znHbZTtc*`ndn=3G=!g}gL_85L6I)qj{NN~<47>@Q{%W=Vr;uFzH=w5+XX=6MfX?L!udU{PTfLIY{zzMQ;r$)+dRo@KE7rN3q|jTxUP z$B4Ba6;>MefZ$MJaF^2k3OabkN-}8uFUPcAQ2W!fP`sIE`GDUK5PMN5H!}|usnCW_ z6qPjBnz*nzB*CFKz^+bK6Dabf8%VdFtZVOOTX6H;CFd9%s@V^Z=H2?}n1|-Je{0*l zL-o2=LDZxQ!~I&4@OmZ$_Ge`J;3^WX$s4u5oN(r>^9 zX}Q{o&+k-PE1ltS6s5}ybo(2Mfb$C+$VoU*sVnS1Z>G$YQ6Pn;4*E5mwr3ar>S9Q! z7Exw7C2{}_is~9ZEX4DxDoUw5I3@5X*T6@gLumclucP*@RF{cTiLhkBewmQ8dl=g2 z_(ru2pzt=WX#3*4>*d{rlxDk;2#v2?#AcoZN(cdIm~V=UIs+<1eFZL1U3+ANC)29J z65MAW-jWS^PqC^88>AMQf=1Q8@WKohbhsC+Dda{(2TdS&-vS&BovU`B#Px)l+hY&f z3SbBriSsdbG}juGtbvD-k0+GJ)?%FOq8fMxF1~SNPqA+d)f#3bysjXQiuX^US@hT?cZuePHsIo#MsY;s#++tQa#J8~pLp}5-U`Yn!bS&>*$dASB?SXi7h-*RxyyaJ{|;%89)<@s z-6KZMS!G<%Ucwf?vHqHlKOuk>e|;(iw(I7;B=e6V!Lh6HdW=*@sB&otdLo2lEy&eA zHvj!Xr0#~?DO;QUhjtnOi)jN1CH3Rf4*DbHJIYhn^(ksdSSv~MRS~Um9=_1Q@T&k% z-G9+df1CJ+5^@}~GYHsUvHcN-Fc}<#Zr|w!3gclSm6I8L5FY%kE(doSFi&(P;ND(s zUJ~}ORd4D0t&FzK@Z?myL8OGgaitn!=Dgra;qUXv#k{g`q1)oSvvy50>6ZSZ$ z6il&lR+H97HOuhFL54HDM6`HGzFH0t*X1#z!vBO()tUU8ktV5uDy=xZOj3IWMmkQ@ z@`53Ol_RvGF=0f$nS|;Jn`a}xfKd^Se;;^%ssWpq%rM6L7^uc?9?jF@LDz%HAe)P1 zl7GWZlmJ8F?xApoEECPsdE>HDcaR!=Qd?gkP27f1%KH$_29r!cB|LUA)dIh)!4%=o zlmj`NbYp06nf#-ixDG1GFvMvA-`H+q(>kWQLS2k+$=$}06Ov@j^cGVZaLvlE>NQAS zc1|oc7 zySPaNAwmTMo;uwDH3Hqwx-!X=iMj)3%H)T{d);yziyIEH`*oB5GP<%tz}Nb6t!ml# zB`CG|26wleveu%gp4qc*chdPi%1w+ZrP&3SjX?G z`z*ov4JT2q3#;UJN=w{T-T(I}Sb~-C=NIocKn(vWBdH-VxEw^v@|L*xr)-4Eh zaPIGLfy>LcKv-+s5l_{J3BAFd4omx=Vt+k$-! zIMzhCY0Pr{RL+P>PhN!zMAmkdQX3^}Lq6MrZj2$Y?a!6)<^h0=Mp6rC?V)x2s zcQ^5z*U(~K_Lijs3qzp8Bv<80j@$>N2+7Qvqckfw= zwJC2+fCG-^&jgPDIxL~ly7`%`5eLZAMeU#q&KwPbMB3n1DG4hChh5wCD>=Q%O#NM^ z9G_yBUdw#!ofqpokib*m3ZYs`#R(9!i+KA86GTJ=`o4x|_iuSewZ6%+uDFnGGLt+F za~cOd6C*Fyi*|emSDT|B=RPTi=>a_Xf3f!jfXv({@&G>t>W8X>%pG?PWJPvuYVE1I zPU%YzmWA_E0en%PatTKWIf8B1inVeFO=>tK4U!#iP=|jfo#gE`=-tZ#l8X6yzopS= zs0s9llr(+5vS~0YUid2_BruHQj)rs}S7BxfOi(~&uVA3yf6orcC=EW-;bgnZppNve z0RuHp@CAhFJydR$ZX%kM(nKssc>AF=jp1Q3HRn+3oHz-PXi6aNPFl$x^ z%0cU!x*Ud92=i=*f6!Ut=w30uR%->?L(Va&w1Rmcp6739bjY8#Wu)?#)}-2rJb4gC zc?9STr;+P>myfu00gK=;SrQVmE-4{*VBTzR_e>PL$7AdKo6lab18Guwl**P zd`^kMjVXp2;YVxu74zrbw0!fEH&ZIvBkjj23bYfiu4?&f`mC>AJ(6J8kW zvxMb=8GzT1w5#zwkNlx(a5S13g`>~NID?!ubbI$414;E{IDkK87*>Do;PhjEbrkk z<%VXDm(cfq{wRrXa&ii`l;!CQ^xN~!)V?CPNp?M?tA2H8(!JJ@jcsMv%JlLm?4Ej6Ap~&?_+~Mqczup4K+Z&&fY|Q}X}V)W2)_1m&{ZlW5}F-3h;G-C-9nkj z!+wUFIkK*ZZ6MTf3mmXM28*2Q5bbmcjm4Z+e)oEghdDSxg{C`4IM+Pf*ivy7-g`6wt5B` zXW)b5J}?T}{PUEXizX2?!qa1p>lFuL2H-;~q8hC%mxvHcrm6 zKNw+w&7D|GeFqQK0LjR}9^uBlgycx|UzqBl;RyJmHPc zOgK+E&x|#Ze!C54aL~f`Uu#1M*F+$v;pF+;+aJe?<}_XoyI(Q&?~Tu3cu6^_Z;D!2 z7vvh}w0V$gz5#fCr4C_fnhvhRF#+spfsP?fgVCfJsE}ZlNFhQ{#5nReH41i4xVYQ~={FjDavTHI8Df(?4UH}V^t$G1IH~DK+#21_ z=p*FYv9i2By5uj!dH3njh^T&g4_qduJ?NqS`+=%2i}vSPqUNYIdvc1F)Y8(tDo7o( zpulW7V|N1+p5#3XiH3WG4{yt{FP&xiH`O*)Cf%<}7r(q!bw+suDp2hACxmX0@FHSR zM9OoJh(_~yP$X`=iZ2JgAaX58yWzMoq|K`qQQ$>HmMzR_N9szp_-eER1yGEClkSX( z8OXlaV@LoAQX`)hI6)9iM5x403Ulud3QY)khJjHuXXvH2B!Tw8KBMPE9f?B;Z9WuD zyi=V&P`iptzMI``=ydC8o?Fptv$E4WYI}{5shp$jH3FtR{Q4&^M}4r8`1cp8%UF>| zbAE+*5jxk{#3I?6+s5bSlDo#&5;lu0@zRZq~3eW|J{~gye$6% zXn}KZ{7-mC4;*mK{RU{=Ve-kbx6;8<%&-n5j23X&Af$??5@6K)%NY;>;eXiDCRtRP zQ?hamt{Am_y66iJLL@OEGB_Mqre_ijDMLXWD-`|BVnuRD&^(4_=ZxH}eYai$8*AoW ztAc=RS>mg%eavbcqC&-!v2OVWJeM)dk!!Uk+nLP=0$ZZcbe{H_EB}z1v-}Co3|b9? zm`NpwF&`0Wguf())mc-P7jdRQzvhFw1hE=?WHF!@#af5jH;ml9Lb3^o?iH^7ESQ8A zMYCL)2!63;&7Ug2Oxmo`YQ~s_IgHJ<8x=&MA|UIB>6a63N{h6&wj!u+8P3LuL1$?U zPfdDp0Uk6j#1~7Voley}Ri6`-NKNcWwIjL5(+PNqfSuOT%6$x@_U2ludrfNfciQ_8 zR$ty6uaJb8$d;lv9&e34jE-PbGxW;70-TVR20u1n|tJvdH_2m3y*zokiD3vJHNNImw)?e*@ zhZ1O`ZO{MilLh^9?R>j1BSv|oB6>8+|KJnwdrYA&kdP&i-n<@(rP*CT&m+eh5IYRG zhW`0p4l9NS`^APB2Fz8SqhgNTp1*D#MT?dg35>NVfn8I@|HP<`eH1ZqP*Vo=WM;|_L?+92>9FI#SIpC_`P zbJ&kUGXx7M?HXo$pEd*kuN0EdYlvvnm=wjoZ_{JVD~F zjorbhJ#%>k1~rDFxouEMRK70%U2k&2Ol=MN>~u`7JzQ;!0^I+Z3;)%fCqD!=-5#2} zx0rRVWME*bW+_LH*asK)JwXg2>M@eSHAzB{#59OF9`v?Ln8PhR$JK)%HyAHd5_ov7 zcQo9gSw72}5OVssQUtO0(+iwmm-fM{qK!RC82q_qe2WH{es5!X7ruki%3fBLP=#z;9aN>>>vm~ zLut~QkvVy@x~{r>V>iH6Cs(u)F|`SCKFplJdP|1iwgWf%uPb}HGv`Xk{g&E&8*XZI z_vWO_Jt~g^kFEP;r1a;)05JSo$}EHhZ@RLFsaYfn2>5yKZo*glBAXVh&S+2)(*Ddz zb76oZcB0L2`-5DAH0A@#E#*(5N*@oD(YSW7#Yy6&XwgwhOeUZhKCOeBtf=iAyt6sc z)Du!T-DSA?Q+mqz#BHUSf_vE!UTRWdunkt{c=Gi5N|Y<1Jy6=4rE8-6*W6(Xe0<)A zrSstIu~%MDctk)WRm<_ua+65yFsT9m5o5VBl0cRP}GTZ++0VD$A7eNNG$TI2agl z@QmD?J6VlP8YRE`Dms0l?-RZDutwO1SS%%K0OXLHs4>8RB0PQM>v@aM!o*i}|M7CT zc_w&ya?pB%hk57PD`?*+#!R`B_sZ*89&ZxNS_s$I!s1UHd^4B`qg9*lP9N=`q)L9N z^ktL<+2(@OE&et zm}jdpQ)7UvSkQl%wqCn`&baihh%{(`CFtPR_>?}#t6oD zT8&YUt`_jJ5_i+F-`MVq4?~Naf*!j56;O#7aCc2O(4x7WJASwO*H>@bk4U29couOT zZ-Nj10I1s-G`g&XHZzdX4}~P$Tli*>a{JYWoC0t+bzGVPhN27?oh&8q`IfEKr*kOw zk%sSVT*b$6H+EKWkwG9G@K?I~Uq-He6jZR^01?{A$0~MSX;EJ&6%!3o2)YXn;{bjF!3n0f#S|IrR%=QBM^KRAlSelSCIU?0OS;k=920j)yR zVJzS+Li^1QqDC~ZZ|QVtY3TJe@_z2VMNJLKEsvf+x3jD9;e}vQuU);dyQ-mOY6)fB z+lwGCdE@h-0-rm{6m0IL2(YASVxYp{@eTM5zF?$w@{KJpQ&8^dBM0OG70-}OTXKfz zdh}RtzmIyALQ$gg>W>;i)K1qgLDHNARt)h4x+n(6^1meyW2%D`I4UR`BlG`);iT*` z1(3S$sh?WKO*%R{Yntm!s9o>^9VLih)0?6PEBq4QcHC0H6J{F~>7Q<<-ZRsSPopR_ zEgHn%yBmEDk#`(u(6Zx(!l&Y`HiEQ(NKT316j~MnHV`AE#9t0IY z%HazJ?|2`Uv5!ZO5grJ)n9wW{aXuIG@6AFdiP1hf$^k*t8ga1$_BBD~KA031$TTY( zP17{JS1q8;O8v}7F$t&imh{<_<9Re|%3}41r1oMd0`b6SyonVLyzuw{op5vKK+dea zCnC=?_2s53BL`(^kYNXv5)tlmsWLggEmvoL;3rO`5r@oF85d+1&krl}5WW03j*h2z z4%tXV|HDa>*Ql4?^WJUXFzz4)2L8$G=XZU+S(nrF06&qRP3+mEM~~5GxSwb3ILC6U z!D1{e7B1(LY>UAzILrjV-@HsdGsHqi!aDnfup+rICOIapW>8{7y%*0Jgj~KjvsmKB z#rzwPx5$l8#9n4hLOVTf`J)URN^;QzT6nEJ1PYTr6r2`)t7-l)abn zK{El=XskD)?v&Fj<{a6}>t&UWLAiZhaD}=-%C9_Z*CZ(Qn}7e~Ij?mrupO?aHAFTY z)Nl!ZUuRztqzGT*9i%)t80sSEnvxdupZZESOkuYtGZzqp*VUq9YW$}1aGt0Qu7~yje?~N}og>dS(jAv$lIQMVCyw>?kc!F3`XvV-hGUK}MG;FtWznZrIUsc&WX$+X*>Wue(0mB|O#(D%yr$+d zIaNkSB}DPIq*bbMW+Z3~`j$;pKZ4RKLC;p_wS?5IDJ{?~AGr|3Qa%`F2XQU6%m$Wi zaV~MBr5_eZ|J;qWAg$J=_W20&?f)HK=NRHp)l z2CCV7*}rKD@pAi$mwD?Z3xiw#All3Lv4YOqm+YDAR^$#zhb@I0)_R zegixW0um}8nvpuGnOowD;U}#(K_;UiPXkZTny12N!jus`EWm_?(c2+SXr~Y2RFgQO zMNEYMu_nh;zH6=M5WBKYJKw6c9nu_R9eJ0_sSV+L&I#eCop5MfEQ1cfK$<^nH}G!` zpDh5qTnOgix10HAmtpQ4HKg%!^6~ZV)X_4%L2k_%wVGKUAJE z;#c|GX}6kcSMZHH@mrzi6?RauNEs`4SRlHGeDoW(XA|jpIhbCke9A&Md#-y z@Y)E?X?=)V1C0wN<0{fWE0~WXljNC+@_)8}{kx{Nw$*B-;@vn^=Brsfinp?bN@CSU z0|S-(DW~?Bn-~Ib=R1Y(QX8U)LbcMKQoQ}OEG!$ zNXI$B#{mW?iK*hDQIl9Y-ps1(_|TB2su1+;@rEZZE<%r2d|4XXRaz^NIW^7Gt7;Et zsmtyUZ9YBmcnl4E1vINAtl-lD&suz^){j*57yZ@Ufxk9+^#vM$;pOj;;=`b{F4Gl5&^9X2IiA>%_s3rKu4BVuZwEYfsXI9 zycdpcF13LaRcp=v_~MMWgz|q~VQP6b$#eax#!!#7I?WUE{fBO-?~O!hGbW+XN+x1* z^T@0ip;6*bRys2cO2vLLzlfiJhg)-J#Z_p8t^gnOz9SfCe~W~i+&?>y)nnuL7%N{7Eshst#y`#` zb4c#F=@`Szc4}(0y{KflRuuT^Q7y8kW02>#c0yl6OkuO}P`;$|mv>*UB{BkjIiX&pMWb}1MVUVd^*(cd8vNlW1 zc?nc3uLLZ(S9QeKR$?QP1D3=kbhHH z8!Eu$oVuXD=vgsXf{NgN1DO9UFfuH^beyN}fC0Vy87XnL(@|McsP+lIWIgGV!wcX5 z&C}M&;q&Oyb zU?VZ|_=^I6|3d?~4N7rGZYl{PxSP`FQYr|=0zxT5o+Cv-XZu%N$4O#p=6V}_qml$& zscgTd_$p34->jesWMYuSCwy4i2KxWricJ40$AeKW}sWcl! zS-QIO)Ikl&0_ib`dbwEGsLi;EAxD^fAY9SEsZ3(t!qvwku)@%f znqiYn3={%c>h3^7W9oix^hmrV<5=T1-9CFrXBr#?;ifw6#8(UM&hcvdq(L1ys1GwC z?@LIbO&Luc>z4~_ymplCSu0|{nz2k^^)7O zcM{&#p`ZzRS+XkPo|!1%s~~KYEYRCd{2}6<3E$(W!PFh^rJqD9!+!W&+MFszI)oT76h4D`^lDnJ|yZv^9(7i z^bJO65=Zc2@-rXE`(x{nHwpQ*YS5*Zllxd(dNzV5TPl(gBf3{SHBH;9D6>Gb`p&3I z0idW?SWS(*)rpqtVYV=-?OC__jwrVR*v5sVqTR+%uf(NXMb1yws0V@ZnCYG!P{`UE zCuMHA>dR3+$y&(2`!>>5%@3?ZEe_*nW~V_%ie;9O+U)sm0|i63#6=(@xZ~?%&#M%gzBC{rfzeP2YcB z8GXq=cGl8C?MM&f%JiKoOyL!f-QjZXTLB?qMNySLJ|HmwRZ#_0MNDh1+B3De9PZcR zlK123tXYk9$z!8Hp(V~|RTZrYzLAt?7^?d{fps|oRF~+XQ(q0_f9d?dl2Mc&qIY=o z`C(A;g7a&KnIf(V^w$!aQk=B7|8FbHSHiFP4x9n_5I7P$eWNJ+7+V7XU3+l6`0cT{ zGj7T6tu%ka?7MQwYpbBN8H_dWJ>0=#j>b#q_LU5!WPMBNL6jen0*AmmJ$_|)$SHK} z)%mh7h+t9kVmbggexUJF?gfJSptfeBfs43|L%77OaM~Gsp~{J&gFzeI;HuCY zL!hJB7=$|zu|Y<3gR!@NUDjrdWKu8Beq*buvX<3K2*bD8hLmU13L1Xw$ogb~lP_G-UrrKFgsW9@M%PPHg`ppI!O>>E9Zqb%Q6X2mSu2N&Az@ zq{{hhYhFYtO0rR40o1lubai@0GKdx_J^1~2IP(H$M9 z5tC4`J-7EOg-1R|XD}-tu_IiBn$e0ph4r>URn5lPGBBoTUcpodOVh8gg%{&1(<=Ll za)-oNrhnF35gBkgjX=+{2F+{PM8*+DDT5RA*15#D-fW@0mg(W+)Xtkn1C=%f(?i_a z5(or&$_i9MO)(4e4h*Bc0)j1nDQ$a-7Oo+8X>}*M(|Fhtz+}^W>?XCPeT~gAB<-^T zD9L1L2dud zFMIj#H-v!z;i9d;rO$c3v8*O8Wh^h%gmw?x4GUwk6 zq-8Da`8YI5Gw0LzDDmNjOcg>473D=;T+bj4v0hw-(5#wj-@vd8#z>$zmi@ z{cVg8H-k+5M}kACYTgdPHebPT<>)d5>CPpYuSp_E4GeQjFOL8$SC+RHz@E!^11*`)jWua;GsB12EsOud?> z%jOi_Uz!cgMCxN`0)UM-g(I!JFz)+1b|>jo@mrkT}Z@$31q;d z5p$rN@5u8;i{!c*`3_J1i^_C$7T!g7krW zMo$HERqDU{6qqxWVFwHyl#Pug)u06Qhu)Y1Mgj=6eSPF^Uv)qs4+eiCZ9becH)Xk> zD&5^>>+KsmwP*5lpmENNlSTO@Z3`kBpXZMTqJV(fu*-zUf5kYF){}K9l5SoMVrJ0B@{OTewxc)s!_$SSnq1-m`>t;YnPscgI zPrs;+tm_6ToW)i!Bm9Y;iG%;)rX%oYM>yw+_?s9%v-3tTfBQJan4w7*W zDiEBm*&-2LWZRg|ePL*_r}$`6u2?16Oa5} z?Y^H7Z~+NrpNeCg6*WjE*2fgi>@U;m*p88#B*K^F!^1KW>&eY|ProHW;o@Q7Ph7D* zCoT#18u-?q96Poq`iRMlmltO|cFn?K#@=|Co^-#SB=qOFV6aM2(ddXR^YZo|lm=Ar zbkWtfj*f2}PXns6xL!U^O)=PI=brc$IvQyj`r*$ZVoF36Xo6tmGPjSPBgb3O*&Zbw z*EEe{rq1t1j?W3{FgdewDCrKGr+81EXs9nbJ*;CHt5RKKJyh8)E!r;y+!U;{dgiiU zdCE4V%jYz|;FEIv-emKt*(Bwd+5im?5CS59s>TH8OzeI8IOKlvPU=-qqpb>0vAnXSts!sY3=|UG21%p&u)6)O!-)&Cj zphYrOS+R4=NU>)g0U0M}b^@kdkFa)c8x9JcQfcw>e&Rpo$qFZ-_}Vay{Cxsk>FnLH zCr)M(sM#&x807-9K;NSxgY7~~Yc`pmyKWMAO3z{7v#cjMvLL{`WEN(`QSYc12A>K` z?~Jo{QY_}!YIUc1+?-Z)=(SjzWUob&u#|Dro)-#*0V+whB}a+CAb?)OY8P)^)1$>e zpB08JonWs6v~H01$*B0jvHV>jvk^(Xqq(cOti}F(7{vBoV$1 za4mhL^(C>^fNKA>SO6=EAjP~kq_$yDnKpla6NS8m>tz62cq_>8*77cRqx6JZgvj~D z=;VCp%1Ws z3D~ab3^Q~lu}V*W^NM+7nzGnp7^)m{bmVTj9INtN=qR_izG^HH1>Zp;%s}WjjFKu@Tl7<7Xo_Oxt_k>qmIR?`zz

    1)GP2M zo76ix`k2E}saP|3u|W<434v2fY@hjwC4tjY zL(G_lpBCPxvEVGS!+iWcs)iY4kd@krkD{1Ra%O_Pzl}Ga)pygz>OZ~A#9XA@Nxd6d>2IYxSmpQZwMZlWRo?hdw~gUo{b6~n{=RPR zC|D3?BuaBzlJzTD+WL;{9YhLW*#Dw?oP9Rccq2sKE2SuL?v?n1)!#b6NOVdT^$E)! zdGq}Lub)3`;ApAq`oMGmDYpdSw*psW9r8`VGMnQuhR#$&G`WYoVFfTUj(rWb0P-5V< zgmV&sSS2!~%{>I5k(9Tfa+l}w96b<*63XzH#2y<4pfCBTrysjyZ@sT%Od3hunKIU# z-!Q?Z&R}g>>l(M1zvH$E@L=ckc~SdNi}KJ(7ZA}Nvu^bY%|et&&0QDN4?&QO-TUxcQXRjkjl@S9#6CmG%Hh84T)FtD$cmB7>5*Z>V(2*!E;J6n#K2dx%m zG_>5lFCh(3l4h#3Y10Sfk-T!?al3kCYDdy5PwU1E&C8DkZR1JQ2X~|i$vJ*&awY@5kr~YD7t~W&o03LvKfMti+fv zo~GNE!DQ4SL*7vC+Igo!T}E*4a2pTJJd6Zex33Lwr-_@42IS5dO@)ygl9Wjgk>QFW zg6E_%X1UvQLL=s!T^)C3{Ul}l_Dfd|Ug|Xeb%)`Qd2NKv@bvHBA=8ZrmQZ)A%(8=I zTGDPs?LQiOSP}G`8r1ub^ls?LX{44gnD+;`2@S0!y&jmA0@|~co2*jy#uIbY-{?&| zPyu>?5tJ8z22+mA-SvX8`lgzOR`&2klE<%QTOXYVk;)DY=xqelx7cKJ;@uu1`40(y zNs<8+eolnpuP0h-m<>BE@DFSEJb?}#y_0vKR*^-!|=F$czADr-NT

    pa->agtpt71moY1F4Je-AXyo`#Q}q*9&f1= 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 diff --git a/haskell/src/SwiftNav/SBP/Integrity.hs b/haskell/src/SwiftNav/SBP/Integrity.hs index 98dea0cfe8..ca8ad4c76c 100644 --- a/haskell/src/SwiftNav/SBP/Integrity.hs +++ b/haskell/src/SwiftNav/SBP/Integrity.hs @@ -36,20 +36,113 @@ import SwiftNav.SBP.Gnss {-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-} +data IntegritySSRHeader = IntegritySSRHeader + { _integritySSRHeader_obs_time :: !GpsTimeSec + -- ^ GNSS reference time of the observation used to generate the flag. + , _integritySSRHeader_num_msgs :: !Word8 + -- ^ Number of messages in the dataset + , _integritySSRHeader_seq_num :: !Word8 + -- ^ Position of this message in the dataset + , _integritySSRHeader_ssr_sol_id :: !Word8 + -- ^ SSR Solution ID. + , _integritySSRHeader_tile_set_id :: !Word16 + -- ^ Unique identifier of the set this tile belongs to. + , _integritySSRHeader_tile_id :: !Word16 + -- ^ Unique identifier of this tile in the tile set. + , _integritySSRHeader_chain_id :: !Word8 + -- ^ Chain and type of flag. + } deriving ( Show, Read, Eq ) + +instance Binary IntegritySSRHeader where + get = do + _integritySSRHeader_obs_time <- get + _integritySSRHeader_num_msgs <- getWord8 + _integritySSRHeader_seq_num <- getWord8 + _integritySSRHeader_ssr_sol_id <- getWord8 + _integritySSRHeader_tile_set_id <- getWord16le + _integritySSRHeader_tile_id <- getWord16le + _integritySSRHeader_chain_id <- getWord8 + pure IntegritySSRHeader {..} + + put IntegritySSRHeader {..} = do + put _integritySSRHeader_obs_time + putWord8 _integritySSRHeader_num_msgs + putWord8 _integritySSRHeader_seq_num + putWord8 _integritySSRHeader_ssr_sol_id + putWord16le _integritySSRHeader_tile_set_id + putWord16le _integritySSRHeader_tile_id + putWord8 _integritySSRHeader_chain_id + +$(makeJSON "_integritySSRHeader_" ''IntegritySSRHeader) +$(makeLenses ''IntegritySSRHeader) + msgSsrFlagHighLevel :: Word16 msgSsrFlagHighLevel = 0x0BB9 data MsgSsrFlagHighLevel = MsgSsrFlagHighLevel - { _msgSsrFlagHighLevel_stub :: ![Word8] + { _msgSsrFlagHighLevel_obs_time :: !GpsTimeSec + -- ^ GNSS reference time of the observation used to generate the flag. + , _msgSsrFlagHighLevel_corr_time :: !GpsTimeSec + -- ^ GNSS reference time of the correction associated to the flag. + , _msgSsrFlagHighLevel_ssr_sol_id :: !Word8 + -- ^ SSR Solution ID. + , _msgSsrFlagHighLevel_tile_set_id :: !Word16 + -- ^ Unique identifier of the set this tile belongs to. + , _msgSsrFlagHighLevel_tile_id :: !Word16 + -- ^ Unique identifier of this tile in the tile set. + , _msgSsrFlagHighLevel_chain_id :: !Word8 + -- ^ Chain and type of flag. + , _msgSsrFlagHighLevel_use_gps_sat :: !Word8 + -- ^ Use GPS satellites. + , _msgSsrFlagHighLevel_use_gal_sat :: !Word8 + -- ^ Use GAL satellites. + , _msgSsrFlagHighLevel_use_bds_sat :: !Word8 + -- ^ Use BDS satellites. + , _msgSsrFlagHighLevel_reserved :: ![Word8] + -- ^ Reserved + , _msgSsrFlagHighLevel_use_tropo_grid_points :: !Word8 + -- ^ Use tropo grid points. + , _msgSsrFlagHighLevel_use_iono_grid_points :: !Word8 + -- ^ Use iono grid points. + , _msgSsrFlagHighLevel_use_iono_tile_sat_los :: !Word8 + -- ^ Use iono tile satellite LoS. + , _msgSsrFlagHighLevel_use_iono_grid_point_sat_los :: !Word8 + -- ^ Use iono grid point satellite LoS. } deriving ( Show, Read, Eq ) instance Binary MsgSsrFlagHighLevel where get = do - _msgSsrFlagHighLevel_stub <- whileM (not <$> isEmpty) getWord8 + _msgSsrFlagHighLevel_obs_time <- get + _msgSsrFlagHighLevel_corr_time <- get + _msgSsrFlagHighLevel_ssr_sol_id <- getWord8 + _msgSsrFlagHighLevel_tile_set_id <- getWord16le + _msgSsrFlagHighLevel_tile_id <- getWord16le + _msgSsrFlagHighLevel_chain_id <- getWord8 + _msgSsrFlagHighLevel_use_gps_sat <- getWord8 + _msgSsrFlagHighLevel_use_gal_sat <- getWord8 + _msgSsrFlagHighLevel_use_bds_sat <- getWord8 + _msgSsrFlagHighLevel_reserved <- replicateM 6 getWord8 + _msgSsrFlagHighLevel_use_tropo_grid_points <- getWord8 + _msgSsrFlagHighLevel_use_iono_grid_points <- getWord8 + _msgSsrFlagHighLevel_use_iono_tile_sat_los <- getWord8 + _msgSsrFlagHighLevel_use_iono_grid_point_sat_los <- getWord8 pure MsgSsrFlagHighLevel {..} put MsgSsrFlagHighLevel {..} = do - mapM_ putWord8 _msgSsrFlagHighLevel_stub + put _msgSsrFlagHighLevel_obs_time + put _msgSsrFlagHighLevel_corr_time + putWord8 _msgSsrFlagHighLevel_ssr_sol_id + putWord16le _msgSsrFlagHighLevel_tile_set_id + putWord16le _msgSsrFlagHighLevel_tile_id + putWord8 _msgSsrFlagHighLevel_chain_id + putWord8 _msgSsrFlagHighLevel_use_gps_sat + putWord8 _msgSsrFlagHighLevel_use_gal_sat + putWord8 _msgSsrFlagHighLevel_use_bds_sat + mapM_ putWord8 _msgSsrFlagHighLevel_reserved + putWord8 _msgSsrFlagHighLevel_use_tropo_grid_points + putWord8 _msgSsrFlagHighLevel_use_iono_grid_points + putWord8 _msgSsrFlagHighLevel_use_iono_tile_sat_los + putWord8 _msgSsrFlagHighLevel_use_iono_grid_point_sat_los $(makeSBP 'msgSsrFlagHighLevel ''MsgSsrFlagHighLevel) $(makeJSON "_msgSsrFlagHighLevel_" ''MsgSsrFlagHighLevel) @@ -59,16 +152,45 @@ msgSsrFlagSatellites :: Word16 msgSsrFlagSatellites = 0x0BBD data MsgSsrFlagSatellites = MsgSsrFlagSatellites - { _msgSsrFlagSatellites_stub :: ![Word8] + { _msgSsrFlagSatellites_obs_time :: !GpsTimeSec + -- ^ GNSS reference time of the observation used to generate the flag. + , _msgSsrFlagSatellites_num_msgs :: !Word8 + -- ^ Number of messages in the dataset + , _msgSsrFlagSatellites_seq_num :: !Word8 + -- ^ Position of this message in the dataset + , _msgSsrFlagSatellites_ssr_sol_id :: !Word8 + -- ^ SSR Solution ID. + , _msgSsrFlagSatellites_chain_id :: !Word8 + -- ^ Chain and type of flag. + , _msgSsrFlagSatellites_const_id :: !Word8 + -- ^ Constellation ID. + , _msgSsrFlagSatellites_n_faulty_sats :: !Word8 + -- ^ Number of faulty satellites. + , _msgSsrFlagSatellites_faulty_sats :: ![Word8] + -- ^ List of faulty satellites. } deriving ( Show, Read, Eq ) instance Binary MsgSsrFlagSatellites where get = do - _msgSsrFlagSatellites_stub <- whileM (not <$> isEmpty) getWord8 + _msgSsrFlagSatellites_obs_time <- get + _msgSsrFlagSatellites_num_msgs <- getWord8 + _msgSsrFlagSatellites_seq_num <- getWord8 + _msgSsrFlagSatellites_ssr_sol_id <- getWord8 + _msgSsrFlagSatellites_chain_id <- getWord8 + _msgSsrFlagSatellites_const_id <- getWord8 + _msgSsrFlagSatellites_n_faulty_sats <- getWord8 + _msgSsrFlagSatellites_faulty_sats <- whileM (not <$> isEmpty) getWord8 pure MsgSsrFlagSatellites {..} put MsgSsrFlagSatellites {..} = do - mapM_ putWord8 _msgSsrFlagSatellites_stub + put _msgSsrFlagSatellites_obs_time + putWord8 _msgSsrFlagSatellites_num_msgs + putWord8 _msgSsrFlagSatellites_seq_num + putWord8 _msgSsrFlagSatellites_ssr_sol_id + putWord8 _msgSsrFlagSatellites_chain_id + putWord8 _msgSsrFlagSatellites_const_id + putWord8 _msgSsrFlagSatellites_n_faulty_sats + mapM_ putWord8 _msgSsrFlagSatellites_faulty_sats $(makeSBP 'msgSsrFlagSatellites ''MsgSsrFlagSatellites) $(makeJSON "_msgSsrFlagSatellites_" ''MsgSsrFlagSatellites) @@ -78,16 +200,25 @@ msgSsrFlagTropoGridPoints :: Word16 msgSsrFlagTropoGridPoints = 0x0BC3 data MsgSsrFlagTropoGridPoints = MsgSsrFlagTropoGridPoints - { _msgSsrFlagTropoGridPoints_stub :: ![Word8] + { _msgSsrFlagTropoGridPoints_header :: !IntegritySSRHeader + -- ^ Header of an integrity message. + , _msgSsrFlagTropoGridPoints_n_faulty_points :: !Word8 + -- ^ Number of faulty grid points. + , _msgSsrFlagTropoGridPoints_faulty_points :: ![Word16] + -- ^ List of faulty grid points. } deriving ( Show, Read, Eq ) instance Binary MsgSsrFlagTropoGridPoints where get = do - _msgSsrFlagTropoGridPoints_stub <- whileM (not <$> isEmpty) getWord8 + _msgSsrFlagTropoGridPoints_header <- get + _msgSsrFlagTropoGridPoints_n_faulty_points <- getWord8 + _msgSsrFlagTropoGridPoints_faulty_points <- whileM (not <$> isEmpty) getWord16le pure MsgSsrFlagTropoGridPoints {..} put MsgSsrFlagTropoGridPoints {..} = do - mapM_ putWord8 _msgSsrFlagTropoGridPoints_stub + put _msgSsrFlagTropoGridPoints_header + putWord8 _msgSsrFlagTropoGridPoints_n_faulty_points + mapM_ putWord16le _msgSsrFlagTropoGridPoints_faulty_points $(makeSBP 'msgSsrFlagTropoGridPoints ''MsgSsrFlagTropoGridPoints) $(makeJSON "_msgSsrFlagTropoGridPoints_" ''MsgSsrFlagTropoGridPoints) @@ -97,16 +228,25 @@ msgSsrFlagIonoGridPoints :: Word16 msgSsrFlagIonoGridPoints = 0x0BC7 data MsgSsrFlagIonoGridPoints = MsgSsrFlagIonoGridPoints - { _msgSsrFlagIonoGridPoints_stub :: ![Word8] + { _msgSsrFlagIonoGridPoints_header :: !IntegritySSRHeader + -- ^ Header of an integrity message. + , _msgSsrFlagIonoGridPoints_n_faulty_points :: !Word8 + -- ^ Number of faulty grid points. + , _msgSsrFlagIonoGridPoints_faulty_points :: ![Word16] + -- ^ List of faulty grid points. } deriving ( Show, Read, Eq ) instance Binary MsgSsrFlagIonoGridPoints where get = do - _msgSsrFlagIonoGridPoints_stub <- whileM (not <$> isEmpty) getWord8 + _msgSsrFlagIonoGridPoints_header <- get + _msgSsrFlagIonoGridPoints_n_faulty_points <- getWord8 + _msgSsrFlagIonoGridPoints_faulty_points <- whileM (not <$> isEmpty) getWord16le pure MsgSsrFlagIonoGridPoints {..} put MsgSsrFlagIonoGridPoints {..} = do - mapM_ putWord8 _msgSsrFlagIonoGridPoints_stub + put _msgSsrFlagIonoGridPoints_header + putWord8 _msgSsrFlagIonoGridPoints_n_faulty_points + mapM_ putWord16le _msgSsrFlagIonoGridPoints_faulty_points $(makeSBP 'msgSsrFlagIonoGridPoints ''MsgSsrFlagIonoGridPoints) $(makeJSON "_msgSsrFlagIonoGridPoints_" ''MsgSsrFlagIonoGridPoints) @@ -116,16 +256,25 @@ msgSsrFlagIonoTileSatLos :: Word16 msgSsrFlagIonoTileSatLos = 0x0BCD data MsgSsrFlagIonoTileSatLos = MsgSsrFlagIonoTileSatLos - { _msgSsrFlagIonoTileSatLos_stub :: ![Word8] + { _msgSsrFlagIonoTileSatLos_header :: !IntegritySSRHeader + -- ^ Header of an integrity message. + , _msgSsrFlagIonoTileSatLos_n_faulty_los :: !Word8 + -- ^ Number of faulty LOS. + , _msgSsrFlagIonoTileSatLos_faulty_los :: ![SvId] + -- ^ List of faulty LOS } deriving ( Show, Read, Eq ) instance Binary MsgSsrFlagIonoTileSatLos where get = do - _msgSsrFlagIonoTileSatLos_stub <- whileM (not <$> isEmpty) getWord8 + _msgSsrFlagIonoTileSatLos_header <- get + _msgSsrFlagIonoTileSatLos_n_faulty_los <- getWord8 + _msgSsrFlagIonoTileSatLos_faulty_los <- whileM (not <$> isEmpty) get pure MsgSsrFlagIonoTileSatLos {..} put MsgSsrFlagIonoTileSatLos {..} = do - mapM_ putWord8 _msgSsrFlagIonoTileSatLos_stub + put _msgSsrFlagIonoTileSatLos_header + putWord8 _msgSsrFlagIonoTileSatLos_n_faulty_los + mapM_ put _msgSsrFlagIonoTileSatLos_faulty_los $(makeSBP 'msgSsrFlagIonoTileSatLos ''MsgSsrFlagIonoTileSatLos) $(makeJSON "_msgSsrFlagIonoTileSatLos_" ''MsgSsrFlagIonoTileSatLos) @@ -135,16 +284,29 @@ msgSsrFlagIonoGridPointSatLos :: Word16 msgSsrFlagIonoGridPointSatLos = 0x0BD1 data MsgSsrFlagIonoGridPointSatLos = MsgSsrFlagIonoGridPointSatLos - { _msgSsrFlagIonoGridPointSatLos_stub :: ![Word8] + { _msgSsrFlagIonoGridPointSatLos_header :: !IntegritySSRHeader + -- ^ Header of an integrity message. + , _msgSsrFlagIonoGridPointSatLos_grid_point_id :: !Word16 + -- ^ Index of the grid point. + , _msgSsrFlagIonoGridPointSatLos_n_faulty_los :: !Word8 + -- ^ Number of faulty LOS. + , _msgSsrFlagIonoGridPointSatLos_faulty_los :: ![SvId] + -- ^ List of faulty LOS } deriving ( Show, Read, Eq ) instance Binary MsgSsrFlagIonoGridPointSatLos where get = do - _msgSsrFlagIonoGridPointSatLos_stub <- whileM (not <$> isEmpty) getWord8 + _msgSsrFlagIonoGridPointSatLos_header <- get + _msgSsrFlagIonoGridPointSatLos_grid_point_id <- getWord16le + _msgSsrFlagIonoGridPointSatLos_n_faulty_los <- getWord8 + _msgSsrFlagIonoGridPointSatLos_faulty_los <- whileM (not <$> isEmpty) get pure MsgSsrFlagIonoGridPointSatLos {..} put MsgSsrFlagIonoGridPointSatLos {..} = do - mapM_ putWord8 _msgSsrFlagIonoGridPointSatLos_stub + put _msgSsrFlagIonoGridPointSatLos_header + putWord16le _msgSsrFlagIonoGridPointSatLos_grid_point_id + putWord8 _msgSsrFlagIonoGridPointSatLos_n_faulty_los + mapM_ put _msgSsrFlagIonoGridPointSatLos_faulty_los $(makeSBP 'msgSsrFlagIonoGridPointSatLos ''MsgSsrFlagIonoGridPointSatLos) $(makeJSON "_msgSsrFlagIonoGridPointSatLos_" ''MsgSsrFlagIonoGridPointSatLos) diff --git a/haskell/src/SwiftNav/SBP/Navigation.hs b/haskell/src/SwiftNav/SBP/Navigation.hs index 86a96c4973..4e9f2a4313 100644 --- a/haskell/src/SwiftNav/SBP/Navigation.hs +++ b/haskell/src/SwiftNav/SBP/Navigation.hs @@ -2312,16 +2312,52 @@ msgUtcLeapSecond = 0x023A -- Emulates the GPS CNAV message, reserving bytes for future broadcast of the -- drift model parameters. data MsgUtcLeapSecond = MsgUtcLeapSecond - { _msgUtcLeapSecond_stub :: ![Word8] + { _msgUtcLeapSecond_bias_coeff :: !Int16 + -- ^ Reserved. Bias coefficient of GPS time scale with respect to UTC drift + -- model. + , _msgUtcLeapSecond_drift_coeff :: !Int16 + -- ^ Reserved. Drift coefficient of GPS time scale with respect to UTC drift + -- model. + , _msgUtcLeapSecond_drift_rate_coeff :: !Int8 + -- ^ Reserved. Drift rate correction coefficient of GPS time scale with + -- respect to UTC drift model. + , _msgUtcLeapSecond_count_before :: !Int8 + -- ^ Leap second count before insertion. + , _msgUtcLeapSecond_tow_s :: !Word16 + -- ^ Reserved. Drift model reference week second. + , _msgUtcLeapSecond_wn :: !Word16 + -- ^ Reserved. Drift model reference week number. + , _msgUtcLeapSecond_ref_wn :: !Word16 + -- ^ Leap second reference week number. + , _msgUtcLeapSecond_ref_dn :: !Word8 + -- ^ Leap second reference day number. + , _msgUtcLeapSecond_count_after :: !Int8 + -- ^ Leap second count after insertion. } deriving ( Show, Read, Eq ) instance Binary MsgUtcLeapSecond where get = do - _msgUtcLeapSecond_stub <- whileM (not <$> isEmpty) getWord8 + _msgUtcLeapSecond_bias_coeff <- (fromIntegral <$> getWord16le) + _msgUtcLeapSecond_drift_coeff <- (fromIntegral <$> getWord16le) + _msgUtcLeapSecond_drift_rate_coeff <- (fromIntegral <$> getWord8) + _msgUtcLeapSecond_count_before <- (fromIntegral <$> getWord8) + _msgUtcLeapSecond_tow_s <- getWord16le + _msgUtcLeapSecond_wn <- getWord16le + _msgUtcLeapSecond_ref_wn <- getWord16le + _msgUtcLeapSecond_ref_dn <- getWord8 + _msgUtcLeapSecond_count_after <- (fromIntegral <$> getWord8) pure MsgUtcLeapSecond {..} put MsgUtcLeapSecond {..} = do - mapM_ putWord8 _msgUtcLeapSecond_stub + (putWord16le . fromIntegral) _msgUtcLeapSecond_bias_coeff + (putWord16le . fromIntegral) _msgUtcLeapSecond_drift_coeff + (putWord8 . fromIntegral) _msgUtcLeapSecond_drift_rate_coeff + (putWord8 . fromIntegral) _msgUtcLeapSecond_count_before + putWord16le _msgUtcLeapSecond_tow_s + putWord16le _msgUtcLeapSecond_wn + putWord16le _msgUtcLeapSecond_ref_wn + putWord8 _msgUtcLeapSecond_ref_dn + (putWord8 . fromIntegral) _msgUtcLeapSecond_count_after $(makeSBP 'msgUtcLeapSecond ''MsgUtcLeapSecond) $(makeJSON "_msgUtcLeapSecond_" ''MsgUtcLeapSecond) @@ -2331,16 +2367,94 @@ msgReferenceFrameParam :: Word16 msgReferenceFrameParam = 0x0244 data MsgReferenceFrameParam = MsgReferenceFrameParam - { _msgReferenceFrameParam_stub :: ![Word8] + { _msgReferenceFrameParam_ssr_iod :: !Word8 + -- ^ SSR IOD parameter. + , _msgReferenceFrameParam_sn :: !Text + -- ^ Name of source coordinate-system using the EPSG identification code. + , _msgReferenceFrameParam_tn :: !Text + -- ^ Name of target coordinate-system using the EPSG identification code. + , _msgReferenceFrameParam_sin :: !Word8 + -- ^ System Identification Number. + , _msgReferenceFrameParam_utn :: !Word16 + -- ^ Utilized Transformation Message. + , _msgReferenceFrameParam_re_t0 :: !Word16 + -- ^ Reference Epoch t0 for transformation parameter set given as Modified + -- Julian Day (MDJ) Number minus 44244 days. + , _msgReferenceFrameParam_delta_X0 :: !Int32 + -- ^ Translation in X for Reference Epoch t0. + , _msgReferenceFrameParam_delta_Y0 :: !Int32 + -- ^ Translation in Y for Reference Epoch t0. + , _msgReferenceFrameParam_delta_Z0 :: !Int32 + -- ^ Translation in Z for Reference Epoch t0. + , _msgReferenceFrameParam_theta_01 :: !Int32 + -- ^ Rotation around the X-axis for Reference Epoch t0. + , _msgReferenceFrameParam_theta_02 :: !Int32 + -- ^ Rotation around the Y-axis for Reference Epoch t0. + , _msgReferenceFrameParam_theta_03 :: !Int32 + -- ^ Rotation around the Z-axis for Reference Epoch t0. + , _msgReferenceFrameParam_scale :: !Int32 + -- ^ Scale correction for Reference Epoch t0. + , _msgReferenceFrameParam_dot_delta_X0 :: !Int32 + -- ^ Rate of change of translation in X. + , _msgReferenceFrameParam_dot_delta_Y0 :: !Int32 + -- ^ Rate of change of translation in Y. + , _msgReferenceFrameParam_dot_delta_Z0 :: !Int32 + -- ^ Rate of change of translation in Z. + , _msgReferenceFrameParam_dot_theta_01 :: !Int32 + -- ^ Rate of change of rotation around the X-axis. + , _msgReferenceFrameParam_dot_theta_02 :: !Int32 + -- ^ Rate of change of rotation around the Y-axis. + , _msgReferenceFrameParam_dot_theta_03 :: !Int32 + -- ^ Rate of change of rotation around the Z-axis. + , _msgReferenceFrameParam_dot_scale :: !Int16 + -- ^ Rate of change of scale correction. } deriving ( Show, Read, Eq ) instance Binary MsgReferenceFrameParam where get = do - _msgReferenceFrameParam_stub <- whileM (not <$> isEmpty) getWord8 + _msgReferenceFrameParam_ssr_iod <- getWord8 + _msgReferenceFrameParam_sn <- decodeUtf8 <$> getByteString 32 + _msgReferenceFrameParam_tn <- decodeUtf8 <$> getByteString 32 + _msgReferenceFrameParam_sin <- getWord8 + _msgReferenceFrameParam_utn <- getWord16le + _msgReferenceFrameParam_re_t0 <- getWord16le + _msgReferenceFrameParam_delta_X0 <- (fromIntegral <$> getWord32le) + _msgReferenceFrameParam_delta_Y0 <- (fromIntegral <$> getWord32le) + _msgReferenceFrameParam_delta_Z0 <- (fromIntegral <$> getWord32le) + _msgReferenceFrameParam_theta_01 <- (fromIntegral <$> getWord32le) + _msgReferenceFrameParam_theta_02 <- (fromIntegral <$> getWord32le) + _msgReferenceFrameParam_theta_03 <- (fromIntegral <$> getWord32le) + _msgReferenceFrameParam_scale <- (fromIntegral <$> getWord32le) + _msgReferenceFrameParam_dot_delta_X0 <- (fromIntegral <$> getWord32le) + _msgReferenceFrameParam_dot_delta_Y0 <- (fromIntegral <$> getWord32le) + _msgReferenceFrameParam_dot_delta_Z0 <- (fromIntegral <$> getWord32le) + _msgReferenceFrameParam_dot_theta_01 <- (fromIntegral <$> getWord32le) + _msgReferenceFrameParam_dot_theta_02 <- (fromIntegral <$> getWord32le) + _msgReferenceFrameParam_dot_theta_03 <- (fromIntegral <$> getWord32le) + _msgReferenceFrameParam_dot_scale <- (fromIntegral <$> getWord16le) pure MsgReferenceFrameParam {..} put MsgReferenceFrameParam {..} = do - mapM_ putWord8 _msgReferenceFrameParam_stub + putWord8 _msgReferenceFrameParam_ssr_iod + putByteString $ encodeUtf8 _msgReferenceFrameParam_sn + putByteString $ encodeUtf8 _msgReferenceFrameParam_tn + putWord8 _msgReferenceFrameParam_sin + putWord16le _msgReferenceFrameParam_utn + putWord16le _msgReferenceFrameParam_re_t0 + (putWord32le . fromIntegral) _msgReferenceFrameParam_delta_X0 + (putWord32le . fromIntegral) _msgReferenceFrameParam_delta_Y0 + (putWord32le . fromIntegral) _msgReferenceFrameParam_delta_Z0 + (putWord32le . fromIntegral) _msgReferenceFrameParam_theta_01 + (putWord32le . fromIntegral) _msgReferenceFrameParam_theta_02 + (putWord32le . fromIntegral) _msgReferenceFrameParam_theta_03 + (putWord32le . fromIntegral) _msgReferenceFrameParam_scale + (putWord32le . fromIntegral) _msgReferenceFrameParam_dot_delta_X0 + (putWord32le . fromIntegral) _msgReferenceFrameParam_dot_delta_Y0 + (putWord32le . fromIntegral) _msgReferenceFrameParam_dot_delta_Z0 + (putWord32le . fromIntegral) _msgReferenceFrameParam_dot_theta_01 + (putWord32le . fromIntegral) _msgReferenceFrameParam_dot_theta_02 + (putWord32le . fromIntegral) _msgReferenceFrameParam_dot_theta_03 + (putWord16le . fromIntegral) _msgReferenceFrameParam_dot_scale $(makeSBP 'msgReferenceFrameParam ''MsgReferenceFrameParam) $(makeJSON "_msgReferenceFrameParam_" ''MsgReferenceFrameParam) diff --git a/haskell/src/SwiftNav/SBP/Ssr.hs b/haskell/src/SwiftNav/SBP/Ssr.hs index d975896b86..6592b75e1f 100644 --- a/haskell/src/SwiftNav/SBP/Ssr.hs +++ b/haskell/src/SwiftNav/SBP/Ssr.hs @@ -204,7 +204,8 @@ data STECSatElement = STECSatElement -- ^ Quality of the STEC data. Encoded following RTCM DF389 specification -- but in units of TECU instead of m. , _sTECSatElement_stec_coeff :: ![Int16] - -- ^ Coefficients of the STEC polynomial in the order of C00, C01, C10, C11 + -- ^ Coefficients of the STEC polynomial in the order of C00, C01, C10, C11. + -- C00 = 0.05 TECU, C01/C10 = 0.02 TECU/deg, C11 0.02 TECU/deg^2 } deriving ( Show, Read, Eq ) instance Binary STECSatElement where @@ -251,11 +252,12 @@ $(makeLenses ''TroposphericDelayCorrectionNoStd) -- point. data TroposphericDelayCorrection = TroposphericDelayCorrection { _troposphericDelayCorrection_hydro :: !Int16 - -- ^ Hydrostatic vertical delay + -- ^ Hydrostatic vertical delay. Add 2.3 m to get actual value. , _troposphericDelayCorrection_wet :: !Int8 - -- ^ Wet vertical delay + -- ^ Wet vertical delay. Add 0.252 m to get actual value. , _troposphericDelayCorrection_stddev :: !Word8 - -- ^ stddev + -- ^ Modified DF389 scale. Class is upper 3 bits, value is lower 5. stddev + -- <= (3^class * (1 + value/16) - 1) mm } deriving ( Show, Read, Eq ) instance Binary TroposphericDelayCorrection where @@ -306,7 +308,8 @@ data STECResidual = STECResidual , _sTECResidual_residual :: !Int16 -- ^ STEC residual , _sTECResidual_stddev :: !Word8 - -- ^ stddev + -- ^ Modified DF389 scale. Class is upper 3 bits, value is lower 5. stddev + -- <= (3^class * (1 + value/16) - 1) * 10 TECU } deriving ( Show, Read, Eq ) instance Binary STECResidual where @@ -539,20 +542,73 @@ $(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_stub :: ![Word8] + { _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 ) instance Binary MsgSsrStecCorrection where get = do - _msgSsrStecCorrection_stub <- whileM (not <$> isEmpty) getWord8 + _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 - mapM_ putWord8 _msgSsrStecCorrection_stub + 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) $(makeJSON "_msgSsrStecCorrection_" ''MsgSsrStecCorrection) @@ -595,20 +651,109 @@ $(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 + -- ^ Error Bound Mean. See Note 1. + , _sTECSatElementIntegrity_stec_bound_sig :: !Word8 + -- ^ Error Bound StDev. See Note 1. + , _sTECSatElementIntegrity_stec_bound_mu_dot :: !Word8 + -- ^ Error Bound Mean First derivative. + , _sTECSatElementIntegrity_stec_bound_sig_dot :: !Word8 + -- ^ Error Bound StDev First derivative. + } 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 +-- | SBP class for message MSG_SSR_GRIDDED_CORRECTION_BOUNDS (0x05FE). +-- +-- Note 1: Range: 0-17.5 m. i<= 200, mean = 0.01i; 200230, mean=5+0.5(i-230). data MsgSsrGriddedCorrectionBounds = MsgSsrGriddedCorrectionBounds - { _msgSsrGriddedCorrectionBounds_stub :: ![Word8] + { _msgSsrGriddedCorrectionBounds_header :: !BoundsHeader + -- ^ Header of a bounds message. + , _msgSsrGriddedCorrectionBounds_ssr_iod_atmo :: !Word8 + -- ^ IOD of the correction. + , _msgSsrGriddedCorrectionBounds_tile_set_id :: !Word16 + -- ^ 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_v_hydro_bound_mu :: !Word8 + -- ^ Vertical Hydrostatic Error Bound Mean. + , _msgSsrGriddedCorrectionBounds_tropo_v_hydro_bound_sig :: !Word8 + -- ^ Vertical Hydrostatic Error Bound StDev. + , _msgSsrGriddedCorrectionBounds_tropo_v_wet_bound_mu :: !Word8 + -- ^ Vertical Wet Error Bound Mean. + , _msgSsrGriddedCorrectionBounds_tropo_v_wet_bound_sig :: !Word8 + -- ^ Vertical Wet Error Bound StDev. + , _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_stub <- whileM (not <$> isEmpty) getWord8 + _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_v_hydro_bound_mu <- getWord8 + _msgSsrGriddedCorrectionBounds_tropo_v_hydro_bound_sig <- getWord8 + _msgSsrGriddedCorrectionBounds_tropo_v_wet_bound_mu <- getWord8 + _msgSsrGriddedCorrectionBounds_tropo_v_wet_bound_sig <- getWord8 + _msgSsrGriddedCorrectionBounds_n_sats <- getWord8 + _msgSsrGriddedCorrectionBounds_stec_sat_list <- whileM (not <$> isEmpty) get pure MsgSsrGriddedCorrectionBounds {..} put MsgSsrGriddedCorrectionBounds {..} = do - mapM_ putWord8 _msgSsrGriddedCorrectionBounds_stub + 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_v_hydro_bound_mu + putWord8 _msgSsrGriddedCorrectionBounds_tropo_v_hydro_bound_sig + putWord8 _msgSsrGriddedCorrectionBounds_tropo_v_wet_bound_mu + putWord8 _msgSsrGriddedCorrectionBounds_tropo_v_wet_bound_sig + putWord8 _msgSsrGriddedCorrectionBounds_n_sats + mapM_ put _msgSsrGriddedCorrectionBounds_stec_sat_list $(makeSBP 'msgSsrGriddedCorrectionBounds ''MsgSsrGriddedCorrectionBounds) $(makeJSON "_msgSsrGriddedCorrectionBounds_" ''MsgSsrGriddedCorrectionBounds) @@ -725,16 +870,90 @@ msgSsrTileDefinition = 0x05F7 -- element GNSS-SSR-CorrectionPoints. SBP only supports gridded arrays of -- correction points, not lists of points. data MsgSsrTileDefinition = MsgSsrTileDefinition - { _msgSsrTileDefinition_stub :: ![Word8] + { _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. + -- See GNSS-SSR-ArrayOfCorrectionPoints field correctionPointSetID. + , _msgSsrTileDefinition_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. + , _msgSsrTileDefinition_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. + , _msgSsrTileDefinition_spacing_lat :: !Word16 + -- ^ Spacing of the correction points in the latitude direction. + -- + -- See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLatitude. + , _msgSsrTileDefinition_spacing_lon :: !Word16 + -- ^ Spacing of the correction points in the longitude direction. + -- + -- See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLongitude. + , _msgSsrTileDefinition_rows :: !Word16 + -- ^ Number of steps in the latitude direction. + -- + -- See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLatitude. + , _msgSsrTileDefinition_cols :: !Word16 + -- ^ Number of steps in the longitude direction. + -- + -- See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLongitude. + , _msgSsrTileDefinition_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 MsgSsrTileDefinition where get = do - _msgSsrTileDefinition_stub <- whileM (not <$> isEmpty) getWord8 + _msgSsrTileDefinition_ssr_sol_id <- getWord8 + _msgSsrTileDefinition_tile_set_id <- getWord16le + _msgSsrTileDefinition_tile_id <- getWord16le + _msgSsrTileDefinition_corner_nw_lat <- (fromIntegral <$> getWord16le) + _msgSsrTileDefinition_corner_nw_lon <- (fromIntegral <$> getWord16le) + _msgSsrTileDefinition_spacing_lat <- getWord16le + _msgSsrTileDefinition_spacing_lon <- getWord16le + _msgSsrTileDefinition_rows <- getWord16le + _msgSsrTileDefinition_cols <- getWord16le + _msgSsrTileDefinition_bitmask <- getWord64le pure MsgSsrTileDefinition {..} put MsgSsrTileDefinition {..} = do - mapM_ putWord8 _msgSsrTileDefinition_stub + putWord8 _msgSsrTileDefinition_ssr_sol_id + putWord16le _msgSsrTileDefinition_tile_set_id + putWord16le _msgSsrTileDefinition_tile_id + (putWord16le . fromIntegral) _msgSsrTileDefinition_corner_nw_lat + (putWord16le . fromIntegral) _msgSsrTileDefinition_corner_nw_lon + putWord16le _msgSsrTileDefinition_spacing_lat + putWord16le _msgSsrTileDefinition_spacing_lon + putWord16le _msgSsrTileDefinition_rows + putWord16le _msgSsrTileDefinition_cols + putWord64le _msgSsrTileDefinition_bitmask $(makeSBP 'msgSsrTileDefinition ''MsgSsrTileDefinition) $(makeJSON "_msgSsrTileDefinition_" ''MsgSsrTileDefinition) @@ -1110,58 +1329,258 @@ $(makeSBP 'msgSsrGridDefinitionDepA ''MsgSsrGridDefinitionDepA) $(makeJSON "_msgSsrGridDefinitionDepA_" ''MsgSsrGridDefinitionDepA) $(makeLenses ''MsgSsrGridDefinitionDepA) +-- | OrbitClockBound. +-- +-- Orbit and clock bound. +data OrbitClockBound = OrbitClockBound + { _orbitClockBound_sat_id :: !Word8 + -- ^ Satellite ID. Similar to either RTCM DF068 (GPS), DF252 (Galileo), or + -- DF488 (BDS) depending on the constellation. + , _orbitClockBound_orb_radial_bound_mu :: !Word8 + -- ^ Mean Radial. See Note 1. + , _orbitClockBound_orb_along_bound_mu :: !Word8 + -- ^ Mean Along-Track. See Note 1. + , _orbitClockBound_orb_cross_bound_mu :: !Word8 + -- ^ Mean Cross-Track. See Note 1. + , _orbitClockBound_orb_radial_bound_sig :: !Word8 + -- ^ Standard Deviation Radial. See Note 2. + , _orbitClockBound_orb_along_bound_sig :: !Word8 + -- ^ Standard Deviation Along-Track. See Note 2. + , _orbitClockBound_orb_cross_bound_sig :: !Word8 + -- ^ Standard Deviation Cross-Track. See Note 2. + , _orbitClockBound_clock_bound_mu :: !Word8 + -- ^ Clock Bound Mean. See Note 1. + , _orbitClockBound_clock_bound_sig :: !Word8 + -- ^ Clock Bound Standard Deviation. See Note 2. + } deriving ( Show, Read, Eq ) + +instance Binary OrbitClockBound where + get = do + _orbitClockBound_sat_id <- getWord8 + _orbitClockBound_orb_radial_bound_mu <- getWord8 + _orbitClockBound_orb_along_bound_mu <- getWord8 + _orbitClockBound_orb_cross_bound_mu <- getWord8 + _orbitClockBound_orb_radial_bound_sig <- getWord8 + _orbitClockBound_orb_along_bound_sig <- getWord8 + _orbitClockBound_orb_cross_bound_sig <- getWord8 + _orbitClockBound_clock_bound_mu <- getWord8 + _orbitClockBound_clock_bound_sig <- getWord8 + pure OrbitClockBound {..} + + put OrbitClockBound {..} = do + putWord8 _orbitClockBound_sat_id + putWord8 _orbitClockBound_orb_radial_bound_mu + putWord8 _orbitClockBound_orb_along_bound_mu + putWord8 _orbitClockBound_orb_cross_bound_mu + putWord8 _orbitClockBound_orb_radial_bound_sig + putWord8 _orbitClockBound_orb_along_bound_sig + putWord8 _orbitClockBound_orb_cross_bound_sig + putWord8 _orbitClockBound_clock_bound_mu + putWord8 _orbitClockBound_clock_bound_sig + +$(makeJSON "_orbitClockBound_" ''OrbitClockBound) +$(makeLenses ''OrbitClockBound) + msgSsrOrbitClockBounds :: Word16 msgSsrOrbitClockBounds = 0x05DE +-- | SBP class for message MSG_SSR_ORBIT_CLOCK_BOUNDS (0x05DE). +-- +-- Note 1: Range: 0-17.5 m. i<=200, mean=0.01i; 200230, mean=5+0.5(i-230). +-- +-- Note 2: Range: 0-17.5 m. i<=200, std=0.01i; 200230, std=5+0.5(i-230). data MsgSsrOrbitClockBounds = MsgSsrOrbitClockBounds - { _msgSsrOrbitClockBounds_stub :: ![Word8] + { _msgSsrOrbitClockBounds_header :: !BoundsHeader + -- ^ Header of a bounds message. + , _msgSsrOrbitClockBounds_ssr_iod :: !Word8 + -- ^ IOD of the SSR bound. + , _msgSsrOrbitClockBounds_const_id :: !Word8 + -- ^ Constellation ID to which the SVs belong. + , _msgSsrOrbitClockBounds_n_sats :: !Word8 + -- ^ Number of satellites. + , _msgSsrOrbitClockBounds_orbit_clock_bounds :: ![OrbitClockBound] + -- ^ Orbit and Clock Bounds per Satellite } deriving ( Show, Read, Eq ) instance Binary MsgSsrOrbitClockBounds where get = do - _msgSsrOrbitClockBounds_stub <- whileM (not <$> isEmpty) getWord8 + _msgSsrOrbitClockBounds_header <- get + _msgSsrOrbitClockBounds_ssr_iod <- getWord8 + _msgSsrOrbitClockBounds_const_id <- getWord8 + _msgSsrOrbitClockBounds_n_sats <- getWord8 + _msgSsrOrbitClockBounds_orbit_clock_bounds <- whileM (not <$> isEmpty) get pure MsgSsrOrbitClockBounds {..} put MsgSsrOrbitClockBounds {..} = do - mapM_ putWord8 _msgSsrOrbitClockBounds_stub + put _msgSsrOrbitClockBounds_header + putWord8 _msgSsrOrbitClockBounds_ssr_iod + putWord8 _msgSsrOrbitClockBounds_const_id + putWord8 _msgSsrOrbitClockBounds_n_sats + mapM_ put _msgSsrOrbitClockBounds_orbit_clock_bounds $(makeSBP 'msgSsrOrbitClockBounds ''MsgSsrOrbitClockBounds) $(makeJSON "_msgSsrOrbitClockBounds_" ''MsgSsrOrbitClockBounds) $(makeLenses ''MsgSsrOrbitClockBounds) +data CodePhaseBiasesSatSig = CodePhaseBiasesSatSig + { _codePhaseBiasesSatSig_sat_id :: !Word8 + -- ^ Satellite ID. Similar to either RTCM DF068 (GPS), DF252 (Galileo), or + -- DF488 (BDS) depending on the constellation. + , _codePhaseBiasesSatSig_signal_id :: !Word8 + -- ^ Signal and Tracking Mode Identifier. Similar to either RTCM DF380 + -- (GPS), DF382 (Galileo) or DF467 (BDS) depending on the constellation. + , _codePhaseBiasesSatSig_code_bias_bound_mu :: !Word8 + -- ^ Code Bias Mean. Range: 0-1.275 m + , _codePhaseBiasesSatSig_code_bias_bound_sig :: !Word8 + -- ^ Code Bias Standard Deviation. Range: 0-1.275 m + , _codePhaseBiasesSatSig_phase_bias_bound_mu :: !Word8 + -- ^ Phase Bias Mean. Range: 0-1.275 m + , _codePhaseBiasesSatSig_phase_bias_bound_sig :: !Word8 + -- ^ Phase Bias Standard Deviation. Range: 0-1.275 m + } deriving ( Show, Read, Eq ) + +instance Binary CodePhaseBiasesSatSig where + get = do + _codePhaseBiasesSatSig_sat_id <- getWord8 + _codePhaseBiasesSatSig_signal_id <- getWord8 + _codePhaseBiasesSatSig_code_bias_bound_mu <- getWord8 + _codePhaseBiasesSatSig_code_bias_bound_sig <- getWord8 + _codePhaseBiasesSatSig_phase_bias_bound_mu <- getWord8 + _codePhaseBiasesSatSig_phase_bias_bound_sig <- getWord8 + pure CodePhaseBiasesSatSig {..} + + put CodePhaseBiasesSatSig {..} = do + putWord8 _codePhaseBiasesSatSig_sat_id + putWord8 _codePhaseBiasesSatSig_signal_id + putWord8 _codePhaseBiasesSatSig_code_bias_bound_mu + putWord8 _codePhaseBiasesSatSig_code_bias_bound_sig + putWord8 _codePhaseBiasesSatSig_phase_bias_bound_mu + putWord8 _codePhaseBiasesSatSig_phase_bias_bound_sig + +$(makeJSON "_codePhaseBiasesSatSig_" ''CodePhaseBiasesSatSig) +$(makeLenses ''CodePhaseBiasesSatSig) + msgSsrCodePhaseBiasesBounds :: Word16 msgSsrCodePhaseBiasesBounds = 0x05EC data MsgSsrCodePhaseBiasesBounds = MsgSsrCodePhaseBiasesBounds - { _msgSsrCodePhaseBiasesBounds_stub :: ![Word8] + { _msgSsrCodePhaseBiasesBounds_header :: !BoundsHeader + -- ^ Header of a bounds message. + , _msgSsrCodePhaseBiasesBounds_ssr_iod :: !Word8 + -- ^ IOD of the SSR bound. + , _msgSsrCodePhaseBiasesBounds_const_id :: !Word8 + -- ^ Constellation ID to which the SVs belong. + , _msgSsrCodePhaseBiasesBounds_n_sats_signals :: !Word8 + -- ^ Number of satellite-signal couples. + , _msgSsrCodePhaseBiasesBounds_satellites_signals :: ![CodePhaseBiasesSatSig] + -- ^ Code and Phase Biases Bounds per Satellite-Signal couple. } deriving ( Show, Read, Eq ) instance Binary MsgSsrCodePhaseBiasesBounds where get = do - _msgSsrCodePhaseBiasesBounds_stub <- whileM (not <$> isEmpty) getWord8 + _msgSsrCodePhaseBiasesBounds_header <- get + _msgSsrCodePhaseBiasesBounds_ssr_iod <- getWord8 + _msgSsrCodePhaseBiasesBounds_const_id <- getWord8 + _msgSsrCodePhaseBiasesBounds_n_sats_signals <- getWord8 + _msgSsrCodePhaseBiasesBounds_satellites_signals <- whileM (not <$> isEmpty) get pure MsgSsrCodePhaseBiasesBounds {..} put MsgSsrCodePhaseBiasesBounds {..} = do - mapM_ putWord8 _msgSsrCodePhaseBiasesBounds_stub + put _msgSsrCodePhaseBiasesBounds_header + putWord8 _msgSsrCodePhaseBiasesBounds_ssr_iod + putWord8 _msgSsrCodePhaseBiasesBounds_const_id + putWord8 _msgSsrCodePhaseBiasesBounds_n_sats_signals + mapM_ put _msgSsrCodePhaseBiasesBounds_satellites_signals $(makeSBP 'msgSsrCodePhaseBiasesBounds ''MsgSsrCodePhaseBiasesBounds) $(makeJSON "_msgSsrCodePhaseBiasesBounds_" ''MsgSsrCodePhaseBiasesBounds) $(makeLenses ''MsgSsrCodePhaseBiasesBounds) +-- | OrbitClockBoundDegradation. +-- +-- Orbit and clock bound degradation. +data OrbitClockBoundDegradation = OrbitClockBoundDegradation + { _orbitClockBoundDegradation_orb_radial_bound_mu_dot :: !Word8 + -- ^ Orbit Bound Mean Radial First derivative. Range: 0-0.255 m/s + , _orbitClockBoundDegradation_orb_along_bound_mu_dot :: !Word8 + -- ^ Orbit Bound Mean Along-Track First derivative. Range: 0-0.255 m/s + , _orbitClockBoundDegradation_orb_cross_bound_mu_dot :: !Word8 + -- ^ Orbit Bound Mean Cross-Track First derivative. Range: 0-0.255 m/s + , _orbitClockBoundDegradation_orb_radial_bound_sig_dot :: !Word8 + -- ^ Orbit Bound Standard Deviation Radial First derivative. Range: 0-0.255 + -- m/s + , _orbitClockBoundDegradation_orb_along_bound_sig_dot :: !Word8 + -- ^ Orbit Bound Standard Deviation Along-Track First derivative. Range: + -- 0-0.255 m/s + , _orbitClockBoundDegradation_orb_cross_bound_sig_dot :: !Word8 + -- ^ Orbit Bound Standard Deviation Cross-Track First derivative. Range: + -- 0-0.255 m/s + , _orbitClockBoundDegradation_clock_bound_mu_dot :: !Word8 + -- ^ Clock Bound Mean First derivative. Range: 0-0.255 m/s + , _orbitClockBoundDegradation_clock_bound_sig_dot :: !Word8 + -- ^ Clock Bound Standard Deviation First derivative. Range: 0-0.255 m/s + } deriving ( Show, Read, Eq ) + +instance Binary OrbitClockBoundDegradation where + get = do + _orbitClockBoundDegradation_orb_radial_bound_mu_dot <- getWord8 + _orbitClockBoundDegradation_orb_along_bound_mu_dot <- getWord8 + _orbitClockBoundDegradation_orb_cross_bound_mu_dot <- getWord8 + _orbitClockBoundDegradation_orb_radial_bound_sig_dot <- getWord8 + _orbitClockBoundDegradation_orb_along_bound_sig_dot <- getWord8 + _orbitClockBoundDegradation_orb_cross_bound_sig_dot <- getWord8 + _orbitClockBoundDegradation_clock_bound_mu_dot <- getWord8 + _orbitClockBoundDegradation_clock_bound_sig_dot <- getWord8 + pure OrbitClockBoundDegradation {..} + + put OrbitClockBoundDegradation {..} = do + putWord8 _orbitClockBoundDegradation_orb_radial_bound_mu_dot + putWord8 _orbitClockBoundDegradation_orb_along_bound_mu_dot + putWord8 _orbitClockBoundDegradation_orb_cross_bound_mu_dot + putWord8 _orbitClockBoundDegradation_orb_radial_bound_sig_dot + putWord8 _orbitClockBoundDegradation_orb_along_bound_sig_dot + putWord8 _orbitClockBoundDegradation_orb_cross_bound_sig_dot + putWord8 _orbitClockBoundDegradation_clock_bound_mu_dot + putWord8 _orbitClockBoundDegradation_clock_bound_sig_dot + +$(makeJSON "_orbitClockBoundDegradation_" ''OrbitClockBoundDegradation) +$(makeLenses ''OrbitClockBoundDegradation) + msgSsrOrbitClockBoundsDegradation :: Word16 msgSsrOrbitClockBoundsDegradation = 0x05DF data MsgSsrOrbitClockBoundsDegradation = MsgSsrOrbitClockBoundsDegradation - { _msgSsrOrbitClockBoundsDegradation_stub :: ![Word8] + { _msgSsrOrbitClockBoundsDegradation_header :: !BoundsHeader + -- ^ Header of a bounds message. + , _msgSsrOrbitClockBoundsDegradation_ssr_iod :: !Word8 + -- ^ IOD of the SSR bound degradation parameter. + , _msgSsrOrbitClockBoundsDegradation_const_id :: !Word8 + -- ^ Constellation ID to which the SVs belong. + , _msgSsrOrbitClockBoundsDegradation_sat_bitmask :: !Word64 + -- ^ Satellite Bit Mask. Put 1 for each satellite where the following + -- degradation parameters are applicable, 0 otherwise. Encoded following + -- RTCM DF394 specification. + , _msgSsrOrbitClockBoundsDegradation_orbit_clock_bounds_degradation :: !OrbitClockBoundDegradation + -- ^ Orbit and Clock Bounds Degradation Parameters } deriving ( Show, Read, Eq ) instance Binary MsgSsrOrbitClockBoundsDegradation where get = do - _msgSsrOrbitClockBoundsDegradation_stub <- whileM (not <$> isEmpty) getWord8 + _msgSsrOrbitClockBoundsDegradation_header <- get + _msgSsrOrbitClockBoundsDegradation_ssr_iod <- getWord8 + _msgSsrOrbitClockBoundsDegradation_const_id <- getWord8 + _msgSsrOrbitClockBoundsDegradation_sat_bitmask <- getWord64le + _msgSsrOrbitClockBoundsDegradation_orbit_clock_bounds_degradation <- get pure MsgSsrOrbitClockBoundsDegradation {..} put MsgSsrOrbitClockBoundsDegradation {..} = do - mapM_ putWord8 _msgSsrOrbitClockBoundsDegradation_stub + put _msgSsrOrbitClockBoundsDegradation_header + putWord8 _msgSsrOrbitClockBoundsDegradation_ssr_iod + putWord8 _msgSsrOrbitClockBoundsDegradation_const_id + putWord64le _msgSsrOrbitClockBoundsDegradation_sat_bitmask + put _msgSsrOrbitClockBoundsDegradation_orbit_clock_bounds_degradation $(makeSBP 'msgSsrOrbitClockBoundsDegradation ''MsgSsrOrbitClockBoundsDegradation) $(makeJSON "_msgSsrOrbitClockBoundsDegradation_" ''MsgSsrOrbitClockBoundsDegradation) diff --git a/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagHighLevel.java b/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagHighLevel.java index 07fdfaa27a..824a080302 100644 --- a/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagHighLevel.java +++ b/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagHighLevel.java @@ -23,7 +23,47 @@ public class MsgSsrFlagHighLevel extends SBPMessage { public static final int TYPE = 0x0BB9; - public int[] stub; + /** GNSS reference time of the observation used to generate the flag. */ + public GPSTimeSec obs_time; + + /** GNSS reference time of the correction associated to the flag. */ + public GPSTimeSec corr_time; + + /** SSR Solution ID. */ + public int ssr_sol_id; + + /** 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; + + /** Chain and type of flag. */ + public int chain_id; + + /** Use GPS satellites. */ + public int use_gps_sat; + + /** Use GAL satellites. */ + public int use_gal_sat; + + /** Use BDS satellites. */ + public int use_bds_sat; + + /** Reserved */ + public int[] reserved; + + /** Use tropo grid points. */ + public int use_tropo_grid_points; + + /** Use iono grid points. */ + public int use_iono_grid_points; + + /** Use iono tile satellite LoS. */ + public int use_iono_tile_sat_los; + + /** Use iono grid point satellite LoS. */ + public int use_iono_grid_point_sat_los; public MsgSsrFlagHighLevel(int sender) { super(sender, TYPE); @@ -41,18 +81,57 @@ public MsgSsrFlagHighLevel(SBPMessage msg) throws SBPBinaryException { @Override protected void parse(Parser parser) throws SBPBinaryException { /* Parse fields from binary */ - stub = parser.getArrayofU8(); + obs_time = new GPSTimeSec().parse(parser); + corr_time = new GPSTimeSec().parse(parser); + ssr_sol_id = parser.getU8(); + tile_set_id = parser.getU16(); + tile_id = parser.getU16(); + chain_id = parser.getU8(); + use_gps_sat = parser.getU8(); + use_gal_sat = parser.getU8(); + use_bds_sat = parser.getU8(); + reserved = parser.getArrayofU8(6); + use_tropo_grid_points = parser.getU8(); + use_iono_grid_points = parser.getU8(); + use_iono_tile_sat_los = parser.getU8(); + use_iono_grid_point_sat_los = parser.getU8(); } @Override protected void build(Builder builder) { - builder.putArrayofU8(stub); + obs_time.build(builder); + corr_time.build(builder); + builder.putU8(ssr_sol_id); + builder.putU16(tile_set_id); + builder.putU16(tile_id); + builder.putU8(chain_id); + builder.putU8(use_gps_sat); + builder.putU8(use_gal_sat); + builder.putU8(use_bds_sat); + builder.putArrayofU8(reserved, 6); + builder.putU8(use_tropo_grid_points); + builder.putU8(use_iono_grid_points); + builder.putU8(use_iono_tile_sat_los); + builder.putU8(use_iono_grid_point_sat_los); } @Override public JSONObject toJSON() { JSONObject obj = super.toJSON(); - obj.put("stub", new JSONArray(stub)); + obj.put("obs_time", obs_time.toJSON()); + obj.put("corr_time", corr_time.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("chain_id", chain_id); + obj.put("use_gps_sat", use_gps_sat); + obj.put("use_gal_sat", use_gal_sat); + obj.put("use_bds_sat", use_bds_sat); + obj.put("reserved", new JSONArray(reserved)); + obj.put("use_tropo_grid_points", use_tropo_grid_points); + obj.put("use_iono_grid_points", use_iono_grid_points); + obj.put("use_iono_tile_sat_los", use_iono_tile_sat_los); + obj.put("use_iono_grid_point_sat_los", use_iono_grid_point_sat_los); return obj; } } diff --git a/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagIonoGridPointSatLos.java b/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagIonoGridPointSatLos.java index 48460030cb..fbb1612242 100644 --- a/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagIonoGridPointSatLos.java +++ b/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagIonoGridPointSatLos.java @@ -16,14 +16,24 @@ import com.swiftnav.sbp.SBPBinaryException; import com.swiftnav.sbp.SBPMessage; +import com.swiftnav.sbp.SBPStruct; import com.swiftnav.sbp.gnss.*; -import org.json.JSONArray; import org.json.JSONObject; public class MsgSsrFlagIonoGridPointSatLos extends SBPMessage { public static final int TYPE = 0x0BD1; - public int[] stub; + /** Header of an integrity message. */ + public IntegritySSRHeader header; + + /** Index of the grid point. */ + public int grid_point_id; + + /** Number of faulty LOS. */ + public int n_faulty_los; + + /** List of faulty LOS */ + public SvId[] faulty_los; public MsgSsrFlagIonoGridPointSatLos(int sender) { super(sender, TYPE); @@ -41,18 +51,27 @@ public MsgSsrFlagIonoGridPointSatLos(SBPMessage msg) throws SBPBinaryException { @Override protected void parse(Parser parser) throws SBPBinaryException { /* Parse fields from binary */ - stub = parser.getArrayofU8(); + header = new IntegritySSRHeader().parse(parser); + grid_point_id = parser.getU16(); + n_faulty_los = parser.getU8(); + faulty_los = parser.getArray(SvId.class); } @Override protected void build(Builder builder) { - builder.putArrayofU8(stub); + header.build(builder); + builder.putU16(grid_point_id); + builder.putU8(n_faulty_los); + builder.putArray(faulty_los); } @Override public JSONObject toJSON() { JSONObject obj = super.toJSON(); - obj.put("stub", new JSONArray(stub)); + obj.put("header", header.toJSON()); + obj.put("grid_point_id", grid_point_id); + obj.put("n_faulty_los", n_faulty_los); + obj.put("faulty_los", SBPStruct.toJSONArray(faulty_los)); return obj; } } diff --git a/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagIonoGridPoints.java b/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagIonoGridPoints.java index 0eb5c746da..515cd5a023 100644 --- a/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagIonoGridPoints.java +++ b/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagIonoGridPoints.java @@ -23,7 +23,14 @@ public class MsgSsrFlagIonoGridPoints extends SBPMessage { public static final int TYPE = 0x0BC7; - public int[] stub; + /** Header of an integrity message. */ + public IntegritySSRHeader header; + + /** Number of faulty grid points. */ + public int n_faulty_points; + + /** List of faulty grid points. */ + public int[] faulty_points; public MsgSsrFlagIonoGridPoints(int sender) { super(sender, TYPE); @@ -41,18 +48,24 @@ public MsgSsrFlagIonoGridPoints(SBPMessage msg) throws SBPBinaryException { @Override protected void parse(Parser parser) throws SBPBinaryException { /* Parse fields from binary */ - stub = parser.getArrayofU8(); + header = new IntegritySSRHeader().parse(parser); + n_faulty_points = parser.getU8(); + faulty_points = parser.getArrayofU16(); } @Override protected void build(Builder builder) { - builder.putArrayofU8(stub); + header.build(builder); + builder.putU8(n_faulty_points); + builder.putArrayofU16(faulty_points); } @Override public JSONObject toJSON() { JSONObject obj = super.toJSON(); - obj.put("stub", new JSONArray(stub)); + obj.put("header", header.toJSON()); + obj.put("n_faulty_points", n_faulty_points); + obj.put("faulty_points", new JSONArray(faulty_points)); return obj; } } diff --git a/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagIonoTileSatLos.java b/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagIonoTileSatLos.java index 029eab5c79..6c2cb8d6cb 100644 --- a/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagIonoTileSatLos.java +++ b/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagIonoTileSatLos.java @@ -16,14 +16,21 @@ import com.swiftnav.sbp.SBPBinaryException; import com.swiftnav.sbp.SBPMessage; +import com.swiftnav.sbp.SBPStruct; import com.swiftnav.sbp.gnss.*; -import org.json.JSONArray; import org.json.JSONObject; public class MsgSsrFlagIonoTileSatLos extends SBPMessage { public static final int TYPE = 0x0BCD; - public int[] stub; + /** Header of an integrity message. */ + public IntegritySSRHeader header; + + /** Number of faulty LOS. */ + public int n_faulty_los; + + /** List of faulty LOS */ + public SvId[] faulty_los; public MsgSsrFlagIonoTileSatLos(int sender) { super(sender, TYPE); @@ -41,18 +48,24 @@ public MsgSsrFlagIonoTileSatLos(SBPMessage msg) throws SBPBinaryException { @Override protected void parse(Parser parser) throws SBPBinaryException { /* Parse fields from binary */ - stub = parser.getArrayofU8(); + header = new IntegritySSRHeader().parse(parser); + n_faulty_los = parser.getU8(); + faulty_los = parser.getArray(SvId.class); } @Override protected void build(Builder builder) { - builder.putArrayofU8(stub); + header.build(builder); + builder.putU8(n_faulty_los); + builder.putArray(faulty_los); } @Override public JSONObject toJSON() { JSONObject obj = super.toJSON(); - obj.put("stub", new JSONArray(stub)); + obj.put("header", header.toJSON()); + obj.put("n_faulty_los", n_faulty_los); + obj.put("faulty_los", SBPStruct.toJSONArray(faulty_los)); return obj; } } diff --git a/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagSatellites.java b/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagSatellites.java index c80fee54fd..3bc801683a 100644 --- a/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagSatellites.java +++ b/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagSatellites.java @@ -23,7 +23,29 @@ public class MsgSsrFlagSatellites extends SBPMessage { public static final int TYPE = 0x0BBD; - public int[] stub; + /** GNSS reference time of the observation used to generate the flag. */ + public GPSTimeSec obs_time; + + /** Number of messages in the dataset */ + public int num_msgs; + + /** Position of this message in the dataset */ + public int seq_num; + + /** SSR Solution ID. */ + public int ssr_sol_id; + + /** Chain and type of flag. */ + public int chain_id; + + /** Constellation ID. */ + public int const_id; + + /** Number of faulty satellites. */ + public int n_faulty_sats; + + /** List of faulty satellites. */ + public int[] faulty_sats; public MsgSsrFlagSatellites(int sender) { super(sender, TYPE); @@ -41,18 +63,39 @@ public MsgSsrFlagSatellites(SBPMessage msg) throws SBPBinaryException { @Override protected void parse(Parser parser) throws SBPBinaryException { /* Parse fields from binary */ - stub = parser.getArrayofU8(); + obs_time = new GPSTimeSec().parse(parser); + num_msgs = parser.getU8(); + seq_num = parser.getU8(); + ssr_sol_id = parser.getU8(); + chain_id = parser.getU8(); + const_id = parser.getU8(); + n_faulty_sats = parser.getU8(); + faulty_sats = parser.getArrayofU8(); } @Override protected void build(Builder builder) { - builder.putArrayofU8(stub); + obs_time.build(builder); + builder.putU8(num_msgs); + builder.putU8(seq_num); + builder.putU8(ssr_sol_id); + builder.putU8(chain_id); + builder.putU8(const_id); + builder.putU8(n_faulty_sats); + builder.putArrayofU8(faulty_sats); } @Override public JSONObject toJSON() { JSONObject obj = super.toJSON(); - obj.put("stub", new JSONArray(stub)); + obj.put("obs_time", obs_time.toJSON()); + obj.put("num_msgs", num_msgs); + obj.put("seq_num", seq_num); + obj.put("ssr_sol_id", ssr_sol_id); + obj.put("chain_id", chain_id); + obj.put("const_id", const_id); + obj.put("n_faulty_sats", n_faulty_sats); + obj.put("faulty_sats", new JSONArray(faulty_sats)); return obj; } } diff --git a/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagTropoGridPoints.java b/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagTropoGridPoints.java index d674896966..8fa742d9ad 100644 --- a/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagTropoGridPoints.java +++ b/java/src/com/swiftnav/sbp/integrity/MsgSsrFlagTropoGridPoints.java @@ -23,7 +23,14 @@ public class MsgSsrFlagTropoGridPoints extends SBPMessage { public static final int TYPE = 0x0BC3; - public int[] stub; + /** Header of an integrity message. */ + public IntegritySSRHeader header; + + /** Number of faulty grid points. */ + public int n_faulty_points; + + /** List of faulty grid points. */ + public int[] faulty_points; public MsgSsrFlagTropoGridPoints(int sender) { super(sender, TYPE); @@ -41,18 +48,24 @@ public MsgSsrFlagTropoGridPoints(SBPMessage msg) throws SBPBinaryException { @Override protected void parse(Parser parser) throws SBPBinaryException { /* Parse fields from binary */ - stub = parser.getArrayofU8(); + header = new IntegritySSRHeader().parse(parser); + n_faulty_points = parser.getU8(); + faulty_points = parser.getArrayofU16(); } @Override protected void build(Builder builder) { - builder.putArrayofU8(stub); + header.build(builder); + builder.putU8(n_faulty_points); + builder.putArrayofU16(faulty_points); } @Override public JSONObject toJSON() { JSONObject obj = super.toJSON(); - obj.put("stub", new JSONArray(stub)); + obj.put("header", header.toJSON()); + obj.put("n_faulty_points", n_faulty_points); + obj.put("faulty_points", new JSONArray(faulty_points)); return obj; } } diff --git a/java/src/com/swiftnav/sbp/navigation/MsgReferenceFrameParam.java b/java/src/com/swiftnav/sbp/navigation/MsgReferenceFrameParam.java index e77c5f2bd1..52bf3143cb 100644 --- a/java/src/com/swiftnav/sbp/navigation/MsgReferenceFrameParam.java +++ b/java/src/com/swiftnav/sbp/navigation/MsgReferenceFrameParam.java @@ -16,13 +16,73 @@ import com.swiftnav.sbp.SBPBinaryException; import com.swiftnav.sbp.SBPMessage; -import org.json.JSONArray; import org.json.JSONObject; public class MsgReferenceFrameParam extends SBPMessage { public static final int TYPE = 0x0244; - public int[] stub; + /** SSR IOD parameter. */ + public int ssr_iod; + + /** Name of source coordinate-system using the EPSG identification code. */ + public String sn; + + /** Name of target coordinate-system using the EPSG identification code. */ + public String tn; + + /** System Identification Number. */ + public int sin; + + /** Utilized Transformation Message. */ + public int utn; + + /** + * Reference Epoch t0 for transformation parameter set given as Modified Julian Day (MDJ) Number + * minus 44244 days. + */ + public int re_t0; + + /** Translation in X for Reference Epoch t0. */ + public int delta_X0; + + /** Translation in Y for Reference Epoch t0. */ + public int delta_Y0; + + /** Translation in Z for Reference Epoch t0. */ + public int delta_Z0; + + /** Rotation around the X-axis for Reference Epoch t0. */ + public int theta_01; + + /** Rotation around the Y-axis for Reference Epoch t0. */ + public int theta_02; + + /** Rotation around the Z-axis for Reference Epoch t0. */ + public int theta_03; + + /** Scale correction for Reference Epoch t0. */ + public int scale; + + /** Rate of change of translation in X. */ + public int dot_delta_X0; + + /** Rate of change of translation in Y. */ + public int dot_delta_Y0; + + /** Rate of change of translation in Z. */ + public int dot_delta_Z0; + + /** Rate of change of rotation around the X-axis. */ + public int dot_theta_01; + + /** Rate of change of rotation around the Y-axis. */ + public int dot_theta_02; + + /** Rate of change of rotation around the Z-axis. */ + public int dot_theta_03; + + /** Rate of change of scale correction. */ + public int dot_scale; public MsgReferenceFrameParam(int sender) { super(sender, TYPE); @@ -40,18 +100,75 @@ public MsgReferenceFrameParam(SBPMessage msg) throws SBPBinaryException { @Override protected void parse(Parser parser) throws SBPBinaryException { /* Parse fields from binary */ - stub = parser.getArrayofU8(); + ssr_iod = parser.getU8(); + sn = parser.getString(32); + tn = parser.getString(32); + sin = parser.getU8(); + utn = parser.getU16(); + re_t0 = parser.getU16(); + delta_X0 = parser.getS32(); + delta_Y0 = parser.getS32(); + delta_Z0 = parser.getS32(); + theta_01 = parser.getS32(); + theta_02 = parser.getS32(); + theta_03 = parser.getS32(); + scale = parser.getS32(); + dot_delta_X0 = parser.getS32(); + dot_delta_Y0 = parser.getS32(); + dot_delta_Z0 = parser.getS32(); + dot_theta_01 = parser.getS32(); + dot_theta_02 = parser.getS32(); + dot_theta_03 = parser.getS32(); + dot_scale = parser.getS16(); } @Override protected void build(Builder builder) { - builder.putArrayofU8(stub); + builder.putU8(ssr_iod); + builder.putString(sn, 32); + builder.putString(tn, 32); + builder.putU8(sin); + builder.putU16(utn); + builder.putU16(re_t0); + builder.putS32(delta_X0); + builder.putS32(delta_Y0); + builder.putS32(delta_Z0); + builder.putS32(theta_01); + builder.putS32(theta_02); + builder.putS32(theta_03); + builder.putS32(scale); + builder.putS32(dot_delta_X0); + builder.putS32(dot_delta_Y0); + builder.putS32(dot_delta_Z0); + builder.putS32(dot_theta_01); + builder.putS32(dot_theta_02); + builder.putS32(dot_theta_03); + builder.putS16(dot_scale); } @Override public JSONObject toJSON() { JSONObject obj = super.toJSON(); - obj.put("stub", new JSONArray(stub)); + obj.put("ssr_iod", ssr_iod); + obj.put("sn", sn); + obj.put("tn", tn); + obj.put("sin", sin); + obj.put("utn", utn); + obj.put("re_t0", re_t0); + obj.put("delta_X0", delta_X0); + obj.put("delta_Y0", delta_Y0); + obj.put("delta_Z0", delta_Z0); + obj.put("theta_01", theta_01); + obj.put("theta_02", theta_02); + obj.put("theta_03", theta_03); + obj.put("scale", scale); + obj.put("dot_delta_X0", dot_delta_X0); + obj.put("dot_delta_Y0", dot_delta_Y0); + obj.put("dot_delta_Z0", dot_delta_Z0); + obj.put("dot_theta_01", dot_theta_01); + obj.put("dot_theta_02", dot_theta_02); + obj.put("dot_theta_03", dot_theta_03); + obj.put("dot_scale", dot_scale); return obj; } } diff --git a/java/src/com/swiftnav/sbp/navigation/MsgUtcLeapSecond.java b/java/src/com/swiftnav/sbp/navigation/MsgUtcLeapSecond.java index 0ef8e77c6f..a108195af1 100644 --- a/java/src/com/swiftnav/sbp/navigation/MsgUtcLeapSecond.java +++ b/java/src/com/swiftnav/sbp/navigation/MsgUtcLeapSecond.java @@ -16,7 +16,6 @@ import com.swiftnav.sbp.SBPBinaryException; import com.swiftnav.sbp.SBPMessage; -import org.json.JSONArray; import org.json.JSONObject; /** @@ -31,7 +30,35 @@ public class MsgUtcLeapSecond extends SBPMessage { public static final int TYPE = 0x023A; - public int[] stub; + /** Reserved. Bias coefficient of GPS time scale with respect to UTC drift model. */ + public int bias_coeff; + + /** Reserved. Drift coefficient of GPS time scale with respect to UTC drift model. */ + public int drift_coeff; + + /** + * Reserved. Drift rate correction coefficient of GPS time scale with respect to UTC drift + * model. + */ + public int drift_rate_coeff; + + /** Leap second count before insertion. */ + public int count_before; + + /** Reserved. Drift model reference week second. */ + public int tow_s; + + /** Reserved. Drift model reference week number. */ + public int wn; + + /** Leap second reference week number. */ + public int ref_wn; + + /** Leap second reference day number. */ + public int ref_dn; + + /** Leap second count after insertion. */ + public int count_after; public MsgUtcLeapSecond(int sender) { super(sender, TYPE); @@ -49,18 +76,42 @@ public MsgUtcLeapSecond(SBPMessage msg) throws SBPBinaryException { @Override protected void parse(Parser parser) throws SBPBinaryException { /* Parse fields from binary */ - stub = parser.getArrayofU8(); + bias_coeff = parser.getS16(); + drift_coeff = parser.getS16(); + drift_rate_coeff = parser.getS8(); + count_before = parser.getS8(); + tow_s = parser.getU16(); + wn = parser.getU16(); + ref_wn = parser.getU16(); + ref_dn = parser.getU8(); + count_after = parser.getS8(); } @Override protected void build(Builder builder) { - builder.putArrayofU8(stub); + builder.putS16(bias_coeff); + builder.putS16(drift_coeff); + builder.putS8(drift_rate_coeff); + builder.putS8(count_before); + builder.putU16(tow_s); + builder.putU16(wn); + builder.putU16(ref_wn); + builder.putU8(ref_dn); + builder.putS8(count_after); } @Override public JSONObject toJSON() { JSONObject obj = super.toJSON(); - obj.put("stub", new JSONArray(stub)); + obj.put("bias_coeff", bias_coeff); + obj.put("drift_coeff", drift_coeff); + obj.put("drift_rate_coeff", drift_rate_coeff); + obj.put("count_before", count_before); + obj.put("tow_s", tow_s); + obj.put("wn", wn); + obj.put("ref_wn", ref_wn); + obj.put("ref_dn", ref_dn); + obj.put("count_after", count_after); return obj; } } diff --git a/java/src/com/swiftnav/sbp/ssr/MsgSsrCodePhaseBiasesBounds.java b/java/src/com/swiftnav/sbp/ssr/MsgSsrCodePhaseBiasesBounds.java index edefe68eb0..b1a9e8050f 100644 --- a/java/src/com/swiftnav/sbp/ssr/MsgSsrCodePhaseBiasesBounds.java +++ b/java/src/com/swiftnav/sbp/ssr/MsgSsrCodePhaseBiasesBounds.java @@ -16,14 +16,27 @@ import com.swiftnav.sbp.SBPBinaryException; import com.swiftnav.sbp.SBPMessage; +import com.swiftnav.sbp.SBPStruct; import com.swiftnav.sbp.gnss.*; -import org.json.JSONArray; import org.json.JSONObject; public class MsgSsrCodePhaseBiasesBounds extends SBPMessage { public static final int TYPE = 0x05EC; - public int[] stub; + /** Header of a bounds message. */ + public BoundsHeader header; + + /** IOD of the SSR bound. */ + public int ssr_iod; + + /** Constellation ID to which the SVs belong. */ + public int const_id; + + /** Number of satellite-signal couples. */ + public int n_sats_signals; + + /** Code and Phase Biases Bounds per Satellite-Signal couple. */ + public CodePhaseBiasesSatSig[] satellites_signals; public MsgSsrCodePhaseBiasesBounds(int sender) { super(sender, TYPE); @@ -41,18 +54,30 @@ public MsgSsrCodePhaseBiasesBounds(SBPMessage msg) throws SBPBinaryException { @Override protected void parse(Parser parser) throws SBPBinaryException { /* Parse fields from binary */ - stub = parser.getArrayofU8(); + header = new BoundsHeader().parse(parser); + ssr_iod = parser.getU8(); + const_id = parser.getU8(); + n_sats_signals = parser.getU8(); + satellites_signals = parser.getArray(CodePhaseBiasesSatSig.class); } @Override protected void build(Builder builder) { - builder.putArrayofU8(stub); + header.build(builder); + builder.putU8(ssr_iod); + builder.putU8(const_id); + builder.putU8(n_sats_signals); + builder.putArray(satellites_signals); } @Override public JSONObject toJSON() { JSONObject obj = super.toJSON(); - obj.put("stub", new JSONArray(stub)); + obj.put("header", header.toJSON()); + obj.put("ssr_iod", ssr_iod); + obj.put("const_id", const_id); + obj.put("n_sats_signals", n_sats_signals); + obj.put("satellites_signals", SBPStruct.toJSONArray(satellites_signals)); return obj; } } diff --git a/java/src/com/swiftnav/sbp/ssr/MsgSsrGriddedCorrectionBounds.java b/java/src/com/swiftnav/sbp/ssr/MsgSsrGriddedCorrectionBounds.java index ad673c4160..904483c4bb 100644 --- a/java/src/com/swiftnav/sbp/ssr/MsgSsrGriddedCorrectionBounds.java +++ b/java/src/com/swiftnav/sbp/ssr/MsgSsrGriddedCorrectionBounds.java @@ -16,14 +16,60 @@ import com.swiftnav.sbp.SBPBinaryException; import com.swiftnav.sbp.SBPMessage; +import com.swiftnav.sbp.SBPStruct; import com.swiftnav.sbp.gnss.*; -import org.json.JSONArray; import org.json.JSONObject; +/** + * SBP class for message MSG_SSR_GRIDDED_CORRECTION_BOUNDS (0x05FE). + * + *

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

    Note 1: Range: 0-17.5 m. i<= 200, mean = 0.01i; 200230, + * mean=5+0.5(i-230). + */ public class MsgSsrGriddedCorrectionBounds extends SBPMessage { public static final int TYPE = 0x05FE; - public int[] stub; + /** Header of a bounds message. */ + public BoundsHeader header; + + /** IOD of the correction. */ + public int ssr_iod_atmo; + + /** 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; + + /** Vertical Hydrostatic Error Bound Mean. */ + public int tropo_v_hydro_bound_mu; + + /** Vertical Hydrostatic Error Bound StDev. */ + public int tropo_v_hydro_bound_sig; + + /** Vertical Wet Error Bound Mean. */ + public int tropo_v_wet_bound_mu; + + /** Vertical Wet Error Bound StDev. */ + public int tropo_v_wet_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); @@ -41,18 +87,54 @@ public MsgSsrGriddedCorrectionBounds(SBPMessage msg) throws SBPBinaryException { @Override protected void parse(Parser parser) throws SBPBinaryException { /* Parse fields from binary */ - stub = parser.getArrayofU8(); + 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_v_hydro_bound_mu = parser.getU8(); + tropo_v_hydro_bound_sig = parser.getU8(); + tropo_v_wet_bound_mu = parser.getU8(); + tropo_v_wet_bound_sig = parser.getU8(); + n_sats = parser.getU8(); + stec_sat_list = parser.getArray(STECSatElementIntegrity.class); } @Override protected void build(Builder builder) { - builder.putArrayofU8(stub); + 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_v_hydro_bound_mu); + builder.putU8(tropo_v_hydro_bound_sig); + builder.putU8(tropo_v_wet_bound_mu); + builder.putU8(tropo_v_wet_bound_sig); + builder.putU8(n_sats); + builder.putArray(stec_sat_list); } @Override public JSONObject toJSON() { JSONObject obj = super.toJSON(); - obj.put("stub", new JSONArray(stub)); + 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_v_hydro_bound_mu", tropo_v_hydro_bound_mu); + obj.put("tropo_v_hydro_bound_sig", tropo_v_hydro_bound_sig); + obj.put("tropo_v_wet_bound_mu", tropo_v_wet_bound_mu); + obj.put("tropo_v_wet_bound_sig", tropo_v_wet_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/MsgSsrOrbitClockBounds.java b/java/src/com/swiftnav/sbp/ssr/MsgSsrOrbitClockBounds.java index bc443760d9..e27a198dd1 100644 --- a/java/src/com/swiftnav/sbp/ssr/MsgSsrOrbitClockBounds.java +++ b/java/src/com/swiftnav/sbp/ssr/MsgSsrOrbitClockBounds.java @@ -16,8 +16,8 @@ import com.swiftnav.sbp.SBPBinaryException; import com.swiftnav.sbp.SBPMessage; +import com.swiftnav.sbp.SBPStruct; import com.swiftnav.sbp.gnss.*; -import org.json.JSONArray; import org.json.JSONObject; /** @@ -35,7 +35,20 @@ public class MsgSsrOrbitClockBounds extends SBPMessage { public static final int TYPE = 0x05DE; - public int[] stub; + /** Header of a bounds message. */ + public BoundsHeader header; + + /** IOD of the SSR bound. */ + public int ssr_iod; + + /** Constellation ID to which the SVs belong. */ + public int const_id; + + /** Number of satellites. */ + public int n_sats; + + /** Orbit and Clock Bounds per Satellite */ + public OrbitClockBound[] orbit_clock_bounds; public MsgSsrOrbitClockBounds(int sender) { super(sender, TYPE); @@ -53,18 +66,30 @@ public MsgSsrOrbitClockBounds(SBPMessage msg) throws SBPBinaryException { @Override protected void parse(Parser parser) throws SBPBinaryException { /* Parse fields from binary */ - stub = parser.getArrayofU8(); + header = new BoundsHeader().parse(parser); + ssr_iod = parser.getU8(); + const_id = parser.getU8(); + n_sats = parser.getU8(); + orbit_clock_bounds = parser.getArray(OrbitClockBound.class); } @Override protected void build(Builder builder) { - builder.putArrayofU8(stub); + header.build(builder); + builder.putU8(ssr_iod); + builder.putU8(const_id); + builder.putU8(n_sats); + builder.putArray(orbit_clock_bounds); } @Override public JSONObject toJSON() { JSONObject obj = super.toJSON(); - obj.put("stub", new JSONArray(stub)); + obj.put("header", header.toJSON()); + obj.put("ssr_iod", ssr_iod); + obj.put("const_id", const_id); + obj.put("n_sats", n_sats); + obj.put("orbit_clock_bounds", SBPStruct.toJSONArray(orbit_clock_bounds)); return obj; } } diff --git a/java/src/com/swiftnav/sbp/ssr/MsgSsrOrbitClockBoundsDegradation.java b/java/src/com/swiftnav/sbp/ssr/MsgSsrOrbitClockBoundsDegradation.java index 9d4a5f5bbe..68ec1a9a1c 100644 --- a/java/src/com/swiftnav/sbp/ssr/MsgSsrOrbitClockBoundsDegradation.java +++ b/java/src/com/swiftnav/sbp/ssr/MsgSsrOrbitClockBoundsDegradation.java @@ -17,13 +17,29 @@ import com.swiftnav.sbp.SBPBinaryException; import com.swiftnav.sbp.SBPMessage; import com.swiftnav.sbp.gnss.*; -import org.json.JSONArray; +import java.math.BigInteger; import org.json.JSONObject; public class MsgSsrOrbitClockBoundsDegradation extends SBPMessage { public static final int TYPE = 0x05DF; - public int[] stub; + /** Header of a bounds message. */ + public BoundsHeader header; + + /** IOD of the SSR bound degradation parameter. */ + public int ssr_iod; + + /** Constellation ID to which the SVs belong. */ + public int const_id; + + /** + * Satellite Bit Mask. Put 1 for each satellite where the following degradation parameters are + * applicable, 0 otherwise. Encoded following RTCM DF394 specification. + */ + public BigInteger sat_bitmask; + + /** Orbit and Clock Bounds Degradation Parameters */ + public OrbitClockBoundDegradation orbit_clock_bounds_degradation; public MsgSsrOrbitClockBoundsDegradation(int sender) { super(sender, TYPE); @@ -41,18 +57,30 @@ public MsgSsrOrbitClockBoundsDegradation(SBPMessage msg) throws SBPBinaryExcepti @Override protected void parse(Parser parser) throws SBPBinaryException { /* Parse fields from binary */ - stub = parser.getArrayofU8(); + header = new BoundsHeader().parse(parser); + ssr_iod = parser.getU8(); + const_id = parser.getU8(); + sat_bitmask = parser.getU64(); + orbit_clock_bounds_degradation = new OrbitClockBoundDegradation().parse(parser); } @Override protected void build(Builder builder) { - builder.putArrayofU8(stub); + header.build(builder); + builder.putU8(ssr_iod); + builder.putU8(const_id); + builder.putU64(sat_bitmask); + orbit_clock_bounds_degradation.build(builder); } @Override public JSONObject toJSON() { JSONObject obj = super.toJSON(); - obj.put("stub", new JSONArray(stub)); + obj.put("header", header.toJSON()); + obj.put("ssr_iod", ssr_iod); + obj.put("const_id", const_id); + obj.put("sat_bitmask", sat_bitmask); + obj.put("orbit_clock_bounds_degradation", orbit_clock_bounds_degradation.toJSON()); return obj; } } diff --git a/java/src/com/swiftnav/sbp/ssr/MsgSsrStecCorrection.java b/java/src/com/swiftnav/sbp/ssr/MsgSsrStecCorrection.java index 9115fefa77..9f4aed587e 100644 --- a/java/src/com/swiftnav/sbp/ssr/MsgSsrStecCorrection.java +++ b/java/src/com/swiftnav/sbp/ssr/MsgSsrStecCorrection.java @@ -16,14 +16,30 @@ import com.swiftnav.sbp.SBPBinaryException; import com.swiftnav.sbp.SBPMessage; +import com.swiftnav.sbp.SBPStruct; import com.swiftnav.sbp.gnss.*; -import org.json.JSONArray; import org.json.JSONObject; public class MsgSsrStecCorrection extends SBPMessage { public static final int TYPE = 0x05FD; - public int[] stub; + /** 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; + + /** Number of satellites. */ + public int n_sats; + + /** Array of STEC polynomial coefficients for each space vehicle. */ + public STECSatElement[] stec_sat_list; public MsgSsrStecCorrection(int sender) { super(sender, TYPE); @@ -41,18 +57,33 @@ public MsgSsrStecCorrection(SBPMessage msg) throws SBPBinaryException { @Override protected void parse(Parser parser) throws SBPBinaryException { /* Parse fields from binary */ - stub = parser.getArrayofU8(); + 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) { - builder.putArrayofU8(stub); + 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); } @Override public JSONObject toJSON() { JSONObject obj = super.toJSON(); - obj.put("stub", new JSONArray(stub)); + 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/MsgSsrTileDefinition.java b/java/src/com/swiftnav/sbp/ssr/MsgSsrTileDefinition.java index 96e19bee2a..cb2918f393 100644 --- a/java/src/com/swiftnav/sbp/ssr/MsgSsrTileDefinition.java +++ b/java/src/com/swiftnav/sbp/ssr/MsgSsrTileDefinition.java @@ -17,7 +17,7 @@ import com.swiftnav.sbp.SBPBinaryException; import com.swiftnav.sbp.SBPMessage; import com.swiftnav.sbp.gnss.*; -import org.json.JSONArray; +import java.math.BigInteger; import org.json.JSONObject; /** @@ -36,7 +36,83 @@ public class MsgSsrTileDefinition extends SBPMessage { public static final int TYPE = 0x05F7; - public int[] stub; + /** SSR Solution ID. */ + public int ssr_sol_id; + + /** 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 MsgSsrTileDefinition(int sender) { super(sender, TYPE); @@ -54,18 +130,45 @@ public MsgSsrTileDefinition(SBPMessage msg) throws SBPBinaryException { @Override protected void parse(Parser parser) throws SBPBinaryException { /* Parse fields from binary */ - stub = parser.getArrayofU8(); + ssr_sol_id = parser.getU8(); + 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.putArrayofU8(stub); + builder.putU8(ssr_sol_id); + 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("stub", new JSONArray(stub)); + 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); + 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/test/auto_check_sbp_integrity_MsgSsrFlagHighLevelTest.java b/java/test/auto_check_sbp_integrity_MsgSsrFlagHighLevelTest.java index f3f2bad485..3123db6c8f 100644 --- a/java/test/auto_check_sbp_integrity_MsgSsrFlagHighLevelTest.java +++ b/java/test/auto_check_sbp_integrity_MsgSsrFlagHighLevelTest.java @@ -69,289 +69,213 @@ public void test1() throws Throwable { JSONObject json = msg.toJSON(); Number value; Number expected; - value = msg.stub[0]; + value = msg.chain_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[0] + "' != '" + 180 + "'", - value.equals(BigInteger.valueOf(180L))); + "'" + msg.chain_id + "' != '" + 40 + "'", + value.equals(BigInteger.valueOf(40L))); } else { value = value.longValue(); - expected = 180L; + expected = 40L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[1]; + value = msg.corr_time.tow; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[1] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.corr_time.tow + "' != '" + 360 + "'", + value.equals(BigInteger.valueOf(360L))); } else { value = value.longValue(); - expected = 0L; + expected = 360L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[2]; + value = msg.corr_time.wn; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[2] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.corr_time.wn + "' != '" + 6 + "'", + value.equals(BigInteger.valueOf(6L))); } else { value = value.longValue(); - expected = 0L; + expected = 6L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[3]; + value = msg.obs_time.tow; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[3] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.obs_time.tow + "' != '" + 180 + "'", + value.equals(BigInteger.valueOf(180L))); } else { value = value.longValue(); - expected = 0L; + expected = 180L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[4]; + value = msg.obs_time.wn; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[4] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.obs_time.wn + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[5]; + value = msg.reserved[0]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[5] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.reserved[0] + "' != '" + 0 + "'", + value.equals(BigInteger.valueOf(0L))); } else { value = value.longValue(); expected = 0L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[6]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[6] + "' != '" + 104 + "'", - value.equals(BigInteger.valueOf(104L))); - } else { - value = value.longValue(); - expected = 104L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[7]; + value = msg.reserved[1]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[7] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.reserved[1] + "' != '" + 0 + "'", + value.equals(BigInteger.valueOf(0L))); } else { value = value.longValue(); - expected = 1L; + expected = 0L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[8]; + value = msg.reserved[2]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[8] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.reserved[2] + "' != '" + 0 + "'", + value.equals(BigInteger.valueOf(0L))); } else { value = value.longValue(); expected = 0L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[9]; + value = msg.reserved[3]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[9] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.reserved[3] + "' != '" + 0 + "'", + value.equals(BigInteger.valueOf(0L))); } else { value = value.longValue(); expected = 0L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[10]; + value = msg.reserved[4]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[10] + "' != '" + 6 + "'", value.equals(BigInteger.valueOf(6L))); + "'" + msg.reserved[4] + "' != '" + 0 + "'", + value.equals(BigInteger.valueOf(0L))); } else { value = value.longValue(); - expected = 6L; + expected = 0L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[11]; + value = msg.reserved[5]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[11] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.reserved[5] + "' != '" + 0 + "'", + value.equals(BigInteger.valueOf(0L))); } else { value = value.longValue(); expected = 0L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[12]; + value = msg.ssr_sol_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[12] + "' != '" + 10 + "'", + "'" + msg.ssr_sol_id + "' != '" + 10 + "'", value.equals(BigInteger.valueOf(10L))); } else { value = value.longValue(); expected = 10L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[13]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[13] + "' != '" + 20 + "'", - value.equals(BigInteger.valueOf(20L))); - } else { - value = value.longValue(); - expected = 20L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[14]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[14] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[15]; + value = msg.tile_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[15] + "' != '" + 30 + "'", - value.equals(BigInteger.valueOf(30L))); + "'" + msg.tile_id + "' != '" + 30 + "'", value.equals(BigInteger.valueOf(30L))); } else { value = value.longValue(); expected = 30L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[16]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[16] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[17]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[17] + "' != '" + 40 + "'", - value.equals(BigInteger.valueOf(40L))); - } else { - value = value.longValue(); - expected = 40L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[18]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[18] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); - } else { - value = value.longValue(); - expected = 1L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[19]; + value = msg.tile_set_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[19] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + "'" + msg.tile_set_id + "' != '" + 20 + "'", + value.equals(BigInteger.valueOf(20L))); } else { value = value.longValue(); - expected = 2L; + expected = 20L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[20]; + value = msg.use_bds_sat; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[20] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.use_bds_sat + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[21]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[21] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[22]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[22] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[23]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[23] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[24]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[24] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[25]; + value = msg.use_gal_sat; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[25] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.use_gal_sat + "' != '" + 2 + "'", + value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); - expected = 0L; + expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[26]; + value = msg.use_gps_sat; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[26] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.use_gps_sat + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 0L; + expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[27]; + value = msg.use_iono_grid_point_sat_los; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[27] + "' != '" + 4 + "'", value.equals(BigInteger.valueOf(4L))); + "'" + msg.use_iono_grid_point_sat_los + "' != '" + 7 + "'", + value.equals(BigInteger.valueOf(7L))); } else { value = value.longValue(); - expected = 4L; + expected = 7L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[28]; + value = msg.use_iono_grid_points; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[28] + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); + "'" + msg.use_iono_grid_points + "' != '" + 5 + "'", + value.equals(BigInteger.valueOf(5L))); } else { value = value.longValue(); expected = 5L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[29]; + value = msg.use_iono_tile_sat_los; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[29] + "' != '" + 6 + "'", value.equals(BigInteger.valueOf(6L))); + "'" + msg.use_iono_tile_sat_los + "' != '" + 6 + "'", + value.equals(BigInteger.valueOf(6L))); } else { value = value.longValue(); expected = 6L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[30]; + value = msg.use_tropo_grid_points; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[30] + "' != '" + 7 + "'", value.equals(BigInteger.valueOf(7L))); + "'" + msg.use_tropo_grid_points + "' != '" + 4 + "'", + value.equals(BigInteger.valueOf(4L))); } else { value = value.longValue(); - expected = 7L; + expected = 4L; org.junit.Assert.assertEquals(value, expected); } } diff --git a/java/test/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLosTest.java b/java/test/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLosTest.java index 2aea06b7b2..264a080fc7 100644 --- a/java/test/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLosTest.java +++ b/java/test/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointSatLosTest.java @@ -60,200 +60,145 @@ public void test1() throws Throwable { JSONObject json = msg.toJSON(); Number value; Number expected; - value = msg.stub[0]; + value = msg.faulty_los[0].constellation; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[0] + "' != '" + 180 + "'", - value.equals(BigInteger.valueOf(180L))); + "'" + msg.faulty_los[0].constellation + "' != '" + 11 + "'", + value.equals(BigInteger.valueOf(11L))); } else { value = value.longValue(); - expected = 180L; + expected = 11L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[1]; + value = msg.faulty_los[0].satId; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[1] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.faulty_los[0].satId + "' != '" + 10 + "'", + value.equals(BigInteger.valueOf(10L))); } else { value = value.longValue(); - expected = 0L; + expected = 10L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[2]; + value = msg.faulty_los[1].constellation; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[2] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.faulty_los[1].constellation + "' != '" + 14 + "'", + value.equals(BigInteger.valueOf(14L))); } else { value = value.longValue(); - expected = 0L; + expected = 14L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[3]; + value = msg.faulty_los[1].satId; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[3] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.faulty_los[1].satId + "' != '" + 15 + "'", + value.equals(BigInteger.valueOf(15L))); } else { value = value.longValue(); - expected = 0L; + expected = 15L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[4]; + value = msg.grid_point_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[4] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.grid_point_id + "' != '" + 30 + "'", + value.equals(BigInteger.valueOf(30L))); } else { value = value.longValue(); - expected = 3L; + expected = 30L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[5]; + value = msg.header.chain_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[5] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.chain_id + "' != '" + 6 + "'", + value.equals(BigInteger.valueOf(6L))); } else { value = value.longValue(); - expected = 0L; + expected = 6L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[6]; + value = msg.header.num_msgs; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[6] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.header.num_msgs + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[7]; + value = msg.header.obs_time.tow; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[7] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + "'" + msg.header.obs_time.tow + "' != '" + 180 + "'", + value.equals(BigInteger.valueOf(180L))); } else { value = value.longValue(); - expected = 2L; + expected = 180L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[8]; + value = msg.header.obs_time.wn; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[8] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.header.obs_time.wn + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[9]; + value = msg.header.seq_num; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[9] + "' != '" + 4 + "'", value.equals(BigInteger.valueOf(4L))); + "'" + msg.header.seq_num + "' != '" + 2 + "'", + value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); - expected = 4L; + expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[10]; + value = msg.header.ssr_sol_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[10] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.ssr_sol_id + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 0L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[11]; + value = msg.header.tile_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[11] + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); + "'" + msg.header.tile_id + "' != '" + 5 + "'", + value.equals(BigInteger.valueOf(5L))); } else { value = value.longValue(); expected = 5L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[12]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[12] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[13]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[13] + "' != '" + 6 + "'", value.equals(BigInteger.valueOf(6L))); - } else { - value = value.longValue(); - expected = 6L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[14]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[14] + "' != '" + 30 + "'", - value.equals(BigInteger.valueOf(30L))); - } else { - value = value.longValue(); - expected = 30L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[15]; + value = msg.header.tile_set_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[15] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.tile_set_id + "' != '" + 4 + "'", + value.equals(BigInteger.valueOf(4L))); } else { value = value.longValue(); - expected = 0L; + expected = 4L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[16]; + value = msg.n_faulty_los; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[16] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + "'" + msg.n_faulty_los + "' != '" + 2 + "'", + value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[17]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[17] + "' != '" + 10 + "'", - value.equals(BigInteger.valueOf(10L))); - } else { - value = value.longValue(); - expected = 10L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[18]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[18] + "' != '" + 11 + "'", - value.equals(BigInteger.valueOf(11L))); - } else { - value = value.longValue(); - expected = 11L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[19]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[19] + "' != '" + 15 + "'", - value.equals(BigInteger.valueOf(15L))); - } else { - value = value.longValue(); - expected = 15L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[20]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[20] + "' != '" + 14 + "'", - value.equals(BigInteger.valueOf(14L))); - } else { - value = value.longValue(); - expected = 14L; - org.junit.Assert.assertEquals(value, expected); - } } } diff --git a/java/test/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointsTest.java b/java/test/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointsTest.java index 5e79c469a1..de9c71b3d9 100644 --- a/java/test/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointsTest.java +++ b/java/test/auto_check_sbp_integrity_MsgSsrFlagIonoGridPointsTest.java @@ -60,198 +60,125 @@ public void test1() throws Throwable { JSONObject json = msg.toJSON(); Number value; Number expected; - value = msg.stub[0]; + value = msg.faulty_points[0]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[0] + "' != '" + 180 + "'", - value.equals(BigInteger.valueOf(180L))); - } else { - value = value.longValue(); - expected = 180L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[1]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[1] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[2]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[2] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.faulty_points[0] + "' != '" + 10 + "'", + value.equals(BigInteger.valueOf(10L))); } else { value = value.longValue(); - expected = 0L; + expected = 10L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[3]; + value = msg.faulty_points[1]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[3] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.faulty_points[1] + "' != '" + 11 + "'", + value.equals(BigInteger.valueOf(11L))); } else { value = value.longValue(); - expected = 0L; + expected = 11L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[4]; + value = msg.faulty_points[2]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[4] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.faulty_points[2] + "' != '" + 12 + "'", + value.equals(BigInteger.valueOf(12L))); } else { value = value.longValue(); - expected = 3L; + expected = 12L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[5]; + value = msg.header.chain_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[5] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.chain_id + "' != '" + 6 + "'", + value.equals(BigInteger.valueOf(6L))); } else { value = value.longValue(); - expected = 0L; + expected = 6L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[6]; + value = msg.header.num_msgs; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[6] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.header.num_msgs + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[7]; + value = msg.header.obs_time.tow; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[7] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + "'" + msg.header.obs_time.tow + "' != '" + 180 + "'", + value.equals(BigInteger.valueOf(180L))); } else { value = value.longValue(); - expected = 2L; + expected = 180L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[8]; + value = msg.header.obs_time.wn; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[8] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.header.obs_time.wn + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[9]; + value = msg.header.seq_num; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[9] + "' != '" + 4 + "'", value.equals(BigInteger.valueOf(4L))); + "'" + msg.header.seq_num + "' != '" + 2 + "'", + value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); - expected = 4L; + expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[10]; + value = msg.header.ssr_sol_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[10] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.ssr_sol_id + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 0L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[11]; + value = msg.header.tile_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[11] + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); + "'" + msg.header.tile_id + "' != '" + 5 + "'", + value.equals(BigInteger.valueOf(5L))); } else { value = value.longValue(); expected = 5L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[12]; + value = msg.header.tile_set_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[12] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.tile_set_id + "' != '" + 4 + "'", + value.equals(BigInteger.valueOf(4L))); } else { value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[13]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[13] + "' != '" + 6 + "'", value.equals(BigInteger.valueOf(6L))); - } else { - value = value.longValue(); - expected = 6L; + expected = 4L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[14]; + value = msg.n_faulty_points; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[14] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.n_faulty_points + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[15]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[15] + "' != '" + 10 + "'", - value.equals(BigInteger.valueOf(10L))); - } else { - value = value.longValue(); - expected = 10L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[16]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[16] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[17]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[17] + "' != '" + 11 + "'", - value.equals(BigInteger.valueOf(11L))); - } else { - value = value.longValue(); - expected = 11L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[18]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[18] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[19]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[19] + "' != '" + 12 + "'", - value.equals(BigInteger.valueOf(12L))); - } else { - value = value.longValue(); - expected = 12L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[20]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[20] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } } } diff --git a/java/test/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLosTest.java b/java/test/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLosTest.java index 2a0fff770d..adabf5d220 100644 --- a/java/test/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLosTest.java +++ b/java/test/auto_check_sbp_integrity_MsgSsrFlagIonoTileSatLosTest.java @@ -58,181 +58,135 @@ public void test1() throws Throwable { JSONObject json = msg.toJSON(); Number value; Number expected; - value = msg.stub[0]; + value = msg.faulty_los[0].constellation; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[0] + "' != '" + 180 + "'", - value.equals(BigInteger.valueOf(180L))); - } else { - value = value.longValue(); - expected = 180L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[1]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[1] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.faulty_los[0].constellation + "' != '" + 11 + "'", + value.equals(BigInteger.valueOf(11L))); } else { value = value.longValue(); - expected = 0L; + expected = 11L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[2]; + value = msg.faulty_los[0].satId; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[2] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.faulty_los[0].satId + "' != '" + 10 + "'", + value.equals(BigInteger.valueOf(10L))); } else { value = value.longValue(); - expected = 0L; + expected = 10L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[3]; + value = msg.faulty_los[1].constellation; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[3] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.faulty_los[1].constellation + "' != '" + 14 + "'", + value.equals(BigInteger.valueOf(14L))); } else { value = value.longValue(); - expected = 0L; + expected = 14L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[4]; + value = msg.faulty_los[1].satId; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[4] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.faulty_los[1].satId + "' != '" + 15 + "'", + value.equals(BigInteger.valueOf(15L))); } else { value = value.longValue(); - expected = 3L; + expected = 15L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[5]; + value = msg.header.chain_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[5] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.chain_id + "' != '" + 6 + "'", + value.equals(BigInteger.valueOf(6L))); } else { value = value.longValue(); - expected = 0L; + expected = 6L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[6]; + value = msg.header.num_msgs; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[6] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.header.num_msgs + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[7]; + value = msg.header.obs_time.tow; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[7] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + "'" + msg.header.obs_time.tow + "' != '" + 180 + "'", + value.equals(BigInteger.valueOf(180L))); } else { value = value.longValue(); - expected = 2L; + expected = 180L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[8]; + value = msg.header.obs_time.wn; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[8] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.header.obs_time.wn + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[9]; + value = msg.header.seq_num; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[9] + "' != '" + 4 + "'", value.equals(BigInteger.valueOf(4L))); + "'" + msg.header.seq_num + "' != '" + 2 + "'", + value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); - expected = 4L; + expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[10]; + value = msg.header.ssr_sol_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[10] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.ssr_sol_id + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 0L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[11]; + value = msg.header.tile_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[11] + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); + "'" + msg.header.tile_id + "' != '" + 5 + "'", + value.equals(BigInteger.valueOf(5L))); } else { value = value.longValue(); expected = 5L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[12]; + value = msg.header.tile_set_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[12] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.tile_set_id + "' != '" + 4 + "'", + value.equals(BigInteger.valueOf(4L))); } else { value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[13]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[13] + "' != '" + 6 + "'", value.equals(BigInteger.valueOf(6L))); - } else { - value = value.longValue(); - expected = 6L; + expected = 4L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[14]; + value = msg.n_faulty_los; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[14] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + "'" + msg.n_faulty_los + "' != '" + 2 + "'", + value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[15]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[15] + "' != '" + 10 + "'", - value.equals(BigInteger.valueOf(10L))); - } else { - value = value.longValue(); - expected = 10L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[16]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[16] + "' != '" + 11 + "'", - value.equals(BigInteger.valueOf(11L))); - } else { - value = value.longValue(); - expected = 11L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[17]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[17] + "' != '" + 15 + "'", - value.equals(BigInteger.valueOf(15L))); - } else { - value = value.longValue(); - expected = 15L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[18]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[18] + "' != '" + 14 + "'", - value.equals(BigInteger.valueOf(14L))); - } else { - value = value.longValue(); - expected = 14L; - org.junit.Assert.assertEquals(value, expected); - } } } diff --git a/java/test/auto_check_sbp_integrity_MsgSsrFlagSatellitesTest.java b/java/test/auto_check_sbp_integrity_MsgSsrFlagSatellitesTest.java index 8951d5f763..ba0b7ba805 100644 --- a/java/test/auto_check_sbp_integrity_MsgSsrFlagSatellitesTest.java +++ b/java/test/auto_check_sbp_integrity_MsgSsrFlagSatellitesTest.java @@ -41,144 +41,111 @@ public void test1() throws Throwable { JSONObject json = msg.toJSON(); Number value; Number expected; - value = msg.stub[0]; + value = msg.chain_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[0] + "' != '" + 180 + "'", - value.equals(BigInteger.valueOf(180L))); + "'" + msg.chain_id + "' != '" + 4 + "'", value.equals(BigInteger.valueOf(4L))); } else { value = value.longValue(); - expected = 180L; + expected = 4L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[1]; + value = msg.const_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[1] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.const_id + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); } else { value = value.longValue(); - expected = 0L; + expected = 5L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[2]; + value = msg.faulty_sats[0]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[2] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.faulty_sats[0] + "' != '" + 10 + "'", + value.equals(BigInteger.valueOf(10L))); } else { value = value.longValue(); - expected = 0L; + expected = 10L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[3]; + value = msg.faulty_sats[1]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[3] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.faulty_sats[1] + "' != '" + 11 + "'", + value.equals(BigInteger.valueOf(11L))); } else { value = value.longValue(); - expected = 0L; + expected = 11L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[4]; + value = msg.faulty_sats[2]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[4] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.faulty_sats[2] + "' != '" + 12 + "'", + value.equals(BigInteger.valueOf(12L))); } else { value = value.longValue(); - expected = 3L; + expected = 12L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[5]; + value = msg.n_faulty_sats; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[5] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.n_faulty_sats + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 0L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[6]; + value = msg.num_msgs; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[6] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.num_msgs + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[7]; + value = msg.obs_time.tow; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[7] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + "'" + msg.obs_time.tow + "' != '" + 180 + "'", + value.equals(BigInteger.valueOf(180L))); } else { value = value.longValue(); - expected = 2L; + expected = 180L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[8]; + value = msg.obs_time.wn; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[8] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.obs_time.wn + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[9]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[9] + "' != '" + 4 + "'", value.equals(BigInteger.valueOf(4L))); - } else { - value = value.longValue(); - expected = 4L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[10]; + value = msg.seq_num; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[10] + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); + "'" + msg.seq_num + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); - expected = 5L; + expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[11]; + value = msg.ssr_sol_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[11] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.ssr_sol_id + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[12]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[12] + "' != '" + 10 + "'", - value.equals(BigInteger.valueOf(10L))); - } else { - value = value.longValue(); - expected = 10L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[13]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[13] + "' != '" + 11 + "'", - value.equals(BigInteger.valueOf(11L))); - } else { - value = value.longValue(); - expected = 11L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[14]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[14] + "' != '" + 12 + "'", - value.equals(BigInteger.valueOf(12L))); - } else { - value = value.longValue(); - expected = 12L; - org.junit.Assert.assertEquals(value, expected); - } } } diff --git a/java/test/auto_check_sbp_integrity_MsgSsrFlagTropoGridPointsTest.java b/java/test/auto_check_sbp_integrity_MsgSsrFlagTropoGridPointsTest.java index ad34484275..7c3e293d27 100644 --- a/java/test/auto_check_sbp_integrity_MsgSsrFlagTropoGridPointsTest.java +++ b/java/test/auto_check_sbp_integrity_MsgSsrFlagTropoGridPointsTest.java @@ -60,198 +60,125 @@ public void test1() throws Throwable { JSONObject json = msg.toJSON(); Number value; Number expected; - value = msg.stub[0]; + value = msg.faulty_points[0]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[0] + "' != '" + 180 + "'", - value.equals(BigInteger.valueOf(180L))); - } else { - value = value.longValue(); - expected = 180L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[1]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[1] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[2]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[2] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.faulty_points[0] + "' != '" + 10 + "'", + value.equals(BigInteger.valueOf(10L))); } else { value = value.longValue(); - expected = 0L; + expected = 10L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[3]; + value = msg.faulty_points[1]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[3] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.faulty_points[1] + "' != '" + 11 + "'", + value.equals(BigInteger.valueOf(11L))); } else { value = value.longValue(); - expected = 0L; + expected = 11L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[4]; + value = msg.faulty_points[2]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[4] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.faulty_points[2] + "' != '" + 12 + "'", + value.equals(BigInteger.valueOf(12L))); } else { value = value.longValue(); - expected = 3L; + expected = 12L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[5]; + value = msg.header.chain_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[5] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.chain_id + "' != '" + 6 + "'", + value.equals(BigInteger.valueOf(6L))); } else { value = value.longValue(); - expected = 0L; + expected = 6L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[6]; + value = msg.header.num_msgs; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[6] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.header.num_msgs + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[7]; + value = msg.header.obs_time.tow; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[7] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + "'" + msg.header.obs_time.tow + "' != '" + 180 + "'", + value.equals(BigInteger.valueOf(180L))); } else { value = value.longValue(); - expected = 2L; + expected = 180L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[8]; + value = msg.header.obs_time.wn; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[8] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.header.obs_time.wn + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[9]; + value = msg.header.seq_num; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[9] + "' != '" + 4 + "'", value.equals(BigInteger.valueOf(4L))); + "'" + msg.header.seq_num + "' != '" + 2 + "'", + value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); - expected = 4L; + expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[10]; + value = msg.header.ssr_sol_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[10] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.ssr_sol_id + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 0L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[11]; + value = msg.header.tile_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[11] + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); + "'" + msg.header.tile_id + "' != '" + 5 + "'", + value.equals(BigInteger.valueOf(5L))); } else { value = value.longValue(); expected = 5L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[12]; + value = msg.header.tile_set_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[12] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.tile_set_id + "' != '" + 4 + "'", + value.equals(BigInteger.valueOf(4L))); } else { value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[13]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[13] + "' != '" + 6 + "'", value.equals(BigInteger.valueOf(6L))); - } else { - value = value.longValue(); - expected = 6L; + expected = 4L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[14]; + value = msg.n_faulty_points; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[14] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.n_faulty_points + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[15]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[15] + "' != '" + 10 + "'", - value.equals(BigInteger.valueOf(10L))); - } else { - value = value.longValue(); - expected = 10L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[16]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[16] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[17]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[17] + "' != '" + 11 + "'", - value.equals(BigInteger.valueOf(11L))); - } else { - value = value.longValue(); - expected = 11L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[18]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[18] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[19]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[19] + "' != '" + 12 + "'", - value.equals(BigInteger.valueOf(12L))); - } else { - value = value.longValue(); - expected = 12L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[20]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[20] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } } } diff --git a/java/test/auto_check_sbp_navigation_MsgReferenceFrameParamTest.java b/java/test/auto_check_sbp_navigation_MsgReferenceFrameParamTest.java index 4d8265cd79..fa0f4ac4fb 100644 --- a/java/test/auto_check_sbp_navigation_MsgReferenceFrameParamTest.java +++ b/java/test/auto_check_sbp_navigation_MsgReferenceFrameParamTest.java @@ -34,7 +34,6 @@ public void test1() throws Throwable { byte[] payload = new byte[] { (byte) 1, - (byte) 2, (byte) 102, (byte) 111, (byte) 111, @@ -66,7 +65,7 @@ public void test1() throws Throwable { (byte) 0, (byte) 0, (byte) 0, - (byte) 3, + (byte) 0, (byte) 98, (byte) 97, (byte) 114, @@ -98,6 +97,7 @@ public void test1() throws Throwable { (byte) 0, (byte) 0, (byte) 0, + (byte) 0, (byte) 4, (byte) 5, (byte) 0, @@ -163,1138 +163,179 @@ public void test1() throws Throwable { JSONObject json = msg.toJSON(); Number value; Number expected; - value = msg.stub[0]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[0] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); - } else { - value = value.longValue(); - expected = 1L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[1]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[1] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); - } else { - value = value.longValue(); - expected = 2L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[2]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[2] + "' != '" + 102 + "'", - value.equals(BigInteger.valueOf(102L))); - } else { - value = value.longValue(); - expected = 102L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[3]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[3] + "' != '" + 111 + "'", - value.equals(BigInteger.valueOf(111L))); - } else { - value = value.longValue(); - expected = 111L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[4]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[4] + "' != '" + 111 + "'", - value.equals(BigInteger.valueOf(111L))); - } else { - value = value.longValue(); - expected = 111L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[5]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[5] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[6]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[6] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[7]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[7] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[8]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[8] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[9]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[9] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[10]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[10] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[11]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[11] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[12]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[12] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[13]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[13] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[14]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[14] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[15]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[15] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[16]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[16] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[17]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[17] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[18]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[18] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[19]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[19] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[20]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[20] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[21]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[21] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[22]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[22] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[23]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[23] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[24]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[24] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[25]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[25] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[26]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[26] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[27]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[27] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[28]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[28] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[29]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[29] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[30]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[30] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[31]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[31] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[32]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[32] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[33]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[33] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); - } else { - value = value.longValue(); - expected = 3L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[34]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[34] + "' != '" + 98 + "'", - value.equals(BigInteger.valueOf(98L))); - } else { - value = value.longValue(); - expected = 98L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[35]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[35] + "' != '" + 97 + "'", - value.equals(BigInteger.valueOf(97L))); - } else { - value = value.longValue(); - expected = 97L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[36]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[36] + "' != '" + 114 + "'", - value.equals(BigInteger.valueOf(114L))); - } else { - value = value.longValue(); - expected = 114L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[37]; + value = msg.delta_X0; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[37] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.delta_X0 + "' != '" + 7 + "'", value.equals(BigInteger.valueOf(7L))); } else { value = value.longValue(); - expected = 0L; + expected = 7L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[38]; + value = msg.delta_Y0; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[38] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.delta_Y0 + "' != '" + 8 + "'", value.equals(BigInteger.valueOf(8L))); } else { value = value.longValue(); - expected = 0L; + expected = 8L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[39]; + value = msg.delta_Z0; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[39] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.delta_Z0 + "' != '" + 9 + "'", value.equals(BigInteger.valueOf(9L))); } else { value = value.longValue(); - expected = 0L; + expected = 9L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[40]; + value = msg.dot_delta_X0; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[40] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.dot_delta_X0 + "' != '" + 14 + "'", + value.equals(BigInteger.valueOf(14L))); } else { value = value.longValue(); - expected = 0L; + expected = 14L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[41]; + value = msg.dot_delta_Y0; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[41] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.dot_delta_Y0 + "' != '" + 15 + "'", + value.equals(BigInteger.valueOf(15L))); } else { value = value.longValue(); - expected = 0L; + expected = 15L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[42]; + value = msg.dot_delta_Z0; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[42] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.dot_delta_Z0 + "' != '" + 16 + "'", + value.equals(BigInteger.valueOf(16L))); } else { value = value.longValue(); - expected = 0L; + expected = 16L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[43]; + value = msg.dot_scale; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[43] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.dot_scale + "' != '" + 20 + "'", + value.equals(BigInteger.valueOf(20L))); } else { value = value.longValue(); - expected = 0L; + expected = 20L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[44]; + value = msg.dot_theta_01; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[44] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.dot_theta_01 + "' != '" + 17 + "'", + value.equals(BigInteger.valueOf(17L))); } else { value = value.longValue(); - expected = 0L; + expected = 17L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[45]; + value = msg.dot_theta_02; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[45] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.dot_theta_02 + "' != '" + 18 + "'", + value.equals(BigInteger.valueOf(18L))); } else { value = value.longValue(); - expected = 0L; + expected = 18L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[46]; + value = msg.dot_theta_03; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[46] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.dot_theta_03 + "' != '" + 19 + "'", + value.equals(BigInteger.valueOf(19L))); } else { value = value.longValue(); - expected = 0L; + expected = 19L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[47]; + value = msg.re_t0; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[47] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.re_t0 + "' != '" + 6 + "'", value.equals(BigInteger.valueOf(6L))); } else { value = value.longValue(); - expected = 0L; + expected = 6L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[48]; + value = msg.scale; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[48] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.scale + "' != '" + 13 + "'", value.equals(BigInteger.valueOf(13L))); } else { value = value.longValue(); - expected = 0L; + expected = 13L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[49]; + value = msg.sin; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[49] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.sin + "' != '" + 4 + "'", value.equals(BigInteger.valueOf(4L))); } else { value = value.longValue(); - expected = 0L; + expected = 4L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[50]; + org.junit.Assert.assertEquals(msg.sn, "foo"); + value = msg.ssr_iod; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[50] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.ssr_iod + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 0L; + expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[51]; + value = msg.theta_01; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[51] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.theta_01 + "' != '" + 10 + "'", + value.equals(BigInteger.valueOf(10L))); } else { value = value.longValue(); - expected = 0L; + expected = 10L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[52]; + value = msg.theta_02; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[52] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.theta_02 + "' != '" + 11 + "'", + value.equals(BigInteger.valueOf(11L))); } else { value = value.longValue(); - expected = 0L; + expected = 11L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[53]; + value = msg.theta_03; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[53] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.theta_03 + "' != '" + 12 + "'", + value.equals(BigInteger.valueOf(12L))); } else { value = value.longValue(); - expected = 0L; + expected = 12L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[54]; + org.junit.Assert.assertEquals(msg.tn, "bar"); + value = msg.utn; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[54] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[55]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[55] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[56]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[56] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[57]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[57] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[58]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[58] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[59]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[59] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[60]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[60] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[61]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[61] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[62]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[62] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[63]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[63] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[64]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[64] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[65]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[65] + "' != '" + 4 + "'", value.equals(BigInteger.valueOf(4L))); - } else { - value = value.longValue(); - expected = 4L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[66]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[66] + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); + "'" + msg.utn + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); } else { value = value.longValue(); expected = 5L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[67]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[67] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[68]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[68] + "' != '" + 6 + "'", value.equals(BigInteger.valueOf(6L))); - } else { - value = value.longValue(); - expected = 6L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[69]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[69] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[70]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[70] + "' != '" + 7 + "'", value.equals(BigInteger.valueOf(7L))); - } else { - value = value.longValue(); - expected = 7L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[71]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[71] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[72]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[72] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[73]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[73] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[74]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[74] + "' != '" + 8 + "'", value.equals(BigInteger.valueOf(8L))); - } else { - value = value.longValue(); - expected = 8L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[75]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[75] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[76]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[76] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[77]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[77] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[78]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[78] + "' != '" + 9 + "'", value.equals(BigInteger.valueOf(9L))); - } else { - value = value.longValue(); - expected = 9L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[79]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[79] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[80]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[80] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[81]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[81] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[82]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[82] + "' != '" + 10 + "'", - value.equals(BigInteger.valueOf(10L))); - } else { - value = value.longValue(); - expected = 10L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[83]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[83] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[84]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[84] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[85]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[85] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[86]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[86] + "' != '" + 11 + "'", - value.equals(BigInteger.valueOf(11L))); - } else { - value = value.longValue(); - expected = 11L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[87]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[87] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[88]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[88] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[89]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[89] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[90]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[90] + "' != '" + 12 + "'", - value.equals(BigInteger.valueOf(12L))); - } else { - value = value.longValue(); - expected = 12L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[91]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[91] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[92]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[92] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[93]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[93] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[94]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[94] + "' != '" + 13 + "'", - value.equals(BigInteger.valueOf(13L))); - } else { - value = value.longValue(); - expected = 13L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[95]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[95] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[96]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[96] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[97]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[97] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[98]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[98] + "' != '" + 14 + "'", - value.equals(BigInteger.valueOf(14L))); - } else { - value = value.longValue(); - expected = 14L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[99]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[99] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[100]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[100] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[101]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[101] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[102]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[102] + "' != '" + 15 + "'", - value.equals(BigInteger.valueOf(15L))); - } else { - value = value.longValue(); - expected = 15L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[103]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[103] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[104]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[104] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[105]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[105] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[106]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[106] + "' != '" + 16 + "'", - value.equals(BigInteger.valueOf(16L))); - } else { - value = value.longValue(); - expected = 16L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[107]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[107] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[108]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[108] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[109]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[109] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[110]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[110] + "' != '" + 17 + "'", - value.equals(BigInteger.valueOf(17L))); - } else { - value = value.longValue(); - expected = 17L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[111]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[111] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[112]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[112] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[113]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[113] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[114]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[114] + "' != '" + 18 + "'", - value.equals(BigInteger.valueOf(18L))); - } else { - value = value.longValue(); - expected = 18L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[115]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[115] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[116]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[116] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[117]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[117] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[118]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[118] + "' != '" + 19 + "'", - value.equals(BigInteger.valueOf(19L))); - } else { - value = value.longValue(); - expected = 19L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[119]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[119] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[120]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[120] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[121]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[121] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[122]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[122] + "' != '" + 20 + "'", - value.equals(BigInteger.valueOf(20L))); - } else { - value = value.longValue(); - expected = 20L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[123]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[123] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } } } diff --git a/java/test/auto_check_sbp_navigation_MsgUTCLeapSecondTest.java b/java/test/auto_check_sbp_navigation_MsgUTCLeapSecondTest.java index a0628ec249..766a904ffe 100644 --- a/java/test/auto_check_sbp_navigation_MsgUTCLeapSecondTest.java +++ b/java/test/auto_check_sbp_navigation_MsgUTCLeapSecondTest.java @@ -40,130 +40,90 @@ public void test1() throws Throwable { JSONObject json = msg.toJSON(); Number value; Number expected; - value = msg.stub[0]; + value = msg.bias_coeff; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[0] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.bias_coeff + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[1]; + value = msg.count_after; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[1] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.count_after + "' != '" + 9 + "'", + value.equals(BigInteger.valueOf(9L))); } else { value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[2]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[2] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); - } else { - value = value.longValue(); - expected = 2L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[3]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[3] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[4]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[4] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); - } else { - value = value.longValue(); - expected = 3L; + expected = 9L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[5]; + value = msg.count_before; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[5] + "' != '" + 4 + "'", value.equals(BigInteger.valueOf(4L))); + "'" + msg.count_before + "' != '" + 4 + "'", + value.equals(BigInteger.valueOf(4L))); } else { value = value.longValue(); expected = 4L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[6]; + value = msg.drift_coeff; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[6] + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); + "'" + msg.drift_coeff + "' != '" + 2 + "'", + value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); - expected = 5L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[7]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[7] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; + expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[8]; + value = msg.drift_rate_coeff; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[8] + "' != '" + 6 + "'", value.equals(BigInteger.valueOf(6L))); + "'" + msg.drift_rate_coeff + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 6L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[9]; + value = msg.ref_dn; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[9] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.ref_dn + "' != '" + 8 + "'", value.equals(BigInteger.valueOf(8L))); } else { value = value.longValue(); - expected = 0L; + expected = 8L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[10]; + value = msg.ref_wn; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[10] + "' != '" + 7 + "'", value.equals(BigInteger.valueOf(7L))); + "'" + msg.ref_wn + "' != '" + 7 + "'", value.equals(BigInteger.valueOf(7L))); } else { value = value.longValue(); expected = 7L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[11]; + value = msg.tow_s; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[11] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.tow_s + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); } else { value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[12]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[12] + "' != '" + 8 + "'", value.equals(BigInteger.valueOf(8L))); - } else { - value = value.longValue(); - expected = 8L; + expected = 5L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[13]; + value = msg.wn; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[13] + "' != '" + 9 + "'", value.equals(BigInteger.valueOf(9L))); + "'" + msg.wn + "' != '" + 6 + "'", value.equals(BigInteger.valueOf(6L))); } else { value = value.longValue(); - expected = 9L; + expected = 6L; org.junit.Assert.assertEquals(value, expected); } } diff --git a/java/test/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBoundsTest.java b/java/test/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBoundsTest.java index 0b4f556ac5..549917c584 100644 --- a/java/test/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBoundsTest.java +++ b/java/test/auto_check_sbp_ssr_MsgSsrCodePhaseBiasesBoundsTest.java @@ -43,291 +43,272 @@ public void test1() throws Throwable { JSONObject json = msg.toJSON(); Number value; Number expected; - value = msg.stub[0]; + value = msg.const_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[0] + "' != '" + 180 + "'", - value.equals(BigInteger.valueOf(180L))); + "'" + msg.const_id + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 180L; + expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[1]; + value = msg.header.num_msgs; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[1] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.num_msgs + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 0L; + expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[2]; + value = msg.header.seq_num; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[2] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.seq_num + "' != '" + 2 + "'", + value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); - expected = 0L; + expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[3]; + value = msg.header.sol_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[3] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.sol_id + "' != '" + 14 + "'", + value.equals(BigInteger.valueOf(14L))); } else { value = value.longValue(); - expected = 0L; + expected = 14L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[4]; + value = msg.header.time.tow; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[4] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.header.time.tow + "' != '" + 180 + "'", + value.equals(BigInteger.valueOf(180L))); } else { value = value.longValue(); - expected = 3L; + expected = 180L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[5]; + value = msg.header.time.wn; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[5] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.time.wn + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 0L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[6]; + value = msg.header.update_interval; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[6] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.header.update_interval + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[7]; + value = msg.n_sats_signals; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[7] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + "'" + msg.n_sats_signals + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 2L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[8]; + value = msg.satellites_signals[0].code_bias_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[8] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.satellites_signals[0].code_bias_bound_mu + "' != '" + 39 + "'", + value.equals(BigInteger.valueOf(39L))); } else { value = value.longValue(); - expected = 1L; + expected = 39L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[9]; + value = msg.satellites_signals[0].code_bias_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[9] + "' != '" + 14 + "'", value.equals(BigInteger.valueOf(14L))); + "'" + msg.satellites_signals[0].code_bias_bound_sig + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 14L; + expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[10]; + value = msg.satellites_signals[0].phase_bias_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[10] + "' != '" + 15 + "'", - value.equals(BigInteger.valueOf(15L))); + "'" + msg.satellites_signals[0].phase_bias_bound_mu + "' != '" + 39 + "'", + value.equals(BigInteger.valueOf(39L))); } else { value = value.longValue(); - expected = 15L; + expected = 39L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[11]; + value = msg.satellites_signals[0].phase_bias_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[11] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.satellites_signals[0].phase_bias_bound_sig + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[12]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[12] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); - } else { - value = value.longValue(); - expected = 3L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[13]; + value = msg.satellites_signals[0].sat_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[13] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.satellites_signals[0].sat_id + "' != '" + 0 + "'", + value.equals(BigInteger.valueOf(0L))); } else { value = value.longValue(); expected = 0L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[14]; + value = msg.satellites_signals[0].signal_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[14] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.satellites_signals[0].signal_id + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[15]; + value = msg.satellites_signals[1].code_bias_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[15] + "' != '" + 39 + "'", + "'" + msg.satellites_signals[1].code_bias_bound_mu + "' != '" + 39 + "'", value.equals(BigInteger.valueOf(39L))); } else { value = value.longValue(); expected = 39L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[16]; + value = msg.satellites_signals[1].code_bias_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[16] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.satellites_signals[1].code_bias_bound_sig + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[17]; + value = msg.satellites_signals[1].phase_bias_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[17] + "' != '" + 39 + "'", + "'" + msg.satellites_signals[1].phase_bias_bound_mu + "' != '" + 39 + "'", value.equals(BigInteger.valueOf(39L))); } else { value = value.longValue(); expected = 39L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[18]; + value = msg.satellites_signals[1].phase_bias_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[18] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.satellites_signals[1].phase_bias_bound_sig + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[19]; + value = msg.satellites_signals[1].sat_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[19] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.satellites_signals[1].sat_id + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[20]; + value = msg.satellites_signals[1].signal_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[20] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.satellites_signals[1].signal_id + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[21]; + value = msg.satellites_signals[2].code_bias_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[21] + "' != '" + 39 + "'", + "'" + msg.satellites_signals[2].code_bias_bound_mu + "' != '" + 39 + "'", value.equals(BigInteger.valueOf(39L))); } else { value = value.longValue(); expected = 39L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[22]; + value = msg.satellites_signals[2].code_bias_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[22] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.satellites_signals[2].code_bias_bound_sig + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[23]; + value = msg.satellites_signals[2].phase_bias_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[23] + "' != '" + 39 + "'", + "'" + msg.satellites_signals[2].phase_bias_bound_mu + "' != '" + 39 + "'", value.equals(BigInteger.valueOf(39L))); } else { value = value.longValue(); expected = 39L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[24]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[24] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); - } else { - value = value.longValue(); - expected = 1L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[25]; + value = msg.satellites_signals[2].phase_bias_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[25] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.satellites_signals[2].phase_bias_bound_sig + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[26]; + value = msg.satellites_signals[2].sat_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[26] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.satellites_signals[2].sat_id + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[27]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[27] + "' != '" + 39 + "'", - value.equals(BigInteger.valueOf(39L))); - } else { - value = value.longValue(); - expected = 39L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[28]; + value = msg.satellites_signals[2].signal_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[28] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.satellites_signals[2].signal_id + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[29]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[29] + "' != '" + 39 + "'", - value.equals(BigInteger.valueOf(39L))); - } else { - value = value.longValue(); - expected = 39L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[30]; + value = msg.ssr_iod; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[30] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.ssr_iod + "' != '" + 15 + "'", value.equals(BigInteger.valueOf(15L))); } else { value = value.longValue(); - expected = 1L; + expected = 15L; org.junit.Assert.assertEquals(value, expected); } } diff --git a/java/test/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBoundsTest.java b/java/test/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBoundsTest.java index cad89c7a18..08ba36e5e5 100644 --- a/java/test/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBoundsTest.java +++ b/java/test/auto_check_sbp_ssr_MsgSsrGriddedCorrectionBoundsTest.java @@ -36,425 +36,370 @@ public void test1() throws Throwable { (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, + (byte) 200, (byte) 150, (byte) 100, (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.stub[0]; + value = msg.grid_point_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[0] + "' != '" + 180 + "'", - value.equals(BigInteger.valueOf(180L))); - } else { - value = value.longValue(); - expected = 180L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[1]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[1] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[2]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[2] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.grid_point_id + "' != '" + 1000 + "'", + value.equals(BigInteger.valueOf(1000L))); } else { value = value.longValue(); - expected = 0L; + expected = 1000L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[3]; + value = msg.header.num_msgs; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[3] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.num_msgs + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 0L; + expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[4]; + value = msg.header.seq_num; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[4] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.header.seq_num + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 3L; + expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[5]; + value = msg.header.sol_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[5] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.sol_id + "' != '" + 0 + "'", + value.equals(BigInteger.valueOf(0L))); } else { value = value.longValue(); expected = 0L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[6]; + value = msg.header.time.tow; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[6] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.header.time.tow + "' != '" + 180 + "'", + value.equals(BigInteger.valueOf(180L))); } else { value = value.longValue(); - expected = 1L; + expected = 180L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[7]; + value = msg.header.time.wn; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[7] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.header.time.wn + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 1L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[8]; + value = msg.header.update_interval; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[8] + "' != '" + 10 + "'", value.equals(BigInteger.valueOf(10L))); + "'" + msg.header.update_interval + "' != '" + 10 + "'", + value.equals(BigInteger.valueOf(10L))); } else { value = value.longValue(); expected = 10L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[9]; + value = msg.n_sats; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[9] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.n_sats + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); - expected = 0L; + expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[10]; + value = msg.ssr_iod_atmo; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[10] + "' != '" + 15 + "'", + "'" + msg.ssr_iod_atmo + "' != '" + 15 + "'", value.equals(BigInteger.valueOf(15L))); } else { value = value.longValue(); expected = 15L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[11]; + value = msg.stec_sat_list[0].stec_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[11] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); - } else { - value = value.longValue(); - expected = 1L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[12]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[12] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.stec_sat_list[0].stec_bound_mu + "' != '" + 18 + "'", + value.equals(BigInteger.valueOf(18L))); } else { value = value.longValue(); - expected = 0L; + expected = 18L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[13]; + value = msg.stec_sat_list[0].stec_bound_mu_dot; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[13] + "' != '" + 10 + "'", - value.equals(BigInteger.valueOf(10L))); + "'" + msg.stec_sat_list[0].stec_bound_mu_dot + "' != '" + 20 + "'", + value.equals(BigInteger.valueOf(20L))); } else { value = value.longValue(); - expected = 10L; + expected = 20L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[14]; + value = msg.stec_sat_list[0].stec_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[14] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.stec_sat_list[0].stec_bound_sig + "' != '" + 19 + "'", + value.equals(BigInteger.valueOf(19L))); } else { value = value.longValue(); - expected = 0L; + expected = 19L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[15]; + value = msg.stec_sat_list[0].stec_bound_sig_dot; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[15] + "' != '" + 39 + "'", - value.equals(BigInteger.valueOf(39L))); + "'" + msg.stec_sat_list[0].stec_bound_sig_dot + "' != '" + 21 + "'", + value.equals(BigInteger.valueOf(21L))); } else { value = value.longValue(); - expected = 39L; + expected = 21L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[16]; + value = msg.stec_sat_list[0].stec_residual.residual; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[16] + "' != '" + 232 + "'", - value.equals(BigInteger.valueOf(232L))); + "'" + msg.stec_sat_list[0].stec_residual.residual + "' != '" + 16 + "'", + value.equals(BigInteger.valueOf(16L))); } else { value = value.longValue(); - expected = 232L; + expected = 16L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[17]; + value = msg.stec_sat_list[0].stec_residual.stddev; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[17] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.stec_sat_list[0].stec_residual.stddev + "' != '" + 17 + "'", + value.equals(BigInteger.valueOf(17L))); } else { value = value.longValue(); - expected = 3L; + expected = 17L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[18]; + value = msg.stec_sat_list[0].stec_residual.sv_id.constellation; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[18] + "' != '" + 244 + "'", - value.equals(BigInteger.valueOf(244L))); + "'" + + msg.stec_sat_list[0].stec_residual.sv_id.constellation + + "' != '" + + 10 + + "'", + value.equals(BigInteger.valueOf(10L))); } else { value = value.longValue(); - expected = 244L; + expected = 10L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[19]; + value = msg.stec_sat_list[0].stec_residual.sv_id.satId; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[19] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.stec_sat_list[0].stec_residual.sv_id.satId + "' != '" + 5 + "'", + value.equals(BigInteger.valueOf(5L))); } else { value = value.longValue(); - expected = 1L; + expected = 5L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[20]; + value = msg.stec_sat_list[1].stec_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[20] + "' != '" + 100 + "'", - value.equals(BigInteger.valueOf(100L))); + "'" + msg.stec_sat_list[1].stec_bound_mu + "' != '" + 24 + "'", + value.equals(BigInteger.valueOf(24L))); } else { value = value.longValue(); - expected = 100L; + expected = 24L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[21]; + value = msg.stec_sat_list[1].stec_bound_mu_dot; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[21] + "' != '" + 200 + "'", - value.equals(BigInteger.valueOf(200L))); + "'" + msg.stec_sat_list[1].stec_bound_mu_dot + "' != '" + 26 + "'", + value.equals(BigInteger.valueOf(26L))); } else { value = value.longValue(); - expected = 200L; + expected = 26L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[22]; + value = msg.stec_sat_list[1].stec_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[22] + "' != '" + 150 + "'", - value.equals(BigInteger.valueOf(150L))); + "'" + msg.stec_sat_list[1].stec_bound_sig + "' != '" + 25 + "'", + value.equals(BigInteger.valueOf(25L))); } else { value = value.longValue(); - expected = 150L; + expected = 25L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[23]; + value = msg.stec_sat_list[1].stec_bound_sig_dot; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[23] + "' != '" + 100 + "'", - value.equals(BigInteger.valueOf(100L))); + "'" + msg.stec_sat_list[1].stec_bound_sig_dot + "' != '" + 27 + "'", + value.equals(BigInteger.valueOf(27L))); } else { value = value.longValue(); - expected = 100L; + expected = 27L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[24]; + value = msg.stec_sat_list[1].stec_residual.residual; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[24] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + "'" + msg.stec_sat_list[1].stec_residual.residual + "' != '" + 22 + "'", + value.equals(BigInteger.valueOf(22L))); } else { value = value.longValue(); - expected = 2L; + expected = 22L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[25]; + value = msg.stec_sat_list[1].stec_residual.stddev; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[25] + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); + "'" + msg.stec_sat_list[1].stec_residual.stddev + "' != '" + 23 + "'", + value.equals(BigInteger.valueOf(23L))); } else { value = value.longValue(); - expected = 5L; + expected = 23L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[26]; + value = msg.stec_sat_list[1].stec_residual.sv_id.constellation; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[26] + "' != '" + 10 + "'", + "'" + + 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.stub[27]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[27] + "' != '" + 16 + "'", - value.equals(BigInteger.valueOf(16L))); - } else { - value = value.longValue(); - expected = 16L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[28]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[28] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[29]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[29] + "' != '" + 17 + "'", - value.equals(BigInteger.valueOf(17L))); - } else { - value = value.longValue(); - expected = 17L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[30]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[30] + "' != '" + 18 + "'", - value.equals(BigInteger.valueOf(18L))); - } else { - value = value.longValue(); - expected = 18L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[31]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[31] + "' != '" + 19 + "'", - value.equals(BigInteger.valueOf(19L))); - } else { - value = value.longValue(); - expected = 19L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[32]; + value = msg.stec_sat_list[1].stec_residual.sv_id.satId; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[32] + "' != '" + 20 + "'", - value.equals(BigInteger.valueOf(20L))); + "'" + msg.stec_sat_list[1].stec_residual.sv_id.satId + "' != '" + 6 + "'", + value.equals(BigInteger.valueOf(6L))); } else { value = value.longValue(); - expected = 20L; + expected = 6L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[33]; + value = msg.tile_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[33] + "' != '" + 21 + "'", - value.equals(BigInteger.valueOf(21L))); + "'" + msg.tile_id + "' != '" + 10 + "'", value.equals(BigInteger.valueOf(10L))); } else { value = value.longValue(); - expected = 21L; + expected = 10L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[34]; + value = msg.tile_set_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[34] + "' != '" + 6 + "'", value.equals(BigInteger.valueOf(6L))); + "'" + msg.tile_set_id + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 6L; + expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[35]; + value = msg.tropo_delay_correction.hydro; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[35] + "' != '" + 10 + "'", - value.equals(BigInteger.valueOf(10L))); + "'" + msg.tropo_delay_correction.hydro + "' != '" + 500 + "'", + value.equals(BigInteger.valueOf(500L))); } else { value = value.longValue(); - expected = 10L; + expected = 500L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[36]; + value = msg.tropo_delay_correction.stddev; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[36] + "' != '" + 22 + "'", - value.equals(BigInteger.valueOf(22L))); + "'" + msg.tropo_delay_correction.stddev + "' != '" + 200 + "'", + value.equals(BigInteger.valueOf(200L))); } else { value = value.longValue(); - expected = 22L; + expected = 200L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[37]; + value = msg.tropo_delay_correction.wet; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[37] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.tropo_delay_correction.wet + "' != '" + 100 + "'", + value.equals(BigInteger.valueOf(100L))); } else { value = value.longValue(); - expected = 0L; + expected = 100L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[38]; + value = msg.tropo_qi; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[38] + "' != '" + 23 + "'", - value.equals(BigInteger.valueOf(23L))); + "'" + msg.tropo_qi + "' != '" + 39 + "'", + value.equals(BigInteger.valueOf(39L))); } else { value = value.longValue(); - expected = 23L; + expected = 39L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[39]; + value = msg.tropo_v_hydro_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[39] + "' != '" + 24 + "'", - value.equals(BigInteger.valueOf(24L))); + "'" + msg.tropo_v_hydro_bound_mu + "' != '" + 150 + "'", + value.equals(BigInteger.valueOf(150L))); } else { value = value.longValue(); - expected = 24L; + expected = 150L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[40]; + value = msg.tropo_v_hydro_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[40] + "' != '" + 25 + "'", - value.equals(BigInteger.valueOf(25L))); + "'" + msg.tropo_v_hydro_bound_sig + "' != '" + 100 + "'", + value.equals(BigInteger.valueOf(100L))); } else { value = value.longValue(); - expected = 25L; + expected = 100L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[41]; + value = msg.tropo_v_wet_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[41] + "' != '" + 26 + "'", - value.equals(BigInteger.valueOf(26L))); + "'" + msg.tropo_v_wet_bound_mu + "' != '" + 150 + "'", + value.equals(BigInteger.valueOf(150L))); } else { value = value.longValue(); - expected = 26L; + expected = 150L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[42]; + value = msg.tropo_v_wet_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[42] + "' != '" + 27 + "'", - value.equals(BigInteger.valueOf(27L))); + "'" + msg.tropo_v_wet_bound_sig + "' != '" + 100 + "'", + value.equals(BigInteger.valueOf(100L))); } else { value = value.longValue(); - expected = 27L; + expected = 100L; org.junit.Assert.assertEquals(value, expected); } } diff --git a/java/test/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradationTest.java b/java/test/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradationTest.java index 1b3402cf41..3036f0bee3 100644 --- a/java/test/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradationTest.java +++ b/java/test/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsDegradationTest.java @@ -67,267 +67,204 @@ public void test1() throws Throwable { JSONObject json = msg.toJSON(); Number value; Number expected; - value = msg.stub[0]; + value = msg.const_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[0] + "' != '" + 180 + "'", - value.equals(BigInteger.valueOf(180L))); - } else { - value = value.longValue(); - expected = 180L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[1]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[1] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[2]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[2] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.const_id + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[3]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[3] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[4]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[4] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); - } else { - value = value.longValue(); - expected = 3L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[5]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[5] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; + expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[6]; + value = msg.header.num_msgs; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[6] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.header.num_msgs + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[7]; + value = msg.header.seq_num; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[7] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + "'" + msg.header.seq_num + "' != '" + 2 + "'", + value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[8]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[8] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); - } else { - value = value.longValue(); - expected = 3L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[9]; + value = msg.header.sol_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[9] + "' != '" + 48 + "'", value.equals(BigInteger.valueOf(48L))); + "'" + msg.header.sol_id + "' != '" + 48 + "'", + value.equals(BigInteger.valueOf(48L))); } else { value = value.longValue(); expected = 48L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[10]; + value = msg.header.time.tow; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[10] + "' != '" + 15 + "'", - value.equals(BigInteger.valueOf(15L))); - } else { - value = value.longValue(); - expected = 15L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[11]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[11] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.header.time.tow + "' != '" + 180 + "'", + value.equals(BigInteger.valueOf(180L))); } else { value = value.longValue(); - expected = 1L; + expected = 180L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[12]; + value = msg.header.time.wn; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[12] + "' != '" + 10 + "'", - value.equals(BigInteger.valueOf(10L))); + "'" + msg.header.time.wn + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 10L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[13]; + value = msg.header.update_interval; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[13] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.update_interval + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 0L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[14]; + value = msg.orbit_clock_bounds_degradation.clock_bound_mu_dot; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[14] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + + msg.orbit_clock_bounds_degradation.clock_bound_mu_dot + + "' != '" + + 194 + + "'", + value.equals(BigInteger.valueOf(194L))); } else { value = value.longValue(); - expected = 0L; + expected = 194L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[15]; + value = msg.orbit_clock_bounds_degradation.clock_bound_sig_dot; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[15] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + + msg.orbit_clock_bounds_degradation.clock_bound_sig_dot + + "' != '" + + 193 + + "'", + value.equals(BigInteger.valueOf(193L))); } else { value = value.longValue(); - expected = 0L; + expected = 193L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[16]; + value = msg.orbit_clock_bounds_degradation.orb_along_bound_mu_dot; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[16] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + + msg.orbit_clock_bounds_degradation.orb_along_bound_mu_dot + + "' != '" + + 199 + + "'", + value.equals(BigInteger.valueOf(199L))); } else { value = value.longValue(); - expected = 0L; + expected = 199L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[17]; + value = msg.orbit_clock_bounds_degradation.orb_along_bound_sig_dot; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[17] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + + msg.orbit_clock_bounds_degradation.orb_along_bound_sig_dot + + "' != '" + + 196 + + "'", + value.equals(BigInteger.valueOf(196L))); } else { value = value.longValue(); - expected = 0L; + expected = 196L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[18]; + value = msg.orbit_clock_bounds_degradation.orb_cross_bound_mu_dot; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[18] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + + msg.orbit_clock_bounds_degradation.orb_cross_bound_mu_dot + + "' != '" + + 198 + + "'", + value.equals(BigInteger.valueOf(198L))); } else { value = value.longValue(); - expected = 0L; + expected = 198L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[19]; + value = msg.orbit_clock_bounds_degradation.orb_cross_bound_sig_dot; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[19] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + + msg.orbit_clock_bounds_degradation.orb_cross_bound_sig_dot + + "' != '" + + 195 + + "'", + value.equals(BigInteger.valueOf(195L))); } else { value = value.longValue(); - expected = 0L; + expected = 195L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[20]; + value = msg.orbit_clock_bounds_degradation.orb_radial_bound_mu_dot; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[20] + "' != '" + 200 + "'", + "'" + + msg.orbit_clock_bounds_degradation.orb_radial_bound_mu_dot + + "' != '" + + 200 + + "'", value.equals(BigInteger.valueOf(200L))); } else { value = value.longValue(); expected = 200L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[21]; + value = msg.orbit_clock_bounds_degradation.orb_radial_bound_sig_dot; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[21] + "' != '" + 199 + "'", - value.equals(BigInteger.valueOf(199L))); - } else { - value = value.longValue(); - expected = 199L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[22]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[22] + "' != '" + 198 + "'", - value.equals(BigInteger.valueOf(198L))); - } else { - value = value.longValue(); - expected = 198L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[23]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[23] + "' != '" + 197 + "'", + "'" + + msg.orbit_clock_bounds_degradation.orb_radial_bound_sig_dot + + "' != '" + + 197 + + "'", value.equals(BigInteger.valueOf(197L))); } else { value = value.longValue(); expected = 197L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[24]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[24] + "' != '" + 196 + "'", - value.equals(BigInteger.valueOf(196L))); - } else { - value = value.longValue(); - expected = 196L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[25]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[25] + "' != '" + 195 + "'", - value.equals(BigInteger.valueOf(195L))); - } else { - value = value.longValue(); - expected = 195L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[26]; + value = msg.sat_bitmask; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[26] + "' != '" + 194 + "'", - value.equals(BigInteger.valueOf(194L))); + "'" + msg.sat_bitmask + "' != '" + 10 + "'", + value.equals(BigInteger.valueOf(10L))); } else { value = value.longValue(); - expected = 194L; + expected = 10L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[27]; + value = msg.ssr_iod; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[27] + "' != '" + 193 + "'", - value.equals(BigInteger.valueOf(193L))); + "'" + msg.ssr_iod + "' != '" + 15 + "'", value.equals(BigInteger.valueOf(15L))); } else { value = value.longValue(); - expected = 193L; + expected = 15L; org.junit.Assert.assertEquals(value, expected); } } diff --git a/java/test/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsTest.java b/java/test/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsTest.java index bc916e0b79..f0dc098100 100644 --- a/java/test/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsTest.java +++ b/java/test/auto_check_sbp_ssr_MsgSsrOrbitClockBoundsTest.java @@ -43,294 +43,271 @@ public void test1() throws Throwable { JSONObject json = msg.toJSON(); Number value; Number expected; - value = msg.stub[0]; + value = msg.const_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[0] + "' != '" + 180 + "'", - value.equals(BigInteger.valueOf(180L))); + "'" + msg.const_id + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 180L; + expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[1]; + value = msg.header.num_msgs; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[1] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.num_msgs + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 0L; + expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[2]; + value = msg.header.seq_num; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[2] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.seq_num + "' != '" + 2 + "'", + value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); - expected = 0L; + expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[3]; + value = msg.header.sol_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[3] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.sol_id + "' != '" + 48 + "'", + value.equals(BigInteger.valueOf(48L))); } else { value = value.longValue(); - expected = 0L; + expected = 48L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[4]; + value = msg.header.time.tow; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[4] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.header.time.tow + "' != '" + 180 + "'", + value.equals(BigInteger.valueOf(180L))); } else { value = value.longValue(); - expected = 3L; + expected = 180L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[5]; + value = msg.header.time.wn; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[5] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.time.wn + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 0L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[6]; + value = msg.header.update_interval; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[6] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.header.update_interval + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 1L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[7]; + value = msg.n_sats; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[7] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + "'" + msg.n_sats + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[8]; + value = msg.orbit_clock_bounds[0].clock_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[8] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.orbit_clock_bounds[0].clock_bound_mu + "' != '" + 39 + "'", + value.equals(BigInteger.valueOf(39L))); } else { value = value.longValue(); - expected = 3L; + expected = 39L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[9]; + value = msg.orbit_clock_bounds[0].clock_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[9] + "' != '" + 48 + "'", value.equals(BigInteger.valueOf(48L))); + "'" + msg.orbit_clock_bounds[0].clock_bound_sig + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 48L; + expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[10]; + value = msg.orbit_clock_bounds[0].orb_along_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[10] + "' != '" + 15 + "'", - value.equals(BigInteger.valueOf(15L))); + "'" + msg.orbit_clock_bounds[0].orb_along_bound_mu + "' != '" + 38 + "'", + value.equals(BigInteger.valueOf(38L))); } else { value = value.longValue(); - expected = 15L; + expected = 38L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[11]; + value = msg.orbit_clock_bounds[0].orb_along_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[11] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.orbit_clock_bounds[0].orb_along_bound_sig + "' != '" + 2 + "'", + value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); - expected = 1L; + expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[12]; + value = msg.orbit_clock_bounds[0].orb_cross_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[12] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + "'" + msg.orbit_clock_bounds[0].orb_cross_bound_mu + "' != '" + 37 + "'", + value.equals(BigInteger.valueOf(37L))); } else { value = value.longValue(); - expected = 2L; + expected = 37L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[13]; + value = msg.orbit_clock_bounds[0].orb_cross_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[13] + "' != '" + 24 + "'", - value.equals(BigInteger.valueOf(24L))); + "'" + msg.orbit_clock_bounds[0].orb_cross_bound_sig + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 24L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[14]; + value = msg.orbit_clock_bounds[0].orb_radial_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[14] + "' != '" + 39 + "'", + "'" + msg.orbit_clock_bounds[0].orb_radial_bound_mu + "' != '" + 39 + "'", value.equals(BigInteger.valueOf(39L))); } else { value = value.longValue(); expected = 39L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[15]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[15] + "' != '" + 38 + "'", - value.equals(BigInteger.valueOf(38L))); - } else { - value = value.longValue(); - expected = 38L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[16]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[16] + "' != '" + 37 + "'", - value.equals(BigInteger.valueOf(37L))); - } else { - value = value.longValue(); - expected = 37L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[17]; + value = msg.orbit_clock_bounds[0].orb_radial_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[17] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.orbit_clock_bounds[0].orb_radial_bound_sig + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[18]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[18] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); - } else { - value = value.longValue(); - expected = 2L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[19]; + value = msg.orbit_clock_bounds[0].sat_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[19] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.orbit_clock_bounds[0].sat_id + "' != '" + 24 + "'", + value.equals(BigInteger.valueOf(24L))); } else { value = value.longValue(); - expected = 3L; + expected = 24L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[20]; + value = msg.orbit_clock_bounds[1].clock_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[20] + "' != '" + 39 + "'", + "'" + msg.orbit_clock_bounds[1].clock_bound_mu + "' != '" + 39 + "'", value.equals(BigInteger.valueOf(39L))); } else { value = value.longValue(); expected = 39L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[21]; + value = msg.orbit_clock_bounds[1].clock_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[21] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.orbit_clock_bounds[1].clock_bound_sig + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[22]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[22] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); - } else { - value = value.longValue(); - expected = 3L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[23]; + value = msg.orbit_clock_bounds[1].orb_along_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[23] + "' != '" + 39 + "'", - value.equals(BigInteger.valueOf(39L))); + "'" + msg.orbit_clock_bounds[1].orb_along_bound_mu + "' != '" + 38 + "'", + value.equals(BigInteger.valueOf(38L))); } else { value = value.longValue(); - expected = 39L; + expected = 38L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[24]; + value = msg.orbit_clock_bounds[1].orb_along_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[24] + "' != '" + 38 + "'", - value.equals(BigInteger.valueOf(38L))); + "'" + msg.orbit_clock_bounds[1].orb_along_bound_sig + "' != '" + 2 + "'", + value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); - expected = 38L; + expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[25]; + value = msg.orbit_clock_bounds[1].orb_cross_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[25] + "' != '" + 37 + "'", + "'" + msg.orbit_clock_bounds[1].orb_cross_bound_mu + "' != '" + 37 + "'", value.equals(BigInteger.valueOf(37L))); } else { value = value.longValue(); expected = 37L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[26]; + value = msg.orbit_clock_bounds[1].orb_cross_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[26] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.orbit_clock_bounds[1].orb_cross_bound_sig + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 1L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[27]; + value = msg.orbit_clock_bounds[1].orb_radial_bound_mu; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[27] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + "'" + msg.orbit_clock_bounds[1].orb_radial_bound_mu + "' != '" + 39 + "'", + value.equals(BigInteger.valueOf(39L))); } else { value = value.longValue(); - expected = 2L; + expected = 39L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[28]; + value = msg.orbit_clock_bounds[1].orb_radial_bound_sig; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[28] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); + "'" + msg.orbit_clock_bounds[1].orb_radial_bound_sig + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 3L; + expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[29]; + value = msg.orbit_clock_bounds[1].sat_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[29] + "' != '" + 39 + "'", - value.equals(BigInteger.valueOf(39L))); + "'" + msg.orbit_clock_bounds[1].sat_id + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 39L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[30]; + value = msg.ssr_iod; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[30] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.ssr_iod + "' != '" + 15 + "'", value.equals(BigInteger.valueOf(15L))); } else { value = value.longValue(); - expected = 1L; + expected = 15L; 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 index b0c68267c1..cfd173ce1a 100644 --- a/java/test/auto_check_sbp_ssr_MsgSsrStecCorrectionTest.java +++ b/java/test/auto_check_sbp_ssr_MsgSsrStecCorrectionTest.java @@ -42,359 +42,242 @@ public void test1() throws Throwable { JSONObject json = msg.toJSON(); Number value; Number expected; - value = msg.stub[0]; + value = msg.header.num_msgs; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[0] + "' != '" + 180 + "'", - value.equals(BigInteger.valueOf(180L))); - } else { - value = value.longValue(); - expected = 180L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[1]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[1] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[2]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[2] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[3]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[3] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[4]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[4] + "' != '" + 3 + "'", value.equals(BigInteger.valueOf(3L))); - } else { - value = value.longValue(); - expected = 3L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[5]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[5] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[6]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[6] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.header.num_msgs + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[7]; + value = msg.header.seq_num; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[7] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.header.seq_num + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[8]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[8] + "' != '" + 10 + "'", value.equals(BigInteger.valueOf(10L))); - } else { - value = value.longValue(); - expected = 10L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[9]; + value = msg.header.sol_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[9] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.sol_id + "' != '" + 0 + "'", + value.equals(BigInteger.valueOf(0L))); } else { value = value.longValue(); expected = 0L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[10]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[10] + "' != '" + 15 + "'", - value.equals(BigInteger.valueOf(15L))); - } else { - value = value.longValue(); - expected = 15L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[11]; + value = msg.header.time.tow; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[11] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.header.time.tow + "' != '" + 180 + "'", + value.equals(BigInteger.valueOf(180L))); } else { value = value.longValue(); - expected = 1L; + expected = 180L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[12]; + value = msg.header.time.wn; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[12] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.header.time.wn + "' != '" + 3 + "'", + value.equals(BigInteger.valueOf(3L))); } else { value = value.longValue(); - expected = 0L; + expected = 3L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[13]; + value = msg.header.update_interval; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[13] + "' != '" + 10 + "'", + "'" + msg.header.update_interval + "' != '" + 10 + "'", value.equals(BigInteger.valueOf(10L))); } else { value = value.longValue(); expected = 10L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[14]; + value = msg.n_sats; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[14] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[15]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[15] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + "'" + msg.n_sats + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); } else { value = value.longValue(); expected = 2L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[16]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[16] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); - } else { - value = value.longValue(); - expected = 1L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[17]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[17] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); - } else { - value = value.longValue(); - expected = 1L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[18]; + value = msg.ssr_iod_atmo; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[18] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); + "'" + msg.ssr_iod_atmo + "' != '" + 15 + "'", + value.equals(BigInteger.valueOf(15L))); } else { value = value.longValue(); - expected = 1L; + expected = 15L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[19]; + value = msg.stec_sat_list[0].stec_coeff[0]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[19] + "' != '" + 63 + "'", + "'" + 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.stub[20]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[20] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[21]; + value = msg.stec_sat_list[0].stec_coeff[1]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[21] + "' != '" + 62 + "'", + "'" + 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.stub[22]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[22] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[23]; + value = msg.stec_sat_list[0].stec_coeff[2]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[23] + "' != '" + 61 + "'", + "'" + 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.stub[24]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[24] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[25]; + value = msg.stec_sat_list[0].stec_coeff[3]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[25] + "' != '" + 60 + "'", + "'" + 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.stub[26]; + value = msg.stec_sat_list[0].stec_quality_indicator; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[26] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.stec_sat_list[0].stec_quality_indicator + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 0L; + expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[27]; + value = msg.stec_sat_list[0].sv_id.constellation; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[27] + "' != '" + 31 + "'", - value.equals(BigInteger.valueOf(31L))); + "'" + msg.stec_sat_list[0].sv_id.constellation + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 31L; + expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[28]; + value = msg.stec_sat_list[0].sv_id.satId; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[28] + "' != '" + 15 + "'", - value.equals(BigInteger.valueOf(15L))); + "'" + msg.stec_sat_list[0].sv_id.satId + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 15L; + expected = 1L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[29]; + value = msg.stec_sat_list[1].stec_coeff[0]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[29] + "' != '" + 5 + "'", value.equals(BigInteger.valueOf(5L))); + "'" + msg.stec_sat_list[1].stec_coeff[0] + "' != '" + 63 + "'", + value.equals(BigInteger.valueOf(63L))); } else { value = value.longValue(); - expected = 5L; + expected = 63L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[30]; + value = msg.stec_sat_list[1].stec_coeff[1]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[30] + "' != '" + 63 + "'", - value.equals(BigInteger.valueOf(63L))); + "'" + msg.stec_sat_list[1].stec_coeff[1] + "' != '" + 64 + "'", + value.equals(BigInteger.valueOf(64L))); } else { value = value.longValue(); - expected = 63L; + expected = 64L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[31]; + value = msg.stec_sat_list[1].stec_coeff[2]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[31] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.stec_sat_list[1].stec_coeff[2] + "' != '" + 65 + "'", + value.equals(BigInteger.valueOf(65L))); } else { value = value.longValue(); - expected = 0L; + expected = 65L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[32]; + value = msg.stec_sat_list[1].stec_coeff[3]; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[32] + "' != '" + 64 + "'", - value.equals(BigInteger.valueOf(64L))); + "'" + msg.stec_sat_list[1].stec_coeff[3] + "' != '" + 66 + "'", + value.equals(BigInteger.valueOf(66L))); } else { value = value.longValue(); - expected = 64L; + expected = 66L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[33]; + value = msg.stec_sat_list[1].stec_quality_indicator; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[33] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.stec_sat_list[1].stec_quality_indicator + "' != '" + 5 + "'", + value.equals(BigInteger.valueOf(5L))); } else { value = value.longValue(); - expected = 0L; + expected = 5L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[34]; + value = msg.stec_sat_list[1].sv_id.constellation; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[34] + "' != '" + 65 + "'", - value.equals(BigInteger.valueOf(65L))); + "'" + msg.stec_sat_list[1].sv_id.constellation + "' != '" + 15 + "'", + value.equals(BigInteger.valueOf(15L))); } else { value = value.longValue(); - expected = 65L; + expected = 15L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[35]; + value = msg.stec_sat_list[1].sv_id.satId; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[35] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.stec_sat_list[1].sv_id.satId + "' != '" + 31 + "'", + value.equals(BigInteger.valueOf(31L))); } else { value = value.longValue(); - expected = 0L; + expected = 31L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[36]; + value = msg.tile_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[36] + "' != '" + 66 + "'", - value.equals(BigInteger.valueOf(66L))); + "'" + msg.tile_id + "' != '" + 10 + "'", value.equals(BigInteger.valueOf(10L))); } else { value = value.longValue(); - expected = 66L; + expected = 10L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[37]; + value = msg.tile_set_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[37] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.tile_set_id + "' != '" + 1 + "'", + value.equals(BigInteger.valueOf(1L))); } else { value = value.longValue(); - expected = 0L; + 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 index ccfdd439bf..3f5753b7a8 100644 --- a/java/test/auto_check_sbp_ssr_MsgSsrTileDefinitionTest.java +++ b/java/test/auto_check_sbp_ssr_MsgSsrTileDefinitionTest.java @@ -61,236 +61,104 @@ public void test1() throws Throwable { JSONObject json = msg.toJSON(); Number value; Number expected; - value = msg.stub[0]; + value = msg.bitmask; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[0] + "' != '" + 31 + "'", value.equals(BigInteger.valueOf(31L))); + "'" + msg.bitmask + "' != '" + 1234567890 + "'", + value.equals(BigInteger.valueOf(1234567890L))); } else { value = value.longValue(); - expected = 31L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[1]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[1] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[2]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[2] + "' != '" + 1 + "'", value.equals(BigInteger.valueOf(1L))); - } else { - value = value.longValue(); - expected = 1L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[3]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[3] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[4]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[4] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); - } else { - value = value.longValue(); - expected = 2L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[5]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[5] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[6]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[6] + "' != '" + 4 + "'", value.equals(BigInteger.valueOf(4L))); - } else { - value = value.longValue(); - expected = 4L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[7]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[7] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[8]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[8] + "' != '" + 8 + "'", value.equals(BigInteger.valueOf(8L))); - } else { - value = value.longValue(); - expected = 8L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[9]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[9] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[10]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[10] + "' != '" + 16 + "'", - value.equals(BigInteger.valueOf(16L))); - } else { - value = value.longValue(); - expected = 16L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[11]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[11] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[12]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[12] + "' != '" + 32 + "'", - value.equals(BigInteger.valueOf(32L))); - } else { - value = value.longValue(); - expected = 32L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[13]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[13] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; + expected = 1234567890L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[14]; + value = msg.cols; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[14] + "' != '" + 64 + "'", - value.equals(BigInteger.valueOf(64L))); + "'" + msg.cols + "' != '" + 32768 + "'", + value.equals(BigInteger.valueOf(32768L))); } else { value = value.longValue(); - expected = 64L; + expected = 32768L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[15]; + value = msg.corner_nw_lat; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[15] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.corner_nw_lat + "' != '" + 1024 + "'", + value.equals(BigInteger.valueOf(1024L))); } else { value = value.longValue(); - expected = 0L; + expected = 1024L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[16]; + value = msg.corner_nw_lon; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[16] + "' != '" + 128 + "'", - value.equals(BigInteger.valueOf(128L))); + "'" + msg.corner_nw_lon + "' != '" + 2048 + "'", + value.equals(BigInteger.valueOf(2048L))); } else { value = value.longValue(); - expected = 128L; + expected = 2048L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[17]; + value = msg.rows; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[17] + "' != '" + 210 + "'", - value.equals(BigInteger.valueOf(210L))); + "'" + msg.rows + "' != '" + 16384 + "'", + value.equals(BigInteger.valueOf(16384L))); } else { value = value.longValue(); - expected = 210L; + expected = 16384L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[18]; + value = msg.spacing_lat; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[18] + "' != '" + 2 + "'", value.equals(BigInteger.valueOf(2L))); + "'" + msg.spacing_lat + "' != '" + 4096 + "'", + value.equals(BigInteger.valueOf(4096L))); } else { value = value.longValue(); - expected = 2L; + expected = 4096L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[19]; + value = msg.spacing_lon; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[19] + "' != '" + 150 + "'", - value.equals(BigInteger.valueOf(150L))); + "'" + msg.spacing_lon + "' != '" + 8192 + "'", + value.equals(BigInteger.valueOf(8192L))); } else { value = value.longValue(); - expected = 150L; + expected = 8192L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[20]; + value = msg.ssr_sol_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[20] + "' != '" + 73 + "'", - value.equals(BigInteger.valueOf(73L))); + "'" + msg.ssr_sol_id + "' != '" + 31 + "'", + value.equals(BigInteger.valueOf(31L))); } else { value = value.longValue(); - expected = 73L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[21]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[21] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; - org.junit.Assert.assertEquals(value, expected); - } - value = msg.stub[22]; - if (value instanceof BigInteger) { - org.junit.Assert.assertTrue( - "'" + msg.stub[22] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); - } else { - value = value.longValue(); - expected = 0L; + expected = 31L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[23]; + value = msg.tile_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[23] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.tile_id + "' != '" + 512 + "'", + value.equals(BigInteger.valueOf(512L))); } else { value = value.longValue(); - expected = 0L; + expected = 512L; org.junit.Assert.assertEquals(value, expected); } - value = msg.stub[24]; + value = msg.tile_set_id; if (value instanceof BigInteger) { org.junit.Assert.assertTrue( - "'" + msg.stub[24] + "' != '" + 0 + "'", value.equals(BigInteger.valueOf(0L))); + "'" + msg.tile_set_id + "' != '" + 256 + "'", + value.equals(BigInteger.valueOf(256L))); } else { value = value.longValue(); - expected = 0L; + expected = 256L; org.junit.Assert.assertEquals(value, expected); } } diff --git a/javascript/sbp.bundle.js b/javascript/sbp.bundle.js index 03c770eda2..c86f1c6b62 100644 --- a/javascript/sbp.bundle.js +++ b/javascript/sbp.bundle.js @@ -5,11 +5,11 @@ * @author Feross Aboukhadijeh * @license MIT */ -var r=p(25),o=p(26),i=p(16);function s(){return a.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function n(e,t){if(s()=s())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s().toString(16)+" bytes");return 0|e}function f(e,t){if(a.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var p=e.length;if(0===p)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return p;case"utf8":case"utf-8":case void 0:return k(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*p;case"hex":return p>>>1;case"base64":return B(e).length;default:if(r)return k(e).length;t=(""+t).toLowerCase(),r=!0}}function d(e,t,p){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===p||p>this.length)&&(p=this.length),p<=0)return"";if((p>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return D(this,t,p);case"utf8":case"utf-8":return v(this,t,p);case"ascii":return U(this,t,p);case"latin1":case"binary":return M(this,t,p);case"base64":return T(this,t,p);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return O(this,t,p);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}function _(e,t,p){var r=e[t];e[t]=e[p],e[p]=r}function S(e,t,p,r,o){if(0===e.length)return-1;if("string"==typeof p?(r=p,p=0):p>2147483647?p=2147483647:p<-2147483648&&(p=-2147483648),p=+p,isNaN(p)&&(p=o?0:e.length-1),p<0&&(p=e.length+p),p>=e.length){if(o)return-1;p=e.length-1}else if(p<0){if(!o)return-1;p=0}if("string"==typeof t&&(t=a.from(t,r)),a.isBuffer(t))return 0===t.length?-1:g(e,t,p,r,o);if("number"==typeof t)return t&=255,a.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,p):Uint8Array.prototype.lastIndexOf.call(e,t,p):g(e,[t],p,r,o);throw new TypeError("val must be string, number or Buffer")}function g(e,t,p,r,o){var i,s=1,n=e.length,a=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;s=2,n/=2,a/=2,p/=2}function l(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}if(o){var c=-1;for(i=p;in&&(p=n-a),i=p;i>=0;i--){for(var u=!0,y=0;yo&&(r=o):r=o;var i=t.length;if(i%2!=0)throw new TypeError("Invalid hex string");r>i/2&&(r=i/2);for(var s=0;s>8,o=p%256,i.push(o),i.push(r);return i}(t,e.length-p),e,p,r)}function T(e,t,p){return 0===t&&p===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,p))}function v(e,t,p){p=Math.min(e.length,p);for(var r=[],o=t;o239?4:l>223?3:l>191?2:1;if(o+u<=p)switch(u){case 1:l<128&&(c=l);break;case 2:128==(192&(i=e[o+1]))&&(a=(31&l)<<6|63&i)>127&&(c=a);break;case 3:i=e[o+1],s=e[o+2],128==(192&i)&&128==(192&s)&&(a=(15&l)<<12|(63&i)<<6|63&s)>2047&&(a<55296||a>57343)&&(c=a);break;case 4:i=e[o+1],s=e[o+2],n=e[o+3],128==(192&i)&&128==(192&s)&&128==(192&n)&&(a=(15&l)<<18|(63&i)<<12|(63&s)<<6|63&n)>65535&&a<1114112&&(c=a)}null===c?(c=65533,u=1):c>65535&&(c-=65536,r.push(c>>>10&1023|55296),c=56320|1023&c),r.push(c),o+=u}return function(e){var t=e.length;if(t<=4096)return String.fromCharCode.apply(String,e);var p="",r=0;for(;r0&&(e=this.toString("hex",0,p).match(/.{2}/g).join(" "),this.length>p&&(e+=" ... ")),""},a.prototype.compare=function(e,t,p,r,o){if(!a.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===p&&(p=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||p>e.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&t>=p)return 0;if(r>=o)return-1;if(t>=p)return 1;if(this===e)return 0;for(var i=(o>>>=0)-(r>>>=0),s=(p>>>=0)-(t>>>=0),n=Math.min(i,s),l=this.slice(r,o),c=e.slice(t,p),u=0;uo)&&(p=o),e.length>0&&(p<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var i=!1;;)switch(r){case"hex":return w(this,e,t,p);case"utf8":case"utf-8":return E(this,e,t,p);case"ascii":return m(this,e,t,p);case"latin1":case"binary":return b(this,e,t,p);case"base64":return I(this,e,t,p);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return L(this,e,t,p);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}},a.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function U(e,t,p){var r="";p=Math.min(e.length,p);for(var o=t;or)&&(p=r);for(var o="",i=t;ip)throw new RangeError("Trying to access beyond buffer length")}function A(e,t,p,r,o,i){if(!a.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||te.length)throw new RangeError("Index out of range")}function C(e,t,p,r){t<0&&(t=65535+t+1);for(var o=0,i=Math.min(e.length-p,2);o>>8*(r?o:1-o)}function R(e,t,p,r){t<0&&(t=4294967295+t+1);for(var o=0,i=Math.min(e.length-p,4);o>>8*(r?o:3-o)&255}function P(e,t,p,r,o,i){if(p+r>e.length)throw new RangeError("Index out of range");if(p<0)throw new RangeError("Index out of range")}function N(e,t,p,r,i){return i||P(e,0,p,4),o.write(e,t,p,r,23,4),p+4}function j(e,t,p,r,i){return i||P(e,0,p,8),o.write(e,t,p,r,52,8),p+8}a.prototype.slice=function(e,t){var p,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t0&&(o*=256);)r+=this[e+--t]*o;return r},a.prototype.readUInt8=function(e,t){return t||G(e,1,this.length),this[e]},a.prototype.readUInt16LE=function(e,t){return t||G(e,2,this.length),this[e]|this[e+1]<<8},a.prototype.readUInt16BE=function(e,t){return t||G(e,2,this.length),this[e]<<8|this[e+1]},a.prototype.readUInt32LE=function(e,t){return t||G(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},a.prototype.readUInt32BE=function(e,t){return t||G(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},a.prototype.readIntLE=function(e,t,p){e|=0,t|=0,p||G(e,t,this.length);for(var r=this[e],o=1,i=0;++i=(o*=128)&&(r-=Math.pow(2,8*t)),r},a.prototype.readIntBE=function(e,t,p){e|=0,t|=0,p||G(e,t,this.length);for(var r=t,o=1,i=this[e+--r];r>0&&(o*=256);)i+=this[e+--r]*o;return i>=(o*=128)&&(i-=Math.pow(2,8*t)),i},a.prototype.readInt8=function(e,t){return t||G(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},a.prototype.readInt16LE=function(e,t){t||G(e,2,this.length);var p=this[e]|this[e+1]<<8;return 32768&p?4294901760|p:p},a.prototype.readInt16BE=function(e,t){t||G(e,2,this.length);var p=this[e+1]|this[e]<<8;return 32768&p?4294901760|p:p},a.prototype.readInt32LE=function(e,t){return t||G(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},a.prototype.readInt32BE=function(e,t){return t||G(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},a.prototype.readFloatLE=function(e,t){return t||G(e,4,this.length),o.read(this,e,!0,23,4)},a.prototype.readFloatBE=function(e,t){return t||G(e,4,this.length),o.read(this,e,!1,23,4)},a.prototype.readDoubleLE=function(e,t){return t||G(e,8,this.length),o.read(this,e,!0,52,8)},a.prototype.readDoubleBE=function(e,t){return t||G(e,8,this.length),o.read(this,e,!1,52,8)},a.prototype.writeUIntLE=function(e,t,p,r){(e=+e,t|=0,p|=0,r)||A(this,e,t,p,Math.pow(2,8*p)-1,0);var o=1,i=0;for(this[t]=255&e;++i=0&&(i*=256);)this[t+o]=e/i&255;return t+p},a.prototype.writeUInt8=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,1,255,0),a.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},a.prototype.writeUInt16LE=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):C(this,e,t,!0),t+2},a.prototype.writeUInt16BE=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):C(this,e,t,!1),t+2},a.prototype.writeUInt32LE=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):R(this,e,t,!0),t+4},a.prototype.writeUInt32BE=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},a.prototype.writeIntLE=function(e,t,p,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*p-1);A(this,e,t,p,o-1,-o)}var i=0,s=1,n=0;for(this[t]=255&e;++i>0)-n&255;return t+p},a.prototype.writeIntBE=function(e,t,p,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*p-1);A(this,e,t,p,o-1,-o)}var i=p-1,s=1,n=0;for(this[t+i]=255&e;--i>=0&&(s*=256);)e<0&&0===n&&0!==this[t+i+1]&&(n=1),this[t+i]=(e/s>>0)-n&255;return t+p},a.prototype.writeInt8=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,1,127,-128),a.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},a.prototype.writeInt16LE=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):C(this,e,t,!0),t+2},a.prototype.writeInt16BE=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):C(this,e,t,!1),t+2},a.prototype.writeInt32LE=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,4,2147483647,-2147483648),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):R(this,e,t,!0),t+4},a.prototype.writeInt32BE=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},a.prototype.writeFloatLE=function(e,t,p){return N(this,e,t,!0,p)},a.prototype.writeFloatBE=function(e,t,p){return N(this,e,t,!1,p)},a.prototype.writeDoubleLE=function(e,t,p){return j(this,e,t,!0,p)},a.prototype.writeDoubleBE=function(e,t,p){return j(this,e,t,!1,p)},a.prototype.copy=function(e,t,p,r){if(p||(p=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t=0;--o)e[o+t]=this[o+p];else if(i<1e3||!a.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,p=void 0===p?this.length:p>>>0,e||(e=0),"number"==typeof e)for(i=t;i55295&&p<57344){if(!o){if(p>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(s+1===r){(t-=3)>-1&&i.push(239,191,189);continue}o=p;continue}if(p<56320){(t-=3)>-1&&i.push(239,191,189),o=p;continue}p=65536+(o-55296<<10|p-56320)}else o&&(t-=3)>-1&&i.push(239,191,189);if(o=null,p<128){if((t-=1)<0)break;i.push(p)}else if(p<2048){if((t-=2)<0)break;i.push(p>>6|192,63&p|128)}else if(p<65536){if((t-=3)<0)break;i.push(p>>12|224,p>>6&63|128,63&p|128)}else{if(!(p<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(p>>18|240,p>>12&63|128,p>>6&63|128,63&p|128)}}return i}function B(e){return r.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(x,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function q(e,t,p,r){for(var o=0;o=t.length||o>=e.length);++o)t[o+p]=e[o];return o}}).call(this,p(5))},function(e,t){var p,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function n(e){if(p===setTimeout)return setTimeout(e,0);if((p===i||!p)&&setTimeout)return p=setTimeout,setTimeout(e,0);try{return p(e,0)}catch(t){try{return p.call(null,e,0)}catch(t){return p.call(this,e,0)}}}!function(){try{p="function"==typeof setTimeout?setTimeout:i}catch(e){p=i}try{r="function"==typeof clearTimeout?clearTimeout:s}catch(e){r=s}}();var a,l=[],c=!1,u=-1;function y(){c&&a&&(c=!1,a.length?l=a.concat(l):u=-1,l.length&&h())}function h(){if(!c){var e=n(y);c=!0;for(var t=l.length;t;){for(a=l,l=[];++u1)for(var p=1;p0&&this._events[e].length>s&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},p.prototype.on=p.prototype.addListener,p.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var p=!1;function o(){this.removeListener(e,o),p||(p=!0,t.apply(this,arguments))}return o.listener=t,this.on(e,o),this},p.prototype.removeListener=function(e,t){var p,i,s,n;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(s=(p=this._events[e]).length,i=-1,p===t||r(p.listener)&&p.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(o(p)){for(n=s;n-- >0;)if(p[n]===t||p[n].listener&&p[n].listener===t){i=n;break}if(i<0)return this;1===p.length?(p.length=0,delete this._events[e]):p.splice(i,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},p.prototype.removeAllListeners=function(e){var t,p;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(p=this._events[e]))this.removeListener(e,p);else if(p)for(;p.length;)this.removeListener(e,p[p.length-1]);return delete this._events[e],this},p.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},p.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},p.listenerCount=function(e,t){return e.listenerCount(t)}},function(e,t,p){(t=e.exports=p(19)).Stream=t,t.Readable=t,t.Writable=p(15),t.Duplex=p(7),t.Transform=p(23),t.PassThrough=p(38)},function(e,t,p){"use strict";(function(t,r,o){var i=p(11);function s(e){var t=this;this.next=null,this.entry=null,this.finish=function(){!function(e,t,p){var r=e.entry;e.entry=null;for(;r;){var o=r.callback;t.pendingcb--,o(p),r=r.next}t.corkedRequestsFree?t.corkedRequestsFree.next=e:t.corkedRequestsFree=e}(t,e)}}e.exports=g;var n,a=!t.browser&&["v0.10","v0.9."].indexOf(t.version.slice(0,5))>-1?r:i.nextTick;g.WritableState=S;var l=p(10);l.inherits=p(6);var c={deprecate:p(37)},u=p(20),y=p(12).Buffer,h=o.Uint8Array||function(){};var f,d=p(21);function _(){}function S(e,t){n=n||p(7),e=e||{};var r=t instanceof n;this.objectMode=!!e.objectMode,r&&(this.objectMode=this.objectMode||!!e.writableObjectMode);var o=e.highWaterMark,l=e.writableHighWaterMark,c=this.objectMode?16:16384;this.highWaterMark=o||0===o?o:r&&(l||0===l)?l:c,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var u=!1===e.decodeStrings;this.decodeStrings=!u,this.defaultEncoding=e.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){!function(e,t){var p=e._writableState,r=p.sync,o=p.writecb;if(function(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}(p),t)!function(e,t,p,r,o){--t.pendingcb,p?(i.nextTick(o,r),i.nextTick(L,e,t),e._writableState.errorEmitted=!0,e.emit("error",r)):(o(r),e._writableState.errorEmitted=!0,e.emit("error",r),L(e,t))}(e,p,r,t,o);else{var s=b(p);s||p.corked||p.bufferProcessing||!p.bufferedRequest||m(e,p),r?a(E,e,p,s,o):E(e,p,s,o)}}(t,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new s(this)}function g(e){if(n=n||p(7),!(f.call(g,this)||this instanceof n))return new g(e);this._writableState=new S(e,this),this.writable=!0,e&&("function"==typeof e.write&&(this._write=e.write),"function"==typeof e.writev&&(this._writev=e.writev),"function"==typeof e.destroy&&(this._destroy=e.destroy),"function"==typeof e.final&&(this._final=e.final)),u.call(this)}function w(e,t,p,r,o,i,s){t.writelen=r,t.writecb=s,t.writing=!0,t.sync=!0,p?e._writev(o,t.onwrite):e._write(o,i,t.onwrite),t.sync=!1}function E(e,t,p,r){p||function(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit("drain"))}(e,t),t.pendingcb--,r(),L(e,t)}function m(e,t){t.bufferProcessing=!0;var p=t.bufferedRequest;if(e._writev&&p&&p.next){var r=t.bufferedRequestCount,o=new Array(r),i=t.corkedRequestsFree;i.entry=p;for(var n=0,a=!0;p;)o[n]=p,p.isBuf||(a=!1),p=p.next,n+=1;o.allBuffers=a,w(e,t,!0,t.length,o,"",i.finish),t.pendingcb++,t.lastBufferedRequest=null,i.next?(t.corkedRequestsFree=i.next,i.next=null):t.corkedRequestsFree=new s(t),t.bufferedRequestCount=0}else{for(;p;){var l=p.chunk,c=p.encoding,u=p.callback;if(w(e,t,!1,t.objectMode?1:l.length,l,c,u),p=p.next,t.bufferedRequestCount--,t.writing)break}null===p&&(t.lastBufferedRequest=null)}t.bufferedRequest=p,t.bufferProcessing=!1}function b(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function I(e,t){e._final((function(p){t.pendingcb--,p&&e.emit("error",p),t.prefinished=!0,e.emit("prefinish"),L(e,t)}))}function L(e,t){var p=b(t);return p&&(!function(e,t){t.prefinished||t.finalCalled||("function"==typeof e._final?(t.pendingcb++,t.finalCalled=!0,i.nextTick(I,e,t)):(t.prefinished=!0,e.emit("prefinish")))}(e,t),0===t.pendingcb&&(t.finished=!0,e.emit("finish"))),p}l.inherits(g,u),S.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(S.prototype,"buffer",{get:c.deprecate((function(){return this.getBuffer()}),"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(e){}}(),"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(f=Function.prototype[Symbol.hasInstance],Object.defineProperty(g,Symbol.hasInstance,{value:function(e){return!!f.call(this,e)||this===g&&(e&&e._writableState instanceof S)}})):f=function(e){return e instanceof this},g.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},g.prototype.write=function(e,t,p){var r,o=this._writableState,s=!1,n=!o.objectMode&&(r=e,y.isBuffer(r)||r instanceof h);return n&&!y.isBuffer(e)&&(e=function(e){return y.from(e)}(e)),"function"==typeof t&&(p=t,t=null),n?t="buffer":t||(t=o.defaultEncoding),"function"!=typeof p&&(p=_),o.ended?function(e,t){var p=new Error("write after end");e.emit("error",p),i.nextTick(t,p)}(this,p):(n||function(e,t,p,r){var o=!0,s=!1;return null===p?s=new TypeError("May not write null values to stream"):"string"==typeof p||void 0===p||t.objectMode||(s=new TypeError("Invalid non-string/buffer chunk")),s&&(e.emit("error",s),i.nextTick(r,s),o=!1),o}(this,o,e,p))&&(o.pendingcb++,s=function(e,t,p,r,o,i){if(!p){var s=function(e,t,p){e.objectMode||!1===e.decodeStrings||"string"!=typeof t||(t=y.from(t,p));return t}(t,r,o);r!==s&&(p=!0,o="buffer",r=s)}var n=t.objectMode?1:r.length;t.length+=n;var a=t.length-1))throw new TypeError("Unknown encoding: "+e);return this._writableState.defaultEncoding=e,this},Object.defineProperty(g.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),g.prototype._write=function(e,t,p){p(new Error("_write() is not implemented"))},g.prototype._writev=null,g.prototype.end=function(e,t,p){var r=this._writableState;"function"==typeof e?(p=e,e=null,t=null):"function"==typeof t&&(p=t,t=null),null!=e&&this.write(e,t),r.corked&&(r.corked=1,this.uncork()),r.ending||r.finished||function(e,t,p){t.ending=!0,L(e,t),p&&(t.finished?i.nextTick(p):e.once("finish",p));t.ended=!0,e.writable=!1}(this,r,p)},Object.defineProperty(g.prototype,"destroyed",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),g.prototype.destroy=d.destroy,g.prototype._undestroy=d.undestroy,g.prototype._destroy=function(e,t){this.end(),t(e)}}).call(this,p(9),p(35).setImmediate,p(5))},function(e,t){var p={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==p.call(e)}},function(e,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Parser=void 0;var r=p(28),o={},i={uint8:1,uint16le:2,uint16be:2,uint32le:4,uint32be:4,int8:1,int16le:2,int16be:2,int32le:4,int32be:4,int64be:8,int64le:8,uint64be:8,uint64le:8,floatle:4,floatbe:4,doublele:8,doublebe:8},s={uint8:"Uint8",uint16le:"Uint16",uint16be:"Uint16",uint32le:"Uint32",uint32be:"Uint32",int8:"Int8",int16le:"Int16",int16be:"Int16",int32le:"Int32",int32be:"Int32",int64be:"BigInt64",int64le:"BigInt64",uint64be:"BigUint64",uint64le:"BigUint64",floatle:"Float32",floatbe:"Float32",doublele:"Float64",doublebe:"Float64"},n={uint8:!1,uint16le:!0,uint16be:!1,uint32le:!0,uint32be:!1,int8:!1,int16le:!0,int16be:!1,int32le:!0,int32be:!1,int64be:!1,int64le:!0,uint64be:!1,uint64le:!0,floatle:!0,floatbe:!1,doublele:!0,doublebe:!1},a=function(){function e(){this.varName="",this.type="",this.options={},this.next=null,this.head=null,this.compiled=null,this.endian="be",this.constructorFn=null,this.alias=null}return e.start=function(){return new e},e.prototype.primitiveGenerateN=function(e,t){var p=s[e],r=n[e];t.pushCode(t.generateVariable(this.varName)+" = dataView.get"+p+"(offset, "+r+");"),t.pushCode("offset += "+i[e]+";")},e.prototype.primitiveN=function(e,t,p){return this.setNextParser(e,t,p)},e.prototype.useThisEndian=function(e){return e+this.endian.toLowerCase()},e.prototype.uint8=function(e,t){return this.primitiveN("uint8",e,t)},e.prototype.uint16=function(e,t){return this.primitiveN(this.useThisEndian("uint16"),e,t)},e.prototype.uint16le=function(e,t){return this.primitiveN("uint16le",e,t)},e.prototype.uint16be=function(e,t){return this.primitiveN("uint16be",e,t)},e.prototype.uint32=function(e,t){return this.primitiveN(this.useThisEndian("uint32"),e,t)},e.prototype.uint32le=function(e,t){return this.primitiveN("uint32le",e,t)},e.prototype.uint32be=function(e,t){return this.primitiveN("uint32be",e,t)},e.prototype.int8=function(e,t){return this.primitiveN("int8",e,t)},e.prototype.int16=function(e,t){return this.primitiveN(this.useThisEndian("int16"),e,t)},e.prototype.int16le=function(e,t){return this.primitiveN("int16le",e,t)},e.prototype.int16be=function(e,t){return this.primitiveN("int16be",e,t)},e.prototype.int32=function(e,t){return this.primitiveN(this.useThisEndian("int32"),e,t)},e.prototype.int32le=function(e,t){return this.primitiveN("int32le",e,t)},e.prototype.int32be=function(e,t){return this.primitiveN("int32be",e,t)},e.prototype.bigIntVersionCheck=function(){if(!DataView.prototype.getBigInt64)throw new Error("BigInt64 is unsupported in this runtime")},e.prototype.int64=function(e,t){return this.bigIntVersionCheck(),this.primitiveN(this.useThisEndian("int64"),e,t)},e.prototype.int64be=function(e,t){return this.bigIntVersionCheck(),this.primitiveN("int64be",e,t)},e.prototype.int64le=function(e,t){return this.bigIntVersionCheck(),this.primitiveN("int64le",e,t)},e.prototype.uint64=function(e,t){return this.bigIntVersionCheck(),this.primitiveN(this.useThisEndian("uint64"),e,t)},e.prototype.uint64be=function(e,t){return this.bigIntVersionCheck(),this.primitiveN("uint64be",e,t)},e.prototype.uint64le=function(e,t){return this.bigIntVersionCheck(),this.primitiveN("uint64le",e,t)},e.prototype.floatle=function(e,t){return this.primitiveN("floatle",e,t)},e.prototype.floatbe=function(e,t){return this.primitiveN("floatbe",e,t)},e.prototype.doublele=function(e,t){return this.primitiveN("doublele",e,t)},e.prototype.doublebe=function(e,t){return this.primitiveN("doublebe",e,t)},e.prototype.bitN=function(e,t,p){return p||(p={}),p.length=e,this.setNextParser("bit",t,p)},e.prototype.bit1=function(e,t){return this.bitN(1,e,t)},e.prototype.bit2=function(e,t){return this.bitN(2,e,t)},e.prototype.bit3=function(e,t){return this.bitN(3,e,t)},e.prototype.bit4=function(e,t){return this.bitN(4,e,t)},e.prototype.bit5=function(e,t){return this.bitN(5,e,t)},e.prototype.bit6=function(e,t){return this.bitN(6,e,t)},e.prototype.bit7=function(e,t){return this.bitN(7,e,t)},e.prototype.bit8=function(e,t){return this.bitN(8,e,t)},e.prototype.bit9=function(e,t){return this.bitN(9,e,t)},e.prototype.bit10=function(e,t){return this.bitN(10,e,t)},e.prototype.bit11=function(e,t){return this.bitN(11,e,t)},e.prototype.bit12=function(e,t){return this.bitN(12,e,t)},e.prototype.bit13=function(e,t){return this.bitN(13,e,t)},e.prototype.bit14=function(e,t){return this.bitN(14,e,t)},e.prototype.bit15=function(e,t){return this.bitN(15,e,t)},e.prototype.bit16=function(e,t){return this.bitN(16,e,t)},e.prototype.bit17=function(e,t){return this.bitN(17,e,t)},e.prototype.bit18=function(e,t){return this.bitN(18,e,t)},e.prototype.bit19=function(e,t){return this.bitN(19,e,t)},e.prototype.bit20=function(e,t){return this.bitN(20,e,t)},e.prototype.bit21=function(e,t){return this.bitN(21,e,t)},e.prototype.bit22=function(e,t){return this.bitN(22,e,t)},e.prototype.bit23=function(e,t){return this.bitN(23,e,t)},e.prototype.bit24=function(e,t){return this.bitN(24,e,t)},e.prototype.bit25=function(e,t){return this.bitN(25,e,t)},e.prototype.bit26=function(e,t){return this.bitN(26,e,t)},e.prototype.bit27=function(e,t){return this.bitN(27,e,t)},e.prototype.bit28=function(e,t){return this.bitN(28,e,t)},e.prototype.bit29=function(e,t){return this.bitN(29,e,t)},e.prototype.bit30=function(e,t){return this.bitN(30,e,t)},e.prototype.bit31=function(e,t){return this.bitN(31,e,t)},e.prototype.bit32=function(e,t){return this.bitN(32,e,t)},e.prototype.namely=function(e){return o[e]=this,this.alias=e,this},e.prototype.skip=function(e,t){return this.seek(e,t)},e.prototype.seek=function(e,t){if(t&&t.assert)throw new Error("assert option on seek is not allowed.");return this.setNextParser("seek","",{length:e})},e.prototype.string=function(e,t){if(!t.zeroTerminated&&!t.length&&!t.greedy)throw new Error("Neither length, zeroTerminated, nor greedy is defined for string.");if((t.zeroTerminated||t.length)&&t.greedy)throw new Error("greedy is mutually exclusive with length and zeroTerminated for string.");if(t.stripNull&&!t.length&&!t.greedy)throw new Error("Length or greedy must be defined if stripNull is defined.");return t.encoding=t.encoding||"utf8",this.setNextParser("string",e,t)},e.prototype.buffer=function(e,t){if(!t.length&&!t.readUntil)throw new Error("Length nor readUntil is defined in buffer parser");return this.setNextParser("buffer",e,t)},e.prototype.array=function(e,t){if(!t.readUntil&&!t.length&&!t.lengthInBytes)throw new Error("Length option of array is not defined.");if(!t.type)throw new Error("Type option of array is not defined.");if("string"==typeof t.type&&!o[t.type]&&Object.keys(i).indexOf(t.type)<0)throw new Error('Specified primitive type "'+t.type+'" is not supported.');return this.setNextParser("array",e,t)},e.prototype.choice=function(e,t){if("object"!=typeof t&&"object"==typeof e&&(t=e,e=null),!t.tag)throw new Error("Tag option of array is not defined.");if(!t.choices)throw new Error("Choices option of array is not defined.");return Object.keys(t.choices).forEach((function(p){var r=parseInt(p,10),s=t.choices[r];if(isNaN(r))throw new Error("Key of choices must be a number.");if(!s)throw new Error("Choice Case "+p+" of "+e+" is not valid.");if("string"==typeof s&&!o[s]&&Object.keys(i).indexOf(s)<0)throw new Error('Specified primitive type "'+s+'" is not supported.')})),this.setNextParser("choice",e,t)},e.prototype.nest=function(t,p){if("object"!=typeof p&&"object"==typeof t&&(p=t,t=null),!p.type)throw new Error("Type option of nest is not defined.");if(!(p.type instanceof e||o[p.type]))throw new Error("Type option of nest must be a Parser object.");if(!(p.type instanceof e||t))throw new Error("options.type must be a object if variable name is omitted.");return this.setNextParser("nest",t,p)},e.prototype.pointer=function(t,p){if(!p.offset)throw new Error("Offset option of pointer is not defined.");if(!p.type)throw new Error("Type option of pointer is not defined.");if("string"==typeof p.type){if(Object.keys(i).indexOf(p.type)<0&&!o[p.type])throw new Error('Specified type "'+p.type+'" is not supported.')}else if(!(p.type instanceof e))throw new Error("Type option of pointer must be a string or a Parser object.");return this.setNextParser("pointer",t,p)},e.prototype.saveOffset=function(e,t){return this.setNextParser("saveOffset",e,t)},e.prototype.endianess=function(e){switch(e.toLowerCase()){case"little":this.endian="le";break;case"big":this.endian="be";break;default:throw new Error("Invalid endianess: "+e)}return this},e.prototype.create=function(e){if(!(e instanceof Function))throw new Error("Constructor must be a Function object.");return this.constructorFn=e,this},e.prototype.getContext=function(e){var t=new r.Context(e);return t.pushCode("var dataView = new DataView(buffer.buffer, buffer.byteOffset, buffer.length);"),this.alias?(this.addAliasedCode(t),t.pushCode("return ___parser_"+this.alias+"(0).result;")):this.addRawCode(t),t},e.prototype.getCode=function(){return this.getContext().code},e.prototype.addRawCode=function(e){e.pushCode("var offset = 0;"),this.constructorFn?e.pushCode("var vars = new constructorFn();"):e.pushCode("var vars = {};"),this.generate(e),this.resolveReferences(e),e.pushCode("return vars;")},e.prototype.addAliasedCode=function(e){return e.pushCode("function ___parser_"+this.alias+"(offset) {"),this.constructorFn?e.pushCode("var vars = new constructorFn();"):e.pushCode("var vars = {};"),this.generate(e),e.markResolved(this.alias),this.resolveReferences(e),e.pushCode("return { offset: offset, result: vars };"),e.pushCode("}"),e},e.prototype.resolveReferences=function(e){var t=e.getUnresolvedReferences();e.markRequested(t),t.forEach((function(t){o[t].addAliasedCode(e)}))},e.prototype.compile=function(){var e=this.getContext("imports");this.compiled=new Function("imports","TextDecoder","return function (buffer, constructorFn) { "+e.code+" };")(e.imports,"undefined"==typeof TextDecoder?p(18).TextDecoder:TextDecoder)},e.prototype.sizeOf=function(){var t=NaN;if(Object.keys(i).indexOf(this.type)>=0)t=i[this.type];else if("string"===this.type&&"number"==typeof this.options.length)t=this.options.length;else if("buffer"===this.type&&"number"==typeof this.options.length)t=this.options.length;else if("array"===this.type&&"number"==typeof this.options.length){var p=NaN;"string"==typeof this.options.type?p=i[this.options.type]:this.options.type instanceof e&&(p=this.options.type.sizeOf()),t=this.options.length*p}else"seek"===this.type?t=this.options.length:"nest"===this.type?t=this.options.type.sizeOf():this.type||(t=0);return this.next&&(t+=this.next.sizeOf()),t},e.prototype.parse=function(e){return this.compiled||this.compile(),this.compiled(e,this.constructorFn)},e.prototype.setNextParser=function(t,p,r){var o=new e;return o.type=t,o.varName=p,o.options=r||o.options,o.endian=this.endian,this.head?this.head.next=o:this.next=o,this.head=o,this},e.prototype.generate=function(e){if(this.type){switch(this.type){case"uint8":case"uint16le":case"uint16be":case"uint32le":case"uint32be":case"int8":case"int16le":case"int16be":case"int32le":case"int32be":case"int64be":case"int64le":case"uint64be":case"uint64le":case"floatle":case"floatbe":case"doublele":case"doublebe":this.primitiveGenerateN(this.type,e);break;case"bit":this.generateBit(e);break;case"string":this.generateString(e);break;case"buffer":this.generateBuffer(e);break;case"seek":this.generateSeek(e);break;case"nest":this.generateNest(e);break;case"array":this.generateArray(e);break;case"choice":this.generateChoice(e);break;case"pointer":this.generatePointer(e);break;case"saveOffset":this.generateSaveOffset(e)}this.generateAssert(e)}var t=e.generateVariable(this.varName);return this.options.formatter&&this.generateFormatter(e,t,this.options.formatter),this.generateNext(e)},e.prototype.generateAssert=function(e){if(this.options.assert){var t=e.generateVariable(this.varName);switch(typeof this.options.assert){case"function":var p=e.addImport(this.options.assert);e.pushCode("if (!"+p+".call(vars, "+t+")) {");break;case"number":e.pushCode("if ("+this.options.assert+" !== "+t+") {");break;case"string":e.pushCode('if ("'+this.options.assert+'" !== '+t+") {");break;default:throw new Error("Assert option supports only strings, numbers and assert functions.")}e.generateError('"Assert error: '+t+' is " + '+this.options.assert),e.pushCode("}")}},e.prototype.generateNext=function(e){return this.next&&(e=this.next.generate(e)),e},e.prototype.generateBit=function(e){var t=JSON.parse(JSON.stringify(this));if(t.varName=e.generateVariable(t.varName),e.bitFields.push(t),!this.next||this.next&&["bit","nest"].indexOf(this.next.type)<0){var p=0;e.bitFields.forEach((function(e){return p+=e.options.length}));var r=e.generateTmpVariable();if(p<=8)e.pushCode("var "+r+" = dataView.getUint8(offset);"),p=8;else if(p<=16)e.pushCode("var "+r+" = dataView.getUint16(offset);"),p=16;else if(p<=24){var o=e.generateTmpVariable(),i=e.generateTmpVariable();e.pushCode("var "+o+" = dataView.getUint16(offset);"),e.pushCode("var "+i+" = dataView.getUint8(offset + 2);"),e.pushCode("var "+r+" = ("+o+" << 8) | "+i+";"),p=24}else{if(!(p<=32))throw new Error("Currently, bit field sequence longer than 4-bytes is not supported.");e.pushCode("var "+r+" = dataView.getUint32(offset);"),p=32}e.pushCode("offset += "+p/8+";");var s=0,n="be"===this.endian;e.bitFields.forEach((function(t){var o=t.options.length,i=n?p-s-o:s,a=(1<> "+i+" & "+a+";"),s+=o})),e.bitFields=[]}},e.prototype.generateSeek=function(e){var t=e.generateOption(this.options.length);e.pushCode("offset += "+t+";")},e.prototype.generateString=function(e){var t=e.generateVariable(this.varName),p=e.generateTmpVariable(),r=this.options.encoding,o="hex"===r.toLowerCase(),i='b => b.toString(16).padStart(2, "0")';if(this.options.length&&this.options.zeroTerminated){var s=this.options.length;e.pushCode("var "+p+" = offset;"),e.pushCode("while(dataView.getUint8(offset++) !== 0 && offset - "+p+" < "+s+");");var n="offset - "+p+" < "+s+" ? offset - 1 : offset";e.pushCode(o?t+" = Array.from(buffer.subarray("+p+", "+n+"), "+i+").join('');":t+" = new TextDecoder('"+r+"').decode(buffer.subarray("+p+", "+n+"));")}else if(this.options.length){s=e.generateOption(this.options.length);e.pushCode(o?t+" = Array.from(buffer.subarray(offset, offset + "+s+"), "+i+").join('');":t+" = new TextDecoder('"+r+"').decode(buffer.subarray(offset, offset + "+s+"));"),e.pushCode("offset += "+s+";")}else this.options.zeroTerminated?(e.pushCode("var "+p+" = offset;"),e.pushCode("while(dataView.getUint8(offset++) !== 0);"),e.pushCode(o?t+" = Array.from(buffer.subarray("+p+", offset - 1)), "+i+").join('');":t+" = new TextDecoder('"+r+"').decode(buffer.subarray("+p+", offset - 1));")):this.options.greedy&&(e.pushCode("var "+p+" = offset;"),e.pushCode("while(buffer.length > offset++);"),e.pushCode(o?t+" = Array.from(buffer.subarray("+p+", offset)), "+i+").join('');":t+" = new TextDecoder('"+r+"').decode(buffer.subarray("+p+", offset));"));this.options.stripNull&&e.pushCode(t+" = "+t+".replace(/\\x00+$/g, '')")},e.prototype.generateBuffer=function(e){var t=e.generateVariable(this.varName);if("function"==typeof this.options.readUntil){var p=this.options.readUntil,r=e.generateTmpVariable(),o=e.generateTmpVariable();e.pushCode("var "+r+" = offset;"),e.pushCode("var "+o+" = 0;"),e.pushCode("while (offset < buffer.length) {"),e.pushCode(o+" = dataView.getUint8(offset);");var i=e.addImport(p);e.pushCode("if ("+i+".call(this, "+o+", buffer.subarray(offset))) break;"),e.pushCode("offset += 1;"),e.pushCode("}"),e.pushCode(t+" = buffer.subarray("+r+", offset);")}else if("eof"===this.options.readUntil)e.pushCode(t+" = buffer.subarray(offset);");else{var s=e.generateOption(this.options.length);e.pushCode(t+" = buffer.subarray(offset, offset + "+s+");"),e.pushCode("offset += "+s+";")}this.options.clone&&e.pushCode(t+" = buffer.constructor.from("+t+");")},e.prototype.generateArray=function(t){var p=t.generateOption(this.options.length),r=t.generateOption(this.options.lengthInBytes),a=this.options.type,l=t.generateTmpVariable(),c=t.generateVariable(this.varName),u=t.generateTmpVariable(),y=this.options.key,h="string"==typeof y;if(h?t.pushCode(c+" = {};"):t.pushCode(c+" = [];"),"function"==typeof this.options.readUntil?t.pushCode("do {"):"eof"===this.options.readUntil?t.pushCode("for (var "+l+" = 0; offset < buffer.length; "+l+"++) {"):void 0!==r?t.pushCode("for (var "+l+" = offset + "+r+"; offset < "+l+"; ) {"):t.pushCode("for (var "+l+" = "+p+"; "+l+" > 0; "+l+"--) {"),"string"==typeof a)if(o[a]){var f=t.generateTmpVariable();t.pushCode("var "+f+" = ___parser_"+a+"(offset);"),t.pushCode("var "+u+" = "+f+".result; offset = "+f+".offset;"),a!==this.alias&&t.addReference(a)}else{var d=s[a],_=n[a];t.pushCode("var "+u+" = dataView.get"+d+"(offset, "+_+");"),t.pushCode("offset += "+i[a]+";")}else a instanceof e&&(t.pushCode("var "+u+" = {};"),t.pushScope(u),a.generate(t),t.popScope());if(h?t.pushCode(c+"["+u+"."+y+"] = "+u+";"):t.pushCode(c+".push("+u+");"),t.pushCode("}"),"function"==typeof this.options.readUntil){var S=this.options.readUntil,g=t.addImport(S);t.pushCode("while (!"+g+".call(this, "+u+", buffer.subarray(offset)));")}},e.prototype.generateChoiceCase=function(t,p,r){if("string"==typeof r){var a=t.generateVariable(this.varName);if(o[r]){var l=t.generateTmpVariable();t.pushCode("var "+l+" = ___parser_"+r+"(offset);"),t.pushCode(a+" = "+l+".result; offset = "+l+".offset;"),r!==this.alias&&t.addReference(r)}else{var c=s[r],u=n[r];t.pushCode(a+" = dataView.get"+c+"(offset, "+u+");"),t.pushCode("offset += "+i[r])}}else r instanceof e&&(t.pushPath(p),r.generate(t),t.popPath(p))},e.prototype.generateChoice=function(e){var t=this,p=e.generateOption(this.options.tag);this.varName&&e.pushCode(e.generateVariable(this.varName)+" = {};"),e.pushCode("switch("+p+") {"),Object.keys(this.options.choices).forEach((function(p){var r=t.options.choices[parseInt(p,10)];e.pushCode("case "+p+":"),t.generateChoiceCase(e,t.varName,r),e.pushCode("break;")})),e.pushCode("default:"),this.options.defaultChoice?this.generateChoiceCase(e,this.varName,this.options.defaultChoice):e.generateError('"Met undefined tag value " + '+p+' + " at choice"'),e.pushCode("}")},e.prototype.generateNest=function(t){var p=t.generateVariable(this.varName);if(this.options.type instanceof e)this.varName&&t.pushCode(p+" = {};"),t.pushPath(this.varName),this.options.type.generate(t),t.popPath(this.varName);else if(o[this.options.type]){var r=t.generateTmpVariable();t.pushCode("var "+r+" = ___parser_"+this.options.type+"(offset);"),t.pushCode(p+" = "+r+".result; offset = "+r+".offset;"),this.options.type!==this.alias&&t.addReference(this.options.type)}},e.prototype.generateFormatter=function(e,t,p){if("function"==typeof p){var r=e.addImport(p);e.pushCode(t+" = "+r+".call(this, "+t+");")}},e.prototype.generatePointer=function(t){var p=this.options.type,r=t.generateOption(this.options.offset),a=t.generateTmpVariable(),l=t.generateVariable(this.varName);if(t.pushCode("var "+a+" = offset;"),t.pushCode("offset = "+r+";"),this.options.type instanceof e)t.pushCode(l+" = {};"),t.pushPath(this.varName),this.options.type.generate(t),t.popPath(this.varName);else if(o[this.options.type]){var c=t.generateTmpVariable();t.pushCode("var "+c+" = ___parser_"+this.options.type+"(offset);"),t.pushCode(l+" = "+c+".result; offset = "+c+".offset;"),this.options.type!==this.alias&&t.addReference(this.options.type)}else if(Object.keys(i).indexOf(this.options.type)>=0){var u=s[p],y=n[p];t.pushCode(l+" = dataView.get"+u+"(offset, "+y+");"),t.pushCode("offset += "+i[p]+";")}t.pushCode("offset = "+a+";")},e.prototype.generateSaveOffset=function(e){var t=e.generateVariable(this.varName);e.pushCode(t+" = offset")},e}();t.Parser=a},function(e,t,p){(function(e,r){var o=/%[sdj%]/g;t.format=function(e){if(!S(e)){for(var t=[],p=0;p=i)return e;switch(e){case"%s":return String(r[p++]);case"%d":return Number(r[p++]);case"%j":try{return JSON.stringify(r[p++])}catch(e){return"[Circular]"}default:return e}})),a=r[p];p=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),f(p)?r.showHidden=p:p&&t._extend(r,p),g(r.showHidden)&&(r.showHidden=!1),g(r.depth)&&(r.depth=2),g(r.colors)&&(r.colors=!1),g(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=a),c(r,e,r.depth)}function a(e,t){var p=n.styles[t];return p?"["+n.colors[p][0]+"m"+e+"["+n.colors[p][1]+"m":e}function l(e,t){return e}function c(e,p,r){if(e.customInspect&&p&&I(p.inspect)&&p.inspect!==t.inspect&&(!p.constructor||p.constructor.prototype!==p)){var o=p.inspect(r,e);return S(o)||(o=c(e,o,r)),o}var i=function(e,t){if(g(t))return e.stylize("undefined","undefined");if(S(t)){var p="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(p,"string")}if(_(t))return e.stylize(""+t,"number");if(f(t))return e.stylize(""+t,"boolean");if(d(t))return e.stylize("null","null")}(e,p);if(i)return i;var s=Object.keys(p),n=function(e){var t={};return e.forEach((function(e,p){t[e]=!0})),t}(s);if(e.showHidden&&(s=Object.getOwnPropertyNames(p)),b(p)&&(s.indexOf("message")>=0||s.indexOf("description")>=0))return u(p);if(0===s.length){if(I(p)){var a=p.name?": "+p.name:"";return e.stylize("[Function"+a+"]","special")}if(w(p))return e.stylize(RegExp.prototype.toString.call(p),"regexp");if(m(p))return e.stylize(Date.prototype.toString.call(p),"date");if(b(p))return u(p)}var l,E="",L=!1,T=["{","}"];(h(p)&&(L=!0,T=["[","]"]),I(p))&&(E=" [Function"+(p.name?": "+p.name:"")+"]");return w(p)&&(E=" "+RegExp.prototype.toString.call(p)),m(p)&&(E=" "+Date.prototype.toUTCString.call(p)),b(p)&&(E=" "+u(p)),0!==s.length||L&&0!=p.length?r<0?w(p)?e.stylize(RegExp.prototype.toString.call(p),"regexp"):e.stylize("[Object]","special"):(e.seen.push(p),l=L?function(e,t,p,r,o){for(var i=[],s=0,n=t.length;s=0&&0,e+t.replace(/\u001b\[\d\d?m/g,"").length+1}),0)>60)return p[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+p[1];return p[0]+t+" "+e.join(", ")+" "+p[1]}(l,E,T)):T[0]+E+T[1]}function u(e){return"["+Error.prototype.toString.call(e)+"]"}function y(e,t,p,r,o,i){var s,n,a;if((a=Object.getOwnPropertyDescriptor(t,o)||{value:t[o]}).get?n=a.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):a.set&&(n=e.stylize("[Setter]","special")),M(r,o)||(s="["+o+"]"),n||(e.seen.indexOf(a.value)<0?(n=d(p)?c(e,a.value,null):c(e,a.value,p-1)).indexOf("\n")>-1&&(n=i?n.split("\n").map((function(e){return" "+e})).join("\n").substr(2):"\n"+n.split("\n").map((function(e){return" "+e})).join("\n")):n=e.stylize("[Circular]","special")),g(s)){if(i&&o.match(/^\d+$/))return n;(s=JSON.stringify(""+o)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+n}function h(e){return Array.isArray(e)}function f(e){return"boolean"==typeof e}function d(e){return null===e}function _(e){return"number"==typeof e}function S(e){return"string"==typeof e}function g(e){return void 0===e}function w(e){return E(e)&&"[object RegExp]"===L(e)}function E(e){return"object"==typeof e&&null!==e}function m(e){return E(e)&&"[object Date]"===L(e)}function b(e){return E(e)&&("[object Error]"===L(e)||e instanceof Error)}function I(e){return"function"==typeof e}function L(e){return Object.prototype.toString.call(e)}function T(e){return e<10?"0"+e.toString(10):e.toString(10)}t.debuglog=function(e){if(g(i)&&(i=r.env.NODE_DEBUG||""),e=e.toUpperCase(),!s[e])if(new RegExp("\\b"+e+"\\b","i").test(i)){var p=r.pid;s[e]=function(){var r=t.format.apply(t,arguments);console.error("%s %d: %s",e,p,r)}}else s[e]=function(){};return s[e]},t.inspect=n,n.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},n.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},t.isArray=h,t.isBoolean=f,t.isNull=d,t.isNullOrUndefined=function(e){return null==e},t.isNumber=_,t.isString=S,t.isSymbol=function(e){return"symbol"==typeof e},t.isUndefined=g,t.isRegExp=w,t.isObject=E,t.isDate=m,t.isError=b,t.isFunction=I,t.isPrimitive=function(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||void 0===e},t.isBuffer=p(29);var v=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function U(){var e=new Date,t=[T(e.getHours()),T(e.getMinutes()),T(e.getSeconds())].join(":");return[e.getDate(),v[e.getMonth()],t].join(" ")}function M(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.log=function(){console.log("%s - %s",U(),t.format.apply(t,arguments))},t.inherits=p(6),t._extend=function(e,t){if(!t||!E(t))return e;for(var p=Object.keys(t),r=p.length;r--;)e[p[r]]=t[p[r]];return e}}).call(this,p(5),p(9))},function(e,t,p){"use strict";(function(t,r){var o=p(11);e.exports=w;var i,s=p(16);w.ReadableState=g;p(13).EventEmitter;var n=function(e,t){return e.listeners(t).length},a=p(20),l=p(12).Buffer,c=t.Uint8Array||function(){};var u=p(10);u.inherits=p(6);var y=p(32),h=void 0;h=y&&y.debuglog?y.debuglog("stream"):function(){};var f,d=p(33),_=p(21);u.inherits(w,a);var S=["error","close","destroy","pause","resume"];function g(e,t){e=e||{};var r=t instanceof(i=i||p(7));this.objectMode=!!e.objectMode,r&&(this.objectMode=this.objectMode||!!e.readableObjectMode);var o=e.highWaterMark,s=e.readableHighWaterMark,n=this.objectMode?16:16384;this.highWaterMark=o||0===o?o:r&&(s||0===s)?s:n,this.highWaterMark=Math.floor(this.highWaterMark),this.buffer=new d,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.destroyed=!1,this.defaultEncoding=e.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(f||(f=p(22).StringDecoder),this.decoder=new f(e.encoding),this.encoding=e.encoding)}function w(e){if(i=i||p(7),!(this instanceof w))return new w(e);this._readableState=new g(e,this),this.readable=!0,e&&("function"==typeof e.read&&(this._read=e.read),"function"==typeof e.destroy&&(this._destroy=e.destroy)),a.call(this)}function E(e,t,p,r,o){var i,s=e._readableState;null===t?(s.reading=!1,function(e,t){if(t.ended)return;if(t.decoder){var p=t.decoder.end();p&&p.length&&(t.buffer.push(p),t.length+=t.objectMode?1:p.length)}t.ended=!0,I(e)}(e,s)):(o||(i=function(e,t){var p;r=t,l.isBuffer(r)||r instanceof c||"string"==typeof t||void 0===t||e.objectMode||(p=new TypeError("Invalid non-string/buffer chunk"));var r;return p}(s,t)),i?e.emit("error",i):s.objectMode||t&&t.length>0?("string"==typeof t||s.objectMode||Object.getPrototypeOf(t)===l.prototype||(t=function(e){return l.from(e)}(t)),r?s.endEmitted?e.emit("error",new Error("stream.unshift() after end event")):m(e,s,t,!0):s.ended?e.emit("error",new Error("stream.push() after EOF")):(s.reading=!1,s.decoder&&!p?(t=s.decoder.write(t),s.objectMode||0!==t.length?m(e,s,t,!1):T(e,s)):m(e,s,t,!1))):r||(s.reading=!1));return function(e){return!e.ended&&(e.needReadable||e.lengtht.highWaterMark&&(t.highWaterMark=function(e){return e>=8388608?e=8388608:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function I(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(h("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?o.nextTick(L,e):L(e))}function L(e){h("emit readable"),e.emit("readable"),D(e)}function T(e,t){t.readingMore||(t.readingMore=!0,o.nextTick(v,e,t))}function v(e,t){for(var p=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length=t.length?(p=t.decoder?t.buffer.join(""):1===t.buffer.length?t.buffer.head.data:t.buffer.concat(t.length),t.buffer.clear()):p=function(e,t,p){var r;ei.length?i.length:e;if(s===i.length?o+=i:o+=i.slice(0,e),0===(e-=s)){s===i.length?(++r,p.next?t.head=p.next:t.head=t.tail=null):(t.head=p,p.data=i.slice(s));break}++r}return t.length-=r,o}(e,t):function(e,t){var p=l.allocUnsafe(e),r=t.head,o=1;r.data.copy(p),e-=r.data.length;for(;r=r.next;){var i=r.data,s=e>i.length?i.length:e;if(i.copy(p,p.length-e,0,s),0===(e-=s)){s===i.length?(++o,r.next?t.head=r.next:t.head=t.tail=null):(t.head=r,r.data=i.slice(s));break}++o}return t.length-=o,p}(e,t);return r}(e,t.buffer,t.decoder),p);var p}function G(e){var t=e._readableState;if(t.length>0)throw new Error('"endReadable()" called on non-empty stream');t.endEmitted||(t.ended=!0,o.nextTick(A,t,e))}function A(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function C(e,t){for(var p=0,r=e.length;p=t.highWaterMark||t.ended))return h("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?G(this):I(this),null;if(0===(e=b(e,t))&&t.ended)return 0===t.length&&G(this),null;var r,o=t.needReadable;return h("need readable",o),(0===t.length||t.length-e0?O(e,t):null)?(t.needReadable=!0,e=0):t.length-=e,0===t.length&&(t.ended||(t.needReadable=!0),p!==e&&t.ended&&G(this)),null!==r&&this.emit("data",r),r},w.prototype._read=function(e){this.emit("error",new Error("_read() is not implemented"))},w.prototype.pipe=function(e,t){var p=this,i=this._readableState;switch(i.pipesCount){case 0:i.pipes=e;break;case 1:i.pipes=[i.pipes,e];break;default:i.pipes.push(e)}i.pipesCount+=1,h("pipe count=%d opts=%j",i.pipesCount,t);var a=(!t||!1!==t.end)&&e!==r.stdout&&e!==r.stderr?c:w;function l(t,r){h("onunpipe"),t===p&&r&&!1===r.hasUnpiped&&(r.hasUnpiped=!0,h("cleanup"),e.removeListener("close",S),e.removeListener("finish",g),e.removeListener("drain",u),e.removeListener("error",_),e.removeListener("unpipe",l),p.removeListener("end",c),p.removeListener("end",w),p.removeListener("data",d),y=!0,!i.awaitDrain||e._writableState&&!e._writableState.needDrain||u())}function c(){h("onend"),e.end()}i.endEmitted?o.nextTick(a):p.once("end",a),e.on("unpipe",l);var u=function(e){return function(){var t=e._readableState;h("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&n(e,"data")&&(t.flowing=!0,D(e))}}(p);e.on("drain",u);var y=!1;var f=!1;function d(t){h("ondata"),f=!1,!1!==e.write(t)||f||((1===i.pipesCount&&i.pipes===e||i.pipesCount>1&&-1!==C(i.pipes,e))&&!y&&(h("false write response, pause",p._readableState.awaitDrain),p._readableState.awaitDrain++,f=!0),p.pause())}function _(t){h("onerror",t),w(),e.removeListener("error",_),0===n(e,"error")&&e.emit("error",t)}function S(){e.removeListener("finish",g),w()}function g(){h("onfinish"),e.removeListener("close",S),w()}function w(){h("unpipe"),p.unpipe(e)}return p.on("data",d),function(e,t,p){if("function"==typeof e.prependListener)return e.prependListener(t,p);e._events&&e._events[t]?s(e._events[t])?e._events[t].unshift(p):e._events[t]=[p,e._events[t]]:e.on(t,p)}(e,"error",_),e.once("close",S),e.once("finish",g),e.emit("pipe",p),i.flowing||(h("pipe resume"),p.resume()),e},w.prototype.unpipe=function(e){var t=this._readableState,p={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes||(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this,p)),this;if(!e){var r=t.pipes,o=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var i=0;i>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function n(e){var t=this.lastTotal-this.lastNeed,p=function(e,t,p){if(128!=(192&t[0]))return e.lastNeed=0,"�";if(e.lastNeed>1&&t.length>1){if(128!=(192&t[1]))return e.lastNeed=1,"�";if(e.lastNeed>2&&t.length>2&&128!=(192&t[2]))return e.lastNeed=2,"�"}}(this,e);return void 0!==p?p:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,t,0,e.length),void(this.lastNeed-=e.length))}function a(e,t){if((e.length-t)%2==0){var p=e.toString("utf16le",t);if(p){var r=p.charCodeAt(p.length-1);if(r>=55296&&r<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],p.slice(0,-1)}return p}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString("utf16le",t,e.length-1)}function l(e){var t=e&&e.length?this.write(e):"";if(this.lastNeed){var p=this.lastTotal-this.lastNeed;return t+this.lastChar.toString("utf16le",0,p)}return t}function c(e,t){var p=(e.length-t)%3;return 0===p?e.toString("base64",t):(this.lastNeed=3-p,this.lastTotal=3,1===p?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString("base64",t,e.length-p))}function u(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function y(e){return e.toString(this.encoding)}function h(e){return e&&e.length?this.write(e):""}t.StringDecoder=i,i.prototype.write=function(e){if(0===e.length)return"";var t,p;if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return"";p=this.lastNeed,this.lastNeed=0}else p=0;return p=0)return o>0&&(e.lastNeed=o-1),o;if(--r=0)return o>0&&(e.lastNeed=o-2),o;if(--r=0)return o>0&&(2===o?o=0:e.lastNeed=o-3),o;return 0}(this,e,t);if(!this.lastNeed)return e.toString("utf8",t);this.lastTotal=p;var r=e.length-(p-this.lastNeed);return e.copy(this.lastChar,0,r),e.toString("utf8",t,r)},i.prototype.fillLast=function(e){if(this.lastNeed<=e.length)return e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,e.length),this.lastNeed-=e.length}},function(e,t,p){"use strict";e.exports=s;var r=p(7),o=p(10);function i(e,t){var p=this._transformState;p.transforming=!1;var r=p.writecb;if(!r)return this.emit("error",new Error("write callback called multiple times"));p.writechunk=null,p.writecb=null,null!=t&&this.push(t),r(e);var o=this._readableState;o.reading=!1,(o.needReadable||o.length>8&255^255&p],t&=65535;return t}r.exports={preambleByte:85,crc16:S,sbpIdTable:h,sbpMessageTypesTable:f,decode:function(e){var t=d.parse(e),p=h[t.msg_type];return void 0===p?(console.log("Unknown message type: ",t.msg_type),new s(t)):new p(t)},dispatch:function(t,p,o){var i,s,n=new e(0);if(void 0===o&&"function"==typeof p?i=p:(i=o,s=p),s&&!Array.isArray(s)&&-1===["function","number"].indexOf(typeof s))throw l("dispatch: messageWhitelist must be function, number, or array");var a=function(p){t.pause();try{if((n=e.concat([n,p])).length<2)return;var o=function(){var e,t,p,o,i,a,l;for(l=0;ln.length)throw new c;e=n.slice(l+1,l+6),p=n.readUInt16LE(l+1),_=n.readUInt16LE(l+3),o=n.readUInt8(l+5);var y=s&&Array.isArray(s)&&-1!==s.indexOf(p),h=s&&"number"==typeof s&&s&p,f=s&&"function"==typeof s&&s(p);if(s&&!(y||h||f))return n=n.slice(l+6+o+2),null;if(l+8+o>n.length)throw new c;a=S(n.slice(l+6,l+6+o),S(e)),i=n.readUInt16LE(l+6+o);var d=n.slice(l,l+6+o+2);if(i===a)return n=n.slice(l+6+o+2),[r.exports.decode(d),d];throw n=n.slice(l+1),new u}();if(null===o)return;var l=o[0],y=o[1];i(null,l,y)}catch(e){if(!(e instanceof c||e instanceof u))throw e}finally{t.resume(),n.length>0&&setTimeout((function(){a(new e(0))}),0)}};t.on("data",a)}},function(e){var p={function:!0,object:!0},i=p[typeof window]&&window||this,s=p[typeof t]&&t&&!t.nodeType&&t,n=p[typeof r]&&r&&!r.nodeType&&r,a=s&&n&&"object"==typeof o&&o;!a||a.global!==a&&a.window!==a&&a.self!==a||(i=a),i.SBP=e}(r.exports)}).call(this,p(8).Buffer,p(27)(e),p(5))},function(e,t,p){"use strict";t.byteLength=function(e){var t=l(e),p=t[0],r=t[1];return 3*(p+r)/4-r},t.toByteArray=function(e){for(var t,p=l(e),r=p[0],s=p[1],n=new i(function(e,t,p){return 3*(t+p)/4-p}(0,r,s)),a=0,c=s>0?r-4:r,u=0;u>16&255,n[a++]=t>>8&255,n[a++]=255&t;2===s&&(t=o[e.charCodeAt(u)]<<2|o[e.charCodeAt(u+1)]>>4,n[a++]=255&t);1===s&&(t=o[e.charCodeAt(u)]<<10|o[e.charCodeAt(u+1)]<<4|o[e.charCodeAt(u+2)]>>2,n[a++]=t>>8&255,n[a++]=255&t);return n},t.fromByteArray=function(e){for(var t,p=e.length,o=p%3,i=[],s=0,n=p-o;sn?n:s+16383));1===o?(t=e[p-1],i.push(r[t>>2]+r[t<<4&63]+"==")):2===o&&(t=(e[p-2]<<8)+e[p-1],i.push(r[t>>10]+r[t>>4&63]+r[t<<2&63]+"="));return i.join("")};for(var r=[],o=[],i="undefined"!=typeof Uint8Array?Uint8Array:Array,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n=0,a=s.length;n0)throw new Error("Invalid string. Length must be a multiple of 4");var p=e.indexOf("=");return-1===p&&(p=t),[p,p===t?0:4-p%4]}function c(e,t,p){for(var o,i,s=[],n=t;n>18&63]+r[i>>12&63]+r[i>>6&63]+r[63&i]);return s.join("")}o["-".charCodeAt(0)]=62,o["_".charCodeAt(0)]=63},function(e,t){t.read=function(e,t,p,r,o){var i,s,n=8*o-r-1,a=(1<>1,c=-7,u=p?o-1:0,y=p?-1:1,h=e[t+u];for(u+=y,i=h&(1<<-c)-1,h>>=-c,c+=n;c>0;i=256*i+e[t+u],u+=y,c-=8);for(s=i&(1<<-c)-1,i>>=-c,c+=r;c>0;s=256*s+e[t+u],u+=y,c-=8);if(0===i)i=1-l;else{if(i===a)return s?NaN:1/0*(h?-1:1);s+=Math.pow(2,r),i-=l}return(h?-1:1)*s*Math.pow(2,i-r)},t.write=function(e,t,p,r,o,i){var s,n,a,l=8*i-o-1,c=(1<>1,y=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:i-1,f=r?1:-1,d=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(n=isNaN(t)?1:0,s=c):(s=Math.floor(Math.log(t)/Math.LN2),t*(a=Math.pow(2,-s))<1&&(s--,a*=2),(t+=s+u>=1?y/a:y*Math.pow(2,1-u))*a>=2&&(s++,a/=2),s+u>=c?(n=0,s=c):s+u>=1?(n=(t*a-1)*Math.pow(2,o),s+=u):(n=t*Math.pow(2,u-1)*Math.pow(2,o),s=0));o>=8;e[p+h]=255&n,h+=f,n/=256,o-=8);for(s=s<0;e[p+h]=255&s,h+=f,s/=256,l-=8);e[p+h-f]|=128*d}},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Context=void 0;var r=function(){function e(e){this.code="",this.scopes=[["vars"]],this.bitFields=[],this.tmpVariableCount=0,this.references={},this.imports=[],this.reverseImports=new Map,this.importPath=e}return e.prototype.generateVariable=function(e){var t=[],p=this.scopes[this.scopes.length-1];return t.push.apply(t,p),e&&t.push(e),t.join(".")},e.prototype.generateOption=function(e){switch(typeof e){case"number":return e.toString();case"string":return this.generateVariable(e);case"function":return this.addImport(e)+".call("+this.generateVariable()+", vars)"}},e.prototype.generateError=function(e){this.pushCode("throw new Error("+e+");")},e.prototype.generateTmpVariable=function(){return"$tmp"+this.tmpVariableCount++},e.prototype.pushCode=function(e){this.code+=e+"\n"},e.prototype.pushPath=function(e){e&&this.scopes[this.scopes.length-1].push(e)},e.prototype.popPath=function(e){e&&this.scopes[this.scopes.length-1].pop()},e.prototype.pushScope=function(e){this.scopes.push([e])},e.prototype.popScope=function(){this.scopes.pop()},e.prototype.addImport=function(e){if(!this.importPath)return"("+e+")";var t=this.reverseImports.get(e);return t||(t=this.imports.push(e)-1,this.reverseImports.set(e,t)),this.importPath+"["+t+"]"},e.prototype.addReference=function(e){this.references[e]||(this.references[e]={resolved:!1,requested:!1})},e.prototype.markResolved=function(e){this.references[e].resolved=!0},e.prototype.markRequested=function(e){var t=this;e.forEach((function(e){t.references[e].requested=!0}))},e.prototype.getUnresolvedReferences=function(){var e=this.references;return Object.keys(this.references).filter((function(t){return!e[t].resolved&&!e[t].requested}))},e}();t.Context=r},function(e,t){e.exports=function(e){return e&&"object"==typeof e&&"function"==typeof e.copy&&"function"==typeof e.fill&&"function"==typeof e.readUInt8}},function(e,t,p){(function(e){function p(e,t){for(var p=0,r=e.length-1;r>=0;r--){var o=e[r];"."===o?e.splice(r,1):".."===o?(e.splice(r,1),p++):p&&(e.splice(r,1),p--)}if(t)for(;p--;p)e.unshift("..");return e}var r=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,o=function(e){return r.exec(e).slice(1)};function i(e,t){if(e.filter)return e.filter(t);for(var p=[],r=0;r=-1&&!r;o--){var s=o>=0?arguments[o]:e.cwd();if("string"!=typeof s)throw new TypeError("Arguments to path.resolve must be strings");s&&(t=s+"/"+t,r="/"===s.charAt(0))}return(r?"/":"")+(t=p(i(t.split("/"),(function(e){return!!e})),!r).join("/"))||"."},t.normalize=function(e){var r=t.isAbsolute(e),o="/"===s(e,-1);return(e=p(i(e.split("/"),(function(e){return!!e})),!r).join("/"))||r||(e="."),e&&o&&(e+="/"),(r?"/":"")+e},t.isAbsolute=function(e){return"/"===e.charAt(0)},t.join=function(){var e=Array.prototype.slice.call(arguments,0);return t.normalize(i(e,(function(e,t){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e})).join("/"))},t.relative=function(e,p){function r(e){for(var t=0;t=0&&""===e[p];p--);return t>p?[]:e.slice(t,p-t+1)}e=t.resolve(e).substr(1),p=t.resolve(p).substr(1);for(var o=r(e.split("/")),i=r(p.split("/")),s=Math.min(o.length,i.length),n=s,a=0;a0?this.tail.next=t:this.head=t,this.tail=t,++this.length},e.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},e.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},e.prototype.clear=function(){this.head=this.tail=null,this.length=0},e.prototype.join=function(e){if(0===this.length)return"";for(var t=this.head,p=""+t.data;t=t.next;)p+=e+t.data;return p},e.prototype.concat=function(e){if(0===this.length)return r.alloc(0);if(1===this.length)return this.head.data;for(var t=r.allocUnsafe(e>>>0),p=this.head,o=0;p;)i(p.data,t,o),o+=p.data.length,p=p.next;return t},e}(),o&&o.inspect&&o.inspect.custom&&(e.exports.prototype[o.inspect.custom]=function(){var e=o.inspect({length:this.length});return this.constructor.name+" "+e})},function(e,t){},function(e,t,p){(function(e){var r=void 0!==e&&e||"undefined"!=typeof self&&self||window,o=Function.prototype.apply;function i(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new i(o.call(setTimeout,r,arguments),clearTimeout)},t.setInterval=function(){return new i(o.call(setInterval,r,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},i.prototype.unref=i.prototype.ref=function(){},i.prototype.close=function(){this._clearFn.call(r,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},p(36),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,p(5))},function(e,t,p){(function(e,t){!function(e,p){"use strict";if(!e.setImmediate){var r,o,i,s,n,a=1,l={},c=!1,u=e.document,y=Object.getPrototypeOf&&Object.getPrototypeOf(e);y=y&&y.setTimeout?y:e,"[object process]"==={}.toString.call(e.process)?r=function(e){t.nextTick((function(){f(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,p=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=p,t}}()?e.MessageChannel?((i=new MessageChannel).port1.onmessage=function(e){f(e.data)},r=function(e){i.port2.postMessage(e)}):u&&"onreadystatechange"in u.createElement("script")?(o=u.documentElement,r=function(e){var t=u.createElement("script");t.onreadystatechange=function(){f(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):r=function(e){setTimeout(f,0,e)}:(s="setImmediate$"+Math.random()+"$",n=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(s)&&f(+t.data.slice(s.length))},e.addEventListener?e.addEventListener("message",n,!1):e.attachEvent("onmessage",n),r=function(t){e.postMessage(s+t,"*")}),y.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),p=0;p=s())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s().toString(16)+" bytes");return 0|e}function f(e,t){if(a.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var p=e.length;if(0===p)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return p;case"utf8":case"utf-8":case void 0:return F(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*p;case"hex":return p>>>1;case"base64":return B(e).length;default:if(r)return F(e).length;t=(""+t).toLowerCase(),r=!0}}function d(e,t,p){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===p||p>this.length)&&(p=this.length),p<=0)return"";if((p>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return D(this,t,p);case"utf8":case"utf-8":return v(this,t,p);case"ascii":return U(this,t,p);case"latin1":case"binary":return M(this,t,p);case"base64":return T(this,t,p);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return O(this,t,p);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}function _(e,t,p){var r=e[t];e[t]=e[p],e[p]=r}function S(e,t,p,r,o){if(0===e.length)return-1;if("string"==typeof p?(r=p,p=0):p>2147483647?p=2147483647:p<-2147483648&&(p=-2147483648),p=+p,isNaN(p)&&(p=o?0:e.length-1),p<0&&(p=e.length+p),p>=e.length){if(o)return-1;p=e.length-1}else if(p<0){if(!o)return-1;p=0}if("string"==typeof t&&(t=a.from(t,r)),a.isBuffer(t))return 0===t.length?-1:g(e,t,p,r,o);if("number"==typeof t)return t&=255,a.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,p):Uint8Array.prototype.lastIndexOf.call(e,t,p):g(e,[t],p,r,o);throw new TypeError("val must be string, number or Buffer")}function g(e,t,p,r,o){var i,s=1,n=e.length,a=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;s=2,n/=2,a/=2,p/=2}function l(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}if(o){var c=-1;for(i=p;in&&(p=n-a),i=p;i>=0;i--){for(var u=!0,y=0;yo&&(r=o):r=o;var i=t.length;if(i%2!=0)throw new TypeError("Invalid hex string");r>i/2&&(r=i/2);for(var s=0;s>8,o=p%256,i.push(o),i.push(r);return i}(t,e.length-p),e,p,r)}function T(e,t,p){return 0===t&&p===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,p))}function v(e,t,p){p=Math.min(e.length,p);for(var r=[],o=t;o239?4:l>223?3:l>191?2:1;if(o+u<=p)switch(u){case 1:l<128&&(c=l);break;case 2:128==(192&(i=e[o+1]))&&(a=(31&l)<<6|63&i)>127&&(c=a);break;case 3:i=e[o+1],s=e[o+2],128==(192&i)&&128==(192&s)&&(a=(15&l)<<12|(63&i)<<6|63&s)>2047&&(a<55296||a>57343)&&(c=a);break;case 4:i=e[o+1],s=e[o+2],n=e[o+3],128==(192&i)&&128==(192&s)&&128==(192&n)&&(a=(15&l)<<18|(63&i)<<12|(63&s)<<6|63&n)>65535&&a<1114112&&(c=a)}null===c?(c=65533,u=1):c>65535&&(c-=65536,r.push(c>>>10&1023|55296),c=56320|1023&c),r.push(c),o+=u}return function(e){var t=e.length;if(t<=4096)return String.fromCharCode.apply(String,e);var p="",r=0;for(;r0&&(e=this.toString("hex",0,p).match(/.{2}/g).join(" "),this.length>p&&(e+=" ... ")),""},a.prototype.compare=function(e,t,p,r,o){if(!a.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===p&&(p=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||p>e.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&t>=p)return 0;if(r>=o)return-1;if(t>=p)return 1;if(this===e)return 0;for(var i=(o>>>=0)-(r>>>=0),s=(p>>>=0)-(t>>>=0),n=Math.min(i,s),l=this.slice(r,o),c=e.slice(t,p),u=0;uo)&&(p=o),e.length>0&&(p<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var i=!1;;)switch(r){case"hex":return w(this,e,t,p);case"utf8":case"utf-8":return E(this,e,t,p);case"ascii":return m(this,e,t,p);case"latin1":case"binary":return b(this,e,t,p);case"base64":return I(this,e,t,p);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return L(this,e,t,p);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}},a.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function U(e,t,p){var r="";p=Math.min(e.length,p);for(var o=t;or)&&(p=r);for(var o="",i=t;ip)throw new RangeError("Trying to access beyond buffer length")}function A(e,t,p,r,o,i){if(!a.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||te.length)throw new RangeError("Index out of range")}function C(e,t,p,r){t<0&&(t=65535+t+1);for(var o=0,i=Math.min(e.length-p,2);o>>8*(r?o:1-o)}function R(e,t,p,r){t<0&&(t=4294967295+t+1);for(var o=0,i=Math.min(e.length-p,4);o>>8*(r?o:3-o)&255}function P(e,t,p,r,o,i){if(p+r>e.length)throw new RangeError("Index out of range");if(p<0)throw new RangeError("Index out of range")}function N(e,t,p,r,i){return i||P(e,0,p,4),o.write(e,t,p,r,23,4),p+4}function j(e,t,p,r,i){return i||P(e,0,p,8),o.write(e,t,p,r,52,8),p+8}a.prototype.slice=function(e,t){var p,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t0&&(o*=256);)r+=this[e+--t]*o;return r},a.prototype.readUInt8=function(e,t){return t||G(e,1,this.length),this[e]},a.prototype.readUInt16LE=function(e,t){return t||G(e,2,this.length),this[e]|this[e+1]<<8},a.prototype.readUInt16BE=function(e,t){return t||G(e,2,this.length),this[e]<<8|this[e+1]},a.prototype.readUInt32LE=function(e,t){return t||G(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},a.prototype.readUInt32BE=function(e,t){return t||G(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},a.prototype.readIntLE=function(e,t,p){e|=0,t|=0,p||G(e,t,this.length);for(var r=this[e],o=1,i=0;++i=(o*=128)&&(r-=Math.pow(2,8*t)),r},a.prototype.readIntBE=function(e,t,p){e|=0,t|=0,p||G(e,t,this.length);for(var r=t,o=1,i=this[e+--r];r>0&&(o*=256);)i+=this[e+--r]*o;return i>=(o*=128)&&(i-=Math.pow(2,8*t)),i},a.prototype.readInt8=function(e,t){return t||G(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},a.prototype.readInt16LE=function(e,t){t||G(e,2,this.length);var p=this[e]|this[e+1]<<8;return 32768&p?4294901760|p:p},a.prototype.readInt16BE=function(e,t){t||G(e,2,this.length);var p=this[e+1]|this[e]<<8;return 32768&p?4294901760|p:p},a.prototype.readInt32LE=function(e,t){return t||G(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},a.prototype.readInt32BE=function(e,t){return t||G(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},a.prototype.readFloatLE=function(e,t){return t||G(e,4,this.length),o.read(this,e,!0,23,4)},a.prototype.readFloatBE=function(e,t){return t||G(e,4,this.length),o.read(this,e,!1,23,4)},a.prototype.readDoubleLE=function(e,t){return t||G(e,8,this.length),o.read(this,e,!0,52,8)},a.prototype.readDoubleBE=function(e,t){return t||G(e,8,this.length),o.read(this,e,!1,52,8)},a.prototype.writeUIntLE=function(e,t,p,r){(e=+e,t|=0,p|=0,r)||A(this,e,t,p,Math.pow(2,8*p)-1,0);var o=1,i=0;for(this[t]=255&e;++i=0&&(i*=256);)this[t+o]=e/i&255;return t+p},a.prototype.writeUInt8=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,1,255,0),a.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},a.prototype.writeUInt16LE=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):C(this,e,t,!0),t+2},a.prototype.writeUInt16BE=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):C(this,e,t,!1),t+2},a.prototype.writeUInt32LE=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):R(this,e,t,!0),t+4},a.prototype.writeUInt32BE=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},a.prototype.writeIntLE=function(e,t,p,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*p-1);A(this,e,t,p,o-1,-o)}var i=0,s=1,n=0;for(this[t]=255&e;++i>0)-n&255;return t+p},a.prototype.writeIntBE=function(e,t,p,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*p-1);A(this,e,t,p,o-1,-o)}var i=p-1,s=1,n=0;for(this[t+i]=255&e;--i>=0&&(s*=256);)e<0&&0===n&&0!==this[t+i+1]&&(n=1),this[t+i]=(e/s>>0)-n&255;return t+p},a.prototype.writeInt8=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,1,127,-128),a.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},a.prototype.writeInt16LE=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):C(this,e,t,!0),t+2},a.prototype.writeInt16BE=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):C(this,e,t,!1),t+2},a.prototype.writeInt32LE=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,4,2147483647,-2147483648),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):R(this,e,t,!0),t+4},a.prototype.writeInt32BE=function(e,t,p){return e=+e,t|=0,p||A(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},a.prototype.writeFloatLE=function(e,t,p){return N(this,e,t,!0,p)},a.prototype.writeFloatBE=function(e,t,p){return N(this,e,t,!1,p)},a.prototype.writeDoubleLE=function(e,t,p){return j(this,e,t,!0,p)},a.prototype.writeDoubleBE=function(e,t,p){return j(this,e,t,!1,p)},a.prototype.copy=function(e,t,p,r){if(p||(p=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t=0;--o)e[o+t]=this[o+p];else if(i<1e3||!a.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,p=void 0===p?this.length:p>>>0,e||(e=0),"number"==typeof e)for(i=t;i55295&&p<57344){if(!o){if(p>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(s+1===r){(t-=3)>-1&&i.push(239,191,189);continue}o=p;continue}if(p<56320){(t-=3)>-1&&i.push(239,191,189),o=p;continue}p=65536+(o-55296<<10|p-56320)}else o&&(t-=3)>-1&&i.push(239,191,189);if(o=null,p<128){if((t-=1)<0)break;i.push(p)}else if(p<2048){if((t-=2)<0)break;i.push(p>>6|192,63&p|128)}else if(p<65536){if((t-=3)<0)break;i.push(p>>12|224,p>>6&63|128,63&p|128)}else{if(!(p<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(p>>18|240,p>>12&63|128,p>>6&63|128,63&p|128)}}return i}function B(e){return r.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(x,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function q(e,t,p,r){for(var o=0;o=t.length||o>=e.length);++o)t[o+p]=e[o];return o}}).call(this,p(5))},function(e,t){var p,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function n(e){if(p===setTimeout)return setTimeout(e,0);if((p===i||!p)&&setTimeout)return p=setTimeout,setTimeout(e,0);try{return p(e,0)}catch(t){try{return p.call(null,e,0)}catch(t){return p.call(this,e,0)}}}!function(){try{p="function"==typeof setTimeout?setTimeout:i}catch(e){p=i}try{r="function"==typeof clearTimeout?clearTimeout:s}catch(e){r=s}}();var a,l=[],c=!1,u=-1;function y(){c&&a&&(c=!1,a.length?l=a.concat(l):u=-1,l.length&&h())}function h(){if(!c){var e=n(y);c=!0;for(var t=l.length;t;){for(a=l,l=[];++u1)for(var p=1;p0&&this._events[e].length>s&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},p.prototype.on=p.prototype.addListener,p.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var p=!1;function o(){this.removeListener(e,o),p||(p=!0,t.apply(this,arguments))}return o.listener=t,this.on(e,o),this},p.prototype.removeListener=function(e,t){var p,i,s,n;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(s=(p=this._events[e]).length,i=-1,p===t||r(p.listener)&&p.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(o(p)){for(n=s;n-- >0;)if(p[n]===t||p[n].listener&&p[n].listener===t){i=n;break}if(i<0)return this;1===p.length?(p.length=0,delete this._events[e]):p.splice(i,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},p.prototype.removeAllListeners=function(e){var t,p;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(p=this._events[e]))this.removeListener(e,p);else if(p)for(;p.length;)this.removeListener(e,p[p.length-1]);return delete this._events[e],this},p.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},p.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},p.listenerCount=function(e,t){return e.listenerCount(t)}},function(e,t,p){(t=e.exports=p(19)).Stream=t,t.Readable=t,t.Writable=p(15),t.Duplex=p(7),t.Transform=p(23),t.PassThrough=p(38)},function(e,t,p){"use strict";(function(t,r,o){var i=p(11);function s(e){var t=this;this.next=null,this.entry=null,this.finish=function(){!function(e,t,p){var r=e.entry;e.entry=null;for(;r;){var o=r.callback;t.pendingcb--,o(p),r=r.next}t.corkedRequestsFree?t.corkedRequestsFree.next=e:t.corkedRequestsFree=e}(t,e)}}e.exports=g;var n,a=!t.browser&&["v0.10","v0.9."].indexOf(t.version.slice(0,5))>-1?r:i.nextTick;g.WritableState=S;var l=p(10);l.inherits=p(6);var c={deprecate:p(37)},u=p(20),y=p(12).Buffer,h=o.Uint8Array||function(){};var f,d=p(21);function _(){}function S(e,t){n=n||p(7),e=e||{};var r=t instanceof n;this.objectMode=!!e.objectMode,r&&(this.objectMode=this.objectMode||!!e.writableObjectMode);var o=e.highWaterMark,l=e.writableHighWaterMark,c=this.objectMode?16:16384;this.highWaterMark=o||0===o?o:r&&(l||0===l)?l:c,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var u=!1===e.decodeStrings;this.decodeStrings=!u,this.defaultEncoding=e.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){!function(e,t){var p=e._writableState,r=p.sync,o=p.writecb;if(function(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}(p),t)!function(e,t,p,r,o){--t.pendingcb,p?(i.nextTick(o,r),i.nextTick(L,e,t),e._writableState.errorEmitted=!0,e.emit("error",r)):(o(r),e._writableState.errorEmitted=!0,e.emit("error",r),L(e,t))}(e,p,r,t,o);else{var s=b(p);s||p.corked||p.bufferProcessing||!p.bufferedRequest||m(e,p),r?a(E,e,p,s,o):E(e,p,s,o)}}(t,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new s(this)}function g(e){if(n=n||p(7),!(f.call(g,this)||this instanceof n))return new g(e);this._writableState=new S(e,this),this.writable=!0,e&&("function"==typeof e.write&&(this._write=e.write),"function"==typeof e.writev&&(this._writev=e.writev),"function"==typeof e.destroy&&(this._destroy=e.destroy),"function"==typeof e.final&&(this._final=e.final)),u.call(this)}function w(e,t,p,r,o,i,s){t.writelen=r,t.writecb=s,t.writing=!0,t.sync=!0,p?e._writev(o,t.onwrite):e._write(o,i,t.onwrite),t.sync=!1}function E(e,t,p,r){p||function(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit("drain"))}(e,t),t.pendingcb--,r(),L(e,t)}function m(e,t){t.bufferProcessing=!0;var p=t.bufferedRequest;if(e._writev&&p&&p.next){var r=t.bufferedRequestCount,o=new Array(r),i=t.corkedRequestsFree;i.entry=p;for(var n=0,a=!0;p;)o[n]=p,p.isBuf||(a=!1),p=p.next,n+=1;o.allBuffers=a,w(e,t,!0,t.length,o,"",i.finish),t.pendingcb++,t.lastBufferedRequest=null,i.next?(t.corkedRequestsFree=i.next,i.next=null):t.corkedRequestsFree=new s(t),t.bufferedRequestCount=0}else{for(;p;){var l=p.chunk,c=p.encoding,u=p.callback;if(w(e,t,!1,t.objectMode?1:l.length,l,c,u),p=p.next,t.bufferedRequestCount--,t.writing)break}null===p&&(t.lastBufferedRequest=null)}t.bufferedRequest=p,t.bufferProcessing=!1}function b(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function I(e,t){e._final((function(p){t.pendingcb--,p&&e.emit("error",p),t.prefinished=!0,e.emit("prefinish"),L(e,t)}))}function L(e,t){var p=b(t);return p&&(!function(e,t){t.prefinished||t.finalCalled||("function"==typeof e._final?(t.pendingcb++,t.finalCalled=!0,i.nextTick(I,e,t)):(t.prefinished=!0,e.emit("prefinish")))}(e,t),0===t.pendingcb&&(t.finished=!0,e.emit("finish"))),p}l.inherits(g,u),S.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(S.prototype,"buffer",{get:c.deprecate((function(){return this.getBuffer()}),"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(e){}}(),"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(f=Function.prototype[Symbol.hasInstance],Object.defineProperty(g,Symbol.hasInstance,{value:function(e){return!!f.call(this,e)||this===g&&(e&&e._writableState instanceof S)}})):f=function(e){return e instanceof this},g.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},g.prototype.write=function(e,t,p){var r,o=this._writableState,s=!1,n=!o.objectMode&&(r=e,y.isBuffer(r)||r instanceof h);return n&&!y.isBuffer(e)&&(e=function(e){return y.from(e)}(e)),"function"==typeof t&&(p=t,t=null),n?t="buffer":t||(t=o.defaultEncoding),"function"!=typeof p&&(p=_),o.ended?function(e,t){var p=new Error("write after end");e.emit("error",p),i.nextTick(t,p)}(this,p):(n||function(e,t,p,r){var o=!0,s=!1;return null===p?s=new TypeError("May not write null values to stream"):"string"==typeof p||void 0===p||t.objectMode||(s=new TypeError("Invalid non-string/buffer chunk")),s&&(e.emit("error",s),i.nextTick(r,s),o=!1),o}(this,o,e,p))&&(o.pendingcb++,s=function(e,t,p,r,o,i){if(!p){var s=function(e,t,p){e.objectMode||!1===e.decodeStrings||"string"!=typeof t||(t=y.from(t,p));return t}(t,r,o);r!==s&&(p=!0,o="buffer",r=s)}var n=t.objectMode?1:r.length;t.length+=n;var a=t.length-1))throw new TypeError("Unknown encoding: "+e);return this._writableState.defaultEncoding=e,this},Object.defineProperty(g.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),g.prototype._write=function(e,t,p){p(new Error("_write() is not implemented"))},g.prototype._writev=null,g.prototype.end=function(e,t,p){var r=this._writableState;"function"==typeof e?(p=e,e=null,t=null):"function"==typeof t&&(p=t,t=null),null!=e&&this.write(e,t),r.corked&&(r.corked=1,this.uncork()),r.ending||r.finished||function(e,t,p){t.ending=!0,L(e,t),p&&(t.finished?i.nextTick(p):e.once("finish",p));t.ended=!0,e.writable=!1}(this,r,p)},Object.defineProperty(g.prototype,"destroyed",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),g.prototype.destroy=d.destroy,g.prototype._undestroy=d.undestroy,g.prototype._destroy=function(e,t){this.end(),t(e)}}).call(this,p(9),p(35).setImmediate,p(5))},function(e,t){var p={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==p.call(e)}},function(e,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Parser=void 0;var r=p(28),o={},i={uint8:1,uint16le:2,uint16be:2,uint32le:4,uint32be:4,int8:1,int16le:2,int16be:2,int32le:4,int32be:4,int64be:8,int64le:8,uint64be:8,uint64le:8,floatle:4,floatbe:4,doublele:8,doublebe:8},s={uint8:"Uint8",uint16le:"Uint16",uint16be:"Uint16",uint32le:"Uint32",uint32be:"Uint32",int8:"Int8",int16le:"Int16",int16be:"Int16",int32le:"Int32",int32be:"Int32",int64be:"BigInt64",int64le:"BigInt64",uint64be:"BigUint64",uint64le:"BigUint64",floatle:"Float32",floatbe:"Float32",doublele:"Float64",doublebe:"Float64"},n={uint8:!1,uint16le:!0,uint16be:!1,uint32le:!0,uint32be:!1,int8:!1,int16le:!0,int16be:!1,int32le:!0,int32be:!1,int64be:!1,int64le:!0,uint64be:!1,uint64le:!0,floatle:!0,floatbe:!1,doublele:!0,doublebe:!1},a=function(){function e(){this.varName="",this.type="",this.options={},this.next=null,this.head=null,this.compiled=null,this.endian="be",this.constructorFn=null,this.alias=null}return e.start=function(){return new e},e.prototype.primitiveGenerateN=function(e,t){var p=s[e],r=n[e];t.pushCode(t.generateVariable(this.varName)+" = dataView.get"+p+"(offset, "+r+");"),t.pushCode("offset += "+i[e]+";")},e.prototype.primitiveN=function(e,t,p){return this.setNextParser(e,t,p)},e.prototype.useThisEndian=function(e){return e+this.endian.toLowerCase()},e.prototype.uint8=function(e,t){return this.primitiveN("uint8",e,t)},e.prototype.uint16=function(e,t){return this.primitiveN(this.useThisEndian("uint16"),e,t)},e.prototype.uint16le=function(e,t){return this.primitiveN("uint16le",e,t)},e.prototype.uint16be=function(e,t){return this.primitiveN("uint16be",e,t)},e.prototype.uint32=function(e,t){return this.primitiveN(this.useThisEndian("uint32"),e,t)},e.prototype.uint32le=function(e,t){return this.primitiveN("uint32le",e,t)},e.prototype.uint32be=function(e,t){return this.primitiveN("uint32be",e,t)},e.prototype.int8=function(e,t){return this.primitiveN("int8",e,t)},e.prototype.int16=function(e,t){return this.primitiveN(this.useThisEndian("int16"),e,t)},e.prototype.int16le=function(e,t){return this.primitiveN("int16le",e,t)},e.prototype.int16be=function(e,t){return this.primitiveN("int16be",e,t)},e.prototype.int32=function(e,t){return this.primitiveN(this.useThisEndian("int32"),e,t)},e.prototype.int32le=function(e,t){return this.primitiveN("int32le",e,t)},e.prototype.int32be=function(e,t){return this.primitiveN("int32be",e,t)},e.prototype.bigIntVersionCheck=function(){if(!DataView.prototype.getBigInt64)throw new Error("BigInt64 is unsupported in this runtime")},e.prototype.int64=function(e,t){return this.bigIntVersionCheck(),this.primitiveN(this.useThisEndian("int64"),e,t)},e.prototype.int64be=function(e,t){return this.bigIntVersionCheck(),this.primitiveN("int64be",e,t)},e.prototype.int64le=function(e,t){return this.bigIntVersionCheck(),this.primitiveN("int64le",e,t)},e.prototype.uint64=function(e,t){return this.bigIntVersionCheck(),this.primitiveN(this.useThisEndian("uint64"),e,t)},e.prototype.uint64be=function(e,t){return this.bigIntVersionCheck(),this.primitiveN("uint64be",e,t)},e.prototype.uint64le=function(e,t){return this.bigIntVersionCheck(),this.primitiveN("uint64le",e,t)},e.prototype.floatle=function(e,t){return this.primitiveN("floatle",e,t)},e.prototype.floatbe=function(e,t){return this.primitiveN("floatbe",e,t)},e.prototype.doublele=function(e,t){return this.primitiveN("doublele",e,t)},e.prototype.doublebe=function(e,t){return this.primitiveN("doublebe",e,t)},e.prototype.bitN=function(e,t,p){return p||(p={}),p.length=e,this.setNextParser("bit",t,p)},e.prototype.bit1=function(e,t){return this.bitN(1,e,t)},e.prototype.bit2=function(e,t){return this.bitN(2,e,t)},e.prototype.bit3=function(e,t){return this.bitN(3,e,t)},e.prototype.bit4=function(e,t){return this.bitN(4,e,t)},e.prototype.bit5=function(e,t){return this.bitN(5,e,t)},e.prototype.bit6=function(e,t){return this.bitN(6,e,t)},e.prototype.bit7=function(e,t){return this.bitN(7,e,t)},e.prototype.bit8=function(e,t){return this.bitN(8,e,t)},e.prototype.bit9=function(e,t){return this.bitN(9,e,t)},e.prototype.bit10=function(e,t){return this.bitN(10,e,t)},e.prototype.bit11=function(e,t){return this.bitN(11,e,t)},e.prototype.bit12=function(e,t){return this.bitN(12,e,t)},e.prototype.bit13=function(e,t){return this.bitN(13,e,t)},e.prototype.bit14=function(e,t){return this.bitN(14,e,t)},e.prototype.bit15=function(e,t){return this.bitN(15,e,t)},e.prototype.bit16=function(e,t){return this.bitN(16,e,t)},e.prototype.bit17=function(e,t){return this.bitN(17,e,t)},e.prototype.bit18=function(e,t){return this.bitN(18,e,t)},e.prototype.bit19=function(e,t){return this.bitN(19,e,t)},e.prototype.bit20=function(e,t){return this.bitN(20,e,t)},e.prototype.bit21=function(e,t){return this.bitN(21,e,t)},e.prototype.bit22=function(e,t){return this.bitN(22,e,t)},e.prototype.bit23=function(e,t){return this.bitN(23,e,t)},e.prototype.bit24=function(e,t){return this.bitN(24,e,t)},e.prototype.bit25=function(e,t){return this.bitN(25,e,t)},e.prototype.bit26=function(e,t){return this.bitN(26,e,t)},e.prototype.bit27=function(e,t){return this.bitN(27,e,t)},e.prototype.bit28=function(e,t){return this.bitN(28,e,t)},e.prototype.bit29=function(e,t){return this.bitN(29,e,t)},e.prototype.bit30=function(e,t){return this.bitN(30,e,t)},e.prototype.bit31=function(e,t){return this.bitN(31,e,t)},e.prototype.bit32=function(e,t){return this.bitN(32,e,t)},e.prototype.namely=function(e){return o[e]=this,this.alias=e,this},e.prototype.skip=function(e,t){return this.seek(e,t)},e.prototype.seek=function(e,t){if(t&&t.assert)throw new Error("assert option on seek is not allowed.");return this.setNextParser("seek","",{length:e})},e.prototype.string=function(e,t){if(!t.zeroTerminated&&!t.length&&!t.greedy)throw new Error("Neither length, zeroTerminated, nor greedy is defined for string.");if((t.zeroTerminated||t.length)&&t.greedy)throw new Error("greedy is mutually exclusive with length and zeroTerminated for string.");if(t.stripNull&&!t.length&&!t.greedy)throw new Error("Length or greedy must be defined if stripNull is defined.");return t.encoding=t.encoding||"utf8",this.setNextParser("string",e,t)},e.prototype.buffer=function(e,t){if(!t.length&&!t.readUntil)throw new Error("Length nor readUntil is defined in buffer parser");return this.setNextParser("buffer",e,t)},e.prototype.array=function(e,t){if(!t.readUntil&&!t.length&&!t.lengthInBytes)throw new Error("Length option of array is not defined.");if(!t.type)throw new Error("Type option of array is not defined.");if("string"==typeof t.type&&!o[t.type]&&Object.keys(i).indexOf(t.type)<0)throw new Error('Specified primitive type "'+t.type+'" is not supported.');return this.setNextParser("array",e,t)},e.prototype.choice=function(e,t){if("object"!=typeof t&&"object"==typeof e&&(t=e,e=null),!t.tag)throw new Error("Tag option of array is not defined.");if(!t.choices)throw new Error("Choices option of array is not defined.");return Object.keys(t.choices).forEach((function(p){var r=parseInt(p,10),s=t.choices[r];if(isNaN(r))throw new Error("Key of choices must be a number.");if(!s)throw new Error("Choice Case "+p+" of "+e+" is not valid.");if("string"==typeof s&&!o[s]&&Object.keys(i).indexOf(s)<0)throw new Error('Specified primitive type "'+s+'" is not supported.')})),this.setNextParser("choice",e,t)},e.prototype.nest=function(t,p){if("object"!=typeof p&&"object"==typeof t&&(p=t,t=null),!p.type)throw new Error("Type option of nest is not defined.");if(!(p.type instanceof e||o[p.type]))throw new Error("Type option of nest must be a Parser object.");if(!(p.type instanceof e||t))throw new Error("options.type must be a object if variable name is omitted.");return this.setNextParser("nest",t,p)},e.prototype.pointer=function(t,p){if(!p.offset)throw new Error("Offset option of pointer is not defined.");if(!p.type)throw new Error("Type option of pointer is not defined.");if("string"==typeof p.type){if(Object.keys(i).indexOf(p.type)<0&&!o[p.type])throw new Error('Specified type "'+p.type+'" is not supported.')}else if(!(p.type instanceof e))throw new Error("Type option of pointer must be a string or a Parser object.");return this.setNextParser("pointer",t,p)},e.prototype.saveOffset=function(e,t){return this.setNextParser("saveOffset",e,t)},e.prototype.endianess=function(e){switch(e.toLowerCase()){case"little":this.endian="le";break;case"big":this.endian="be";break;default:throw new Error("Invalid endianess: "+e)}return this},e.prototype.create=function(e){if(!(e instanceof Function))throw new Error("Constructor must be a Function object.");return this.constructorFn=e,this},e.prototype.getContext=function(e){var t=new r.Context(e);return t.pushCode("var dataView = new DataView(buffer.buffer, buffer.byteOffset, buffer.length);"),this.alias?(this.addAliasedCode(t),t.pushCode("return ___parser_"+this.alias+"(0).result;")):this.addRawCode(t),t},e.prototype.getCode=function(){return this.getContext().code},e.prototype.addRawCode=function(e){e.pushCode("var offset = 0;"),this.constructorFn?e.pushCode("var vars = new constructorFn();"):e.pushCode("var vars = {};"),this.generate(e),this.resolveReferences(e),e.pushCode("return vars;")},e.prototype.addAliasedCode=function(e){return e.pushCode("function ___parser_"+this.alias+"(offset) {"),this.constructorFn?e.pushCode("var vars = new constructorFn();"):e.pushCode("var vars = {};"),this.generate(e),e.markResolved(this.alias),this.resolveReferences(e),e.pushCode("return { offset: offset, result: vars };"),e.pushCode("}"),e},e.prototype.resolveReferences=function(e){var t=e.getUnresolvedReferences();e.markRequested(t),t.forEach((function(t){o[t].addAliasedCode(e)}))},e.prototype.compile=function(){var e=this.getContext("imports");this.compiled=new Function("imports","TextDecoder","return function (buffer, constructorFn) { "+e.code+" };")(e.imports,"undefined"==typeof TextDecoder?p(18).TextDecoder:TextDecoder)},e.prototype.sizeOf=function(){var t=NaN;if(Object.keys(i).indexOf(this.type)>=0)t=i[this.type];else if("string"===this.type&&"number"==typeof this.options.length)t=this.options.length;else if("buffer"===this.type&&"number"==typeof this.options.length)t=this.options.length;else if("array"===this.type&&"number"==typeof this.options.length){var p=NaN;"string"==typeof this.options.type?p=i[this.options.type]:this.options.type instanceof e&&(p=this.options.type.sizeOf()),t=this.options.length*p}else"seek"===this.type?t=this.options.length:"nest"===this.type?t=this.options.type.sizeOf():this.type||(t=0);return this.next&&(t+=this.next.sizeOf()),t},e.prototype.parse=function(e){return this.compiled||this.compile(),this.compiled(e,this.constructorFn)},e.prototype.setNextParser=function(t,p,r){var o=new e;return o.type=t,o.varName=p,o.options=r||o.options,o.endian=this.endian,this.head?this.head.next=o:this.next=o,this.head=o,this},e.prototype.generate=function(e){if(this.type){switch(this.type){case"uint8":case"uint16le":case"uint16be":case"uint32le":case"uint32be":case"int8":case"int16le":case"int16be":case"int32le":case"int32be":case"int64be":case"int64le":case"uint64be":case"uint64le":case"floatle":case"floatbe":case"doublele":case"doublebe":this.primitiveGenerateN(this.type,e);break;case"bit":this.generateBit(e);break;case"string":this.generateString(e);break;case"buffer":this.generateBuffer(e);break;case"seek":this.generateSeek(e);break;case"nest":this.generateNest(e);break;case"array":this.generateArray(e);break;case"choice":this.generateChoice(e);break;case"pointer":this.generatePointer(e);break;case"saveOffset":this.generateSaveOffset(e)}this.generateAssert(e)}var t=e.generateVariable(this.varName);return this.options.formatter&&this.generateFormatter(e,t,this.options.formatter),this.generateNext(e)},e.prototype.generateAssert=function(e){if(this.options.assert){var t=e.generateVariable(this.varName);switch(typeof this.options.assert){case"function":var p=e.addImport(this.options.assert);e.pushCode("if (!"+p+".call(vars, "+t+")) {");break;case"number":e.pushCode("if ("+this.options.assert+" !== "+t+") {");break;case"string":e.pushCode('if ("'+this.options.assert+'" !== '+t+") {");break;default:throw new Error("Assert option supports only strings, numbers and assert functions.")}e.generateError('"Assert error: '+t+' is " + '+this.options.assert),e.pushCode("}")}},e.prototype.generateNext=function(e){return this.next&&(e=this.next.generate(e)),e},e.prototype.generateBit=function(e){var t=JSON.parse(JSON.stringify(this));if(t.varName=e.generateVariable(t.varName),e.bitFields.push(t),!this.next||this.next&&["bit","nest"].indexOf(this.next.type)<0){var p=0;e.bitFields.forEach((function(e){return p+=e.options.length}));var r=e.generateTmpVariable();if(p<=8)e.pushCode("var "+r+" = dataView.getUint8(offset);"),p=8;else if(p<=16)e.pushCode("var "+r+" = dataView.getUint16(offset);"),p=16;else if(p<=24){var o=e.generateTmpVariable(),i=e.generateTmpVariable();e.pushCode("var "+o+" = dataView.getUint16(offset);"),e.pushCode("var "+i+" = dataView.getUint8(offset + 2);"),e.pushCode("var "+r+" = ("+o+" << 8) | "+i+";"),p=24}else{if(!(p<=32))throw new Error("Currently, bit field sequence longer than 4-bytes is not supported.");e.pushCode("var "+r+" = dataView.getUint32(offset);"),p=32}e.pushCode("offset += "+p/8+";");var s=0,n="be"===this.endian;e.bitFields.forEach((function(t){var o=t.options.length,i=n?p-s-o:s,a=(1<> "+i+" & "+a+";"),s+=o})),e.bitFields=[]}},e.prototype.generateSeek=function(e){var t=e.generateOption(this.options.length);e.pushCode("offset += "+t+";")},e.prototype.generateString=function(e){var t=e.generateVariable(this.varName),p=e.generateTmpVariable(),r=this.options.encoding,o="hex"===r.toLowerCase(),i='b => b.toString(16).padStart(2, "0")';if(this.options.length&&this.options.zeroTerminated){var s=this.options.length;e.pushCode("var "+p+" = offset;"),e.pushCode("while(dataView.getUint8(offset++) !== 0 && offset - "+p+" < "+s+");");var n="offset - "+p+" < "+s+" ? offset - 1 : offset";e.pushCode(o?t+" = Array.from(buffer.subarray("+p+", "+n+"), "+i+").join('');":t+" = new TextDecoder('"+r+"').decode(buffer.subarray("+p+", "+n+"));")}else if(this.options.length){s=e.generateOption(this.options.length);e.pushCode(o?t+" = Array.from(buffer.subarray(offset, offset + "+s+"), "+i+").join('');":t+" = new TextDecoder('"+r+"').decode(buffer.subarray(offset, offset + "+s+"));"),e.pushCode("offset += "+s+";")}else this.options.zeroTerminated?(e.pushCode("var "+p+" = offset;"),e.pushCode("while(dataView.getUint8(offset++) !== 0);"),e.pushCode(o?t+" = Array.from(buffer.subarray("+p+", offset - 1)), "+i+").join('');":t+" = new TextDecoder('"+r+"').decode(buffer.subarray("+p+", offset - 1));")):this.options.greedy&&(e.pushCode("var "+p+" = offset;"),e.pushCode("while(buffer.length > offset++);"),e.pushCode(o?t+" = Array.from(buffer.subarray("+p+", offset)), "+i+").join('');":t+" = new TextDecoder('"+r+"').decode(buffer.subarray("+p+", offset));"));this.options.stripNull&&e.pushCode(t+" = "+t+".replace(/\\x00+$/g, '')")},e.prototype.generateBuffer=function(e){var t=e.generateVariable(this.varName);if("function"==typeof this.options.readUntil){var p=this.options.readUntil,r=e.generateTmpVariable(),o=e.generateTmpVariable();e.pushCode("var "+r+" = offset;"),e.pushCode("var "+o+" = 0;"),e.pushCode("while (offset < buffer.length) {"),e.pushCode(o+" = dataView.getUint8(offset);");var i=e.addImport(p);e.pushCode("if ("+i+".call(this, "+o+", buffer.subarray(offset))) break;"),e.pushCode("offset += 1;"),e.pushCode("}"),e.pushCode(t+" = buffer.subarray("+r+", offset);")}else if("eof"===this.options.readUntil)e.pushCode(t+" = buffer.subarray(offset);");else{var s=e.generateOption(this.options.length);e.pushCode(t+" = buffer.subarray(offset, offset + "+s+");"),e.pushCode("offset += "+s+";")}this.options.clone&&e.pushCode(t+" = buffer.constructor.from("+t+");")},e.prototype.generateArray=function(t){var p=t.generateOption(this.options.length),r=t.generateOption(this.options.lengthInBytes),a=this.options.type,l=t.generateTmpVariable(),c=t.generateVariable(this.varName),u=t.generateTmpVariable(),y=this.options.key,h="string"==typeof y;if(h?t.pushCode(c+" = {};"):t.pushCode(c+" = [];"),"function"==typeof this.options.readUntil?t.pushCode("do {"):"eof"===this.options.readUntil?t.pushCode("for (var "+l+" = 0; offset < buffer.length; "+l+"++) {"):void 0!==r?t.pushCode("for (var "+l+" = offset + "+r+"; offset < "+l+"; ) {"):t.pushCode("for (var "+l+" = "+p+"; "+l+" > 0; "+l+"--) {"),"string"==typeof a)if(o[a]){var f=t.generateTmpVariable();t.pushCode("var "+f+" = ___parser_"+a+"(offset);"),t.pushCode("var "+u+" = "+f+".result; offset = "+f+".offset;"),a!==this.alias&&t.addReference(a)}else{var d=s[a],_=n[a];t.pushCode("var "+u+" = dataView.get"+d+"(offset, "+_+");"),t.pushCode("offset += "+i[a]+";")}else a instanceof e&&(t.pushCode("var "+u+" = {};"),t.pushScope(u),a.generate(t),t.popScope());if(h?t.pushCode(c+"["+u+"."+y+"] = "+u+";"):t.pushCode(c+".push("+u+");"),t.pushCode("}"),"function"==typeof this.options.readUntil){var S=this.options.readUntil,g=t.addImport(S);t.pushCode("while (!"+g+".call(this, "+u+", buffer.subarray(offset)));")}},e.prototype.generateChoiceCase=function(t,p,r){if("string"==typeof r){var a=t.generateVariable(this.varName);if(o[r]){var l=t.generateTmpVariable();t.pushCode("var "+l+" = ___parser_"+r+"(offset);"),t.pushCode(a+" = "+l+".result; offset = "+l+".offset;"),r!==this.alias&&t.addReference(r)}else{var c=s[r],u=n[r];t.pushCode(a+" = dataView.get"+c+"(offset, "+u+");"),t.pushCode("offset += "+i[r])}}else r instanceof e&&(t.pushPath(p),r.generate(t),t.popPath(p))},e.prototype.generateChoice=function(e){var t=this,p=e.generateOption(this.options.tag);this.varName&&e.pushCode(e.generateVariable(this.varName)+" = {};"),e.pushCode("switch("+p+") {"),Object.keys(this.options.choices).forEach((function(p){var r=t.options.choices[parseInt(p,10)];e.pushCode("case "+p+":"),t.generateChoiceCase(e,t.varName,r),e.pushCode("break;")})),e.pushCode("default:"),this.options.defaultChoice?this.generateChoiceCase(e,this.varName,this.options.defaultChoice):e.generateError('"Met undefined tag value " + '+p+' + " at choice"'),e.pushCode("}")},e.prototype.generateNest=function(t){var p=t.generateVariable(this.varName);if(this.options.type instanceof e)this.varName&&t.pushCode(p+" = {};"),t.pushPath(this.varName),this.options.type.generate(t),t.popPath(this.varName);else if(o[this.options.type]){var r=t.generateTmpVariable();t.pushCode("var "+r+" = ___parser_"+this.options.type+"(offset);"),t.pushCode(p+" = "+r+".result; offset = "+r+".offset;"),this.options.type!==this.alias&&t.addReference(this.options.type)}},e.prototype.generateFormatter=function(e,t,p){if("function"==typeof p){var r=e.addImport(p);e.pushCode(t+" = "+r+".call(this, "+t+");")}},e.prototype.generatePointer=function(t){var p=this.options.type,r=t.generateOption(this.options.offset),a=t.generateTmpVariable(),l=t.generateVariable(this.varName);if(t.pushCode("var "+a+" = offset;"),t.pushCode("offset = "+r+";"),this.options.type instanceof e)t.pushCode(l+" = {};"),t.pushPath(this.varName),this.options.type.generate(t),t.popPath(this.varName);else if(o[this.options.type]){var c=t.generateTmpVariable();t.pushCode("var "+c+" = ___parser_"+this.options.type+"(offset);"),t.pushCode(l+" = "+c+".result; offset = "+c+".offset;"),this.options.type!==this.alias&&t.addReference(this.options.type)}else if(Object.keys(i).indexOf(this.options.type)>=0){var u=s[p],y=n[p];t.pushCode(l+" = dataView.get"+u+"(offset, "+y+");"),t.pushCode("offset += "+i[p]+";")}t.pushCode("offset = "+a+";")},e.prototype.generateSaveOffset=function(e){var t=e.generateVariable(this.varName);e.pushCode(t+" = offset")},e}();t.Parser=a},function(e,t,p){(function(e,r){var o=/%[sdj%]/g;t.format=function(e){if(!S(e)){for(var t=[],p=0;p=i)return e;switch(e){case"%s":return String(r[p++]);case"%d":return Number(r[p++]);case"%j":try{return JSON.stringify(r[p++])}catch(e){return"[Circular]"}default:return e}})),a=r[p];p=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),f(p)?r.showHidden=p:p&&t._extend(r,p),g(r.showHidden)&&(r.showHidden=!1),g(r.depth)&&(r.depth=2),g(r.colors)&&(r.colors=!1),g(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=a),c(r,e,r.depth)}function a(e,t){var p=n.styles[t];return p?"["+n.colors[p][0]+"m"+e+"["+n.colors[p][1]+"m":e}function l(e,t){return e}function c(e,p,r){if(e.customInspect&&p&&I(p.inspect)&&p.inspect!==t.inspect&&(!p.constructor||p.constructor.prototype!==p)){var o=p.inspect(r,e);return S(o)||(o=c(e,o,r)),o}var i=function(e,t){if(g(t))return e.stylize("undefined","undefined");if(S(t)){var p="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(p,"string")}if(_(t))return e.stylize(""+t,"number");if(f(t))return e.stylize(""+t,"boolean");if(d(t))return e.stylize("null","null")}(e,p);if(i)return i;var s=Object.keys(p),n=function(e){var t={};return e.forEach((function(e,p){t[e]=!0})),t}(s);if(e.showHidden&&(s=Object.getOwnPropertyNames(p)),b(p)&&(s.indexOf("message")>=0||s.indexOf("description")>=0))return u(p);if(0===s.length){if(I(p)){var a=p.name?": "+p.name:"";return e.stylize("[Function"+a+"]","special")}if(w(p))return e.stylize(RegExp.prototype.toString.call(p),"regexp");if(m(p))return e.stylize(Date.prototype.toString.call(p),"date");if(b(p))return u(p)}var l,E="",L=!1,T=["{","}"];(h(p)&&(L=!0,T=["[","]"]),I(p))&&(E=" [Function"+(p.name?": "+p.name:"")+"]");return w(p)&&(E=" "+RegExp.prototype.toString.call(p)),m(p)&&(E=" "+Date.prototype.toUTCString.call(p)),b(p)&&(E=" "+u(p)),0!==s.length||L&&0!=p.length?r<0?w(p)?e.stylize(RegExp.prototype.toString.call(p),"regexp"):e.stylize("[Object]","special"):(e.seen.push(p),l=L?function(e,t,p,r,o){for(var i=[],s=0,n=t.length;s=0&&0,e+t.replace(/\u001b\[\d\d?m/g,"").length+1}),0)>60)return p[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+p[1];return p[0]+t+" "+e.join(", ")+" "+p[1]}(l,E,T)):T[0]+E+T[1]}function u(e){return"["+Error.prototype.toString.call(e)+"]"}function y(e,t,p,r,o,i){var s,n,a;if((a=Object.getOwnPropertyDescriptor(t,o)||{value:t[o]}).get?n=a.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):a.set&&(n=e.stylize("[Setter]","special")),M(r,o)||(s="["+o+"]"),n||(e.seen.indexOf(a.value)<0?(n=d(p)?c(e,a.value,null):c(e,a.value,p-1)).indexOf("\n")>-1&&(n=i?n.split("\n").map((function(e){return" "+e})).join("\n").substr(2):"\n"+n.split("\n").map((function(e){return" "+e})).join("\n")):n=e.stylize("[Circular]","special")),g(s)){if(i&&o.match(/^\d+$/))return n;(s=JSON.stringify(""+o)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+n}function h(e){return Array.isArray(e)}function f(e){return"boolean"==typeof e}function d(e){return null===e}function _(e){return"number"==typeof e}function S(e){return"string"==typeof e}function g(e){return void 0===e}function w(e){return E(e)&&"[object RegExp]"===L(e)}function E(e){return"object"==typeof e&&null!==e}function m(e){return E(e)&&"[object Date]"===L(e)}function b(e){return E(e)&&("[object Error]"===L(e)||e instanceof Error)}function I(e){return"function"==typeof e}function L(e){return Object.prototype.toString.call(e)}function T(e){return e<10?"0"+e.toString(10):e.toString(10)}t.debuglog=function(e){if(g(i)&&(i=r.env.NODE_DEBUG||""),e=e.toUpperCase(),!s[e])if(new RegExp("\\b"+e+"\\b","i").test(i)){var p=r.pid;s[e]=function(){var r=t.format.apply(t,arguments);console.error("%s %d: %s",e,p,r)}}else s[e]=function(){};return s[e]},t.inspect=n,n.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},n.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},t.isArray=h,t.isBoolean=f,t.isNull=d,t.isNullOrUndefined=function(e){return null==e},t.isNumber=_,t.isString=S,t.isSymbol=function(e){return"symbol"==typeof e},t.isUndefined=g,t.isRegExp=w,t.isObject=E,t.isDate=m,t.isError=b,t.isFunction=I,t.isPrimitive=function(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||void 0===e},t.isBuffer=p(29);var v=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function U(){var e=new Date,t=[T(e.getHours()),T(e.getMinutes()),T(e.getSeconds())].join(":");return[e.getDate(),v[e.getMonth()],t].join(" ")}function M(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.log=function(){console.log("%s - %s",U(),t.format.apply(t,arguments))},t.inherits=p(6),t._extend=function(e,t){if(!t||!E(t))return e;for(var p=Object.keys(t),r=p.length;r--;)e[p[r]]=t[p[r]];return e}}).call(this,p(5),p(9))},function(e,t,p){"use strict";(function(t,r){var o=p(11);e.exports=w;var i,s=p(16);w.ReadableState=g;p(13).EventEmitter;var n=function(e,t){return e.listeners(t).length},a=p(20),l=p(12).Buffer,c=t.Uint8Array||function(){};var u=p(10);u.inherits=p(6);var y=p(32),h=void 0;h=y&&y.debuglog?y.debuglog("stream"):function(){};var f,d=p(33),_=p(21);u.inherits(w,a);var S=["error","close","destroy","pause","resume"];function g(e,t){e=e||{};var r=t instanceof(i=i||p(7));this.objectMode=!!e.objectMode,r&&(this.objectMode=this.objectMode||!!e.readableObjectMode);var o=e.highWaterMark,s=e.readableHighWaterMark,n=this.objectMode?16:16384;this.highWaterMark=o||0===o?o:r&&(s||0===s)?s:n,this.highWaterMark=Math.floor(this.highWaterMark),this.buffer=new d,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.destroyed=!1,this.defaultEncoding=e.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(f||(f=p(22).StringDecoder),this.decoder=new f(e.encoding),this.encoding=e.encoding)}function w(e){if(i=i||p(7),!(this instanceof w))return new w(e);this._readableState=new g(e,this),this.readable=!0,e&&("function"==typeof e.read&&(this._read=e.read),"function"==typeof e.destroy&&(this._destroy=e.destroy)),a.call(this)}function E(e,t,p,r,o){var i,s=e._readableState;null===t?(s.reading=!1,function(e,t){if(t.ended)return;if(t.decoder){var p=t.decoder.end();p&&p.length&&(t.buffer.push(p),t.length+=t.objectMode?1:p.length)}t.ended=!0,I(e)}(e,s)):(o||(i=function(e,t){var p;r=t,l.isBuffer(r)||r instanceof c||"string"==typeof t||void 0===t||e.objectMode||(p=new TypeError("Invalid non-string/buffer chunk"));var r;return p}(s,t)),i?e.emit("error",i):s.objectMode||t&&t.length>0?("string"==typeof t||s.objectMode||Object.getPrototypeOf(t)===l.prototype||(t=function(e){return l.from(e)}(t)),r?s.endEmitted?e.emit("error",new Error("stream.unshift() after end event")):m(e,s,t,!0):s.ended?e.emit("error",new Error("stream.push() after EOF")):(s.reading=!1,s.decoder&&!p?(t=s.decoder.write(t),s.objectMode||0!==t.length?m(e,s,t,!1):T(e,s)):m(e,s,t,!1))):r||(s.reading=!1));return function(e){return!e.ended&&(e.needReadable||e.lengtht.highWaterMark&&(t.highWaterMark=function(e){return e>=8388608?e=8388608:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function I(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(h("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?o.nextTick(L,e):L(e))}function L(e){h("emit readable"),e.emit("readable"),D(e)}function T(e,t){t.readingMore||(t.readingMore=!0,o.nextTick(v,e,t))}function v(e,t){for(var p=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length=t.length?(p=t.decoder?t.buffer.join(""):1===t.buffer.length?t.buffer.head.data:t.buffer.concat(t.length),t.buffer.clear()):p=function(e,t,p){var r;ei.length?i.length:e;if(s===i.length?o+=i:o+=i.slice(0,e),0===(e-=s)){s===i.length?(++r,p.next?t.head=p.next:t.head=t.tail=null):(t.head=p,p.data=i.slice(s));break}++r}return t.length-=r,o}(e,t):function(e,t){var p=l.allocUnsafe(e),r=t.head,o=1;r.data.copy(p),e-=r.data.length;for(;r=r.next;){var i=r.data,s=e>i.length?i.length:e;if(i.copy(p,p.length-e,0,s),0===(e-=s)){s===i.length?(++o,r.next?t.head=r.next:t.head=t.tail=null):(t.head=r,r.data=i.slice(s));break}++o}return t.length-=o,p}(e,t);return r}(e,t.buffer,t.decoder),p);var p}function G(e){var t=e._readableState;if(t.length>0)throw new Error('"endReadable()" called on non-empty stream');t.endEmitted||(t.ended=!0,o.nextTick(A,t,e))}function A(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function C(e,t){for(var p=0,r=e.length;p=t.highWaterMark||t.ended))return h("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?G(this):I(this),null;if(0===(e=b(e,t))&&t.ended)return 0===t.length&&G(this),null;var r,o=t.needReadable;return h("need readable",o),(0===t.length||t.length-e0?O(e,t):null)?(t.needReadable=!0,e=0):t.length-=e,0===t.length&&(t.ended||(t.needReadable=!0),p!==e&&t.ended&&G(this)),null!==r&&this.emit("data",r),r},w.prototype._read=function(e){this.emit("error",new Error("_read() is not implemented"))},w.prototype.pipe=function(e,t){var p=this,i=this._readableState;switch(i.pipesCount){case 0:i.pipes=e;break;case 1:i.pipes=[i.pipes,e];break;default:i.pipes.push(e)}i.pipesCount+=1,h("pipe count=%d opts=%j",i.pipesCount,t);var a=(!t||!1!==t.end)&&e!==r.stdout&&e!==r.stderr?c:w;function l(t,r){h("onunpipe"),t===p&&r&&!1===r.hasUnpiped&&(r.hasUnpiped=!0,h("cleanup"),e.removeListener("close",S),e.removeListener("finish",g),e.removeListener("drain",u),e.removeListener("error",_),e.removeListener("unpipe",l),p.removeListener("end",c),p.removeListener("end",w),p.removeListener("data",d),y=!0,!i.awaitDrain||e._writableState&&!e._writableState.needDrain||u())}function c(){h("onend"),e.end()}i.endEmitted?o.nextTick(a):p.once("end",a),e.on("unpipe",l);var u=function(e){return function(){var t=e._readableState;h("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&n(e,"data")&&(t.flowing=!0,D(e))}}(p);e.on("drain",u);var y=!1;var f=!1;function d(t){h("ondata"),f=!1,!1!==e.write(t)||f||((1===i.pipesCount&&i.pipes===e||i.pipesCount>1&&-1!==C(i.pipes,e))&&!y&&(h("false write response, pause",p._readableState.awaitDrain),p._readableState.awaitDrain++,f=!0),p.pause())}function _(t){h("onerror",t),w(),e.removeListener("error",_),0===n(e,"error")&&e.emit("error",t)}function S(){e.removeListener("finish",g),w()}function g(){h("onfinish"),e.removeListener("close",S),w()}function w(){h("unpipe"),p.unpipe(e)}return p.on("data",d),function(e,t,p){if("function"==typeof e.prependListener)return e.prependListener(t,p);e._events&&e._events[t]?s(e._events[t])?e._events[t].unshift(p):e._events[t]=[p,e._events[t]]:e.on(t,p)}(e,"error",_),e.once("close",S),e.once("finish",g),e.emit("pipe",p),i.flowing||(h("pipe resume"),p.resume()),e},w.prototype.unpipe=function(e){var t=this._readableState,p={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes||(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this,p)),this;if(!e){var r=t.pipes,o=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var i=0;i>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function n(e){var t=this.lastTotal-this.lastNeed,p=function(e,t,p){if(128!=(192&t[0]))return e.lastNeed=0,"�";if(e.lastNeed>1&&t.length>1){if(128!=(192&t[1]))return e.lastNeed=1,"�";if(e.lastNeed>2&&t.length>2&&128!=(192&t[2]))return e.lastNeed=2,"�"}}(this,e);return void 0!==p?p:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,t,0,e.length),void(this.lastNeed-=e.length))}function a(e,t){if((e.length-t)%2==0){var p=e.toString("utf16le",t);if(p){var r=p.charCodeAt(p.length-1);if(r>=55296&&r<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],p.slice(0,-1)}return p}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString("utf16le",t,e.length-1)}function l(e){var t=e&&e.length?this.write(e):"";if(this.lastNeed){var p=this.lastTotal-this.lastNeed;return t+this.lastChar.toString("utf16le",0,p)}return t}function c(e,t){var p=(e.length-t)%3;return 0===p?e.toString("base64",t):(this.lastNeed=3-p,this.lastTotal=3,1===p?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString("base64",t,e.length-p))}function u(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function y(e){return e.toString(this.encoding)}function h(e){return e&&e.length?this.write(e):""}t.StringDecoder=i,i.prototype.write=function(e){if(0===e.length)return"";var t,p;if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return"";p=this.lastNeed,this.lastNeed=0}else p=0;return p=0)return o>0&&(e.lastNeed=o-1),o;if(--r=0)return o>0&&(e.lastNeed=o-2),o;if(--r=0)return o>0&&(2===o?o=0:e.lastNeed=o-3),o;return 0}(this,e,t);if(!this.lastNeed)return e.toString("utf8",t);this.lastTotal=p;var r=e.length-(p-this.lastNeed);return e.copy(this.lastChar,0,r),e.toString("utf8",t,r)},i.prototype.fillLast=function(e){if(this.lastNeed<=e.length)return e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,e.length),this.lastNeed-=e.length}},function(e,t,p){"use strict";e.exports=s;var r=p(7),o=p(10);function i(e,t){var p=this._transformState;p.transforming=!1;var r=p.writecb;if(!r)return this.emit("error",new Error("write callback called multiple times"));p.writechunk=null,p.writecb=null,null!=t&&this.push(t),r(e);var o=this._readableState;o.reading=!1,(o.needReadable||o.length>8&255^255&p],t&=65535;return t}r.exports={preambleByte:85,crc16:S,sbpIdTable:h,sbpMessageTypesTable:f,decode:function(e){var t=d.parse(e),p=h[t.msg_type];return void 0===p?(console.log("Unknown message type: ",t.msg_type),new s(t)):new p(t)},dispatch:function(t,p,o){var i,s,n=new e(0);if(void 0===o&&"function"==typeof p?i=p:(i=o,s=p),s&&!Array.isArray(s)&&-1===["function","number"].indexOf(typeof s))throw l("dispatch: messageWhitelist must be function, number, or array");var a=function(p){t.pause();try{if((n=e.concat([n,p])).length<2)return;var o=function(){var e,t,p,o,i,a,l;for(l=0;ln.length)throw new c;e=n.slice(l+1,l+6),p=n.readUInt16LE(l+1),_=n.readUInt16LE(l+3),o=n.readUInt8(l+5);var y=s&&Array.isArray(s)&&-1!==s.indexOf(p),h=s&&"number"==typeof s&&s&p,f=s&&"function"==typeof s&&s(p);if(s&&!(y||h||f))return n=n.slice(l+6+o+2),null;if(l+8+o>n.length)throw new c;a=S(n.slice(l+6,l+6+o),S(e)),i=n.readUInt16LE(l+6+o);var d=n.slice(l,l+6+o+2);if(i===a)return n=n.slice(l+6+o+2),[r.exports.decode(d),d];throw n=n.slice(l+1),new u}();if(null===o)return;var l=o[0],y=o[1];i(null,l,y)}catch(e){if(!(e instanceof c||e instanceof u))throw e}finally{t.resume(),n.length>0&&setTimeout((function(){a(new e(0))}),0)}};t.on("data",a)}},function(e){var p={function:!0,object:!0},i=p[typeof window]&&window||this,s=p[typeof t]&&t&&!t.nodeType&&t,n=p[typeof r]&&r&&!r.nodeType&&r,a=s&&n&&"object"==typeof o&&o;!a||a.global!==a&&a.window!==a&&a.self!==a||(i=a),i.SBP=e}(r.exports)}).call(this,p(8).Buffer,p(27)(e),p(5))},function(e,t,p){"use strict";t.byteLength=function(e){var t=l(e),p=t[0],r=t[1];return 3*(p+r)/4-r},t.toByteArray=function(e){for(var t,p=l(e),r=p[0],s=p[1],n=new i(function(e,t,p){return 3*(t+p)/4-p}(0,r,s)),a=0,c=s>0?r-4:r,u=0;u>16&255,n[a++]=t>>8&255,n[a++]=255&t;2===s&&(t=o[e.charCodeAt(u)]<<2|o[e.charCodeAt(u+1)]>>4,n[a++]=255&t);1===s&&(t=o[e.charCodeAt(u)]<<10|o[e.charCodeAt(u+1)]<<4|o[e.charCodeAt(u+2)]>>2,n[a++]=t>>8&255,n[a++]=255&t);return n},t.fromByteArray=function(e){for(var t,p=e.length,o=p%3,i=[],s=0,n=p-o;sn?n:s+16383));1===o?(t=e[p-1],i.push(r[t>>2]+r[t<<4&63]+"==")):2===o&&(t=(e[p-2]<<8)+e[p-1],i.push(r[t>>10]+r[t>>4&63]+r[t<<2&63]+"="));return i.join("")};for(var r=[],o=[],i="undefined"!=typeof Uint8Array?Uint8Array:Array,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n=0,a=s.length;n0)throw new Error("Invalid string. Length must be a multiple of 4");var p=e.indexOf("=");return-1===p&&(p=t),[p,p===t?0:4-p%4]}function c(e,t,p){for(var o,i,s=[],n=t;n>18&63]+r[i>>12&63]+r[i>>6&63]+r[63&i]);return s.join("")}o["-".charCodeAt(0)]=62,o["_".charCodeAt(0)]=63},function(e,t){t.read=function(e,t,p,r,o){var i,s,n=8*o-r-1,a=(1<>1,c=-7,u=p?o-1:0,y=p?-1:1,h=e[t+u];for(u+=y,i=h&(1<<-c)-1,h>>=-c,c+=n;c>0;i=256*i+e[t+u],u+=y,c-=8);for(s=i&(1<<-c)-1,i>>=-c,c+=r;c>0;s=256*s+e[t+u],u+=y,c-=8);if(0===i)i=1-l;else{if(i===a)return s?NaN:1/0*(h?-1:1);s+=Math.pow(2,r),i-=l}return(h?-1:1)*s*Math.pow(2,i-r)},t.write=function(e,t,p,r,o,i){var s,n,a,l=8*i-o-1,c=(1<>1,y=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:i-1,f=r?1:-1,d=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(n=isNaN(t)?1:0,s=c):(s=Math.floor(Math.log(t)/Math.LN2),t*(a=Math.pow(2,-s))<1&&(s--,a*=2),(t+=s+u>=1?y/a:y*Math.pow(2,1-u))*a>=2&&(s++,a/=2),s+u>=c?(n=0,s=c):s+u>=1?(n=(t*a-1)*Math.pow(2,o),s+=u):(n=t*Math.pow(2,u-1)*Math.pow(2,o),s=0));o>=8;e[p+h]=255&n,h+=f,n/=256,o-=8);for(s=s<0;e[p+h]=255&s,h+=f,s/=256,l-=8);e[p+h-f]|=128*d}},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Context=void 0;var r=function(){function e(e){this.code="",this.scopes=[["vars"]],this.bitFields=[],this.tmpVariableCount=0,this.references={},this.imports=[],this.reverseImports=new Map,this.importPath=e}return e.prototype.generateVariable=function(e){var t=[],p=this.scopes[this.scopes.length-1];return t.push.apply(t,p),e&&t.push(e),t.join(".")},e.prototype.generateOption=function(e){switch(typeof e){case"number":return e.toString();case"string":return this.generateVariable(e);case"function":return this.addImport(e)+".call("+this.generateVariable()+", vars)"}},e.prototype.generateError=function(e){this.pushCode("throw new Error("+e+");")},e.prototype.generateTmpVariable=function(){return"$tmp"+this.tmpVariableCount++},e.prototype.pushCode=function(e){this.code+=e+"\n"},e.prototype.pushPath=function(e){e&&this.scopes[this.scopes.length-1].push(e)},e.prototype.popPath=function(e){e&&this.scopes[this.scopes.length-1].pop()},e.prototype.pushScope=function(e){this.scopes.push([e])},e.prototype.popScope=function(){this.scopes.pop()},e.prototype.addImport=function(e){if(!this.importPath)return"("+e+")";var t=this.reverseImports.get(e);return t||(t=this.imports.push(e)-1,this.reverseImports.set(e,t)),this.importPath+"["+t+"]"},e.prototype.addReference=function(e){this.references[e]||(this.references[e]={resolved:!1,requested:!1})},e.prototype.markResolved=function(e){this.references[e].resolved=!0},e.prototype.markRequested=function(e){var t=this;e.forEach((function(e){t.references[e].requested=!0}))},e.prototype.getUnresolvedReferences=function(){var e=this.references;return Object.keys(this.references).filter((function(t){return!e[t].resolved&&!e[t].requested}))},e}();t.Context=r},function(e,t){e.exports=function(e){return e&&"object"==typeof e&&"function"==typeof e.copy&&"function"==typeof e.fill&&"function"==typeof e.readUInt8}},function(e,t,p){(function(e){function p(e,t){for(var p=0,r=e.length-1;r>=0;r--){var o=e[r];"."===o?e.splice(r,1):".."===o?(e.splice(r,1),p++):p&&(e.splice(r,1),p--)}if(t)for(;p--;p)e.unshift("..");return e}var r=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,o=function(e){return r.exec(e).slice(1)};function i(e,t){if(e.filter)return e.filter(t);for(var p=[],r=0;r=-1&&!r;o--){var s=o>=0?arguments[o]:e.cwd();if("string"!=typeof s)throw new TypeError("Arguments to path.resolve must be strings");s&&(t=s+"/"+t,r="/"===s.charAt(0))}return(r?"/":"")+(t=p(i(t.split("/"),(function(e){return!!e})),!r).join("/"))||"."},t.normalize=function(e){var r=t.isAbsolute(e),o="/"===s(e,-1);return(e=p(i(e.split("/"),(function(e){return!!e})),!r).join("/"))||r||(e="."),e&&o&&(e+="/"),(r?"/":"")+e},t.isAbsolute=function(e){return"/"===e.charAt(0)},t.join=function(){var e=Array.prototype.slice.call(arguments,0);return t.normalize(i(e,(function(e,t){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e})).join("/"))},t.relative=function(e,p){function r(e){for(var t=0;t=0&&""===e[p];p--);return t>p?[]:e.slice(t,p-t+1)}e=t.resolve(e).substr(1),p=t.resolve(p).substr(1);for(var o=r(e.split("/")),i=r(p.split("/")),s=Math.min(o.length,i.length),n=s,a=0;a0?this.tail.next=t:this.head=t,this.tail=t,++this.length},e.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},e.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},e.prototype.clear=function(){this.head=this.tail=null,this.length=0},e.prototype.join=function(e){if(0===this.length)return"";for(var t=this.head,p=""+t.data;t=t.next;)p+=e+t.data;return p},e.prototype.concat=function(e){if(0===this.length)return r.alloc(0);if(1===this.length)return this.head.data;for(var t=r.allocUnsafe(e>>>0),p=this.head,o=0;p;)i(p.data,t,o),o+=p.data.length,p=p.next;return t},e}(),o&&o.inspect&&o.inspect.custom&&(e.exports.prototype[o.inspect.custom]=function(){var e=o.inspect({length:this.length});return this.constructor.name+" "+e})},function(e,t){},function(e,t,p){(function(e){var r=void 0!==e&&e||"undefined"!=typeof self&&self||window,o=Function.prototype.apply;function i(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new i(o.call(setTimeout,r,arguments),clearTimeout)},t.setInterval=function(){return new i(o.call(setInterval,r,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},i.prototype.unref=i.prototype.ref=function(){},i.prototype.close=function(){this._clearFn.call(r,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},p(36),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,p(5))},function(e,t,p){(function(e,t){!function(e,p){"use strict";if(!e.setImmediate){var r,o,i,s,n,a=1,l={},c=!1,u=e.document,y=Object.getPrototypeOf&&Object.getPrototypeOf(e);y=y&&y.setTimeout?y:e,"[object process]"==={}.toString.call(e.process)?r=function(e){t.nextTick((function(){f(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,p=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=p,t}}()?e.MessageChannel?((i=new MessageChannel).port1.onmessage=function(e){f(e.data)},r=function(e){i.port2.postMessage(e)}):u&&"onreadystatechange"in u.createElement("script")?(o=u.documentElement,r=function(e){var t=u.createElement("script");t.onreadystatechange=function(){f(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):r=function(e){setTimeout(f,0,e)}:(s="setImmediate$"+Math.random()+"$",n=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(s)&&f(+t.data.slice(s.length))},e.addEventListener?e.addEventListener("message",n,!1):e.attachEvent("onmessage",n),r=function(t){e.postMessage(s+t,"*")}),y.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),p=0;p * @license MIT */ -function r(e,t){if(e===t)return 0;for(var p=e.length,r=t.length,o=0,i=Math.min(p,r);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],p,r))return!1;return!0}(e,t,p,s))}return p?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,p,r){var o;if("function"!=typeof t)throw new TypeError('"block" argument must be a function');"string"==typeof p&&(r=p,p=null),o=function(e){var t;try{e()}catch(e){t=e}return t}(t),r=(p&&p.name?" ("+p.name+").":".")+(r?" "+r:"."),e&&!o&&_(o,p,"Missing expected exception"+r);var s="string"==typeof r,n=!e&&o&&!p;if((!e&&i.isError(o)&&s&&E(o,p)||n)&&_(o,p,"Got unwanted exception"+r),e&&o&&p&&!E(o,p)||!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 p=new Error;if(p.stack){var r=p.stack,o=h(t),i=r.indexOf("\n"+o);if(i>=0){var s=r.indexOf("\n",i+1);r=r.substring(s+1)}this.stack=r}}},i.inherits(u.AssertionError,Error),u.fail=_,u.ok=S,u.equal=function(e,t,p){e!=t&&_(e,t,p,"==",u.equal)},u.notEqual=function(e,t,p){e==t&&_(e,t,p,"!=",u.notEqual)},u.deepEqual=function(e,t,p){g(e,t,!1)||_(e,t,p,"deepEqual",u.deepEqual)},u.deepStrictEqual=function(e,t,p){g(e,t,!0)||_(e,t,p,"deepStrictEqual",u.deepStrictEqual)},u.notDeepEqual=function(e,t,p){g(e,t,!1)&&_(e,t,p,"notDeepEqual",u.notDeepEqual)},u.notDeepStrictEqual=function e(t,p,r){g(t,p,!0)&&_(t,p,r,"notDeepStrictEqual",e)},u.strictEqual=function(e,t,p){e!==t&&_(e,t,p,"===",u.strictEqual)},u.notStrictEqual=function(e,t,p){e===t&&_(e,t,p,"!==",u.notStrictEqual)},u.throws=function(e,t,p){m(!0,e,t,p)},u.doesNotThrow=function(e,t,p){m(!1,e,t,p)},u.ifError=function(e){if(e)throw e};var b=Object.keys||function(e){var t=[];for(var p in e)s.call(e,p)&&t.push(p);return t}}).call(this,p(5))},function(e,t,p){var r;!function(p){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 p=parseInt(e,t||10);return this._low=65535&p,this._high=p>>>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,p=t>>>16;return p+=this._high+e._high,this._low=65535&t,this._high=65535&p,this},o.prototype.subtract=function(e){return this.add(e.clone().negate())},o.prototype.multiply=function(e){var t,p,r=this._high,o=this._low,i=e._high,s=e._low;return t=(p=o*s)>>>16,t+=r*s,t&=65535,t+=o*i,this._low=65535&p,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(),p=-1;!this.lt(t);)t.shiftLeft(1,!0),p++;for(this.remainder=this.clone(),this._low=0,this._high=0;p>=0;p--)t.shiftRight(1),this.remainder.lt(t)||(this.remainder.subtract(t),p>=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===(r=function(){return o}.apply(t,[]))||(e.exports=r)}()},function(e,t,p){var r;!function(p){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,p,r){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,p,r)}function n(e,t,p,r){return void 0===p?(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|p,this._a48=0|r,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 p=o[t]||new s(Math.pow(t,5)),r=0,i=e.length;r=0&&(p.div(t),r[o]=p.remainder.toNumber().toString(e),p.gt(t));o--);return r[o-1]=p.toNumber().toString(e),r.join("")},s.prototype.add=function(e){var t=this._a00+e._a00,p=t>>>16,r=(p+=this._a16+e._a16)>>>16,o=(r+=this._a32+e._a32)>>>16;return o+=this._a48+e._a48,this._a00=65535&t,this._a16=65535&p,this._a32=65535&r,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,p=this._a16,r=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+=p*i)>>>16;var u=(c+=t*n)>>>16;return c&=65535,u+=(c+=p*s)>>>16,c&=65535,u+=(c+=r*i)>>>16,u+=t*e._a48,u&=65535,u+=p*n,u&=65535,u+=r*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(),p=-1;!this.lt(t);)t.shiftLeft(1,!0),p++;for(this.remainder=this.clone(),this._a00=0,this._a16=0,this._a32=0,this._a48=0;p>=0;p--)t.shiftRight(1),this.remainder.lt(t)||(this.remainder.subtract(t),p>=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 p=this._a48<<16|this._a32,r=this._a16<<16|this._a00,o=p<>>32-e,i=r<>>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 p=this._a48<<16|this._a32,r=this._a16<<16|this._a00,o=p>>>e|r<<32-e,i=r>>>e|p<<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===(r=function(){return s}.apply(t,[]))||(e.exports=r)}()},function(e,t,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,p(0).CarrierPhase,p(0).GnssSignal),s=p(0).GnssSignalDep,n=(p(0).GPSTime,p(0).GPSTimeDep,p(0).GPSTimeSec,p(0).SvId,function(e,t){return r.call(this,e),this.messageType="MSG_ACQ_RESULT",this.fields=t||this.parser.parse(e.payload),this});(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_ACQ_RESULT_DEP_C",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="MSG_ACQ_RESULT_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="MSG_ACQ_RESULT_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="AcqSvProfile",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="AcqSvProfileDep",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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]);let h=function(e,t){return r.call(this,e),this.messageType="MSG_ACQ_SV_PROFILE",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="MSG_ACQ_SV_PROFILE_DEP",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_BOOTLOADER_HANDSHAKE_REQ",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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=[];let s=function(e,t){return r.call(this,e),this.messageType="MSG_BOOTLOADER_HANDSHAKE_RESP",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_BOOTLOADER_JUMP_TO_APP",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_NAP_DEVICE_DNA_REQ",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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=[];let l=function(e,t){return r.call(this,e),this.messageType="MSG_NAP_DEVICE_DNA_RESP",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="MSG_BOOTLOADER_HANDSHAKE_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_EXT_EVENT",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_READ_REQ",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_READ_RESP",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_READ_DIR_REQ",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_READ_DIR_RESP",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_REMOVE",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_WRITE_REQ",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_WRITE_RESP",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_CONFIG_REQ",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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]);let h=function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_CONFIG_RESP",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_FLASH_PROGRAM",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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"]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_FLASH_DONE",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_FLASH_READ_REQ",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_FLASH_READ_RESP",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="MSG_FLASH_ERASE",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="MSG_STM_FLASH_LOCK_SECTOR",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="MSG_STM_FLASH_UNLOCK_SECTOR",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="MSG_STM_UNIQUE_ID_REQ",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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=[];let h=function(e,t){return r.call(this,e),this.messageType="MSG_STM_UNIQUE_ID_RESP",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="MSG_M25_FLASH_WRITE_STATUS",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_IMU_RAW",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_IMU_AUX",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,p(0).CarrierPhase,p(0).GnssSignal,p(0).GnssSignalDep,p(0).GPSTime,p(0).GPSTimeDep,p(0).GPSTimeSec,p(0).SvId,function(e,t){return r.call(this,e),this.messageType="MSG_SSR_FLAG_HIGH_LEVEL",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.prototype)).messageType="MSG_SSR_FLAG_HIGH_LEVEL",i.prototype.msg_type=3001,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little").array("stub",{type:"uint8",readUntil:"eof"}),i.prototype.fieldSpec=[],i.prototype.fieldSpec.push(["stub","array","writeUInt8",function(){return 1},null]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_FLAG_SATELLITES",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.prototype)).messageType="MSG_SSR_FLAG_SATELLITES",s.prototype.msg_type=3005,s.prototype.constructor=s,s.prototype.parser=(new o).endianess("little").array("stub",{type:"uint8",readUntil:"eof"}),s.prototype.fieldSpec=[],s.prototype.fieldSpec.push(["stub","array","writeUInt8",function(){return 1},null]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_FLAG_TROPO_GRID_POINTS",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.prototype)).messageType="MSG_SSR_FLAG_TROPO_GRID_POINTS",n.prototype.msg_type=3011,n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").array("stub",{type:"uint8",readUntil:"eof"}),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["stub","array","writeUInt8",function(){return 1},null]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_FLAG_IONO_GRID_POINTS",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.prototype)).messageType="MSG_SSR_FLAG_IONO_GRID_POINTS",a.prototype.msg_type=3015,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").array("stub",{type:"uint8",readUntil:"eof"}),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["stub","array","writeUInt8",function(){return 1},null]);let l=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_FLAG_IONO_TILE_SAT_LOS",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.prototype)).messageType="MSG_SSR_FLAG_IONO_TILE_SAT_LOS",l.prototype.msg_type=3021,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").array("stub",{type:"uint8",readUntil:"eof"}),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["stub","array","writeUInt8",function(){return 1},null]);let c=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.prototype)).messageType="MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS",c.prototype.msg_type=3025,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").array("stub",{type:"uint8",readUntil:"eof"}),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["stub","array","writeUInt8",function(){return 1},null]),e.exports={3001:i,MsgSsrFlagHighLevel:i,3005:s,MsgSsrFlagSatellites:s,3011:n,MsgSsrFlagTropoGridPoints:n,3015:a,MsgSsrFlagIonoGridPoints:a,3021:l,MsgSsrFlagIonoTileSatLos:l,3025:c,MsgSsrFlagIonoGridPointSatLos:c}},function(e,t,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_CPU_STATE_DEP_A",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_MEM_STATE_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_SYS_STATE_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_PROCESS_SOCKET_COUNTS",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_PROCESS_SOCKET_QUEUES",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_SOCKET_USAGE",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_PROCESS_FD_COUNT",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_PROCESS_FD_SUMMARY",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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]);let h=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_CPU_STATE",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_MEM_STATE",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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]);let d=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_SYS_STATE",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_LOG",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_FWD",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_PRINT_DEP",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_MAG_RAW",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_GPS_TIME",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_GPS_TIME_GNSS",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_UTC_TIME",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_UTC_TIME_GNSS",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="MSG_DOPS",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="MSG_POS_ECEF",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="MSG_POS_ECEF_COV",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="MSG_POS_LLH",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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]);let h=function(e,t){return r.call(this,e),this.messageType="MSG_POS_LLH_COV",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="EstimatedHorizontalErrorEllipse",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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]);let d=function(e,t){return r.call(this,e),this.messageType="MSG_POS_LLH_ACC",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(r.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]);let _=function(e,t){return r.call(this,e),this.messageType="MSG_BASELINE_ECEF",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(r.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]);let S=function(e,t){return r.call(this,e),this.messageType="MSG_BASELINE_NED",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(r.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]);let g=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_ECEF",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(r.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]);let w=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_ECEF_COV",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(r.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]);let E=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_NED",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(r.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]);let m=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_NED_COV",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(r.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]);let b=function(e,t){return r.call(this,e),this.messageType="MSG_POS_ECEF_GNSS",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(r.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]);let I=function(e,t){return r.call(this,e),this.messageType="MSG_POS_ECEF_COV_GNSS",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(r.prototype)).messageType="MSG_POS_ECEF_COV_GNSS",I.prototype.msg_type=564,I.prototype.constructor=I,I.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"),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),I.prototype.fieldSpec.push(["x","writeDoubleLE",8]),I.prototype.fieldSpec.push(["y","writeDoubleLE",8]),I.prototype.fieldSpec.push(["z","writeDoubleLE",8]),I.prototype.fieldSpec.push(["cov_x_x","writeFloatLE",4]),I.prototype.fieldSpec.push(["cov_x_y","writeFloatLE",4]),I.prototype.fieldSpec.push(["cov_x_z","writeFloatLE",4]),I.prototype.fieldSpec.push(["cov_y_y","writeFloatLE",4]),I.prototype.fieldSpec.push(["cov_y_z","writeFloatLE",4]),I.prototype.fieldSpec.push(["cov_z_z","writeFloatLE",4]),I.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),I.prototype.fieldSpec.push(["flags","writeUInt8",1]);let L=function(e,t){return r.call(this,e),this.messageType="MSG_POS_LLH_GNSS",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(r.prototype)).messageType="MSG_POS_LLH_GNSS",L.prototype.msg_type=554,L.prototype.constructor=L,L.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"),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(["h_accuracy","writeUInt16LE",2]),L.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),L.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),L.prototype.fieldSpec.push(["flags","writeUInt8",1]);let T=function(e,t){return r.call(this,e),this.messageType="MSG_POS_LLH_COV_GNSS",this.fields=t||this.parser.parse(e.payload),this};(T.prototype=Object.create(r.prototype)).messageType="MSG_POS_LLH_COV_GNSS",T.prototype.msg_type=561,T.prototype.constructor=T,T.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"),T.prototype.fieldSpec=[],T.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),T.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),T.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),T.prototype.fieldSpec.push(["height","writeDoubleLE",8]),T.prototype.fieldSpec.push(["cov_n_n","writeFloatLE",4]),T.prototype.fieldSpec.push(["cov_n_e","writeFloatLE",4]),T.prototype.fieldSpec.push(["cov_n_d","writeFloatLE",4]),T.prototype.fieldSpec.push(["cov_e_e","writeFloatLE",4]),T.prototype.fieldSpec.push(["cov_e_d","writeFloatLE",4]),T.prototype.fieldSpec.push(["cov_d_d","writeFloatLE",4]),T.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),T.prototype.fieldSpec.push(["flags","writeUInt8",1]);let v=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_ECEF_GNSS",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(r.prototype)).messageType="MSG_VEL_ECEF_GNSS",v.prototype.msg_type=557,v.prototype.constructor=v,v.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").uint16("accuracy").uint8("n_sats").uint8("flags"),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),v.prototype.fieldSpec.push(["x","writeInt32LE",4]),v.prototype.fieldSpec.push(["y","writeInt32LE",4]),v.prototype.fieldSpec.push(["z","writeInt32LE",4]),v.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),v.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),v.prototype.fieldSpec.push(["flags","writeUInt8",1]);let U=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_ECEF_COV_GNSS",this.fields=t||this.parser.parse(e.payload),this};(U.prototype=Object.create(r.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]);let M=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_NED_GNSS",this.fields=t||this.parser.parse(e.payload),this};(M.prototype=Object.create(r.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]);let D=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_NED_COV_GNSS",this.fields=t||this.parser.parse(e.payload),this};(D.prototype=Object.create(r.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]);let O=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_BODY",this.fields=t||this.parser.parse(e.payload),this};(O.prototype=Object.create(r.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]);let G=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_COG",this.fields=t||this.parser.parse(e.payload),this};(G.prototype=Object.create(r.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]);let A=function(e,t){return r.call(this,e),this.messageType="MSG_AGE_CORRECTIONS",this.fields=t||this.parser.parse(e.payload),this};(A.prototype=Object.create(r.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]);let C=function(e,t){return r.call(this,e),this.messageType="MSG_GPS_TIME_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(C.prototype=Object.create(r.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]);let R=function(e,t){return r.call(this,e),this.messageType="MSG_DOPS_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(R.prototype=Object.create(r.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]);let P=function(e,t){return r.call(this,e),this.messageType="MSG_POS_ECEF_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(P.prototype=Object.create(r.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]);let N=function(e,t){return r.call(this,e),this.messageType="MSG_POS_LLH_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(N.prototype=Object.create(r.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]);let j=function(e,t){return r.call(this,e),this.messageType="MSG_BASELINE_ECEF_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(j.prototype=Object.create(r.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]);let x=function(e,t){return r.call(this,e),this.messageType="MSG_BASELINE_NED_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(x.prototype=Object.create(r.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]);let F=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_ECEF_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(F.prototype=Object.create(r.prototype)).messageType="MSG_VEL_ECEF_DEP_A",F.prototype.msg_type=516,F.prototype.constructor=F,F.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").uint16("accuracy").uint8("n_sats").uint8("flags"),F.prototype.fieldSpec=[],F.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),F.prototype.fieldSpec.push(["x","writeInt32LE",4]),F.prototype.fieldSpec.push(["y","writeInt32LE",4]),F.prototype.fieldSpec.push(["z","writeInt32LE",4]),F.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),F.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),F.prototype.fieldSpec.push(["flags","writeUInt8",1]);let k=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_NED_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(k.prototype=Object.create(r.prototype)).messageType="MSG_VEL_NED_DEP_A",k.prototype.msg_type=517,k.prototype.constructor=k,k.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"),k.prototype.fieldSpec=[],k.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),k.prototype.fieldSpec.push(["n","writeInt32LE",4]),k.prototype.fieldSpec.push(["e","writeInt32LE",4]),k.prototype.fieldSpec.push(["d","writeInt32LE",4]),k.prototype.fieldSpec.push(["h_accuracy","writeUInt16LE",2]),k.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),k.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),k.prototype.fieldSpec.push(["flags","writeUInt8",1]);let B=function(e,t){return r.call(this,e),this.messageType="MSG_BASELINE_HEADING_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(B.prototype=Object.create(r.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]);let q=function(e,t){return r.call(this,e),this.messageType="MSG_PROTECTION_LEVEL_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(q.prototype=Object.create(r.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]);let z=function(e,t){return r.call(this,e),this.messageType="MSG_PROTECTION_LEVEL",this.fields=t||this.parser.parse(e.payload),this};(z.prototype=Object.create(r.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]);let H=function(e,t){return r.call(this,e),this.messageType="MSG_UTC_LEAP_SECOND",this.fields=t||this.parser.parse(e.payload),this};(H.prototype=Object.create(r.prototype)).messageType="MSG_UTC_LEAP_SECOND",H.prototype.msg_type=570,H.prototype.constructor=H,H.prototype.parser=(new o).endianess("little").array("stub",{type:"uint8",readUntil:"eof"}),H.prototype.fieldSpec=[],H.prototype.fieldSpec.push(["stub","array","writeUInt8",function(){return 1},null]);let V=function(e,t){return r.call(this,e),this.messageType="MSG_REFERENCE_FRAME_PARAM",this.fields=t||this.parser.parse(e.payload),this};(V.prototype=Object.create(r.prototype)).messageType="MSG_REFERENCE_FRAME_PARAM",V.prototype.msg_type=580,V.prototype.constructor=V,V.prototype.parser=(new o).endianess("little").array("stub",{type:"uint8",readUntil:"eof"}),V.prototype.fieldSpec=[],V.prototype.fieldSpec.push(["stub","array","writeUInt8",function(){return 1},null]),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:I,MsgPosEcefCovGnss:I,554:L,MsgPosLlhGnss:L,561:T,MsgPosLlhCovGnss:T,557:v,MsgVelEcefGnss:v,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:F,MsgVelEcefDepA:F,517:k,MsgVelNedDepA:k,519:B,MsgBaselineHeadingDepA:B,534:q,MsgProtectionLevelDepA:q,535:z,MsgProtectionLevel:z,570:H,MsgUtcLeapSecond:H,580:V,MsgReferenceFrameParam:V}},function(e,t,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,p(0).CarrierPhase,p(0).GnssSignal),s=(p(0).GnssSignalDep,p(0).GPSTime,p(0).GPSTimeDep,p(0).GPSTimeSec,p(0).SvId,function(e,t){return r.call(this,e),this.messageType="MSG_NDB_EVENT",this.fields=t||this.parser.parse(e.payload),this});(s.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,p(0).CarrierPhase),s=p(0).GnssSignal,n=p(0).GnssSignalDep,a=p(0).GPSTime,l=p(0).GPSTimeDep,c=p(0).GPSTimeSec,u=(p(0).SvId,function(e,t){return r.call(this,e),this.messageType="ObservationHeader",this.fields=t||this.parser.parse(e.payload),this});(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="Doppler",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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]);let h=function(e,t){return r.call(this,e),this.messageType="PackedObsContent",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="PackedOsrContent",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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]);let d=function(e,t){return r.call(this,e),this.messageType="MSG_OBS",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(r.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]);let _=function(e,t){return r.call(this,e),this.messageType="MSG_BASE_POS_LLH",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(r.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]);let S=function(e,t){return r.call(this,e),this.messageType="MSG_BASE_POS_ECEF",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(r.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]);let g=function(e,t){return r.call(this,e),this.messageType="EphemerisCommonContent",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(r.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]);let w=function(e,t){return r.call(this,e),this.messageType="EphemerisCommonContentDepB",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(r.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]);let E=function(e,t){return r.call(this,e),this.messageType="EphemerisCommonContentDepA",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(r.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]);let m=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GPS_DEP_E",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(r.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]);let b=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GPS_DEP_F",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(r.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]);let I=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GPS",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(r.prototype)).messageType="MSG_EPHEMERIS_GPS",I.prototype.msg_type=138,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]);let L=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_QZSS",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(r.prototype)).messageType="MSG_EPHEMERIS_QZSS",L.prototype.msg_type=142,L.prototype.constructor=L,L.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"),L.prototype.fieldSpec=[],L.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),L.prototype.fieldSpec.push(["tgd","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","writeFloatLE",4]),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]);let T=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_BDS",this.fields=t||this.parser.parse(e.payload),this};(T.prototype=Object.create(r.prototype)).messageType="MSG_EPHEMERIS_BDS",T.prototype.msg_type=137,T.prototype.constructor=T,T.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"),T.prototype.fieldSpec=[],T.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),T.prototype.fieldSpec.push(["tgd1","writeFloatLE",4]),T.prototype.fieldSpec.push(["tgd2","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","writeFloatLE",4]),T.prototype.fieldSpec.push(["af2","writeFloatLE",4]),T.prototype.fieldSpec.push(["toc",c.prototype.fieldSpec]),T.prototype.fieldSpec.push(["iode","writeUInt8",1]),T.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]);let v=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GAL_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(r.prototype)).messageType="MSG_EPHEMERIS_GAL_DEP_A",v.prototype.msg_type=149,v.prototype.constructor=v,v.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"),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),v.prototype.fieldSpec.push(["bgd_e1e5a","writeFloatLE",4]),v.prototype.fieldSpec.push(["bgd_e1e5b","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","writeDoubleLE",8]),v.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),v.prototype.fieldSpec.push(["af2","writeFloatLE",4]),v.prototype.fieldSpec.push(["toc",c.prototype.fieldSpec]),v.prototype.fieldSpec.push(["iode","writeUInt16LE",2]),v.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]);let U=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GAL",this.fields=t||this.parser.parse(e.payload),this};(U.prototype=Object.create(r.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]);let M=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_SBAS_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(M.prototype=Object.create(r.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]);let D=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GLO_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(D.prototype=Object.create(r.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]);let O=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_SBAS_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(O.prototype=Object.create(r.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]);let G=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_SBAS",this.fields=t||this.parser.parse(e.payload),this};(G.prototype=Object.create(r.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]);let A=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GLO_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(A.prototype=Object.create(r.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]);let C=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GLO_DEP_C",this.fields=t||this.parser.parse(e.payload),this};(C.prototype=Object.create(r.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]);let R=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GLO_DEP_D",this.fields=t||this.parser.parse(e.payload),this};(R.prototype=Object.create(r.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]);let P=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GLO",this.fields=t||this.parser.parse(e.payload),this};(P.prototype=Object.create(r.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]);let N=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_DEP_D",this.fields=t||this.parser.parse(e.payload),this};(N.prototype=Object.create(r.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]);let j=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(j.prototype=Object.create(r.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]);let x=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(x.prototype=Object.create(r.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]);let F=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_DEP_C",this.fields=t||this.parser.parse(e.payload),this};(F.prototype=Object.create(r.prototype)).messageType="MSG_EPHEMERIS_DEP_C",F.prototype.msg_type=71,F.prototype.constructor=F,F.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"),F.prototype.fieldSpec=[],F.prototype.fieldSpec.push(["tgd","writeDoubleLE",8]),F.prototype.fieldSpec.push(["c_rs","writeDoubleLE",8]),F.prototype.fieldSpec.push(["c_rc","writeDoubleLE",8]),F.prototype.fieldSpec.push(["c_uc","writeDoubleLE",8]),F.prototype.fieldSpec.push(["c_us","writeDoubleLE",8]),F.prototype.fieldSpec.push(["c_ic","writeDoubleLE",8]),F.prototype.fieldSpec.push(["c_is","writeDoubleLE",8]),F.prototype.fieldSpec.push(["dn","writeDoubleLE",8]),F.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),F.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),F.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),F.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),F.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),F.prototype.fieldSpec.push(["w","writeDoubleLE",8]),F.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),F.prototype.fieldSpec.push(["inc_dot","writeDoubleLE",8]),F.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),F.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),F.prototype.fieldSpec.push(["af2","writeDoubleLE",8]),F.prototype.fieldSpec.push(["toe_tow","writeDoubleLE",8]),F.prototype.fieldSpec.push(["toe_wn","writeUInt16LE",2]),F.prototype.fieldSpec.push(["toc_tow","writeDoubleLE",8]),F.prototype.fieldSpec.push(["toc_wn","writeUInt16LE",2]),F.prototype.fieldSpec.push(["valid","writeUInt8",1]),F.prototype.fieldSpec.push(["healthy","writeUInt8",1]),F.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),F.prototype.fieldSpec.push(["iode","writeUInt8",1]),F.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]),F.prototype.fieldSpec.push(["reserved","writeUInt32LE",4]);let k=function(e,t){return r.call(this,e),this.messageType="ObservationHeaderDep",this.fields=t||this.parser.parse(e.payload),this};(k.prototype=Object.create(r.prototype)).messageType="ObservationHeaderDep",k.prototype.constructor=k,k.prototype.parser=(new o).endianess("little").nest("t",{type:l.prototype.parser}).uint8("n_obs"),k.prototype.fieldSpec=[],k.prototype.fieldSpec.push(["t",l.prototype.fieldSpec]),k.prototype.fieldSpec.push(["n_obs","writeUInt8",1]);let B=function(e,t){return r.call(this,e),this.messageType="CarrierPhaseDepA",this.fields=t||this.parser.parse(e.payload),this};(B.prototype=Object.create(r.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]);let q=function(e,t){return r.call(this,e),this.messageType="PackedObsContentDepA",this.fields=t||this.parser.parse(e.payload),this};(q.prototype=Object.create(r.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]);let z=function(e,t){return r.call(this,e),this.messageType="PackedObsContentDepB",this.fields=t||this.parser.parse(e.payload),this};(z.prototype=Object.create(r.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]);let H=function(e,t){return r.call(this,e),this.messageType="PackedObsContentDepC",this.fields=t||this.parser.parse(e.payload),this};(H.prototype=Object.create(r.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]);let V=function(e,t){return r.call(this,e),this.messageType="MSG_OBS_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(V.prototype=Object.create(r.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:k.prototype.parser}).array("obs",{type:q.prototype.parser,readUntil:"eof"}),V.prototype.fieldSpec=[],V.prototype.fieldSpec.push(["header",k.prototype.fieldSpec]),V.prototype.fieldSpec.push(["obs","array",q.prototype.fieldSpec,function(){return this.fields.array.length},null]);let Y=function(e,t){return r.call(this,e),this.messageType="MSG_OBS_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(Y.prototype=Object.create(r.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:k.prototype.parser}).array("obs",{type:z.prototype.parser,readUntil:"eof"}),Y.prototype.fieldSpec=[],Y.prototype.fieldSpec.push(["header",k.prototype.fieldSpec]),Y.prototype.fieldSpec.push(["obs","array",z.prototype.fieldSpec,function(){return this.fields.array.length},null]);let W=function(e,t){return r.call(this,e),this.messageType="MSG_OBS_DEP_C",this.fields=t||this.parser.parse(e.payload),this};(W.prototype=Object.create(r.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:k.prototype.parser}).array("obs",{type:H.prototype.parser,readUntil:"eof"}),W.prototype.fieldSpec=[],W.prototype.fieldSpec.push(["header",k.prototype.fieldSpec]),W.prototype.fieldSpec.push(["obs","array",H.prototype.fieldSpec,function(){return this.fields.array.length},null]);let Q=function(e,t){return r.call(this,e),this.messageType="MSG_IONO",this.fields=t||this.parser.parse(e.payload),this};(Q.prototype=Object.create(r.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]);let K=function(e,t){return r.call(this,e),this.messageType="MSG_SV_CONFIGURATION_GPS_DEP",this.fields=t||this.parser.parse(e.payload),this};(K.prototype=Object.create(r.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]);let X=function(e,t){return r.call(this,e),this.messageType="GnssCapb",this.fields=t||this.parser.parse(e.payload),this};(X.prototype=Object.create(r.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]);let J=function(e,t){return r.call(this,e),this.messageType="MSG_GNSS_CAPB",this.fields=t||this.parser.parse(e.payload),this};(J.prototype=Object.create(r.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]);let $=function(e,t){return r.call(this,e),this.messageType="MSG_GROUP_DELAY_DEP_A",this.fields=t||this.parser.parse(e.payload),this};($.prototype=Object.create(r.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]);let Z=function(e,t){return r.call(this,e),this.messageType="MSG_GROUP_DELAY_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(Z.prototype=Object.create(r.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]);let ee=function(e,t){return r.call(this,e),this.messageType="MSG_GROUP_DELAY",this.fields=t||this.parser.parse(e.payload),this};(ee.prototype=Object.create(r.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]);let te=function(e,t){return r.call(this,e),this.messageType="AlmanacCommonContent",this.fields=t||this.parser.parse(e.payload),this};(te.prototype=Object.create(r.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]);let pe=function(e,t){return r.call(this,e),this.messageType="AlmanacCommonContentDep",this.fields=t||this.parser.parse(e.payload),this};(pe.prototype=Object.create(r.prototype)).messageType="AlmanacCommonContentDep",pe.prototype.constructor=pe,pe.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"),pe.prototype.fieldSpec=[],pe.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),pe.prototype.fieldSpec.push(["toa",c.prototype.fieldSpec]),pe.prototype.fieldSpec.push(["ura","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["fit_interval","writeUInt32LE",4]),pe.prototype.fieldSpec.push(["valid","writeUInt8",1]),pe.prototype.fieldSpec.push(["health_bits","writeUInt8",1]);let re=function(e,t){return r.call(this,e),this.messageType="MSG_ALMANAC_GPS_DEP",this.fields=t||this.parser.parse(e.payload),this};(re.prototype=Object.create(r.prototype)).messageType="MSG_ALMANAC_GPS_DEP",re.prototype.msg_type=112,re.prototype.constructor=re,re.prototype.parser=(new o).endianess("little").nest("common",{type:pe.prototype.parser}).doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("af0").doublele("af1"),re.prototype.fieldSpec=[],re.prototype.fieldSpec.push(["common",pe.prototype.fieldSpec]),re.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),re.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),re.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),re.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),re.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),re.prototype.fieldSpec.push(["w","writeDoubleLE",8]),re.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),re.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),re.prototype.fieldSpec.push(["af1","writeDoubleLE",8]);let oe=function(e,t){return r.call(this,e),this.messageType="MSG_ALMANAC_GPS",this.fields=t||this.parser.parse(e.payload),this};(oe.prototype=Object.create(r.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]);let ie=function(e,t){return r.call(this,e),this.messageType="MSG_ALMANAC_GLO_DEP",this.fields=t||this.parser.parse(e.payload),this};(ie.prototype=Object.create(r.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:pe.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",pe.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]);let se=function(e,t){return r.call(this,e),this.messageType="MSG_ALMANAC_GLO",this.fields=t||this.parser.parse(e.payload),this};(se.prototype=Object.create(r.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]);let ne=function(e,t){return r.call(this,e),this.messageType="MSG_GLO_BIASES",this.fields=t||this.parser.parse(e.payload),this};(ne.prototype=Object.create(r.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]);let ae=function(e,t){return r.call(this,e),this.messageType="SvAzEl",this.fields=t||this.parser.parse(e.payload),this};(ae.prototype=Object.create(r.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]);let le=function(e,t){return r.call(this,e),this.messageType="MSG_SV_AZ_EL",this.fields=t||this.parser.parse(e.payload),this};(le.prototype=Object.create(r.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]);let ce=function(e,t){return r.call(this,e),this.messageType="MSG_OSR",this.fields=t||this.parser.parse(e.payload),this};(ce.prototype=Object.create(r.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:I,MsgEphemerisGps:I,142:L,MsgEphemerisQzss:L,137:T,MsgEphemerisBds:T,149:v,MsgEphemerisGalDepA:v,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:F,MsgEphemerisDepC:F,ObservationHeaderDep:k,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:pe,112:re,MsgAlmanacGpsDep:re,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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_BASELINE_HEADING",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_ORIENT_QUAT",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_ORIENT_EULER",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_ANGULAR_RATE",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,p(0).CarrierPhase,p(0).GnssSignal),s=p(0).GnssSignalDep,n=p(0).GPSTime,a=p(0).GPSTimeDep,l=(p(0).GPSTimeSec,p(0).SvId,function(e,t){return r.call(this,e),this.messageType="MSG_ALMANAC",this.fields=t||this.parser.parse(e.payload),this});(l.prototype=Object.create(r.prototype)).messageType="MSG_ALMANAC",l.prototype.msg_type=105,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little"),l.prototype.fieldSpec=[];let c=function(e,t){return r.call(this,e),this.messageType="MSG_SET_TIME",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.prototype)).messageType="MSG_SET_TIME",c.prototype.msg_type=104,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little"),c.prototype.fieldSpec=[];let u=function(e,t){return r.call(this,e),this.messageType="MSG_RESET",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="MSG_RESET_DEP",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.prototype)).messageType="MSG_RESET_DEP",y.prototype.msg_type=178,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little"),y.prototype.fieldSpec=[];let h=function(e,t){return r.call(this,e),this.messageType="MSG_CW_RESULTS",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.prototype)).messageType="MSG_CW_RESULTS",h.prototype.msg_type=192,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little"),h.prototype.fieldSpec=[];let f=function(e,t){return r.call(this,e),this.messageType="MSG_CW_START",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.prototype)).messageType="MSG_CW_START",f.prototype.msg_type=193,f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little"),f.prototype.fieldSpec=[];let d=function(e,t){return r.call(this,e),this.messageType="MSG_RESET_FILTERS",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(r.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]);let _=function(e,t){return r.call(this,e),this.messageType="MSG_INIT_BASE_DEP",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(r.prototype)).messageType="MSG_INIT_BASE_DEP",_.prototype.msg_type=35,_.prototype.constructor=_,_.prototype.parser=(new o).endianess("little"),_.prototype.fieldSpec=[];let S=function(e,t){return r.call(this,e),this.messageType="MSG_THREAD_STATE",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(r.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]);let g=function(e,t){return r.call(this,e),this.messageType="UARTChannel",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(r.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]);let w=function(e,t){return r.call(this,e),this.messageType="Period",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(r.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]);let E=function(e,t){return r.call(this,e),this.messageType="Latency",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(r.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]);let m=function(e,t){return r.call(this,e),this.messageType="MSG_UART_STATE",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(r.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]);let b=function(e,t){return r.call(this,e),this.messageType="MSG_UART_STATE_DEPA",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(r.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]);let I=function(e,t){return r.call(this,e),this.messageType="MSG_IAR_STATE",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(r.prototype)).messageType="MSG_IAR_STATE",I.prototype.msg_type=25,I.prototype.constructor=I,I.prototype.parser=(new o).endianess("little").uint32("num_hyps"),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["num_hyps","writeUInt32LE",4]);let L=function(e,t){return r.call(this,e),this.messageType="MSG_MASK_SATELLITE",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(r.prototype)).messageType="MSG_MASK_SATELLITE",L.prototype.msg_type=43,L.prototype.constructor=L,L.prototype.parser=(new o).endianess("little").uint8("mask").nest("sid",{type:i.prototype.parser}),L.prototype.fieldSpec=[],L.prototype.fieldSpec.push(["mask","writeUInt8",1]),L.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]);let T=function(e,t){return r.call(this,e),this.messageType="MSG_MASK_SATELLITE_DEP",this.fields=t||this.parser.parse(e.payload),this};(T.prototype=Object.create(r.prototype)).messageType="MSG_MASK_SATELLITE_DEP",T.prototype.msg_type=27,T.prototype.constructor=T,T.prototype.parser=(new o).endianess("little").uint8("mask").nest("sid",{type:s.prototype.parser}),T.prototype.fieldSpec=[],T.prototype.fieldSpec.push(["mask","writeUInt8",1]),T.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]);let v=function(e,t){return r.call(this,e),this.messageType="MSG_DEVICE_MONITOR",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(r.prototype)).messageType="MSG_DEVICE_MONITOR",v.prototype.msg_type=181,v.prototype.constructor=v,v.prototype.parser=(new o).endianess("little").int16("dev_vin").int16("cpu_vint").int16("cpu_vaux").int16("cpu_temperature").int16("fe_temperature"),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["dev_vin","writeInt16LE",2]),v.prototype.fieldSpec.push(["cpu_vint","writeInt16LE",2]),v.prototype.fieldSpec.push(["cpu_vaux","writeInt16LE",2]),v.prototype.fieldSpec.push(["cpu_temperature","writeInt16LE",2]),v.prototype.fieldSpec.push(["fe_temperature","writeInt16LE",2]);let U=function(e,t){return r.call(this,e),this.messageType="MSG_COMMAND_REQ",this.fields=t||this.parser.parse(e.payload),this};(U.prototype=Object.create(r.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]);let M=function(e,t){return r.call(this,e),this.messageType="MSG_COMMAND_RESP",this.fields=t||this.parser.parse(e.payload),this};(M.prototype=Object.create(r.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]);let D=function(e,t){return r.call(this,e),this.messageType="MSG_COMMAND_OUTPUT",this.fields=t||this.parser.parse(e.payload),this};(D.prototype=Object.create(r.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]);let O=function(e,t){return r.call(this,e),this.messageType="MSG_NETWORK_STATE_REQ",this.fields=t||this.parser.parse(e.payload),this};(O.prototype=Object.create(r.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=[];let G=function(e,t){return r.call(this,e),this.messageType="MSG_NETWORK_STATE_RESP",this.fields=t||this.parser.parse(e.payload),this};(G.prototype=Object.create(r.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]);let A=function(e,t){return r.call(this,e),this.messageType="NetworkUsage",this.fields=t||this.parser.parse(e.payload),this};(A.prototype=Object.create(r.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]);let C=function(e,t){return r.call(this,e),this.messageType="MSG_NETWORK_BANDWIDTH_USAGE",this.fields=t||this.parser.parse(e.payload),this};(C.prototype=Object.create(r.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]);let R=function(e,t){return r.call(this,e),this.messageType="MSG_CELL_MODEM_STATUS",this.fields=t||this.parser.parse(e.payload),this};(R.prototype=Object.create(r.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]);let P=function(e,t){return r.call(this,e),this.messageType="MSG_SPECAN_DEP",this.fields=t||this.parser.parse(e.payload),this};(P.prototype=Object.create(r.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]);let N=function(e,t){return r.call(this,e),this.messageType="MSG_SPECAN",this.fields=t||this.parser.parse(e.payload),this};(N.prototype=Object.create(r.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]);let j=function(e,t){return r.call(this,e),this.messageType="MSG_FRONT_END_GAIN",this.fields=t||this.parser.parse(e.payload),this};(j.prototype=Object.create(r.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:I,MsgIarState:I,43:L,MsgMaskSatellite:L,27:T,MsgMaskSatelliteDep:T,181:v,MsgDeviceMonitor:v,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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,p(0).CarrierPhase,p(0).GnssSignal),s=(p(0).GnssSignalDep,p(0).GPSTime,p(0).GPSTimeDep,p(0).GPSTimeSec,p(0).SvId,function(e,t){return r.call(this,e),this.messageType="MSG_SBAS_RAW",this.fields=t||this.parser.parse(e.payload),this});(s.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_SAVE",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.prototype)).messageType="MSG_SETTINGS_SAVE",i.prototype.msg_type=161,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little"),i.prototype.fieldSpec=[];let s=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_WRITE",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_WRITE_RESP",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_READ_REQ",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_READ_RESP",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_READ_BY_INDEX_REQ",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_READ_BY_INDEX_RESP",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_READ_BY_INDEX_DONE",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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=[];let h=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_REGISTER",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_REGISTER_RESP",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="SolutionInputType",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_SOLN_META_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_SOLN_META",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="GNSSInputType",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="IMUInputType",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="OdoInputType",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,p(0).CarrierPhase,p(0).GnssSignal),s=(p(0).GnssSignalDep,p(0).GPSTime,p(0).GPSTimeDep,p(0).GPSTimeSec),n=p(0).SvId,a=function(e,t){return r.call(this,e),this.messageType="CodeBiasesContent",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="PhaseBiasesContent",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="STECHeader",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="GriddedCorrectionHeader",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="STECSatElement",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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]);let h=function(e,t){return r.call(this,e),this.messageType="TroposphericDelayCorrectionNoStd",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="TroposphericDelayCorrection",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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]);let d=function(e,t){return r.call(this,e),this.messageType="STECResidualNoStd",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(r.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]);let _=function(e,t){return r.call(this,e),this.messageType="STECResidual",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(r.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]);let S=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_ORBIT_CLOCK",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(r.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]);let g=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_CODE_BIASES",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(r.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]);let w=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_PHASE_BIASES",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(r.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]);let E=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_STEC_CORRECTION_DEP",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(r.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]);let m=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_STEC_CORRECTION",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(r.prototype)).messageType="MSG_SSR_STEC_CORRECTION",m.prototype.msg_type=1533,m.prototype.constructor=m,m.prototype.parser=(new o).endianess("little").array("stub",{type:"uint8",readUntil:"eof"}),m.prototype.fieldSpec=[],m.prototype.fieldSpec.push(["stub","array","writeUInt8",function(){return 1},null]);let b=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_GRIDDED_CORRECTION",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(r.prototype)).messageType="MSG_SSR_GRIDDED_CORRECTION",b.prototype.msg_type=1532,b.prototype.constructor=b,b.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"}),b.prototype.fieldSpec=[],b.prototype.fieldSpec.push(["header",u.prototype.fieldSpec]),b.prototype.fieldSpec.push(["index","writeUInt16LE",2]),b.prototype.fieldSpec.push(["tropo_delay_correction",f.prototype.fieldSpec]),b.prototype.fieldSpec.push(["stec_residuals","array",_.prototype.fieldSpec,function(){return this.fields.array.length},null]);let I=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_GRIDDED_CORRECTION_BOUNDS",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(r.prototype)).messageType="MSG_SSR_GRIDDED_CORRECTION_BOUNDS",I.prototype.msg_type=1534,I.prototype.constructor=I,I.prototype.parser=(new o).endianess("little").array("stub",{type:"uint8",readUntil:"eof"}),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["stub","array","writeUInt8",function(){return 1},null]);let L=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_TILE_DEFINITION_DEP",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(r.prototype)).messageType="MSG_SSR_TILE_DEFINITION_DEP",L.prototype.msg_type=1526,L.prototype.constructor=L,L.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"),L.prototype.fieldSpec=[],L.prototype.fieldSpec.push(["tile_set_id","writeUInt16LE",2]),L.prototype.fieldSpec.push(["tile_id","writeUInt16LE",2]),L.prototype.fieldSpec.push(["corner_nw_lat","writeInt16LE",2]),L.prototype.fieldSpec.push(["corner_nw_lon","writeInt16LE",2]),L.prototype.fieldSpec.push(["spacing_lat","writeUInt16LE",2]),L.prototype.fieldSpec.push(["spacing_lon","writeUInt16LE",2]),L.prototype.fieldSpec.push(["rows","writeUInt16LE",2]),L.prototype.fieldSpec.push(["cols","writeUInt16LE",2]),L.prototype.fieldSpec.push(["bitmask","writeUInt64LE",8]);let T=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_TILE_DEFINITION",this.fields=t||this.parser.parse(e.payload),this};(T.prototype=Object.create(r.prototype)).messageType="MSG_SSR_TILE_DEFINITION",T.prototype.msg_type=1527,T.prototype.constructor=T,T.prototype.parser=(new o).endianess("little").array("stub",{type:"uint8",readUntil:"eof"}),T.prototype.fieldSpec=[],T.prototype.fieldSpec.push(["stub","array","writeUInt8",function(){return 1},null]);let v=function(e,t){return r.call(this,e),this.messageType="SatelliteAPC",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(r.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]);let U=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_SATELLITE_APC",this.fields=t||this.parser.parse(e.payload),this};(U.prototype=Object.create(r.prototype)).messageType="MSG_SSR_SATELLITE_APC",U.prototype.msg_type=1540,U.prototype.constructor=U,U.prototype.parser=(new o).endianess("little").array("apc",{type:v.prototype.parser,readUntil:"eof"}),U.prototype.fieldSpec=[],U.prototype.fieldSpec.push(["apc","array",v.prototype.fieldSpec,function(){return this.fields.array.length},null]);let M=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_ORBIT_CLOCK_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(M.prototype=Object.create(r.prototype)).messageType="MSG_SSR_ORBIT_CLOCK_DEP_A",M.prototype.msg_type=1500,M.prototype.constructor=M,M.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"),M.prototype.fieldSpec=[],M.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),M.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]),M.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),M.prototype.fieldSpec.push(["iod_ssr","writeUInt8",1]),M.prototype.fieldSpec.push(["iod","writeUInt8",1]),M.prototype.fieldSpec.push(["radial","writeInt32LE",4]),M.prototype.fieldSpec.push(["along","writeInt32LE",4]),M.prototype.fieldSpec.push(["cross","writeInt32LE",4]),M.prototype.fieldSpec.push(["dot_radial","writeInt32LE",4]),M.prototype.fieldSpec.push(["dot_along","writeInt32LE",4]),M.prototype.fieldSpec.push(["dot_cross","writeInt32LE",4]),M.prototype.fieldSpec.push(["c0","writeInt32LE",4]),M.prototype.fieldSpec.push(["c1","writeInt32LE",4]),M.prototype.fieldSpec.push(["c2","writeInt32LE",4]);let D=function(e,t){return r.call(this,e),this.messageType="STECHeaderDepA",this.fields=t||this.parser.parse(e.payload),this};(D.prototype=Object.create(r.prototype)).messageType="STECHeaderDepA",D.prototype.constructor=D,D.prototype.parser=(new o).endianess("little").nest("time",{type:s.prototype.parser}).uint8("num_msgs").uint8("seq_num").uint8("update_interval").uint8("iod_atmo"),D.prototype.fieldSpec=[],D.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),D.prototype.fieldSpec.push(["num_msgs","writeUInt8",1]),D.prototype.fieldSpec.push(["seq_num","writeUInt8",1]),D.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),D.prototype.fieldSpec.push(["iod_atmo","writeUInt8",1]);let O=function(e,t){return r.call(this,e),this.messageType="GriddedCorrectionHeaderDepA",this.fields=t||this.parser.parse(e.payload),this};(O.prototype=Object.create(r.prototype)).messageType="GriddedCorrectionHeaderDepA",O.prototype.constructor=O,O.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"),O.prototype.fieldSpec=[],O.prototype.fieldSpec.push(["time",s.prototype.fieldSpec]),O.prototype.fieldSpec.push(["num_msgs","writeUInt16LE",2]),O.prototype.fieldSpec.push(["seq_num","writeUInt16LE",2]),O.prototype.fieldSpec.push(["update_interval","writeUInt8",1]),O.prototype.fieldSpec.push(["iod_atmo","writeUInt8",1]),O.prototype.fieldSpec.push(["tropo_quality_indicator","writeUInt8",1]);let G=function(e,t){return r.call(this,e),this.messageType="GridDefinitionHeaderDepA",this.fields=t||this.parser.parse(e.payload),this};(G.prototype=Object.create(r.prototype)).messageType="GridDefinitionHeaderDepA",G.prototype.constructor=G,G.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"),G.prototype.fieldSpec=[],G.prototype.fieldSpec.push(["region_size_inverse","writeUInt8",1]),G.prototype.fieldSpec.push(["area_width","writeUInt16LE",2]),G.prototype.fieldSpec.push(["lat_nw_corner_enc","writeUInt16LE",2]),G.prototype.fieldSpec.push(["lon_nw_corner_enc","writeUInt16LE",2]),G.prototype.fieldSpec.push(["num_msgs","writeUInt8",1]),G.prototype.fieldSpec.push(["seq_num","writeUInt8",1]);let A=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_STEC_CORRECTION_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(A.prototype=Object.create(r.prototype)).messageType="MSG_SSR_STEC_CORRECTION_DEP_A",A.prototype.msg_type=1515,A.prototype.constructor=A,A.prototype.parser=(new o).endianess("little").nest("header",{type:D.prototype.parser}).array("stec_sat_list",{type:y.prototype.parser,readUntil:"eof"}),A.prototype.fieldSpec=[],A.prototype.fieldSpec.push(["header",D.prototype.fieldSpec]),A.prototype.fieldSpec.push(["stec_sat_list","array",y.prototype.fieldSpec,function(){return this.fields.array.length},null]);let C=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_GRIDDED_CORRECTION_NO_STD_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(C.prototype=Object.create(r.prototype)).messageType="MSG_SSR_GRIDDED_CORRECTION_NO_STD_DEP_A",C.prototype.msg_type=1520,C.prototype.constructor=C,C.prototype.parser=(new o).endianess("little").nest("header",{type:O.prototype.parser}).uint16("index").nest("tropo_delay_correction",{type:h.prototype.parser}).array("stec_residuals",{type:d.prototype.parser,readUntil:"eof"}),C.prototype.fieldSpec=[],C.prototype.fieldSpec.push(["header",O.prototype.fieldSpec]),C.prototype.fieldSpec.push(["index","writeUInt16LE",2]),C.prototype.fieldSpec.push(["tropo_delay_correction",h.prototype.fieldSpec]),C.prototype.fieldSpec.push(["stec_residuals","array",d.prototype.fieldSpec,function(){return this.fields.array.length},null]);let R=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_GRIDDED_CORRECTION_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(R.prototype=Object.create(r.prototype)).messageType="MSG_SSR_GRIDDED_CORRECTION_DEP_A",R.prototype.msg_type=1530,R.prototype.constructor=R,R.prototype.parser=(new o).endianess("little").nest("header",{type:O.prototype.parser}).uint16("index").nest("tropo_delay_correction",{type:f.prototype.parser}).array("stec_residuals",{type:_.prototype.parser,readUntil:"eof"}),R.prototype.fieldSpec=[],R.prototype.fieldSpec.push(["header",O.prototype.fieldSpec]),R.prototype.fieldSpec.push(["index","writeUInt16LE",2]),R.prototype.fieldSpec.push(["tropo_delay_correction",f.prototype.fieldSpec]),R.prototype.fieldSpec.push(["stec_residuals","array",_.prototype.fieldSpec,function(){return this.fields.array.length},null]);let P=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_GRID_DEFINITION_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(P.prototype=Object.create(r.prototype)).messageType="MSG_SSR_GRID_DEFINITION_DEP_A",P.prototype.msg_type=1525,P.prototype.constructor=P,P.prototype.parser=(new o).endianess("little").nest("header",{type:G.prototype.parser}).array("rle_list",{type:"uint8",readUntil:"eof"}),P.prototype.fieldSpec=[],P.prototype.fieldSpec.push(["header",G.prototype.fieldSpec]),P.prototype.fieldSpec.push(["rle_list","array","writeUInt8",function(){return 1},null]);let N=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_ORBIT_CLOCK_BOUNDS",this.fields=t||this.parser.parse(e.payload),this};(N.prototype=Object.create(r.prototype)).messageType="MSG_SSR_ORBIT_CLOCK_BOUNDS",N.prototype.msg_type=1502,N.prototype.constructor=N,N.prototype.parser=(new o).endianess("little").array("stub",{type:"uint8",readUntil:"eof"}),N.prototype.fieldSpec=[],N.prototype.fieldSpec.push(["stub","array","writeUInt8",function(){return 1},null]);let j=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_CODE_PHASE_BIASES_BOUNDS",this.fields=t||this.parser.parse(e.payload),this};(j.prototype=Object.create(r.prototype)).messageType="MSG_SSR_CODE_PHASE_BIASES_BOUNDS",j.prototype.msg_type=1516,j.prototype.constructor=j,j.prototype.parser=(new o).endianess("little").array("stub",{type:"uint8",readUntil:"eof"}),j.prototype.fieldSpec=[],j.prototype.fieldSpec.push(["stub","array","writeUInt8",function(){return 1},null]);let x=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION",this.fields=t||this.parser.parse(e.payload),this};(x.prototype=Object.create(r.prototype)).messageType="MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION",x.prototype.msg_type=1503,x.prototype.constructor=x,x.prototype.parser=(new o).endianess("little").array("stub",{type:"uint8",readUntil:"eof"}),x.prototype.fieldSpec=[],x.prototype.fieldSpec.push(["stub","array","writeUInt8",function(){return 1},null]),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,1533:m,MsgSsrStecCorrection:m,1532:b,MsgSsrGriddedCorrection:b,1534:I,MsgSsrGriddedCorrectionBounds:I,1526:L,MsgSsrTileDefinitionDep:L,1527:T,MsgSsrTileDefinition:T,SatelliteAPC:v,1540:U,MsgSsrSatelliteApc:U,1500:M,MsgSsrOrbitClockDepA:M,STECHeaderDepA:D,GriddedCorrectionHeaderDepA:O,GridDefinitionHeaderDepA:G,1515:A,MsgSsrStecCorrectionDepA:A,1520:C,MsgSsrGriddedCorrectionNoStdDepA:C,1530:R,MsgSsrGriddedCorrectionDepA:R,1525:P,MsgSsrGridDefinitionDepA:P,1502:N,MsgSsrOrbitClockBounds:N,1516:j,MsgSsrCodePhaseBiasesBounds:j,1503:x,MsgSsrOrbitClockBoundsDegradation:x}},function(e,t,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_STARTUP",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_DGNSS_STATUS",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_HEARTBEAT",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="SubSystemReport",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="MSG_STATUS_REPORT",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="StatusJournalItem",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="MSG_STATUS_JOURNAL",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="MSG_INS_STATUS",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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]);let h=function(e,t){return r.call(this,e),this.messageType="MSG_CSAC_TELEMETRY",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="MSG_CSAC_TELEMETRY_LABELS",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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]);let d=function(e,t){return r.call(this,e),this.messageType="MSG_INS_UPDATES",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(r.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]);let _=function(e,t){return r.call(this,e),this.messageType="MSG_GNSS_TIME_OFFSET",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(r.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]);let S=function(e,t){return r.call(this,e),this.messageType="MSG_PPS_TIME",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(r.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]);let g=function(e,t){return r.call(this,e),this.messageType="MSG_SENSOR_AID_EVENT",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(r.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]);let w=function(e,t){return r.call(this,e),this.messageType="MSG_GROUP_META",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,p(0).CarrierPhase),s=p(0).GnssSignal,n=p(0).GnssSignalDep,a=p(0).GPSTime,l=p(0).GPSTimeDep,c=(p(0).GPSTimeSec,p(0).SvId,function(e,t){return r.call(this,e),this.messageType="MSG_TRACKING_STATE_DETAILED_DEP_A",this.fields=t||this.parser.parse(e.payload),this});(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="MSG_TRACKING_STATE_DETAILED_DEP",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="TrackingChannelState",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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]);let h=function(e,t){return r.call(this,e),this.messageType="MSG_TRACKING_STATE",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="MeasurementState",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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]);let d=function(e,t){return r.call(this,e),this.messageType="MSG_MEASUREMENT_STATE",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(r.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]);let _=function(e,t){return r.call(this,e),this.messageType="TrackingChannelCorrelation",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(r.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]);let S=function(e,t){return r.call(this,e),this.messageType="MSG_TRACKING_IQ",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(r.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]);let g=function(e,t){return r.call(this,e),this.messageType="TrackingChannelCorrelationDep",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(r.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]);let w=function(e,t){return r.call(this,e),this.messageType="MSG_TRACKING_IQ_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(r.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]);let E=function(e,t){return r.call(this,e),this.messageType="MSG_TRACKING_IQ_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(r.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]);let m=function(e,t){return r.call(this,e),this.messageType="TrackingChannelStateDepA",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(r.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]);let b=function(e,t){return r.call(this,e),this.messageType="MSG_TRACKING_STATE_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(r.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]);let I=function(e,t){return r.call(this,e),this.messageType="TrackingChannelStateDepB",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(r.prototype)).messageType="TrackingChannelStateDepB",I.prototype.constructor=I,I.prototype.parser=(new o).endianess("little").uint8("state").nest("sid",{type:n.prototype.parser}).floatle("cn0"),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["state","writeUInt8",1]),I.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),I.prototype.fieldSpec.push(["cn0","writeFloatLE",4]);let L=function(e,t){return r.call(this,e),this.messageType="MSG_TRACKING_STATE_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(r.prototype)).messageType="MSG_TRACKING_STATE_DEP_B",L.prototype.msg_type=19,L.prototype.constructor=L,L.prototype.parser=(new o).endianess("little").array("states",{type:I.prototype.parser,readUntil:"eof"}),L.prototype.fieldSpec=[],L.prototype.fieldSpec.push(["states","array",I.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:I,19:L,MsgTrackingStateDepB:L}},function(e,t,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_USER_DATA",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_ODOMETRY",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_WHEELTICK",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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 r(e,t){if(e===t)return 0;for(var p=e.length,r=t.length,o=0,i=Math.min(p,r);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],p,r))return!1;return!0}(e,t,p,s))}return p?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,p,r){var o;if("function"!=typeof t)throw new TypeError('"block" argument must be a function');"string"==typeof p&&(r=p,p=null),o=function(e){var t;try{e()}catch(e){t=e}return t}(t),r=(p&&p.name?" ("+p.name+").":".")+(r?" "+r:"."),e&&!o&&_(o,p,"Missing expected exception"+r);var s="string"==typeof r,n=!e&&o&&!p;if((!e&&i.isError(o)&&s&&E(o,p)||n)&&_(o,p,"Got unwanted exception"+r),e&&o&&p&&!E(o,p)||!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 p=new Error;if(p.stack){var r=p.stack,o=h(t),i=r.indexOf("\n"+o);if(i>=0){var s=r.indexOf("\n",i+1);r=r.substring(s+1)}this.stack=r}}},i.inherits(u.AssertionError,Error),u.fail=_,u.ok=S,u.equal=function(e,t,p){e!=t&&_(e,t,p,"==",u.equal)},u.notEqual=function(e,t,p){e==t&&_(e,t,p,"!=",u.notEqual)},u.deepEqual=function(e,t,p){g(e,t,!1)||_(e,t,p,"deepEqual",u.deepEqual)},u.deepStrictEqual=function(e,t,p){g(e,t,!0)||_(e,t,p,"deepStrictEqual",u.deepStrictEqual)},u.notDeepEqual=function(e,t,p){g(e,t,!1)&&_(e,t,p,"notDeepEqual",u.notDeepEqual)},u.notDeepStrictEqual=function e(t,p,r){g(t,p,!0)&&_(t,p,r,"notDeepStrictEqual",e)},u.strictEqual=function(e,t,p){e!==t&&_(e,t,p,"===",u.strictEqual)},u.notStrictEqual=function(e,t,p){e===t&&_(e,t,p,"!==",u.notStrictEqual)},u.throws=function(e,t,p){m(!0,e,t,p)},u.doesNotThrow=function(e,t,p){m(!1,e,t,p)},u.ifError=function(e){if(e)throw e};var b=Object.keys||function(e){var t=[];for(var p in e)s.call(e,p)&&t.push(p);return t}}).call(this,p(5))},function(e,t,p){var r;!function(p){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 p=parseInt(e,t||10);return this._low=65535&p,this._high=p>>>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,p=t>>>16;return p+=this._high+e._high,this._low=65535&t,this._high=65535&p,this},o.prototype.subtract=function(e){return this.add(e.clone().negate())},o.prototype.multiply=function(e){var t,p,r=this._high,o=this._low,i=e._high,s=e._low;return t=(p=o*s)>>>16,t+=r*s,t&=65535,t+=o*i,this._low=65535&p,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(),p=-1;!this.lt(t);)t.shiftLeft(1,!0),p++;for(this.remainder=this.clone(),this._low=0,this._high=0;p>=0;p--)t.shiftRight(1),this.remainder.lt(t)||(this.remainder.subtract(t),p>=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===(r=function(){return o}.apply(t,[]))||(e.exports=r)}()},function(e,t,p){var r;!function(p){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,p,r){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,p,r)}function n(e,t,p,r){return void 0===p?(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|p,this._a48=0|r,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 p=o[t]||new s(Math.pow(t,5)),r=0,i=e.length;r=0&&(p.div(t),r[o]=p.remainder.toNumber().toString(e),p.gt(t));o--);return r[o-1]=p.toNumber().toString(e),r.join("")},s.prototype.add=function(e){var t=this._a00+e._a00,p=t>>>16,r=(p+=this._a16+e._a16)>>>16,o=(r+=this._a32+e._a32)>>>16;return o+=this._a48+e._a48,this._a00=65535&t,this._a16=65535&p,this._a32=65535&r,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,p=this._a16,r=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+=p*i)>>>16;var u=(c+=t*n)>>>16;return c&=65535,u+=(c+=p*s)>>>16,c&=65535,u+=(c+=r*i)>>>16,u+=t*e._a48,u&=65535,u+=p*n,u&=65535,u+=r*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(),p=-1;!this.lt(t);)t.shiftLeft(1,!0),p++;for(this.remainder=this.clone(),this._a00=0,this._a16=0,this._a32=0,this._a48=0;p>=0;p--)t.shiftRight(1),this.remainder.lt(t)||(this.remainder.subtract(t),p>=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 p=this._a48<<16|this._a32,r=this._a16<<16|this._a00,o=p<>>32-e,i=r<>>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 p=this._a48<<16|this._a32,r=this._a16<<16|this._a00,o=p>>>e|r<<32-e,i=r>>>e|p<<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===(r=function(){return s}.apply(t,[]))||(e.exports=r)}()},function(e,t,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,p(0).CarrierPhase,p(0).GnssSignal),s=p(0).GnssSignalDep,n=(p(0).GPSTime,p(0).GPSTimeDep,p(0).GPSTimeSec,p(0).SvId,function(e,t){return r.call(this,e),this.messageType="MSG_ACQ_RESULT",this.fields=t||this.parser.parse(e.payload),this});(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_ACQ_RESULT_DEP_C",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="MSG_ACQ_RESULT_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="MSG_ACQ_RESULT_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="AcqSvProfile",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="AcqSvProfileDep",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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]);let h=function(e,t){return r.call(this,e),this.messageType="MSG_ACQ_SV_PROFILE",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="MSG_ACQ_SV_PROFILE_DEP",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_BOOTLOADER_HANDSHAKE_REQ",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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=[];let s=function(e,t){return r.call(this,e),this.messageType="MSG_BOOTLOADER_HANDSHAKE_RESP",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_BOOTLOADER_JUMP_TO_APP",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_NAP_DEVICE_DNA_REQ",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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=[];let l=function(e,t){return r.call(this,e),this.messageType="MSG_NAP_DEVICE_DNA_RESP",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="MSG_BOOTLOADER_HANDSHAKE_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_EXT_EVENT",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_READ_REQ",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_READ_RESP",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_READ_DIR_REQ",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_READ_DIR_RESP",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_REMOVE",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_WRITE_REQ",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_WRITE_RESP",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_CONFIG_REQ",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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]);let h=function(e,t){return r.call(this,e),this.messageType="MSG_FILEIO_CONFIG_RESP",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_FLASH_PROGRAM",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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"]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_FLASH_DONE",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_FLASH_READ_REQ",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_FLASH_READ_RESP",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="MSG_FLASH_ERASE",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="MSG_STM_FLASH_LOCK_SECTOR",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="MSG_STM_FLASH_UNLOCK_SECTOR",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="MSG_STM_UNIQUE_ID_REQ",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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=[];let h=function(e,t){return r.call(this,e),this.messageType="MSG_STM_UNIQUE_ID_RESP",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="MSG_M25_FLASH_WRITE_STATUS",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_IMU_RAW",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_IMU_AUX",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,p(0).CarrierPhase,p(0).GnssSignal,p(0).GnssSignalDep,p(0).GPSTime,p(0).GPSTimeDep,p(0).GPSTimeSec),s=p(0).SvId,n=function(e,t){return r.call(this,e),this.messageType="IntegritySSRHeader",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.prototype)).messageType="IntegritySSRHeader",n.prototype.constructor=n,n.prototype.parser=(new o).endianess("little").nest("obs_time",{type:i.prototype.parser}).uint8("num_msgs").uint8("seq_num").uint8("ssr_sol_id").uint16("tile_set_id").uint16("tile_id").uint8("chain_id"),n.prototype.fieldSpec=[],n.prototype.fieldSpec.push(["obs_time",i.prototype.fieldSpec]),n.prototype.fieldSpec.push(["num_msgs","writeUInt8",1]),n.prototype.fieldSpec.push(["seq_num","writeUInt8",1]),n.prototype.fieldSpec.push(["ssr_sol_id","writeUInt8",1]),n.prototype.fieldSpec.push(["tile_set_id","writeUInt16LE",2]),n.prototype.fieldSpec.push(["tile_id","writeUInt16LE",2]),n.prototype.fieldSpec.push(["chain_id","writeUInt8",1]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_FLAG_HIGH_LEVEL",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.prototype)).messageType="MSG_SSR_FLAG_HIGH_LEVEL",a.prototype.msg_type=3001,a.prototype.constructor=a,a.prototype.parser=(new o).endianess("little").nest("obs_time",{type:i.prototype.parser}).nest("corr_time",{type:i.prototype.parser}).uint8("ssr_sol_id").uint16("tile_set_id").uint16("tile_id").uint8("chain_id").uint8("use_gps_sat").uint8("use_gal_sat").uint8("use_bds_sat").array("reserved",{length:6,type:"uint8"}).uint8("use_tropo_grid_points").uint8("use_iono_grid_points").uint8("use_iono_tile_sat_los").uint8("use_iono_grid_point_sat_los"),a.prototype.fieldSpec=[],a.prototype.fieldSpec.push(["obs_time",i.prototype.fieldSpec]),a.prototype.fieldSpec.push(["corr_time",i.prototype.fieldSpec]),a.prototype.fieldSpec.push(["ssr_sol_id","writeUInt8",1]),a.prototype.fieldSpec.push(["tile_set_id","writeUInt16LE",2]),a.prototype.fieldSpec.push(["tile_id","writeUInt16LE",2]),a.prototype.fieldSpec.push(["chain_id","writeUInt8",1]),a.prototype.fieldSpec.push(["use_gps_sat","writeUInt8",1]),a.prototype.fieldSpec.push(["use_gal_sat","writeUInt8",1]),a.prototype.fieldSpec.push(["use_bds_sat","writeUInt8",1]),a.prototype.fieldSpec.push(["reserved","array","writeUInt8",function(){return 1},6]),a.prototype.fieldSpec.push(["use_tropo_grid_points","writeUInt8",1]),a.prototype.fieldSpec.push(["use_iono_grid_points","writeUInt8",1]),a.prototype.fieldSpec.push(["use_iono_tile_sat_los","writeUInt8",1]),a.prototype.fieldSpec.push(["use_iono_grid_point_sat_los","writeUInt8",1]);let l=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_FLAG_SATELLITES",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.prototype)).messageType="MSG_SSR_FLAG_SATELLITES",l.prototype.msg_type=3005,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little").nest("obs_time",{type:i.prototype.parser}).uint8("num_msgs").uint8("seq_num").uint8("ssr_sol_id").uint8("chain_id").uint8("const_id").uint8("n_faulty_sats").array("faulty_sats",{type:"uint8",length:"n_faulty_sats"}),l.prototype.fieldSpec=[],l.prototype.fieldSpec.push(["obs_time",i.prototype.fieldSpec]),l.prototype.fieldSpec.push(["num_msgs","writeUInt8",1]),l.prototype.fieldSpec.push(["seq_num","writeUInt8",1]),l.prototype.fieldSpec.push(["ssr_sol_id","writeUInt8",1]),l.prototype.fieldSpec.push(["chain_id","writeUInt8",1]),l.prototype.fieldSpec.push(["const_id","writeUInt8",1]),l.prototype.fieldSpec.push(["n_faulty_sats","writeUInt8",1]),l.prototype.fieldSpec.push(["faulty_sats","array","writeUInt8",function(){return 1},"n_faulty_sats"]);let c=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_FLAG_TROPO_GRID_POINTS",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.prototype)).messageType="MSG_SSR_FLAG_TROPO_GRID_POINTS",c.prototype.msg_type=3011,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little").nest("header",{type:n.prototype.parser}).uint8("n_faulty_points").array("faulty_points",{type:"uint16le",length:"n_faulty_points"}),c.prototype.fieldSpec=[],c.prototype.fieldSpec.push(["header",n.prototype.fieldSpec]),c.prototype.fieldSpec.push(["n_faulty_points","writeUInt8",1]),c.prototype.fieldSpec.push(["faulty_points","array","writeUInt16LE",function(){return 2},"n_faulty_points"]);let u=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_FLAG_IONO_GRID_POINTS",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.prototype)).messageType="MSG_SSR_FLAG_IONO_GRID_POINTS",u.prototype.msg_type=3015,u.prototype.constructor=u,u.prototype.parser=(new o).endianess("little").nest("header",{type:n.prototype.parser}).uint8("n_faulty_points").array("faulty_points",{type:"uint16le",length:"n_faulty_points"}),u.prototype.fieldSpec=[],u.prototype.fieldSpec.push(["header",n.prototype.fieldSpec]),u.prototype.fieldSpec.push(["n_faulty_points","writeUInt8",1]),u.prototype.fieldSpec.push(["faulty_points","array","writeUInt16LE",function(){return 2},"n_faulty_points"]);let y=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_FLAG_IONO_TILE_SAT_LOS",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.prototype)).messageType="MSG_SSR_FLAG_IONO_TILE_SAT_LOS",y.prototype.msg_type=3021,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little").nest("header",{type:n.prototype.parser}).uint8("n_faulty_los").array("faulty_los",{type:s.prototype.parser,length:"n_faulty_los"}),y.prototype.fieldSpec=[],y.prototype.fieldSpec.push(["header",n.prototype.fieldSpec]),y.prototype.fieldSpec.push(["n_faulty_los","writeUInt8",1]),y.prototype.fieldSpec.push(["faulty_los","array",s.prototype.fieldSpec,function(){return this.fields.array.length},"n_faulty_los"]);let h=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.prototype)).messageType="MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS",h.prototype.msg_type=3025,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little").nest("header",{type:n.prototype.parser}).uint16("grid_point_id").uint8("n_faulty_los").array("faulty_los",{type:s.prototype.parser,length:"n_faulty_los"}),h.prototype.fieldSpec=[],h.prototype.fieldSpec.push(["header",n.prototype.fieldSpec]),h.prototype.fieldSpec.push(["grid_point_id","writeUInt16LE",2]),h.prototype.fieldSpec.push(["n_faulty_los","writeUInt8",1]),h.prototype.fieldSpec.push(["faulty_los","array",s.prototype.fieldSpec,function(){return this.fields.array.length},"n_faulty_los"]),e.exports={IntegritySSRHeader:n,3001:a,MsgSsrFlagHighLevel:a,3005:l,MsgSsrFlagSatellites:l,3011:c,MsgSsrFlagTropoGridPoints:c,3015:u,MsgSsrFlagIonoGridPoints:u,3021:y,MsgSsrFlagIonoTileSatLos:y,3025:h,MsgSsrFlagIonoGridPointSatLos:h}},function(e,t,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_CPU_STATE_DEP_A",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_MEM_STATE_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_SYS_STATE_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_PROCESS_SOCKET_COUNTS",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_PROCESS_SOCKET_QUEUES",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_SOCKET_USAGE",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_PROCESS_FD_COUNT",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_PROCESS_FD_SUMMARY",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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]);let h=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_CPU_STATE",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_MEM_STATE",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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]);let d=function(e,t){return r.call(this,e),this.messageType="MSG_LINUX_SYS_STATE",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_LOG",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_FWD",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_PRINT_DEP",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_MAG_RAW",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_GPS_TIME",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_GPS_TIME_GNSS",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_UTC_TIME",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_UTC_TIME_GNSS",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="MSG_DOPS",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="MSG_POS_ECEF",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="MSG_POS_ECEF_COV",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="MSG_POS_LLH",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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]);let h=function(e,t){return r.call(this,e),this.messageType="MSG_POS_LLH_COV",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="EstimatedHorizontalErrorEllipse",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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]);let d=function(e,t){return r.call(this,e),this.messageType="MSG_POS_LLH_ACC",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(r.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]);let _=function(e,t){return r.call(this,e),this.messageType="MSG_BASELINE_ECEF",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(r.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]);let S=function(e,t){return r.call(this,e),this.messageType="MSG_BASELINE_NED",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(r.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]);let g=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_ECEF",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(r.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]);let w=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_ECEF_COV",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(r.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]);let E=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_NED",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(r.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]);let m=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_NED_COV",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(r.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]);let b=function(e,t){return r.call(this,e),this.messageType="MSG_POS_ECEF_GNSS",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(r.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]);let I=function(e,t){return r.call(this,e),this.messageType="MSG_POS_ECEF_COV_GNSS",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(r.prototype)).messageType="MSG_POS_ECEF_COV_GNSS",I.prototype.msg_type=564,I.prototype.constructor=I,I.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"),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),I.prototype.fieldSpec.push(["x","writeDoubleLE",8]),I.prototype.fieldSpec.push(["y","writeDoubleLE",8]),I.prototype.fieldSpec.push(["z","writeDoubleLE",8]),I.prototype.fieldSpec.push(["cov_x_x","writeFloatLE",4]),I.prototype.fieldSpec.push(["cov_x_y","writeFloatLE",4]),I.prototype.fieldSpec.push(["cov_x_z","writeFloatLE",4]),I.prototype.fieldSpec.push(["cov_y_y","writeFloatLE",4]),I.prototype.fieldSpec.push(["cov_y_z","writeFloatLE",4]),I.prototype.fieldSpec.push(["cov_z_z","writeFloatLE",4]),I.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),I.prototype.fieldSpec.push(["flags","writeUInt8",1]);let L=function(e,t){return r.call(this,e),this.messageType="MSG_POS_LLH_GNSS",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(r.prototype)).messageType="MSG_POS_LLH_GNSS",L.prototype.msg_type=554,L.prototype.constructor=L,L.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"),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(["h_accuracy","writeUInt16LE",2]),L.prototype.fieldSpec.push(["v_accuracy","writeUInt16LE",2]),L.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),L.prototype.fieldSpec.push(["flags","writeUInt8",1]);let T=function(e,t){return r.call(this,e),this.messageType="MSG_POS_LLH_COV_GNSS",this.fields=t||this.parser.parse(e.payload),this};(T.prototype=Object.create(r.prototype)).messageType="MSG_POS_LLH_COV_GNSS",T.prototype.msg_type=561,T.prototype.constructor=T,T.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"),T.prototype.fieldSpec=[],T.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),T.prototype.fieldSpec.push(["lat","writeDoubleLE",8]),T.prototype.fieldSpec.push(["lon","writeDoubleLE",8]),T.prototype.fieldSpec.push(["height","writeDoubleLE",8]),T.prototype.fieldSpec.push(["cov_n_n","writeFloatLE",4]),T.prototype.fieldSpec.push(["cov_n_e","writeFloatLE",4]),T.prototype.fieldSpec.push(["cov_n_d","writeFloatLE",4]),T.prototype.fieldSpec.push(["cov_e_e","writeFloatLE",4]),T.prototype.fieldSpec.push(["cov_e_d","writeFloatLE",4]),T.prototype.fieldSpec.push(["cov_d_d","writeFloatLE",4]),T.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),T.prototype.fieldSpec.push(["flags","writeUInt8",1]);let v=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_ECEF_GNSS",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(r.prototype)).messageType="MSG_VEL_ECEF_GNSS",v.prototype.msg_type=557,v.prototype.constructor=v,v.prototype.parser=(new o).endianess("little").uint32("tow").int32("x").int32("y").int32("z").uint16("accuracy").uint8("n_sats").uint8("flags"),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["tow","writeUInt32LE",4]),v.prototype.fieldSpec.push(["x","writeInt32LE",4]),v.prototype.fieldSpec.push(["y","writeInt32LE",4]),v.prototype.fieldSpec.push(["z","writeInt32LE",4]),v.prototype.fieldSpec.push(["accuracy","writeUInt16LE",2]),v.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),v.prototype.fieldSpec.push(["flags","writeUInt8",1]);let U=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_ECEF_COV_GNSS",this.fields=t||this.parser.parse(e.payload),this};(U.prototype=Object.create(r.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]);let M=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_NED_GNSS",this.fields=t||this.parser.parse(e.payload),this};(M.prototype=Object.create(r.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]);let D=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_NED_COV_GNSS",this.fields=t||this.parser.parse(e.payload),this};(D.prototype=Object.create(r.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]);let O=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_BODY",this.fields=t||this.parser.parse(e.payload),this};(O.prototype=Object.create(r.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]);let G=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_COG",this.fields=t||this.parser.parse(e.payload),this};(G.prototype=Object.create(r.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]);let A=function(e,t){return r.call(this,e),this.messageType="MSG_AGE_CORRECTIONS",this.fields=t||this.parser.parse(e.payload),this};(A.prototype=Object.create(r.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]);let C=function(e,t){return r.call(this,e),this.messageType="MSG_GPS_TIME_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(C.prototype=Object.create(r.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]);let R=function(e,t){return r.call(this,e),this.messageType="MSG_DOPS_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(R.prototype=Object.create(r.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]);let P=function(e,t){return r.call(this,e),this.messageType="MSG_POS_ECEF_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(P.prototype=Object.create(r.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]);let N=function(e,t){return r.call(this,e),this.messageType="MSG_POS_LLH_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(N.prototype=Object.create(r.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]);let j=function(e,t){return r.call(this,e),this.messageType="MSG_BASELINE_ECEF_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(j.prototype=Object.create(r.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]);let x=function(e,t){return r.call(this,e),this.messageType="MSG_BASELINE_NED_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(x.prototype=Object.create(r.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]);let k=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_ECEF_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(k.prototype=Object.create(r.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]);let F=function(e,t){return r.call(this,e),this.messageType="MSG_VEL_NED_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(F.prototype=Object.create(r.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]);let B=function(e,t){return r.call(this,e),this.messageType="MSG_BASELINE_HEADING_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(B.prototype=Object.create(r.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]);let q=function(e,t){return r.call(this,e),this.messageType="MSG_PROTECTION_LEVEL_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(q.prototype=Object.create(r.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]);let z=function(e,t){return r.call(this,e),this.messageType="MSG_PROTECTION_LEVEL",this.fields=t||this.parser.parse(e.payload),this};(z.prototype=Object.create(r.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]);let H=function(e,t){return r.call(this,e),this.messageType="MSG_UTC_LEAP_SECOND",this.fields=t||this.parser.parse(e.payload),this};(H.prototype=Object.create(r.prototype)).messageType="MSG_UTC_LEAP_SECOND",H.prototype.msg_type=570,H.prototype.constructor=H,H.prototype.parser=(new o).endianess("little").int16("bias_coeff").int16("drift_coeff").int8("drift_rate_coeff").int8("count_before").uint16("tow_s").uint16("wn").uint16("ref_wn").uint8("ref_dn").int8("count_after"),H.prototype.fieldSpec=[],H.prototype.fieldSpec.push(["bias_coeff","writeInt16LE",2]),H.prototype.fieldSpec.push(["drift_coeff","writeInt16LE",2]),H.prototype.fieldSpec.push(["drift_rate_coeff","writeInt8",1]),H.prototype.fieldSpec.push(["count_before","writeInt8",1]),H.prototype.fieldSpec.push(["tow_s","writeUInt16LE",2]),H.prototype.fieldSpec.push(["wn","writeUInt16LE",2]),H.prototype.fieldSpec.push(["ref_wn","writeUInt16LE",2]),H.prototype.fieldSpec.push(["ref_dn","writeUInt8",1]),H.prototype.fieldSpec.push(["count_after","writeInt8",1]);let V=function(e,t){return r.call(this,e),this.messageType="MSG_REFERENCE_FRAME_PARAM",this.fields=t||this.parser.parse(e.payload),this};(V.prototype=Object.create(r.prototype)).messageType="MSG_REFERENCE_FRAME_PARAM",V.prototype.msg_type=580,V.prototype.constructor=V,V.prototype.parser=(new o).endianess("little").uint8("ssr_iod").string("sn",{length:32}).string("tn",{length:32}).uint8("sin").uint16("utn").uint16("re_t0").int32("delta_X0").int32("delta_Y0").int32("delta_Z0").int32("theta_01").int32("theta_02").int32("theta_03").int32("scale").int32("dot_delta_X0").int32("dot_delta_Y0").int32("dot_delta_Z0").int32("dot_theta_01").int32("dot_theta_02").int32("dot_theta_03").int16("dot_scale"),V.prototype.fieldSpec=[],V.prototype.fieldSpec.push(["ssr_iod","writeUInt8",1]),V.prototype.fieldSpec.push(["sn","string",32]),V.prototype.fieldSpec.push(["tn","string",32]),V.prototype.fieldSpec.push(["sin","writeUInt8",1]),V.prototype.fieldSpec.push(["utn","writeUInt16LE",2]),V.prototype.fieldSpec.push(["re_t0","writeUInt16LE",2]),V.prototype.fieldSpec.push(["delta_X0","writeInt32LE",4]),V.prototype.fieldSpec.push(["delta_Y0","writeInt32LE",4]),V.prototype.fieldSpec.push(["delta_Z0","writeInt32LE",4]),V.prototype.fieldSpec.push(["theta_01","writeInt32LE",4]),V.prototype.fieldSpec.push(["theta_02","writeInt32LE",4]),V.prototype.fieldSpec.push(["theta_03","writeInt32LE",4]),V.prototype.fieldSpec.push(["scale","writeInt32LE",4]),V.prototype.fieldSpec.push(["dot_delta_X0","writeInt32LE",4]),V.prototype.fieldSpec.push(["dot_delta_Y0","writeInt32LE",4]),V.prototype.fieldSpec.push(["dot_delta_Z0","writeInt32LE",4]),V.prototype.fieldSpec.push(["dot_theta_01","writeInt32LE",4]),V.prototype.fieldSpec.push(["dot_theta_02","writeInt32LE",4]),V.prototype.fieldSpec.push(["dot_theta_03","writeInt32LE",4]),V.prototype.fieldSpec.push(["dot_scale","writeInt16LE",2]),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:I,MsgPosEcefCovGnss:I,554:L,MsgPosLlhGnss:L,561:T,MsgPosLlhCovGnss:T,557:v,MsgVelEcefGnss:v,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,570:H,MsgUtcLeapSecond:H,580:V,MsgReferenceFrameParam:V}},function(e,t,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,p(0).CarrierPhase,p(0).GnssSignal),s=(p(0).GnssSignalDep,p(0).GPSTime,p(0).GPSTimeDep,p(0).GPSTimeSec,p(0).SvId,function(e,t){return r.call(this,e),this.messageType="MSG_NDB_EVENT",this.fields=t||this.parser.parse(e.payload),this});(s.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,p(0).CarrierPhase),s=p(0).GnssSignal,n=p(0).GnssSignalDep,a=p(0).GPSTime,l=p(0).GPSTimeDep,c=p(0).GPSTimeSec,u=(p(0).SvId,function(e,t){return r.call(this,e),this.messageType="ObservationHeader",this.fields=t||this.parser.parse(e.payload),this});(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="Doppler",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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]);let h=function(e,t){return r.call(this,e),this.messageType="PackedObsContent",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="PackedOsrContent",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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]);let d=function(e,t){return r.call(this,e),this.messageType="MSG_OBS",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(r.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]);let _=function(e,t){return r.call(this,e),this.messageType="MSG_BASE_POS_LLH",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(r.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]);let S=function(e,t){return r.call(this,e),this.messageType="MSG_BASE_POS_ECEF",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(r.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]);let g=function(e,t){return r.call(this,e),this.messageType="EphemerisCommonContent",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(r.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]);let w=function(e,t){return r.call(this,e),this.messageType="EphemerisCommonContentDepB",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(r.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]);let E=function(e,t){return r.call(this,e),this.messageType="EphemerisCommonContentDepA",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(r.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]);let m=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GPS_DEP_E",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(r.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]);let b=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GPS_DEP_F",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(r.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]);let I=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GPS",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(r.prototype)).messageType="MSG_EPHEMERIS_GPS",I.prototype.msg_type=138,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]);let L=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_QZSS",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(r.prototype)).messageType="MSG_EPHEMERIS_QZSS",L.prototype.msg_type=142,L.prototype.constructor=L,L.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"),L.prototype.fieldSpec=[],L.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),L.prototype.fieldSpec.push(["tgd","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","writeFloatLE",4]),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]);let T=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_BDS",this.fields=t||this.parser.parse(e.payload),this};(T.prototype=Object.create(r.prototype)).messageType="MSG_EPHEMERIS_BDS",T.prototype.msg_type=137,T.prototype.constructor=T,T.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"),T.prototype.fieldSpec=[],T.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),T.prototype.fieldSpec.push(["tgd1","writeFloatLE",4]),T.prototype.fieldSpec.push(["tgd2","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","writeFloatLE",4]),T.prototype.fieldSpec.push(["af2","writeFloatLE",4]),T.prototype.fieldSpec.push(["toc",c.prototype.fieldSpec]),T.prototype.fieldSpec.push(["iode","writeUInt8",1]),T.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]);let v=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GAL_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(r.prototype)).messageType="MSG_EPHEMERIS_GAL_DEP_A",v.prototype.msg_type=149,v.prototype.constructor=v,v.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"),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["common",g.prototype.fieldSpec]),v.prototype.fieldSpec.push(["bgd_e1e5a","writeFloatLE",4]),v.prototype.fieldSpec.push(["bgd_e1e5b","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","writeDoubleLE",8]),v.prototype.fieldSpec.push(["af1","writeDoubleLE",8]),v.prototype.fieldSpec.push(["af2","writeFloatLE",4]),v.prototype.fieldSpec.push(["toc",c.prototype.fieldSpec]),v.prototype.fieldSpec.push(["iode","writeUInt16LE",2]),v.prototype.fieldSpec.push(["iodc","writeUInt16LE",2]);let U=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GAL",this.fields=t||this.parser.parse(e.payload),this};(U.prototype=Object.create(r.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]);let M=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_SBAS_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(M.prototype=Object.create(r.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]);let D=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GLO_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(D.prototype=Object.create(r.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]);let O=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_SBAS_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(O.prototype=Object.create(r.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]);let G=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_SBAS",this.fields=t||this.parser.parse(e.payload),this};(G.prototype=Object.create(r.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]);let A=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GLO_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(A.prototype=Object.create(r.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]);let C=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GLO_DEP_C",this.fields=t||this.parser.parse(e.payload),this};(C.prototype=Object.create(r.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]);let R=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GLO_DEP_D",this.fields=t||this.parser.parse(e.payload),this};(R.prototype=Object.create(r.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]);let P=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_GLO",this.fields=t||this.parser.parse(e.payload),this};(P.prototype=Object.create(r.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]);let N=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_DEP_D",this.fields=t||this.parser.parse(e.payload),this};(N.prototype=Object.create(r.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]);let j=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(j.prototype=Object.create(r.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]);let x=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(x.prototype=Object.create(r.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]);let k=function(e,t){return r.call(this,e),this.messageType="MSG_EPHEMERIS_DEP_C",this.fields=t||this.parser.parse(e.payload),this};(k.prototype=Object.create(r.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]);let F=function(e,t){return r.call(this,e),this.messageType="ObservationHeaderDep",this.fields=t||this.parser.parse(e.payload),this};(F.prototype=Object.create(r.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]);let B=function(e,t){return r.call(this,e),this.messageType="CarrierPhaseDepA",this.fields=t||this.parser.parse(e.payload),this};(B.prototype=Object.create(r.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]);let q=function(e,t){return r.call(this,e),this.messageType="PackedObsContentDepA",this.fields=t||this.parser.parse(e.payload),this};(q.prototype=Object.create(r.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]);let z=function(e,t){return r.call(this,e),this.messageType="PackedObsContentDepB",this.fields=t||this.parser.parse(e.payload),this};(z.prototype=Object.create(r.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]);let H=function(e,t){return r.call(this,e),this.messageType="PackedObsContentDepC",this.fields=t||this.parser.parse(e.payload),this};(H.prototype=Object.create(r.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]);let V=function(e,t){return r.call(this,e),this.messageType="MSG_OBS_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(V.prototype=Object.create(r.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]);let Y=function(e,t){return r.call(this,e),this.messageType="MSG_OBS_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(Y.prototype=Object.create(r.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]);let W=function(e,t){return r.call(this,e),this.messageType="MSG_OBS_DEP_C",this.fields=t||this.parser.parse(e.payload),this};(W.prototype=Object.create(r.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]);let Q=function(e,t){return r.call(this,e),this.messageType="MSG_IONO",this.fields=t||this.parser.parse(e.payload),this};(Q.prototype=Object.create(r.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]);let K=function(e,t){return r.call(this,e),this.messageType="MSG_SV_CONFIGURATION_GPS_DEP",this.fields=t||this.parser.parse(e.payload),this};(K.prototype=Object.create(r.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]);let X=function(e,t){return r.call(this,e),this.messageType="GnssCapb",this.fields=t||this.parser.parse(e.payload),this};(X.prototype=Object.create(r.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]);let J=function(e,t){return r.call(this,e),this.messageType="MSG_GNSS_CAPB",this.fields=t||this.parser.parse(e.payload),this};(J.prototype=Object.create(r.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]);let Z=function(e,t){return r.call(this,e),this.messageType="MSG_GROUP_DELAY_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(Z.prototype=Object.create(r.prototype)).messageType="MSG_GROUP_DELAY_DEP_A",Z.prototype.msg_type=146,Z.prototype.constructor=Z,Z.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"),Z.prototype.fieldSpec=[],Z.prototype.fieldSpec.push(["t_op",l.prototype.fieldSpec]),Z.prototype.fieldSpec.push(["prn","writeUInt8",1]),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]);let $=function(e,t){return r.call(this,e),this.messageType="MSG_GROUP_DELAY_DEP_B",this.fields=t||this.parser.parse(e.payload),this};($.prototype=Object.create(r.prototype)).messageType="MSG_GROUP_DELAY_DEP_B",$.prototype.msg_type=147,$.prototype.constructor=$,$.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"),$.prototype.fieldSpec=[],$.prototype.fieldSpec.push(["t_op",c.prototype.fieldSpec]),$.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),$.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]);let ee=function(e,t){return r.call(this,e),this.messageType="MSG_GROUP_DELAY",this.fields=t||this.parser.parse(e.payload),this};(ee.prototype=Object.create(r.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]);let te=function(e,t){return r.call(this,e),this.messageType="AlmanacCommonContent",this.fields=t||this.parser.parse(e.payload),this};(te.prototype=Object.create(r.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]);let pe=function(e,t){return r.call(this,e),this.messageType="AlmanacCommonContentDep",this.fields=t||this.parser.parse(e.payload),this};(pe.prototype=Object.create(r.prototype)).messageType="AlmanacCommonContentDep",pe.prototype.constructor=pe,pe.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"),pe.prototype.fieldSpec=[],pe.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),pe.prototype.fieldSpec.push(["toa",c.prototype.fieldSpec]),pe.prototype.fieldSpec.push(["ura","writeDoubleLE",8]),pe.prototype.fieldSpec.push(["fit_interval","writeUInt32LE",4]),pe.prototype.fieldSpec.push(["valid","writeUInt8",1]),pe.prototype.fieldSpec.push(["health_bits","writeUInt8",1]);let re=function(e,t){return r.call(this,e),this.messageType="MSG_ALMANAC_GPS_DEP",this.fields=t||this.parser.parse(e.payload),this};(re.prototype=Object.create(r.prototype)).messageType="MSG_ALMANAC_GPS_DEP",re.prototype.msg_type=112,re.prototype.constructor=re,re.prototype.parser=(new o).endianess("little").nest("common",{type:pe.prototype.parser}).doublele("m0").doublele("ecc").doublele("sqrta").doublele("omega0").doublele("omegadot").doublele("w").doublele("inc").doublele("af0").doublele("af1"),re.prototype.fieldSpec=[],re.prototype.fieldSpec.push(["common",pe.prototype.fieldSpec]),re.prototype.fieldSpec.push(["m0","writeDoubleLE",8]),re.prototype.fieldSpec.push(["ecc","writeDoubleLE",8]),re.prototype.fieldSpec.push(["sqrta","writeDoubleLE",8]),re.prototype.fieldSpec.push(["omega0","writeDoubleLE",8]),re.prototype.fieldSpec.push(["omegadot","writeDoubleLE",8]),re.prototype.fieldSpec.push(["w","writeDoubleLE",8]),re.prototype.fieldSpec.push(["inc","writeDoubleLE",8]),re.prototype.fieldSpec.push(["af0","writeDoubleLE",8]),re.prototype.fieldSpec.push(["af1","writeDoubleLE",8]);let oe=function(e,t){return r.call(this,e),this.messageType="MSG_ALMANAC_GPS",this.fields=t||this.parser.parse(e.payload),this};(oe.prototype=Object.create(r.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]);let ie=function(e,t){return r.call(this,e),this.messageType="MSG_ALMANAC_GLO_DEP",this.fields=t||this.parser.parse(e.payload),this};(ie.prototype=Object.create(r.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:pe.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",pe.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]);let se=function(e,t){return r.call(this,e),this.messageType="MSG_ALMANAC_GLO",this.fields=t||this.parser.parse(e.payload),this};(se.prototype=Object.create(r.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]);let ne=function(e,t){return r.call(this,e),this.messageType="MSG_GLO_BIASES",this.fields=t||this.parser.parse(e.payload),this};(ne.prototype=Object.create(r.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]);let ae=function(e,t){return r.call(this,e),this.messageType="SvAzEl",this.fields=t||this.parser.parse(e.payload),this};(ae.prototype=Object.create(r.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]);let le=function(e,t){return r.call(this,e),this.messageType="MSG_SV_AZ_EL",this.fields=t||this.parser.parse(e.payload),this};(le.prototype=Object.create(r.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]);let ce=function(e,t){return r.call(this,e),this.messageType="MSG_OSR",this.fields=t||this.parser.parse(e.payload),this};(ce.prototype=Object.create(r.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:I,MsgEphemerisGps:I,142:L,MsgEphemerisQzss:L,137:T,MsgEphemerisBds:T,149:v,MsgEphemerisGalDepA:v,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:Z,MsgGroupDelayDepA:Z,147:$,MsgGroupDelayDepB:$,148:ee,MsgGroupDelay:ee,AlmanacCommonContent:te,AlmanacCommonContentDep:pe,112:re,MsgAlmanacGpsDep:re,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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_BASELINE_HEADING",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_ORIENT_QUAT",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_ORIENT_EULER",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_ANGULAR_RATE",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,p(0).CarrierPhase,p(0).GnssSignal),s=p(0).GnssSignalDep,n=p(0).GPSTime,a=p(0).GPSTimeDep,l=(p(0).GPSTimeSec,p(0).SvId,function(e,t){return r.call(this,e),this.messageType="MSG_ALMANAC",this.fields=t||this.parser.parse(e.payload),this});(l.prototype=Object.create(r.prototype)).messageType="MSG_ALMANAC",l.prototype.msg_type=105,l.prototype.constructor=l,l.prototype.parser=(new o).endianess("little"),l.prototype.fieldSpec=[];let c=function(e,t){return r.call(this,e),this.messageType="MSG_SET_TIME",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.prototype)).messageType="MSG_SET_TIME",c.prototype.msg_type=104,c.prototype.constructor=c,c.prototype.parser=(new o).endianess("little"),c.prototype.fieldSpec=[];let u=function(e,t){return r.call(this,e),this.messageType="MSG_RESET",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="MSG_RESET_DEP",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.prototype)).messageType="MSG_RESET_DEP",y.prototype.msg_type=178,y.prototype.constructor=y,y.prototype.parser=(new o).endianess("little"),y.prototype.fieldSpec=[];let h=function(e,t){return r.call(this,e),this.messageType="MSG_CW_RESULTS",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.prototype)).messageType="MSG_CW_RESULTS",h.prototype.msg_type=192,h.prototype.constructor=h,h.prototype.parser=(new o).endianess("little"),h.prototype.fieldSpec=[];let f=function(e,t){return r.call(this,e),this.messageType="MSG_CW_START",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.prototype)).messageType="MSG_CW_START",f.prototype.msg_type=193,f.prototype.constructor=f,f.prototype.parser=(new o).endianess("little"),f.prototype.fieldSpec=[];let d=function(e,t){return r.call(this,e),this.messageType="MSG_RESET_FILTERS",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(r.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]);let _=function(e,t){return r.call(this,e),this.messageType="MSG_INIT_BASE_DEP",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(r.prototype)).messageType="MSG_INIT_BASE_DEP",_.prototype.msg_type=35,_.prototype.constructor=_,_.prototype.parser=(new o).endianess("little"),_.prototype.fieldSpec=[];let S=function(e,t){return r.call(this,e),this.messageType="MSG_THREAD_STATE",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(r.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]);let g=function(e,t){return r.call(this,e),this.messageType="UARTChannel",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(r.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]);let w=function(e,t){return r.call(this,e),this.messageType="Period",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(r.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]);let E=function(e,t){return r.call(this,e),this.messageType="Latency",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(r.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]);let m=function(e,t){return r.call(this,e),this.messageType="MSG_UART_STATE",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(r.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]);let b=function(e,t){return r.call(this,e),this.messageType="MSG_UART_STATE_DEPA",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(r.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]);let I=function(e,t){return r.call(this,e),this.messageType="MSG_IAR_STATE",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(r.prototype)).messageType="MSG_IAR_STATE",I.prototype.msg_type=25,I.prototype.constructor=I,I.prototype.parser=(new o).endianess("little").uint32("num_hyps"),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["num_hyps","writeUInt32LE",4]);let L=function(e,t){return r.call(this,e),this.messageType="MSG_MASK_SATELLITE",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(r.prototype)).messageType="MSG_MASK_SATELLITE",L.prototype.msg_type=43,L.prototype.constructor=L,L.prototype.parser=(new o).endianess("little").uint8("mask").nest("sid",{type:i.prototype.parser}),L.prototype.fieldSpec=[],L.prototype.fieldSpec.push(["mask","writeUInt8",1]),L.prototype.fieldSpec.push(["sid",i.prototype.fieldSpec]);let T=function(e,t){return r.call(this,e),this.messageType="MSG_MASK_SATELLITE_DEP",this.fields=t||this.parser.parse(e.payload),this};(T.prototype=Object.create(r.prototype)).messageType="MSG_MASK_SATELLITE_DEP",T.prototype.msg_type=27,T.prototype.constructor=T,T.prototype.parser=(new o).endianess("little").uint8("mask").nest("sid",{type:s.prototype.parser}),T.prototype.fieldSpec=[],T.prototype.fieldSpec.push(["mask","writeUInt8",1]),T.prototype.fieldSpec.push(["sid",s.prototype.fieldSpec]);let v=function(e,t){return r.call(this,e),this.messageType="MSG_DEVICE_MONITOR",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(r.prototype)).messageType="MSG_DEVICE_MONITOR",v.prototype.msg_type=181,v.prototype.constructor=v,v.prototype.parser=(new o).endianess("little").int16("dev_vin").int16("cpu_vint").int16("cpu_vaux").int16("cpu_temperature").int16("fe_temperature"),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["dev_vin","writeInt16LE",2]),v.prototype.fieldSpec.push(["cpu_vint","writeInt16LE",2]),v.prototype.fieldSpec.push(["cpu_vaux","writeInt16LE",2]),v.prototype.fieldSpec.push(["cpu_temperature","writeInt16LE",2]),v.prototype.fieldSpec.push(["fe_temperature","writeInt16LE",2]);let U=function(e,t){return r.call(this,e),this.messageType="MSG_COMMAND_REQ",this.fields=t||this.parser.parse(e.payload),this};(U.prototype=Object.create(r.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]);let M=function(e,t){return r.call(this,e),this.messageType="MSG_COMMAND_RESP",this.fields=t||this.parser.parse(e.payload),this};(M.prototype=Object.create(r.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]);let D=function(e,t){return r.call(this,e),this.messageType="MSG_COMMAND_OUTPUT",this.fields=t||this.parser.parse(e.payload),this};(D.prototype=Object.create(r.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]);let O=function(e,t){return r.call(this,e),this.messageType="MSG_NETWORK_STATE_REQ",this.fields=t||this.parser.parse(e.payload),this};(O.prototype=Object.create(r.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=[];let G=function(e,t){return r.call(this,e),this.messageType="MSG_NETWORK_STATE_RESP",this.fields=t||this.parser.parse(e.payload),this};(G.prototype=Object.create(r.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]);let A=function(e,t){return r.call(this,e),this.messageType="NetworkUsage",this.fields=t||this.parser.parse(e.payload),this};(A.prototype=Object.create(r.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]);let C=function(e,t){return r.call(this,e),this.messageType="MSG_NETWORK_BANDWIDTH_USAGE",this.fields=t||this.parser.parse(e.payload),this};(C.prototype=Object.create(r.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]);let R=function(e,t){return r.call(this,e),this.messageType="MSG_CELL_MODEM_STATUS",this.fields=t||this.parser.parse(e.payload),this};(R.prototype=Object.create(r.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]);let P=function(e,t){return r.call(this,e),this.messageType="MSG_SPECAN_DEP",this.fields=t||this.parser.parse(e.payload),this};(P.prototype=Object.create(r.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]);let N=function(e,t){return r.call(this,e),this.messageType="MSG_SPECAN",this.fields=t||this.parser.parse(e.payload),this};(N.prototype=Object.create(r.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]);let j=function(e,t){return r.call(this,e),this.messageType="MSG_FRONT_END_GAIN",this.fields=t||this.parser.parse(e.payload),this};(j.prototype=Object.create(r.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:I,MsgIarState:I,43:L,MsgMaskSatellite:L,27:T,MsgMaskSatelliteDep:T,181:v,MsgDeviceMonitor:v,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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,p(0).CarrierPhase,p(0).GnssSignal),s=(p(0).GnssSignalDep,p(0).GPSTime,p(0).GPSTimeDep,p(0).GPSTimeSec,p(0).SvId,function(e,t){return r.call(this,e),this.messageType="MSG_SBAS_RAW",this.fields=t||this.parser.parse(e.payload),this});(s.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_SAVE",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.prototype)).messageType="MSG_SETTINGS_SAVE",i.prototype.msg_type=161,i.prototype.constructor=i,i.prototype.parser=(new o).endianess("little"),i.prototype.fieldSpec=[];let s=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_WRITE",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_WRITE_RESP",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_READ_REQ",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_READ_RESP",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_READ_BY_INDEX_REQ",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_READ_BY_INDEX_RESP",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_READ_BY_INDEX_DONE",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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=[];let h=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_REGISTER",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="MSG_SETTINGS_REGISTER_RESP",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="SolutionInputType",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_SOLN_META_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_SOLN_META",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="GNSSInputType",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="IMUInputType",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="OdoInputType",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,p(0).CarrierPhase,p(0).GnssSignal),s=(p(0).GnssSignalDep,p(0).GPSTime,p(0).GPSTimeDep,p(0).GPSTimeSec),n=p(0).SvId,a=function(e,t){return r.call(this,e),this.messageType="CodeBiasesContent",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="PhaseBiasesContent",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="STECHeader",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="GriddedCorrectionHeader",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="STECSatElement",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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]);let h=function(e,t){return r.call(this,e),this.messageType="TroposphericDelayCorrectionNoStd",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="TroposphericDelayCorrection",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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]);let d=function(e,t){return r.call(this,e),this.messageType="STECResidualNoStd",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(r.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]);let _=function(e,t){return r.call(this,e),this.messageType="STECResidual",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(r.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]);let S=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_ORBIT_CLOCK",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(r.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]);let g=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_CODE_BIASES",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(r.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]);let w=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_PHASE_BIASES",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(r.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]);let E=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_STEC_CORRECTION_DEP",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(r.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]);let m=function(e,t){return r.call(this,e),this.messageType="BoundsHeader",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(r.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]);let b=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_STEC_CORRECTION",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(r.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"]);let I=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_GRIDDED_CORRECTION",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(r.prototype)).messageType="MSG_SSR_GRIDDED_CORRECTION",I.prototype.msg_type=1532,I.prototype.constructor=I,I.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"}),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["header",u.prototype.fieldSpec]),I.prototype.fieldSpec.push(["index","writeUInt16LE",2]),I.prototype.fieldSpec.push(["tropo_delay_correction",f.prototype.fieldSpec]),I.prototype.fieldSpec.push(["stec_residuals","array",_.prototype.fieldSpec,function(){return this.fields.array.length},null]);let L=function(e,t){return r.call(this,e),this.messageType="STECSatElementIntegrity",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(r.prototype)).messageType="STECSatElementIntegrity",L.prototype.constructor=L,L.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"),L.prototype.fieldSpec=[],L.prototype.fieldSpec.push(["stec_residual",_.prototype.fieldSpec]),L.prototype.fieldSpec.push(["stec_bound_mu","writeUInt8",1]),L.prototype.fieldSpec.push(["stec_bound_sig","writeUInt8",1]),L.prototype.fieldSpec.push(["stec_bound_mu_dot","writeUInt8",1]),L.prototype.fieldSpec.push(["stec_bound_sig_dot","writeUInt8",1]);let T=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_GRIDDED_CORRECTION_BOUNDS",this.fields=t||this.parser.parse(e.payload),this};(T.prototype=Object.create(r.prototype)).messageType="MSG_SSR_GRIDDED_CORRECTION_BOUNDS",T.prototype.msg_type=1534,T.prototype.constructor=T,T.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_v_hydro_bound_mu").uint8("tropo_v_hydro_bound_sig").uint8("tropo_v_wet_bound_mu").uint8("tropo_v_wet_bound_sig").uint8("n_sats").array("stec_sat_list",{type:L.prototype.parser,length:"n_sats"}),T.prototype.fieldSpec=[],T.prototype.fieldSpec.push(["header",m.prototype.fieldSpec]),T.prototype.fieldSpec.push(["ssr_iod_atmo","writeUInt8",1]),T.prototype.fieldSpec.push(["tile_set_id","writeUInt16LE",2]),T.prototype.fieldSpec.push(["tile_id","writeUInt16LE",2]),T.prototype.fieldSpec.push(["tropo_qi","writeUInt8",1]),T.prototype.fieldSpec.push(["grid_point_id","writeUInt16LE",2]),T.prototype.fieldSpec.push(["tropo_delay_correction",f.prototype.fieldSpec]),T.prototype.fieldSpec.push(["tropo_v_hydro_bound_mu","writeUInt8",1]),T.prototype.fieldSpec.push(["tropo_v_hydro_bound_sig","writeUInt8",1]),T.prototype.fieldSpec.push(["tropo_v_wet_bound_mu","writeUInt8",1]),T.prototype.fieldSpec.push(["tropo_v_wet_bound_sig","writeUInt8",1]),T.prototype.fieldSpec.push(["n_sats","writeUInt8",1]),T.prototype.fieldSpec.push(["stec_sat_list","array",L.prototype.fieldSpec,function(){return this.fields.array.length},"n_sats"]);let v=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_TILE_DEFINITION_DEP",this.fields=t||this.parser.parse(e.payload),this};(v.prototype=Object.create(r.prototype)).messageType="MSG_SSR_TILE_DEFINITION_DEP",v.prototype.msg_type=1526,v.prototype.constructor=v,v.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"),v.prototype.fieldSpec=[],v.prototype.fieldSpec.push(["tile_set_id","writeUInt16LE",2]),v.prototype.fieldSpec.push(["tile_id","writeUInt16LE",2]),v.prototype.fieldSpec.push(["corner_nw_lat","writeInt16LE",2]),v.prototype.fieldSpec.push(["corner_nw_lon","writeInt16LE",2]),v.prototype.fieldSpec.push(["spacing_lat","writeUInt16LE",2]),v.prototype.fieldSpec.push(["spacing_lon","writeUInt16LE",2]),v.prototype.fieldSpec.push(["rows","writeUInt16LE",2]),v.prototype.fieldSpec.push(["cols","writeUInt16LE",2]),v.prototype.fieldSpec.push(["bitmask","writeUInt64LE",8]);let U=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_TILE_DEFINITION",this.fields=t||this.parser.parse(e.payload),this};(U.prototype=Object.create(r.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]);let M=function(e,t){return r.call(this,e),this.messageType="SatelliteAPC",this.fields=t||this.parser.parse(e.payload),this};(M.prototype=Object.create(r.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]);let D=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_SATELLITE_APC",this.fields=t||this.parser.parse(e.payload),this};(D.prototype=Object.create(r.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]);let O=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_ORBIT_CLOCK_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(O.prototype=Object.create(r.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]);let G=function(e,t){return r.call(this,e),this.messageType="STECHeaderDepA",this.fields=t||this.parser.parse(e.payload),this};(G.prototype=Object.create(r.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]);let A=function(e,t){return r.call(this,e),this.messageType="GriddedCorrectionHeaderDepA",this.fields=t||this.parser.parse(e.payload),this};(A.prototype=Object.create(r.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]);let C=function(e,t){return r.call(this,e),this.messageType="GridDefinitionHeaderDepA",this.fields=t||this.parser.parse(e.payload),this};(C.prototype=Object.create(r.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]);let R=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_STEC_CORRECTION_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(R.prototype=Object.create(r.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]);let P=function(e,t){return r.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(r.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]);let N=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_GRIDDED_CORRECTION_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(N.prototype=Object.create(r.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]);let j=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_GRID_DEFINITION_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(j.prototype=Object.create(r.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]);let x=function(e,t){return r.call(this,e),this.messageType="OrbitClockBound",this.fields=t||this.parser.parse(e.payload),this};(x.prototype=Object.create(r.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]);let k=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_ORBIT_CLOCK_BOUNDS",this.fields=t||this.parser.parse(e.payload),this};(k.prototype=Object.create(r.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"]);let F=function(e,t){return r.call(this,e),this.messageType="CodePhaseBiasesSatSig",this.fields=t||this.parser.parse(e.payload),this};(F.prototype=Object.create(r.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]);let B=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_CODE_PHASE_BIASES_BOUNDS",this.fields=t||this.parser.parse(e.payload),this};(B.prototype=Object.create(r.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"]);let q=function(e,t){return r.call(this,e),this.messageType="OrbitClockBoundDegradation",this.fields=t||this.parser.parse(e.payload),this};(q.prototype=Object.create(r.prototype)).messageType="OrbitClockBoundDegradation",q.prototype.constructor=q,q.prototype.parser=(new o).endianess("little").uint8("orb_radial_bound_mu_dot").uint8("orb_along_bound_mu_dot").uint8("orb_cross_bound_mu_dot").uint8("orb_radial_bound_sig_dot").uint8("orb_along_bound_sig_dot").uint8("orb_cross_bound_sig_dot").uint8("clock_bound_mu_dot").uint8("clock_bound_sig_dot"),q.prototype.fieldSpec=[],q.prototype.fieldSpec.push(["orb_radial_bound_mu_dot","writeUInt8",1]),q.prototype.fieldSpec.push(["orb_along_bound_mu_dot","writeUInt8",1]),q.prototype.fieldSpec.push(["orb_cross_bound_mu_dot","writeUInt8",1]),q.prototype.fieldSpec.push(["orb_radial_bound_sig_dot","writeUInt8",1]),q.prototype.fieldSpec.push(["orb_along_bound_sig_dot","writeUInt8",1]),q.prototype.fieldSpec.push(["orb_cross_bound_sig_dot","writeUInt8",1]),q.prototype.fieldSpec.push(["clock_bound_mu_dot","writeUInt8",1]),q.prototype.fieldSpec.push(["clock_bound_sig_dot","writeUInt8",1]);let z=function(e,t){return r.call(this,e),this.messageType="MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION",this.fields=t||this.parser.parse(e.payload),this};(z.prototype=Object.create(r.prototype)).messageType="MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION",z.prototype.msg_type=1503,z.prototype.constructor=z,z.prototype.parser=(new o).endianess("little").nest("header",{type:m.prototype.parser}).uint8("ssr_iod").uint8("const_id").uint64("sat_bitmask").nest("orbit_clock_bounds_degradation",{type:q.prototype.parser}),z.prototype.fieldSpec=[],z.prototype.fieldSpec.push(["header",m.prototype.fieldSpec]),z.prototype.fieldSpec.push(["ssr_iod","writeUInt8",1]),z.prototype.fieldSpec.push(["const_id","writeUInt8",1]),z.prototype.fieldSpec.push(["sat_bitmask","writeUInt64LE",8]),z.prototype.fieldSpec.push(["orbit_clock_bounds_degradation",q.prototype.fieldSpec]),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:I,MsgSsrGriddedCorrection:I,STECSatElementIntegrity:L,1534:T,MsgSsrGriddedCorrectionBounds:T,1526:v,MsgSsrTileDefinitionDep:v,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,OrbitClockBoundDegradation:q,1503:z,MsgSsrOrbitClockBoundsDegradation:z}},function(e,t,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_STARTUP",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_DGNSS_STATUS",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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]);let n=function(e,t){return r.call(this,e),this.messageType="MSG_HEARTBEAT",this.fields=t||this.parser.parse(e.payload),this};(n.prototype=Object.create(r.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]);let a=function(e,t){return r.call(this,e),this.messageType="SubSystemReport",this.fields=t||this.parser.parse(e.payload),this};(a.prototype=Object.create(r.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]);let l=function(e,t){return r.call(this,e),this.messageType="MSG_STATUS_REPORT",this.fields=t||this.parser.parse(e.payload),this};(l.prototype=Object.create(r.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]);let c=function(e,t){return r.call(this,e),this.messageType="StatusJournalItem",this.fields=t||this.parser.parse(e.payload),this};(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="MSG_STATUS_JOURNAL",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="MSG_INS_STATUS",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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]);let h=function(e,t){return r.call(this,e),this.messageType="MSG_CSAC_TELEMETRY",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="MSG_CSAC_TELEMETRY_LABELS",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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]);let d=function(e,t){return r.call(this,e),this.messageType="MSG_INS_UPDATES",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(r.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]);let _=function(e,t){return r.call(this,e),this.messageType="MSG_GNSS_TIME_OFFSET",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(r.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]);let S=function(e,t){return r.call(this,e),this.messageType="MSG_PPS_TIME",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(r.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]);let g=function(e,t){return r.call(this,e),this.messageType="MSG_SENSOR_AID_EVENT",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(r.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]);let w=function(e,t){return r.call(this,e),this.messageType="MSG_GROUP_META",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,p(0).CarrierPhase),s=p(0).GnssSignal,n=p(0).GnssSignalDep,a=p(0).GPSTime,l=p(0).GPSTimeDep,c=(p(0).GPSTimeSec,p(0).SvId,function(e,t){return r.call(this,e),this.messageType="MSG_TRACKING_STATE_DETAILED_DEP_A",this.fields=t||this.parser.parse(e.payload),this});(c.prototype=Object.create(r.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]);let u=function(e,t){return r.call(this,e),this.messageType="MSG_TRACKING_STATE_DETAILED_DEP",this.fields=t||this.parser.parse(e.payload),this};(u.prototype=Object.create(r.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]);let y=function(e,t){return r.call(this,e),this.messageType="TrackingChannelState",this.fields=t||this.parser.parse(e.payload),this};(y.prototype=Object.create(r.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]);let h=function(e,t){return r.call(this,e),this.messageType="MSG_TRACKING_STATE",this.fields=t||this.parser.parse(e.payload),this};(h.prototype=Object.create(r.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]);let f=function(e,t){return r.call(this,e),this.messageType="MeasurementState",this.fields=t||this.parser.parse(e.payload),this};(f.prototype=Object.create(r.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]);let d=function(e,t){return r.call(this,e),this.messageType="MSG_MEASUREMENT_STATE",this.fields=t||this.parser.parse(e.payload),this};(d.prototype=Object.create(r.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]);let _=function(e,t){return r.call(this,e),this.messageType="TrackingChannelCorrelation",this.fields=t||this.parser.parse(e.payload),this};(_.prototype=Object.create(r.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]);let S=function(e,t){return r.call(this,e),this.messageType="MSG_TRACKING_IQ",this.fields=t||this.parser.parse(e.payload),this};(S.prototype=Object.create(r.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]);let g=function(e,t){return r.call(this,e),this.messageType="TrackingChannelCorrelationDep",this.fields=t||this.parser.parse(e.payload),this};(g.prototype=Object.create(r.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]);let w=function(e,t){return r.call(this,e),this.messageType="MSG_TRACKING_IQ_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(w.prototype=Object.create(r.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]);let E=function(e,t){return r.call(this,e),this.messageType="MSG_TRACKING_IQ_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(E.prototype=Object.create(r.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]);let m=function(e,t){return r.call(this,e),this.messageType="TrackingChannelStateDepA",this.fields=t||this.parser.parse(e.payload),this};(m.prototype=Object.create(r.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]);let b=function(e,t){return r.call(this,e),this.messageType="MSG_TRACKING_STATE_DEP_A",this.fields=t||this.parser.parse(e.payload),this};(b.prototype=Object.create(r.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]);let I=function(e,t){return r.call(this,e),this.messageType="TrackingChannelStateDepB",this.fields=t||this.parser.parse(e.payload),this};(I.prototype=Object.create(r.prototype)).messageType="TrackingChannelStateDepB",I.prototype.constructor=I,I.prototype.parser=(new o).endianess("little").uint8("state").nest("sid",{type:n.prototype.parser}).floatle("cn0"),I.prototype.fieldSpec=[],I.prototype.fieldSpec.push(["state","writeUInt8",1]),I.prototype.fieldSpec.push(["sid",n.prototype.fieldSpec]),I.prototype.fieldSpec.push(["cn0","writeFloatLE",4]);let L=function(e,t){return r.call(this,e),this.messageType="MSG_TRACKING_STATE_DEP_B",this.fields=t||this.parser.parse(e.payload),this};(L.prototype=Object.create(r.prototype)).messageType="MSG_TRACKING_STATE_DEP_B",L.prototype.msg_type=19,L.prototype.constructor=L,L.prototype.parser=(new o).endianess("little").array("states",{type:I.prototype.parser,readUntil:"eof"}),L.prototype.fieldSpec=[],L.prototype.fieldSpec.push(["states","array",I.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:I,19:L,MsgTrackingStateDepB:L}},function(e,t,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_USER_DATA",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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,p){let r=p(2),o=p(4),i=(p(3),p(1).UINT64,function(e,t){return r.call(this,e),this.messageType="MSG_ODOMETRY",this.fields=t||this.parser.parse(e.payload),this});(i.prototype=Object.create(r.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]);let s=function(e,t){return r.call(this,e),this.messageType="MSG_WHEELTICK",this.fields=t||this.parser.parse(e.payload),this};(s.prototype=Object.create(r.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/integrity.js b/javascript/sbp/integrity.js index a892eb8a94..8544c4c13c 100644 --- a/javascript/sbp/integrity.js +++ b/javascript/sbp/integrity.js @@ -30,12 +30,68 @@ let GPSTimeDep = require("./gnss").GPSTimeDep; let GPSTimeSec = require("./gnss").GPSTimeSec; let SvId = require("./gnss").SvId; +/** + * SBP class for message fragment IntegritySSRHeader + * + + * Fields in the SBP payload (`sbp.payload`): + * @field obs_time GPSTimeSec GNSS reference time of the observation used to generate the flag. + * @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 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 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 chain_id number (unsigned 8-bit int, 1 byte) Chain and type of flag. + * + * @param sbp An SBP object with a payload to be decoded. + */ +let IntegritySSRHeader = function (sbp, fields) { + SBP.call(this, sbp); + this.messageType = "IntegritySSRHeader"; + this.fields = (fields || this.parser.parse(sbp.payload)); + + return this; +}; +IntegritySSRHeader.prototype = Object.create(SBP.prototype); +IntegritySSRHeader.prototype.messageType = "IntegritySSRHeader"; +IntegritySSRHeader.prototype.constructor = IntegritySSRHeader; +IntegritySSRHeader.prototype.parser = new Parser() + .endianess('little') + .nest('obs_time', { type: GPSTimeSec.prototype.parser }) + .uint8('num_msgs') + .uint8('seq_num') + .uint8('ssr_sol_id') + .uint16('tile_set_id') + .uint16('tile_id') + .uint8('chain_id'); +IntegritySSRHeader.prototype.fieldSpec = []; +IntegritySSRHeader.prototype.fieldSpec.push(['obs_time', GPSTimeSec.prototype.fieldSpec]); +IntegritySSRHeader.prototype.fieldSpec.push(['num_msgs', 'writeUInt8', 1]); +IntegritySSRHeader.prototype.fieldSpec.push(['seq_num', 'writeUInt8', 1]); +IntegritySSRHeader.prototype.fieldSpec.push(['ssr_sol_id', 'writeUInt8', 1]); +IntegritySSRHeader.prototype.fieldSpec.push(['tile_set_id', 'writeUInt16LE', 2]); +IntegritySSRHeader.prototype.fieldSpec.push(['tile_id', 'writeUInt16LE', 2]); +IntegritySSRHeader.prototype.fieldSpec.push(['chain_id', 'writeUInt8', 1]); + /** * SBP class for message MSG_SSR_FLAG_HIGH_LEVEL (0x0BB9). * * Fields in the SBP payload (`sbp.payload`): - * @field stub array + * @field obs_time GPSTimeSec GNSS reference time of the observation used to generate the flag. + * @field corr_time GPSTimeSec GNSS reference time of the correction associated to the flag. + * @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 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 chain_id number (unsigned 8-bit int, 1 byte) Chain and type of flag. + * @field use_gps_sat number (unsigned 8-bit int, 1 byte) Use GPS satellites. + * @field use_gal_sat number (unsigned 8-bit int, 1 byte) Use GAL satellites. + * @field use_bds_sat number (unsigned 8-bit int, 1 byte) Use BDS satellites. + * @field reserved array Reserved + * @field use_tropo_grid_points number (unsigned 8-bit int, 1 byte) Use tropo grid points. + * @field use_iono_grid_points number (unsigned 8-bit int, 1 byte) Use iono grid points. + * @field use_iono_tile_sat_los number (unsigned 8-bit int, 1 byte) Use iono tile satellite LoS. + * @field use_iono_grid_point_sat_los number (unsigned 8-bit int, 1 byte) Use iono grid point satellite LoS. * * @param sbp An SBP object with a payload to be decoded. */ @@ -52,16 +108,49 @@ MsgSsrFlagHighLevel.prototype.msg_type = 0x0BB9; MsgSsrFlagHighLevel.prototype.constructor = MsgSsrFlagHighLevel; MsgSsrFlagHighLevel.prototype.parser = new Parser() .endianess('little') - .array('stub', { type: 'uint8', readUntil: 'eof' }); + .nest('obs_time', { type: GPSTimeSec.prototype.parser }) + .nest('corr_time', { type: GPSTimeSec.prototype.parser }) + .uint8('ssr_sol_id') + .uint16('tile_set_id') + .uint16('tile_id') + .uint8('chain_id') + .uint8('use_gps_sat') + .uint8('use_gal_sat') + .uint8('use_bds_sat') + .array('reserved', { length: 6, type: 'uint8' }) + .uint8('use_tropo_grid_points') + .uint8('use_iono_grid_points') + .uint8('use_iono_tile_sat_los') + .uint8('use_iono_grid_point_sat_los'); MsgSsrFlagHighLevel.prototype.fieldSpec = []; -MsgSsrFlagHighLevel.prototype.fieldSpec.push(['stub', 'array', 'writeUInt8', function () { return 1; }, null]); +MsgSsrFlagHighLevel.prototype.fieldSpec.push(['obs_time', GPSTimeSec.prototype.fieldSpec]); +MsgSsrFlagHighLevel.prototype.fieldSpec.push(['corr_time', GPSTimeSec.prototype.fieldSpec]); +MsgSsrFlagHighLevel.prototype.fieldSpec.push(['ssr_sol_id', 'writeUInt8', 1]); +MsgSsrFlagHighLevel.prototype.fieldSpec.push(['tile_set_id', 'writeUInt16LE', 2]); +MsgSsrFlagHighLevel.prototype.fieldSpec.push(['tile_id', 'writeUInt16LE', 2]); +MsgSsrFlagHighLevel.prototype.fieldSpec.push(['chain_id', 'writeUInt8', 1]); +MsgSsrFlagHighLevel.prototype.fieldSpec.push(['use_gps_sat', 'writeUInt8', 1]); +MsgSsrFlagHighLevel.prototype.fieldSpec.push(['use_gal_sat', 'writeUInt8', 1]); +MsgSsrFlagHighLevel.prototype.fieldSpec.push(['use_bds_sat', 'writeUInt8', 1]); +MsgSsrFlagHighLevel.prototype.fieldSpec.push(['reserved', 'array', 'writeUInt8', function () { return 1; }, 6]); +MsgSsrFlagHighLevel.prototype.fieldSpec.push(['use_tropo_grid_points', 'writeUInt8', 1]); +MsgSsrFlagHighLevel.prototype.fieldSpec.push(['use_iono_grid_points', 'writeUInt8', 1]); +MsgSsrFlagHighLevel.prototype.fieldSpec.push(['use_iono_tile_sat_los', 'writeUInt8', 1]); +MsgSsrFlagHighLevel.prototype.fieldSpec.push(['use_iono_grid_point_sat_los', 'writeUInt8', 1]); /** * SBP class for message MSG_SSR_FLAG_SATELLITES (0x0BBD). * * Fields in the SBP payload (`sbp.payload`): - * @field stub array + * @field obs_time GPSTimeSec GNSS reference time of the observation used to generate the flag. + * @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 ssr_sol_id number (unsigned 8-bit int, 1 byte) SSR Solution ID. + * @field chain_id number (unsigned 8-bit int, 1 byte) Chain and type of flag. + * @field const_id number (unsigned 8-bit int, 1 byte) Constellation ID. + * @field n_faulty_sats number (unsigned 8-bit int, 1 byte) Number of faulty satellites. + * @field faulty_sats array List of faulty satellites. * * @param sbp An SBP object with a payload to be decoded. */ @@ -78,16 +167,32 @@ MsgSsrFlagSatellites.prototype.msg_type = 0x0BBD; MsgSsrFlagSatellites.prototype.constructor = MsgSsrFlagSatellites; MsgSsrFlagSatellites.prototype.parser = new Parser() .endianess('little') - .array('stub', { type: 'uint8', readUntil: 'eof' }); + .nest('obs_time', { type: GPSTimeSec.prototype.parser }) + .uint8('num_msgs') + .uint8('seq_num') + .uint8('ssr_sol_id') + .uint8('chain_id') + .uint8('const_id') + .uint8('n_faulty_sats') + .array('faulty_sats', { type: 'uint8', length: 'n_faulty_sats' }); MsgSsrFlagSatellites.prototype.fieldSpec = []; -MsgSsrFlagSatellites.prototype.fieldSpec.push(['stub', 'array', 'writeUInt8', function () { return 1; }, null]); +MsgSsrFlagSatellites.prototype.fieldSpec.push(['obs_time', GPSTimeSec.prototype.fieldSpec]); +MsgSsrFlagSatellites.prototype.fieldSpec.push(['num_msgs', 'writeUInt8', 1]); +MsgSsrFlagSatellites.prototype.fieldSpec.push(['seq_num', 'writeUInt8', 1]); +MsgSsrFlagSatellites.prototype.fieldSpec.push(['ssr_sol_id', 'writeUInt8', 1]); +MsgSsrFlagSatellites.prototype.fieldSpec.push(['chain_id', 'writeUInt8', 1]); +MsgSsrFlagSatellites.prototype.fieldSpec.push(['const_id', 'writeUInt8', 1]); +MsgSsrFlagSatellites.prototype.fieldSpec.push(['n_faulty_sats', 'writeUInt8', 1]); +MsgSsrFlagSatellites.prototype.fieldSpec.push(['faulty_sats', 'array', 'writeUInt8', function () { return 1; }, 'n_faulty_sats']); /** * SBP class for message MSG_SSR_FLAG_TROPO_GRID_POINTS (0x0BC3). * * Fields in the SBP payload (`sbp.payload`): - * @field stub array + * @field header IntegritySSRHeader Header of an integrity message. + * @field n_faulty_points number (unsigned 8-bit int, 1 byte) Number of faulty grid points. + * @field faulty_points array List of faulty grid points. * * @param sbp An SBP object with a payload to be decoded. */ @@ -104,16 +209,22 @@ MsgSsrFlagTropoGridPoints.prototype.msg_type = 0x0BC3; MsgSsrFlagTropoGridPoints.prototype.constructor = MsgSsrFlagTropoGridPoints; MsgSsrFlagTropoGridPoints.prototype.parser = new Parser() .endianess('little') - .array('stub', { type: 'uint8', readUntil: 'eof' }); + .nest('header', { type: IntegritySSRHeader.prototype.parser }) + .uint8('n_faulty_points') + .array('faulty_points', { type: 'uint16le', length: 'n_faulty_points' }); MsgSsrFlagTropoGridPoints.prototype.fieldSpec = []; -MsgSsrFlagTropoGridPoints.prototype.fieldSpec.push(['stub', 'array', 'writeUInt8', function () { return 1; }, null]); +MsgSsrFlagTropoGridPoints.prototype.fieldSpec.push(['header', IntegritySSRHeader.prototype.fieldSpec]); +MsgSsrFlagTropoGridPoints.prototype.fieldSpec.push(['n_faulty_points', 'writeUInt8', 1]); +MsgSsrFlagTropoGridPoints.prototype.fieldSpec.push(['faulty_points', 'array', 'writeUInt16LE', function () { return 2; }, 'n_faulty_points']); /** * SBP class for message MSG_SSR_FLAG_IONO_GRID_POINTS (0x0BC7). * * Fields in the SBP payload (`sbp.payload`): - * @field stub array + * @field header IntegritySSRHeader Header of an integrity message. + * @field n_faulty_points number (unsigned 8-bit int, 1 byte) Number of faulty grid points. + * @field faulty_points array List of faulty grid points. * * @param sbp An SBP object with a payload to be decoded. */ @@ -130,16 +241,22 @@ MsgSsrFlagIonoGridPoints.prototype.msg_type = 0x0BC7; MsgSsrFlagIonoGridPoints.prototype.constructor = MsgSsrFlagIonoGridPoints; MsgSsrFlagIonoGridPoints.prototype.parser = new Parser() .endianess('little') - .array('stub', { type: 'uint8', readUntil: 'eof' }); + .nest('header', { type: IntegritySSRHeader.prototype.parser }) + .uint8('n_faulty_points') + .array('faulty_points', { type: 'uint16le', length: 'n_faulty_points' }); MsgSsrFlagIonoGridPoints.prototype.fieldSpec = []; -MsgSsrFlagIonoGridPoints.prototype.fieldSpec.push(['stub', 'array', 'writeUInt8', function () { return 1; }, null]); +MsgSsrFlagIonoGridPoints.prototype.fieldSpec.push(['header', IntegritySSRHeader.prototype.fieldSpec]); +MsgSsrFlagIonoGridPoints.prototype.fieldSpec.push(['n_faulty_points', 'writeUInt8', 1]); +MsgSsrFlagIonoGridPoints.prototype.fieldSpec.push(['faulty_points', 'array', 'writeUInt16LE', function () { return 2; }, 'n_faulty_points']); /** * SBP class for message MSG_SSR_FLAG_IONO_TILE_SAT_LOS (0x0BCD). * * Fields in the SBP payload (`sbp.payload`): - * @field stub array + * @field header IntegritySSRHeader Header of an integrity message. + * @field n_faulty_los number (unsigned 8-bit int, 1 byte) Number of faulty LOS. + * @field faulty_los array List of faulty LOS * * @param sbp An SBP object with a payload to be decoded. */ @@ -156,16 +273,23 @@ MsgSsrFlagIonoTileSatLos.prototype.msg_type = 0x0BCD; MsgSsrFlagIonoTileSatLos.prototype.constructor = MsgSsrFlagIonoTileSatLos; MsgSsrFlagIonoTileSatLos.prototype.parser = new Parser() .endianess('little') - .array('stub', { type: 'uint8', readUntil: 'eof' }); + .nest('header', { type: IntegritySSRHeader.prototype.parser }) + .uint8('n_faulty_los') + .array('faulty_los', { type: SvId.prototype.parser, length: 'n_faulty_los' }); MsgSsrFlagIonoTileSatLos.prototype.fieldSpec = []; -MsgSsrFlagIonoTileSatLos.prototype.fieldSpec.push(['stub', 'array', 'writeUInt8', function () { return 1; }, null]); +MsgSsrFlagIonoTileSatLos.prototype.fieldSpec.push(['header', IntegritySSRHeader.prototype.fieldSpec]); +MsgSsrFlagIonoTileSatLos.prototype.fieldSpec.push(['n_faulty_los', 'writeUInt8', 1]); +MsgSsrFlagIonoTileSatLos.prototype.fieldSpec.push(['faulty_los', 'array', SvId.prototype.fieldSpec, function () { return this.fields.array.length; }, 'n_faulty_los']); /** * SBP class for message MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS (0x0BD1). * * Fields in the SBP payload (`sbp.payload`): - * @field stub array + * @field header IntegritySSRHeader Header of an integrity message. + * @field grid_point_id number (unsigned 16-bit int, 2 bytes) Index of the grid point. + * @field n_faulty_los number (unsigned 8-bit int, 1 byte) Number of faulty LOS. + * @field faulty_los array List of faulty LOS * * @param sbp An SBP object with a payload to be decoded. */ @@ -182,11 +306,18 @@ MsgSsrFlagIonoGridPointSatLos.prototype.msg_type = 0x0BD1; MsgSsrFlagIonoGridPointSatLos.prototype.constructor = MsgSsrFlagIonoGridPointSatLos; MsgSsrFlagIonoGridPointSatLos.prototype.parser = new Parser() .endianess('little') - .array('stub', { type: 'uint8', readUntil: 'eof' }); + .nest('header', { type: IntegritySSRHeader.prototype.parser }) + .uint16('grid_point_id') + .uint8('n_faulty_los') + .array('faulty_los', { type: SvId.prototype.parser, length: 'n_faulty_los' }); MsgSsrFlagIonoGridPointSatLos.prototype.fieldSpec = []; -MsgSsrFlagIonoGridPointSatLos.prototype.fieldSpec.push(['stub', 'array', 'writeUInt8', function () { return 1; }, null]); +MsgSsrFlagIonoGridPointSatLos.prototype.fieldSpec.push(['header', IntegritySSRHeader.prototype.fieldSpec]); +MsgSsrFlagIonoGridPointSatLos.prototype.fieldSpec.push(['grid_point_id', 'writeUInt16LE', 2]); +MsgSsrFlagIonoGridPointSatLos.prototype.fieldSpec.push(['n_faulty_los', 'writeUInt8', 1]); +MsgSsrFlagIonoGridPointSatLos.prototype.fieldSpec.push(['faulty_los', 'array', SvId.prototype.fieldSpec, function () { return this.fields.array.length; }, 'n_faulty_los']); module.exports = { + IntegritySSRHeader: IntegritySSRHeader, 0x0BB9: MsgSsrFlagHighLevel, MsgSsrFlagHighLevel: MsgSsrFlagHighLevel, 0x0BBD: MsgSsrFlagSatellites, diff --git a/javascript/sbp/navigation.js b/javascript/sbp/navigation.js index a2ecf0197d..637c808215 100644 --- a/javascript/sbp/navigation.js +++ b/javascript/sbp/navigation.js @@ -2139,7 +2139,16 @@ MsgProtectionLevel.prototype.fieldSpec.push(['flags', 'writeUInt32LE', 4]); * model parameters. * * Fields in the SBP payload (`sbp.payload`): - * @field stub array + * @field bias_coeff number (signed 16-bit int, 2 bytes) Reserved. Bias coefficient of GPS time scale with respect to UTC drift model. + * @field drift_coeff number (signed 16-bit int, 2 bytes) Reserved. Drift coefficient of GPS time scale with respect to UTC drift model. + * @field drift_rate_coeff number (signed 8-bit int, 1 byte) Reserved. Drift rate correction coefficient of GPS time scale with respect to + * UTC drift model. + * @field count_before number (signed 8-bit int, 1 byte) Leap second count before insertion. + * @field tow_s number (unsigned 16-bit int, 2 bytes) Reserved. Drift model reference week second. + * @field wn number (unsigned 16-bit int, 2 bytes) Reserved. Drift model reference week number. + * @field ref_wn number (unsigned 16-bit int, 2 bytes) Leap second reference week number. + * @field ref_dn number (unsigned 8-bit int, 1 byte) Leap second reference day number. + * @field count_after number (signed 8-bit int, 1 byte) Leap second count after insertion. * * @param sbp An SBP object with a payload to be decoded. */ @@ -2156,16 +2165,52 @@ MsgUtcLeapSecond.prototype.msg_type = 0x023A; MsgUtcLeapSecond.prototype.constructor = MsgUtcLeapSecond; MsgUtcLeapSecond.prototype.parser = new Parser() .endianess('little') - .array('stub', { type: 'uint8', readUntil: 'eof' }); + .int16('bias_coeff') + .int16('drift_coeff') + .int8('drift_rate_coeff') + .int8('count_before') + .uint16('tow_s') + .uint16('wn') + .uint16('ref_wn') + .uint8('ref_dn') + .int8('count_after'); MsgUtcLeapSecond.prototype.fieldSpec = []; -MsgUtcLeapSecond.prototype.fieldSpec.push(['stub', 'array', 'writeUInt8', function () { return 1; }, null]); +MsgUtcLeapSecond.prototype.fieldSpec.push(['bias_coeff', 'writeInt16LE', 2]); +MsgUtcLeapSecond.prototype.fieldSpec.push(['drift_coeff', 'writeInt16LE', 2]); +MsgUtcLeapSecond.prototype.fieldSpec.push(['drift_rate_coeff', 'writeInt8', 1]); +MsgUtcLeapSecond.prototype.fieldSpec.push(['count_before', 'writeInt8', 1]); +MsgUtcLeapSecond.prototype.fieldSpec.push(['tow_s', 'writeUInt16LE', 2]); +MsgUtcLeapSecond.prototype.fieldSpec.push(['wn', 'writeUInt16LE', 2]); +MsgUtcLeapSecond.prototype.fieldSpec.push(['ref_wn', 'writeUInt16LE', 2]); +MsgUtcLeapSecond.prototype.fieldSpec.push(['ref_dn', 'writeUInt8', 1]); +MsgUtcLeapSecond.prototype.fieldSpec.push(['count_after', 'writeInt8', 1]); /** * SBP class for message MSG_REFERENCE_FRAME_PARAM (0x0244). * * Fields in the SBP payload (`sbp.payload`): - * @field stub array + * @field ssr_iod number (unsigned 8-bit int, 1 byte) SSR IOD parameter. + * @field sn string Name of source coordinate-system using the EPSG identification code. + * @field tn string Name of target coordinate-system using the EPSG identification code. + * @field sin number (unsigned 8-bit int, 1 byte) System Identification Number. + * @field utn number (unsigned 16-bit int, 2 bytes) Utilized Transformation Message. + * @field re_t0 number (unsigned 16-bit int, 2 bytes) Reference Epoch t0 for transformation parameter set given as Modified Julian Day + * (MDJ) Number minus 44244 days. + * @field delta_X0 number (signed 32-bit int, 4 bytes) Translation in X for Reference Epoch t0. + * @field delta_Y0 number (signed 32-bit int, 4 bytes) Translation in Y for Reference Epoch t0. + * @field delta_Z0 number (signed 32-bit int, 4 bytes) Translation in Z for Reference Epoch t0. + * @field theta_01 number (signed 32-bit int, 4 bytes) Rotation around the X-axis for Reference Epoch t0. + * @field theta_02 number (signed 32-bit int, 4 bytes) Rotation around the Y-axis for Reference Epoch t0. + * @field theta_03 number (signed 32-bit int, 4 bytes) Rotation around the Z-axis for Reference Epoch t0. + * @field scale number (signed 32-bit int, 4 bytes) Scale correction for Reference Epoch t0. + * @field dot_delta_X0 number (signed 32-bit int, 4 bytes) Rate of change of translation in X. + * @field dot_delta_Y0 number (signed 32-bit int, 4 bytes) Rate of change of translation in Y. + * @field dot_delta_Z0 number (signed 32-bit int, 4 bytes) Rate of change of translation in Z. + * @field dot_theta_01 number (signed 32-bit int, 4 bytes) Rate of change of rotation around the X-axis. + * @field dot_theta_02 number (signed 32-bit int, 4 bytes) Rate of change of rotation around the Y-axis. + * @field dot_theta_03 number (signed 32-bit int, 4 bytes) Rate of change of rotation around the Z-axis. + * @field dot_scale number (signed 16-bit int, 2 bytes) Rate of change of scale correction. * * @param sbp An SBP object with a payload to be decoded. */ @@ -2182,9 +2227,47 @@ MsgReferenceFrameParam.prototype.msg_type = 0x0244; MsgReferenceFrameParam.prototype.constructor = MsgReferenceFrameParam; MsgReferenceFrameParam.prototype.parser = new Parser() .endianess('little') - .array('stub', { type: 'uint8', readUntil: 'eof' }); + .uint8('ssr_iod') + .string('sn', { length: 32 }) + .string('tn', { length: 32 }) + .uint8('sin') + .uint16('utn') + .uint16('re_t0') + .int32('delta_X0') + .int32('delta_Y0') + .int32('delta_Z0') + .int32('theta_01') + .int32('theta_02') + .int32('theta_03') + .int32('scale') + .int32('dot_delta_X0') + .int32('dot_delta_Y0') + .int32('dot_delta_Z0') + .int32('dot_theta_01') + .int32('dot_theta_02') + .int32('dot_theta_03') + .int16('dot_scale'); MsgReferenceFrameParam.prototype.fieldSpec = []; -MsgReferenceFrameParam.prototype.fieldSpec.push(['stub', 'array', 'writeUInt8', function () { return 1; }, null]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['ssr_iod', 'writeUInt8', 1]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['sn', 'string', 32]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['tn', 'string', 32]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['sin', 'writeUInt8', 1]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['utn', 'writeUInt16LE', 2]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['re_t0', 'writeUInt16LE', 2]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['delta_X0', 'writeInt32LE', 4]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['delta_Y0', 'writeInt32LE', 4]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['delta_Z0', 'writeInt32LE', 4]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['theta_01', 'writeInt32LE', 4]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['theta_02', 'writeInt32LE', 4]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['theta_03', 'writeInt32LE', 4]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['scale', 'writeInt32LE', 4]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['dot_delta_X0', 'writeInt32LE', 4]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['dot_delta_Y0', 'writeInt32LE', 4]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['dot_delta_Z0', 'writeInt32LE', 4]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['dot_theta_01', 'writeInt32LE', 4]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['dot_theta_02', 'writeInt32LE', 4]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['dot_theta_03', 'writeInt32LE', 4]); +MsgReferenceFrameParam.prototype.fieldSpec.push(['dot_scale', 'writeInt16LE', 2]); module.exports = { 0x0102: MsgGpsTime, diff --git a/javascript/sbp/ssr.js b/javascript/sbp/ssr.js index b878729001..af52e57181 100644 --- a/javascript/sbp/ssr.js +++ b/javascript/sbp/ssr.js @@ -204,7 +204,8 @@ GriddedCorrectionHeader.prototype.fieldSpec.push(['tropo_quality_indicator', 'wr * @field sv_id SvId Unique space vehicle identifier * @field stec_quality_indicator number (unsigned 8-bit int, 1 byte) Quality of the STEC data. Encoded following RTCM DF389 specification but in * units of TECU instead of m. - * @field stec_coeff array Coefficients of the STEC polynomial in the order of C00, C01, C10, C11 + * @field stec_coeff array Coefficients of the STEC polynomial in the order of C00, C01, C10, C11. C00 = + * 0.05 TECU, C01/C10 = 0.02 TECU/deg, C11 0.02 TECU/deg^2 * * @param sbp An SBP object with a payload to be decoded. */ @@ -263,9 +264,10 @@ TroposphericDelayCorrectionNoStd.prototype.fieldSpec.push(['wet', 'writeInt8', 1 * Troposphere vertical delays (mean and standard deviation) at the grid point. * * Fields in the SBP payload (`sbp.payload`): - * @field hydro number (signed 16-bit int, 2 bytes) Hydrostatic vertical delay - * @field wet number (signed 8-bit int, 1 byte) Wet vertical delay - * @field stddev number (unsigned 8-bit int, 1 byte) stddev + * @field hydro number (signed 16-bit int, 2 bytes) Hydrostatic vertical delay. Add 2.3 m to get actual value. + * @field wet number (signed 8-bit int, 1 byte) Wet vertical delay. Add 0.252 m to get actual value. + * @field stddev number (unsigned 8-bit int, 1 byte) Modified DF389 scale. Class is upper 3 bits, value is lower 5. stddev <= + * (3^class * (1 + value/16) - 1) mm * * @param sbp An SBP object with a payload to be decoded. */ @@ -327,7 +329,8 @@ STECResidualNoStd.prototype.fieldSpec.push(['residual', 'writeInt16LE', 2]); * Fields in the SBP payload (`sbp.payload`): * @field sv_id SvId space vehicle identifier * @field residual number (signed 16-bit int, 2 bytes) STEC residual - * @field stddev number (unsigned 8-bit int, 1 byte) stddev + * @field stddev number (unsigned 8-bit int, 1 byte) Modified DF389 scale. Class is upper 3 bits, value is lower 5. stddev <= + * (3^class * (1 + value/16) - 1) * 10 TECU * * @param sbp An SBP object with a payload to be decoded. */ @@ -554,12 +557,54 @@ 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. + */ +let 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 stub array + * @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. */ @@ -576,9 +621,19 @@ MsgSsrStecCorrection.prototype.msg_type = 0x05FD; MsgSsrStecCorrection.prototype.constructor = MsgSsrStecCorrection; MsgSsrStecCorrection.prototype.parser = new Parser() .endianess('little') - .array('stub', { type: 'uint8', 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(['stub', 'array', 'writeUInt8', function () { return 1; }, 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). @@ -617,12 +672,64 @@ MsgSsrGriddedCorrection.prototype.fieldSpec.push(['index', 'writeUInt16LE', 2]); MsgSsrGriddedCorrection.prototype.fieldSpec.push(['tropo_delay_correction', TroposphericDelayCorrection.prototype.fieldSpec]); MsgSsrGriddedCorrection.prototype.fieldSpec.push(['stec_residuals', 'array', STECResidual.prototype.fieldSpec, function () { return this.fields.array.length; }, null]); +/** + * 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) Error Bound Mean. See Note 1. + * @field stec_bound_sig number (unsigned 8-bit int, 1 byte) Error Bound StDev. See Note 1. + * @field stec_bound_mu_dot number (unsigned 8-bit int, 1 byte) Error Bound Mean First derivative. + * @field stec_bound_sig_dot number (unsigned 8-bit int, 1 byte) Error Bound StDev First derivative. + * + * @param sbp An SBP object with a payload to be decoded. + */ +let 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). * - + * Note 1: Range: 0-17.5 m. i<= 200, mean = 0.01i; 200230, mean=5+0.5(i-230). + * * Fields in the SBP payload (`sbp.payload`): - * @field stub array + * @field header BoundsHeader Header of a bounds message. + * @field ssr_iod_atmo number (unsigned 8-bit int, 1 byte) IOD of the correction. + * @field tile_set_id number (unsigned 16-bit int, 2 bytes) 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_v_hydro_bound_mu number (unsigned 8-bit int, 1 byte) Vertical Hydrostatic Error Bound Mean. + * @field tropo_v_hydro_bound_sig number (unsigned 8-bit int, 1 byte) Vertical Hydrostatic Error Bound StDev. + * @field tropo_v_wet_bound_mu number (unsigned 8-bit int, 1 byte) Vertical Wet Error Bound Mean. + * @field tropo_v_wet_bound_sig number (unsigned 8-bit int, 1 byte) Vertical Wet Error Bound StDev. + * @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. */ @@ -639,9 +746,33 @@ MsgSsrGriddedCorrectionBounds.prototype.msg_type = 0x05FE; MsgSsrGriddedCorrectionBounds.prototype.constructor = MsgSsrGriddedCorrectionBounds; MsgSsrGriddedCorrectionBounds.prototype.parser = new Parser() .endianess('little') - .array('stub', { type: 'uint8', readUntil: 'eof' }); + .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_v_hydro_bound_mu') + .uint8('tropo_v_hydro_bound_sig') + .uint8('tropo_v_wet_bound_mu') + .uint8('tropo_v_wet_bound_sig') + .uint8('n_sats') + .array('stec_sat_list', { type: STECSatElementIntegrity.prototype.parser, length: 'n_sats' }); MsgSsrGriddedCorrectionBounds.prototype.fieldSpec = []; -MsgSsrGriddedCorrectionBounds.prototype.fieldSpec.push(['stub', 'array', 'writeUInt8', function () { return 1; }, null]); +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_v_hydro_bound_mu', 'writeUInt8', 1]); +MsgSsrGriddedCorrectionBounds.prototype.fieldSpec.push(['tropo_v_hydro_bound_sig', 'writeUInt8', 1]); +MsgSsrGriddedCorrectionBounds.prototype.fieldSpec.push(['tropo_v_wet_bound_mu', 'writeUInt8', 1]); +MsgSsrGriddedCorrectionBounds.prototype.fieldSpec.push(['tropo_v_wet_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). @@ -726,7 +857,34 @@ MsgSsrTileDefinitionDep.prototype.fieldSpec.push(['bitmask', 'writeUInt64LE', 8] * lists of points. * * Fields in the SBP payload (`sbp.payload`): - * @field stub array + * @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. + * @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. */ @@ -743,9 +901,27 @@ MsgSsrTileDefinition.prototype.msg_type = 0x05F7; MsgSsrTileDefinition.prototype.constructor = MsgSsrTileDefinition; MsgSsrTileDefinition.prototype.parser = new Parser() .endianess('little') - .array('stub', { type: 'uint8', readUntil: 'eof' }); + .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'); MsgSsrTileDefinition.prototype.fieldSpec = []; -MsgSsrTileDefinition.prototype.fieldSpec.push(['stub', 'array', 'writeUInt8', function () { return 1; }, null]); +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]); +MsgSsrTileDefinition.prototype.fieldSpec.push(['corner_nw_lon', 'writeInt16LE', 2]); +MsgSsrTileDefinition.prototype.fieldSpec.push(['spacing_lat', 'writeUInt16LE', 2]); +MsgSsrTileDefinition.prototype.fieldSpec.push(['spacing_lon', 'writeUInt16LE', 2]); +MsgSsrTileDefinition.prototype.fieldSpec.push(['rows', 'writeUInt16LE', 2]); +MsgSsrTileDefinition.prototype.fieldSpec.push(['cols', 'writeUInt16LE', 2]); +MsgSsrTileDefinition.prototype.fieldSpec.push(['bitmask', 'writeUInt64LE', 8]); /** * SBP class for message fragment SatelliteAPC @@ -1141,12 +1317,70 @@ 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 OrbitClockBound + * + * Orbit and clock bound. + * + * Fields in the SBP payload (`sbp.payload`): + * @field sat_id number (unsigned 8-bit int, 1 byte) Satellite ID. Similar to either RTCM DF068 (GPS), DF252 (Galileo), or DF488 + * (BDS) depending on the constellation. + * @field orb_radial_bound_mu number (unsigned 8-bit int, 1 byte) Mean Radial. See Note 1. + * @field orb_along_bound_mu number (unsigned 8-bit int, 1 byte) Mean Along-Track. See Note 1. + * @field orb_cross_bound_mu number (unsigned 8-bit int, 1 byte) Mean Cross-Track. See Note 1. + * @field orb_radial_bound_sig number (unsigned 8-bit int, 1 byte) Standard Deviation Radial. See Note 2. + * @field orb_along_bound_sig number (unsigned 8-bit int, 1 byte) Standard Deviation Along-Track. See Note 2. + * @field orb_cross_bound_sig number (unsigned 8-bit int, 1 byte) Standard Deviation Cross-Track. See Note 2. + * @field clock_bound_mu number (unsigned 8-bit int, 1 byte) Clock Bound Mean. See Note 1. + * @field clock_bound_sig number (unsigned 8-bit int, 1 byte) Clock Bound Standard Deviation. See Note 2. + * + * @param sbp An SBP object with a payload to be decoded. + */ +let OrbitClockBound = function (sbp, fields) { + SBP.call(this, sbp); + this.messageType = "OrbitClockBound"; + this.fields = (fields || this.parser.parse(sbp.payload)); + + return this; +}; +OrbitClockBound.prototype = Object.create(SBP.prototype); +OrbitClockBound.prototype.messageType = "OrbitClockBound"; +OrbitClockBound.prototype.constructor = OrbitClockBound; +OrbitClockBound.prototype.parser = new Parser() + .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'); +OrbitClockBound.prototype.fieldSpec = []; +OrbitClockBound.prototype.fieldSpec.push(['sat_id', 'writeUInt8', 1]); +OrbitClockBound.prototype.fieldSpec.push(['orb_radial_bound_mu', 'writeUInt8', 1]); +OrbitClockBound.prototype.fieldSpec.push(['orb_along_bound_mu', 'writeUInt8', 1]); +OrbitClockBound.prototype.fieldSpec.push(['orb_cross_bound_mu', 'writeUInt8', 1]); +OrbitClockBound.prototype.fieldSpec.push(['orb_radial_bound_sig', 'writeUInt8', 1]); +OrbitClockBound.prototype.fieldSpec.push(['orb_along_bound_sig', 'writeUInt8', 1]); +OrbitClockBound.prototype.fieldSpec.push(['orb_cross_bound_sig', 'writeUInt8', 1]); +OrbitClockBound.prototype.fieldSpec.push(['clock_bound_mu', 'writeUInt8', 1]); +OrbitClockBound.prototype.fieldSpec.push(['clock_bound_sig', 'writeUInt8', 1]); + /** * SBP class for message MSG_SSR_ORBIT_CLOCK_BOUNDS (0x05DE). * - + * Note 1: Range: 0-17.5 m. i<=200, mean=0.01i; 200230, mean=5+0.5(i-230). Note 2: Range: 0-17.5 m. i<=200, std=0.01i; + * 200230, std=5+0.5(i-230). + * * Fields in the SBP payload (`sbp.payload`): - * @field stub array + * @field header BoundsHeader Header of a bounds message. + * @field ssr_iod number (unsigned 8-bit int, 1 byte) IOD of the SSR bound. + * @field const_id number (unsigned 8-bit int, 1 byte) Constellation ID to which the SVs belong. + * @field n_sats number (unsigned 8-bit int, 1 byte) Number of satellites. + * @field orbit_clock_bounds array Orbit and Clock Bounds per Satellite * * @param sbp An SBP object with a payload to be decoded. */ @@ -1163,16 +1397,70 @@ MsgSsrOrbitClockBounds.prototype.msg_type = 0x05DE; MsgSsrOrbitClockBounds.prototype.constructor = MsgSsrOrbitClockBounds; MsgSsrOrbitClockBounds.prototype.parser = new Parser() .endianess('little') - .array('stub', { type: 'uint8', readUntil: 'eof' }); + .nest('header', { type: BoundsHeader.prototype.parser }) + .uint8('ssr_iod') + .uint8('const_id') + .uint8('n_sats') + .array('orbit_clock_bounds', { type: OrbitClockBound.prototype.parser, length: 'n_sats' }); MsgSsrOrbitClockBounds.prototype.fieldSpec = []; -MsgSsrOrbitClockBounds.prototype.fieldSpec.push(['stub', 'array', 'writeUInt8', function () { return 1; }, null]); +MsgSsrOrbitClockBounds.prototype.fieldSpec.push(['header', BoundsHeader.prototype.fieldSpec]); +MsgSsrOrbitClockBounds.prototype.fieldSpec.push(['ssr_iod', 'writeUInt8', 1]); +MsgSsrOrbitClockBounds.prototype.fieldSpec.push(['const_id', 'writeUInt8', 1]); +MsgSsrOrbitClockBounds.prototype.fieldSpec.push(['n_sats', 'writeUInt8', 1]); +MsgSsrOrbitClockBounds.prototype.fieldSpec.push(['orbit_clock_bounds', 'array', OrbitClockBound.prototype.fieldSpec, function () { return this.fields.array.length; }, 'n_sats']); + +/** + * SBP class for message fragment CodePhaseBiasesSatSig + * + + * Fields in the SBP payload (`sbp.payload`): + * @field sat_id number (unsigned 8-bit int, 1 byte) Satellite ID. Similar to either RTCM DF068 (GPS), DF252 (Galileo), or DF488 + * (BDS) depending on the constellation. + * @field signal_id number (unsigned 8-bit int, 1 byte) Signal and Tracking Mode Identifier. Similar to either RTCM DF380 (GPS), DF382 + * (Galileo) or DF467 (BDS) depending on the constellation. + * @field code_bias_bound_mu number (unsigned 8-bit int, 1 byte) Code Bias Mean. Range: 0-1.275 m + * @field code_bias_bound_sig number (unsigned 8-bit int, 1 byte) Code Bias Standard Deviation. Range: 0-1.275 m + * @field phase_bias_bound_mu number (unsigned 8-bit int, 1 byte) Phase Bias Mean. Range: 0-1.275 m + * @field phase_bias_bound_sig number (unsigned 8-bit int, 1 byte) Phase Bias Standard Deviation. Range: 0-1.275 m + * + * @param sbp An SBP object with a payload to be decoded. + */ +let CodePhaseBiasesSatSig = function (sbp, fields) { + SBP.call(this, sbp); + this.messageType = "CodePhaseBiasesSatSig"; + this.fields = (fields || this.parser.parse(sbp.payload)); + + return this; +}; +CodePhaseBiasesSatSig.prototype = Object.create(SBP.prototype); +CodePhaseBiasesSatSig.prototype.messageType = "CodePhaseBiasesSatSig"; +CodePhaseBiasesSatSig.prototype.constructor = CodePhaseBiasesSatSig; +CodePhaseBiasesSatSig.prototype.parser = new Parser() + .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'); +CodePhaseBiasesSatSig.prototype.fieldSpec = []; +CodePhaseBiasesSatSig.prototype.fieldSpec.push(['sat_id', 'writeUInt8', 1]); +CodePhaseBiasesSatSig.prototype.fieldSpec.push(['signal_id', 'writeUInt8', 1]); +CodePhaseBiasesSatSig.prototype.fieldSpec.push(['code_bias_bound_mu', 'writeUInt8', 1]); +CodePhaseBiasesSatSig.prototype.fieldSpec.push(['code_bias_bound_sig', 'writeUInt8', 1]); +CodePhaseBiasesSatSig.prototype.fieldSpec.push(['phase_bias_bound_mu', 'writeUInt8', 1]); +CodePhaseBiasesSatSig.prototype.fieldSpec.push(['phase_bias_bound_sig', 'writeUInt8', 1]); /** * SBP class for message MSG_SSR_CODE_PHASE_BIASES_BOUNDS (0x05EC). * * Fields in the SBP payload (`sbp.payload`): - * @field stub array + * @field header BoundsHeader Header of a bounds message. + * @field ssr_iod number (unsigned 8-bit int, 1 byte) IOD of the SSR bound. + * @field const_id number (unsigned 8-bit int, 1 byte) Constellation ID to which the SVs belong. + * @field n_sats_signals number (unsigned 8-bit int, 1 byte) Number of satellite-signal couples. + * @field satellites_signals array Code and Phase Biases Bounds per Satellite-Signal couple. * * @param sbp An SBP object with a payload to be decoded. */ @@ -1189,16 +1477,77 @@ MsgSsrCodePhaseBiasesBounds.prototype.msg_type = 0x05EC; MsgSsrCodePhaseBiasesBounds.prototype.constructor = MsgSsrCodePhaseBiasesBounds; MsgSsrCodePhaseBiasesBounds.prototype.parser = new Parser() .endianess('little') - .array('stub', { type: 'uint8', readUntil: 'eof' }); + .nest('header', { type: BoundsHeader.prototype.parser }) + .uint8('ssr_iod') + .uint8('const_id') + .uint8('n_sats_signals') + .array('satellites_signals', { type: CodePhaseBiasesSatSig.prototype.parser, length: 'n_sats_signals' }); MsgSsrCodePhaseBiasesBounds.prototype.fieldSpec = []; -MsgSsrCodePhaseBiasesBounds.prototype.fieldSpec.push(['stub', 'array', 'writeUInt8', function () { return 1; }, null]); +MsgSsrCodePhaseBiasesBounds.prototype.fieldSpec.push(['header', BoundsHeader.prototype.fieldSpec]); +MsgSsrCodePhaseBiasesBounds.prototype.fieldSpec.push(['ssr_iod', 'writeUInt8', 1]); +MsgSsrCodePhaseBiasesBounds.prototype.fieldSpec.push(['const_id', 'writeUInt8', 1]); +MsgSsrCodePhaseBiasesBounds.prototype.fieldSpec.push(['n_sats_signals', 'writeUInt8', 1]); +MsgSsrCodePhaseBiasesBounds.prototype.fieldSpec.push(['satellites_signals', 'array', CodePhaseBiasesSatSig.prototype.fieldSpec, function () { return this.fields.array.length; }, 'n_sats_signals']); + +/** + * SBP class for message fragment OrbitClockBoundDegradation + * + * Orbit and clock bound degradation. + * + * Fields in the SBP payload (`sbp.payload`): + * @field orb_radial_bound_mu_dot number (unsigned 8-bit int, 1 byte) Orbit Bound Mean Radial First derivative. Range: 0-0.255 m/s + * @field orb_along_bound_mu_dot number (unsigned 8-bit int, 1 byte) Orbit Bound Mean Along-Track First derivative. Range: 0-0.255 m/s + * @field orb_cross_bound_mu_dot number (unsigned 8-bit int, 1 byte) Orbit Bound Mean Cross-Track First derivative. Range: 0-0.255 m/s + * @field orb_radial_bound_sig_dot number (unsigned 8-bit int, 1 byte) Orbit Bound Standard Deviation Radial First derivative. Range: 0-0.255 m/s + * @field orb_along_bound_sig_dot number (unsigned 8-bit int, 1 byte) Orbit Bound Standard Deviation Along-Track First derivative. Range: 0-0.255 m/s + * @field orb_cross_bound_sig_dot number (unsigned 8-bit int, 1 byte) Orbit Bound Standard Deviation Cross-Track First derivative. Range: 0-0.255 m/s + * @field clock_bound_mu_dot number (unsigned 8-bit int, 1 byte) Clock Bound Mean First derivative. Range: 0-0.255 m/s + * @field clock_bound_sig_dot number (unsigned 8-bit int, 1 byte) Clock Bound Standard Deviation First derivative. Range: 0-0.255 m/s + * + * @param sbp An SBP object with a payload to be decoded. + */ +let OrbitClockBoundDegradation = function (sbp, fields) { + SBP.call(this, sbp); + this.messageType = "OrbitClockBoundDegradation"; + this.fields = (fields || this.parser.parse(sbp.payload)); + + return this; +}; +OrbitClockBoundDegradation.prototype = Object.create(SBP.prototype); +OrbitClockBoundDegradation.prototype.messageType = "OrbitClockBoundDegradation"; +OrbitClockBoundDegradation.prototype.constructor = OrbitClockBoundDegradation; +OrbitClockBoundDegradation.prototype.parser = new Parser() + .endianess('little') + .uint8('orb_radial_bound_mu_dot') + .uint8('orb_along_bound_mu_dot') + .uint8('orb_cross_bound_mu_dot') + .uint8('orb_radial_bound_sig_dot') + .uint8('orb_along_bound_sig_dot') + .uint8('orb_cross_bound_sig_dot') + .uint8('clock_bound_mu_dot') + .uint8('clock_bound_sig_dot'); +OrbitClockBoundDegradation.prototype.fieldSpec = []; +OrbitClockBoundDegradation.prototype.fieldSpec.push(['orb_radial_bound_mu_dot', 'writeUInt8', 1]); +OrbitClockBoundDegradation.prototype.fieldSpec.push(['orb_along_bound_mu_dot', 'writeUInt8', 1]); +OrbitClockBoundDegradation.prototype.fieldSpec.push(['orb_cross_bound_mu_dot', 'writeUInt8', 1]); +OrbitClockBoundDegradation.prototype.fieldSpec.push(['orb_radial_bound_sig_dot', 'writeUInt8', 1]); +OrbitClockBoundDegradation.prototype.fieldSpec.push(['orb_along_bound_sig_dot', 'writeUInt8', 1]); +OrbitClockBoundDegradation.prototype.fieldSpec.push(['orb_cross_bound_sig_dot', 'writeUInt8', 1]); +OrbitClockBoundDegradation.prototype.fieldSpec.push(['clock_bound_mu_dot', 'writeUInt8', 1]); +OrbitClockBoundDegradation.prototype.fieldSpec.push(['clock_bound_sig_dot', 'writeUInt8', 1]); /** * SBP class for message MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION (0x05DF). * * Fields in the SBP payload (`sbp.payload`): - * @field stub array + * @field header BoundsHeader Header of a bounds message. + * @field ssr_iod number (unsigned 8-bit int, 1 byte) IOD of the SSR bound degradation parameter. + * @field const_id number (unsigned 8-bit int, 1 byte) Constellation ID to which the SVs belong. + * @field sat_bitmask number (unsigned 64-bit int, 8 bytes) Satellite Bit Mask. Put 1 for each satellite where the following degradation + * parameters are applicable, 0 otherwise. Encoded following RTCM DF394 + * specification. + * @field orbit_clock_bounds_degradation OrbitClockBoundDegradation Orbit and Clock Bounds Degradation Parameters * * @param sbp An SBP object with a payload to be decoded. */ @@ -1215,9 +1564,17 @@ MsgSsrOrbitClockBoundsDegradation.prototype.msg_type = 0x05DF; MsgSsrOrbitClockBoundsDegradation.prototype.constructor = MsgSsrOrbitClockBoundsDegradation; MsgSsrOrbitClockBoundsDegradation.prototype.parser = new Parser() .endianess('little') - .array('stub', { type: 'uint8', readUntil: 'eof' }); + .nest('header', { type: BoundsHeader.prototype.parser }) + .uint8('ssr_iod') + .uint8('const_id') + .uint64('sat_bitmask') + .nest('orbit_clock_bounds_degradation', { type: OrbitClockBoundDegradation.prototype.parser }); MsgSsrOrbitClockBoundsDegradation.prototype.fieldSpec = []; -MsgSsrOrbitClockBoundsDegradation.prototype.fieldSpec.push(['stub', 'array', 'writeUInt8', function () { return 1; }, null]); +MsgSsrOrbitClockBoundsDegradation.prototype.fieldSpec.push(['header', BoundsHeader.prototype.fieldSpec]); +MsgSsrOrbitClockBoundsDegradation.prototype.fieldSpec.push(['ssr_iod', 'writeUInt8', 1]); +MsgSsrOrbitClockBoundsDegradation.prototype.fieldSpec.push(['const_id', 'writeUInt8', 1]); +MsgSsrOrbitClockBoundsDegradation.prototype.fieldSpec.push(['sat_bitmask', 'writeUInt64LE', 8]); +MsgSsrOrbitClockBoundsDegradation.prototype.fieldSpec.push(['orbit_clock_bounds_degradation', OrbitClockBoundDegradation.prototype.fieldSpec]); module.exports = { CodeBiasesContent: CodeBiasesContent, @@ -1237,10 +1594,12 @@ module.exports = { MsgSsrPhaseBiases: MsgSsrPhaseBiases, 0x05FB: MsgSsrStecCorrectionDep, MsgSsrStecCorrectionDep: MsgSsrStecCorrectionDep, + BoundsHeader: BoundsHeader, 0x05FD: MsgSsrStecCorrection, MsgSsrStecCorrection: MsgSsrStecCorrection, 0x05FC: MsgSsrGriddedCorrection, MsgSsrGriddedCorrection: MsgSsrGriddedCorrection, + STECSatElementIntegrity: STECSatElementIntegrity, 0x05FE: MsgSsrGriddedCorrectionBounds, MsgSsrGriddedCorrectionBounds: MsgSsrGriddedCorrectionBounds, 0x05F6: MsgSsrTileDefinitionDep, @@ -1263,10 +1622,13 @@ module.exports = { MsgSsrGriddedCorrectionDepA: MsgSsrGriddedCorrectionDepA, 0x05F5: MsgSsrGridDefinitionDepA, MsgSsrGridDefinitionDepA: MsgSsrGridDefinitionDepA, + OrbitClockBound: OrbitClockBound, 0x05DE: MsgSsrOrbitClockBounds, MsgSsrOrbitClockBounds: MsgSsrOrbitClockBounds, + CodePhaseBiasesSatSig: CodePhaseBiasesSatSig, 0x05EC: MsgSsrCodePhaseBiasesBounds, MsgSsrCodePhaseBiasesBounds: MsgSsrCodePhaseBiasesBounds, + OrbitClockBoundDegradation: OrbitClockBoundDegradation, 0x05DF: MsgSsrOrbitClockBoundsDegradation, MsgSsrOrbitClockBoundsDegradation: MsgSsrOrbitClockBoundsDegradation, } \ No newline at end of file diff --git a/jsonschema/MsgReferenceFrameParam.json b/jsonschema/MsgReferenceFrameParam.json index 71e8e1ad93..6ec19a4118 100644 --- a/jsonschema/MsgReferenceFrameParam.json +++ b/jsonschema/MsgReferenceFrameParam.json @@ -16,9 +16,47 @@ "description":"", "type": "object", "properties": { - "stub": {"type": "array", "items": {"type": "integer"}} + "ssr_iod": {"type": "integer"}, + "sn": {"type": "string"}, + "tn": {"type": "string"}, + "sin": {"type": "integer"}, + "utn": {"type": "integer"}, + "re_t0": {"type": "integer"}, + "delta_X0": {"type": "integer"}, + "delta_Y0": {"type": "integer"}, + "delta_Z0": {"type": "integer"}, + "theta_01": {"type": "integer"}, + "theta_02": {"type": "integer"}, + "theta_03": {"type": "integer"}, + "scale": {"type": "integer"}, + "dot_delta_X0": {"type": "integer"}, + "dot_delta_Y0": {"type": "integer"}, + "dot_delta_Z0": {"type": "integer"}, + "dot_theta_01": {"type": "integer"}, + "dot_theta_02": {"type": "integer"}, + "dot_theta_03": {"type": "integer"}, + "dot_scale": {"type": "integer"} }, "required": [ - "stub" + "ssr_iod", + "sn", + "tn", + "sin", + "utn", + "re_t0", + "delta_X0", + "delta_Y0", + "delta_Z0", + "theta_01", + "theta_02", + "theta_03", + "scale", + "dot_delta_X0", + "dot_delta_Y0", + "dot_delta_Z0", + "dot_theta_01", + "dot_theta_02", + "dot_theta_03", + "dot_scale" ] } \ No newline at end of file diff --git a/jsonschema/MsgSsrCodePhaseBiasesBounds.json b/jsonschema/MsgSsrCodePhaseBiasesBounds.json index de40de4304..1dab87fb7e 100644 --- a/jsonschema/MsgSsrCodePhaseBiasesBounds.json +++ b/jsonschema/MsgSsrCodePhaseBiasesBounds.json @@ -16,9 +16,17 @@ "description":"", "type": "object", "properties": { - "stub": {"type": "array", "items": {"type": "integer"}} + "header": {"$ref": "BoundsHeader.json"}, + "ssr_iod": {"type": "integer"}, + "const_id": {"type": "integer"}, + "n_sats_signals": {"type": "integer"}, + "satellites_signals": {"type": "array", "items": {"$ref": "CodePhaseBiasesSatSig.json"}} }, "required": [ - "stub" + "header", + "ssr_iod", + "const_id", + "n_sats_signals", + "satellites_signals" ] } \ No newline at end of file diff --git a/jsonschema/MsgSsrFlagHighLevel.json b/jsonschema/MsgSsrFlagHighLevel.json index 67edf90f7d..535b524a58 100644 --- a/jsonschema/MsgSsrFlagHighLevel.json +++ b/jsonschema/MsgSsrFlagHighLevel.json @@ -16,9 +16,33 @@ "description":"", "type": "object", "properties": { - "stub": {"type": "array", "items": {"type": "integer"}} + "obs_time": {"$ref": "GpsTimeSec.json"}, + "corr_time": {"$ref": "GpsTimeSec.json"}, + "ssr_sol_id": {"type": "integer"}, + "tile_set_id": {"type": "integer"}, + "tile_id": {"type": "integer"}, + "chain_id": {"type": "integer"}, + "use_gps_sat": {"type": "integer"}, + "use_gal_sat": {"type": "integer"}, + "use_bds_sat": {"type": "integer"}, + "use_tropo_grid_points": {"type": "integer"}, + "use_iono_grid_points": {"type": "integer"}, + "use_iono_tile_sat_los": {"type": "integer"}, + "use_iono_grid_point_sat_los": {"type": "integer"} }, "required": [ - "stub" + "obs_time", + "corr_time", + "ssr_sol_id", + "tile_set_id", + "tile_id", + "chain_id", + "use_gps_sat", + "use_gal_sat", + "use_bds_sat", + "use_tropo_grid_points", + "use_iono_grid_points", + "use_iono_tile_sat_los", + "use_iono_grid_point_sat_los" ] } \ No newline at end of file diff --git a/jsonschema/MsgSsrFlagIonoGridPointSatLos.json b/jsonschema/MsgSsrFlagIonoGridPointSatLos.json index 18e05dae6d..dab0b16249 100644 --- a/jsonschema/MsgSsrFlagIonoGridPointSatLos.json +++ b/jsonschema/MsgSsrFlagIonoGridPointSatLos.json @@ -16,9 +16,15 @@ "description":"", "type": "object", "properties": { - "stub": {"type": "array", "items": {"type": "integer"}} + "header": {"$ref": "IntegritySSRHeader.json"}, + "grid_point_id": {"type": "integer"}, + "n_faulty_los": {"type": "integer"}, + "faulty_los": {"type": "array", "items": {"$ref": "SvId.json"}} }, "required": [ - "stub" + "header", + "grid_point_id", + "n_faulty_los", + "faulty_los" ] } \ No newline at end of file diff --git a/jsonschema/MsgSsrFlagIonoGridPoints.json b/jsonschema/MsgSsrFlagIonoGridPoints.json index 3a7d058540..f1b4cd5f27 100644 --- a/jsonschema/MsgSsrFlagIonoGridPoints.json +++ b/jsonschema/MsgSsrFlagIonoGridPoints.json @@ -16,9 +16,13 @@ "description":"", "type": "object", "properties": { - "stub": {"type": "array", "items": {"type": "integer"}} + "header": {"$ref": "IntegritySSRHeader.json"}, + "n_faulty_points": {"type": "integer"}, + "faulty_points": {"type": "array", "items": {"type": "integer"}} }, "required": [ - "stub" + "header", + "n_faulty_points", + "faulty_points" ] } \ No newline at end of file diff --git a/jsonschema/MsgSsrFlagIonoTileSatLos.json b/jsonschema/MsgSsrFlagIonoTileSatLos.json index f3f5cd0caf..6ad4a3ad97 100644 --- a/jsonschema/MsgSsrFlagIonoTileSatLos.json +++ b/jsonschema/MsgSsrFlagIonoTileSatLos.json @@ -16,9 +16,13 @@ "description":"", "type": "object", "properties": { - "stub": {"type": "array", "items": {"type": "integer"}} + "header": {"$ref": "IntegritySSRHeader.json"}, + "n_faulty_los": {"type": "integer"}, + "faulty_los": {"type": "array", "items": {"$ref": "SvId.json"}} }, "required": [ - "stub" + "header", + "n_faulty_los", + "faulty_los" ] } \ No newline at end of file diff --git a/jsonschema/MsgSsrFlagSatellites.json b/jsonschema/MsgSsrFlagSatellites.json index 5c32c6799d..900f8d1e00 100644 --- a/jsonschema/MsgSsrFlagSatellites.json +++ b/jsonschema/MsgSsrFlagSatellites.json @@ -16,9 +16,23 @@ "description":"", "type": "object", "properties": { - "stub": {"type": "array", "items": {"type": "integer"}} + "obs_time": {"$ref": "GpsTimeSec.json"}, + "num_msgs": {"type": "integer"}, + "seq_num": {"type": "integer"}, + "ssr_sol_id": {"type": "integer"}, + "chain_id": {"type": "integer"}, + "const_id": {"type": "integer"}, + "n_faulty_sats": {"type": "integer"}, + "faulty_sats": {"type": "array", "items": {"type": "integer"}} }, "required": [ - "stub" + "obs_time", + "num_msgs", + "seq_num", + "ssr_sol_id", + "chain_id", + "const_id", + "n_faulty_sats", + "faulty_sats" ] } \ No newline at end of file diff --git a/jsonschema/MsgSsrFlagTropoGridPoints.json b/jsonschema/MsgSsrFlagTropoGridPoints.json index 6883c505d7..3462ecff56 100644 --- a/jsonschema/MsgSsrFlagTropoGridPoints.json +++ b/jsonschema/MsgSsrFlagTropoGridPoints.json @@ -16,9 +16,13 @@ "description":"", "type": "object", "properties": { - "stub": {"type": "array", "items": {"type": "integer"}} + "header": {"$ref": "IntegritySSRHeader.json"}, + "n_faulty_points": {"type": "integer"}, + "faulty_points": {"type": "array", "items": {"type": "integer"}} }, "required": [ - "stub" + "header", + "n_faulty_points", + "faulty_points" ] } \ No newline at end of file diff --git a/jsonschema/MsgSsrGriddedCorrectionBounds.json b/jsonschema/MsgSsrGriddedCorrectionBounds.json index 1ce6c50443..1a4952610b 100644 --- a/jsonschema/MsgSsrGriddedCorrectionBounds.json +++ b/jsonschema/MsgSsrGriddedCorrectionBounds.json @@ -16,9 +16,33 @@ "description":"Note 1: Range: 0-17.5 m. i<= 200, mean = 0.01i; 200230, mean=5+0.5(i-230).\n", "type": "object", "properties": { - "stub": {"type": "array", "items": {"type": "integer"}} + "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_v_hydro_bound_mu": {"type": "integer"}, + "tropo_v_hydro_bound_sig": {"type": "integer"}, + "tropo_v_wet_bound_mu": {"type": "integer"}, + "tropo_v_wet_bound_sig": {"type": "integer"}, + "n_sats": {"type": "integer"}, + "stec_sat_list": {"type": "array", "items": {"$ref": "STECSatElementIntegrity.json"}} }, "required": [ - "stub" + "header", + "ssr_iod_atmo", + "tile_set_id", + "tile_id", + "tropo_qi", + "grid_point_id", + "tropo_delay_correction", + "tropo_v_hydro_bound_mu", + "tropo_v_hydro_bound_sig", + "tropo_v_wet_bound_mu", + "tropo_v_wet_bound_sig", + "n_sats", + "stec_sat_list" ] } \ No newline at end of file diff --git a/jsonschema/MsgSsrOrbitClockBounds.json b/jsonschema/MsgSsrOrbitClockBounds.json index bcce16857d..9065401059 100644 --- a/jsonschema/MsgSsrOrbitClockBounds.json +++ b/jsonschema/MsgSsrOrbitClockBounds.json @@ -16,9 +16,17 @@ "description":"Note 1: Range: 0-17.5 m. i<=200, mean=0.01i; 200230, mean=5+0.5(i-230).,\n,\nNote 2: Range: 0-17.5 m. i<=200, std=0.01i; 200230, std=5+0.5(i-230).\n", "type": "object", "properties": { - "stub": {"type": "array", "items": {"type": "integer"}} + "header": {"$ref": "BoundsHeader.json"}, + "ssr_iod": {"type": "integer"}, + "const_id": {"type": "integer"}, + "n_sats": {"type": "integer"}, + "orbit_clock_bounds": {"type": "array", "items": {"$ref": "OrbitClockBound.json"}} }, "required": [ - "stub" + "header", + "ssr_iod", + "const_id", + "n_sats", + "orbit_clock_bounds" ] } \ No newline at end of file diff --git a/jsonschema/MsgSsrOrbitClockBoundsDegradation.json b/jsonschema/MsgSsrOrbitClockBoundsDegradation.json index 4826cee480..ae7d80ad5c 100644 --- a/jsonschema/MsgSsrOrbitClockBoundsDegradation.json +++ b/jsonschema/MsgSsrOrbitClockBoundsDegradation.json @@ -16,9 +16,17 @@ "description":"", "type": "object", "properties": { - "stub": {"type": "array", "items": {"type": "integer"}} + "header": {"$ref": "BoundsHeader.json"}, + "ssr_iod": {"type": "integer"}, + "const_id": {"type": "integer"}, + "sat_bitmask": {"type": "integer"}, + "orbit_clock_bounds_degradation": {"$ref": "OrbitClockBoundDegradation.json"} }, "required": [ - "stub" + "header", + "ssr_iod", + "const_id", + "sat_bitmask", + "orbit_clock_bounds_degradation" ] } \ No newline at end of file diff --git a/jsonschema/MsgSsrStecCorrection.json b/jsonschema/MsgSsrStecCorrection.json index 9ed78d4fbd..a02b001d04 100644 --- a/jsonschema/MsgSsrStecCorrection.json +++ b/jsonschema/MsgSsrStecCorrection.json @@ -16,9 +16,19 @@ "description":"", "type": "object", "properties": { - "stub": {"type": "array", "items": {"type": "integer"}} + "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": [ - "stub" + "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 3bfb141ec1..d9cadfd546 100644 --- a/jsonschema/MsgSsrTileDefinition.json +++ b/jsonschema/MsgSsrTileDefinition.json @@ -16,9 +16,27 @@ "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": { - "stub": {"type": "array", "items": {"type": "integer"}} + "ssr_sol_id": {"type": "integer"}, + "tile_set_id": {"type": "integer"}, + "tile_id": {"type": "integer"}, + "corner_nw_lat": {"type": "integer"}, + "corner_nw_lon": {"type": "integer"}, + "spacing_lat": {"type": "integer"}, + "spacing_lon": {"type": "integer"}, + "rows": {"type": "integer"}, + "cols": {"type": "integer"}, + "bitmask": {"type": "integer"} }, "required": [ - "stub" + "ssr_sol_id", + "tile_set_id", + "tile_id", + "corner_nw_lat", + "corner_nw_lon", + "spacing_lat", + "spacing_lon", + "rows", + "cols", + "bitmask" ] } \ No newline at end of file diff --git a/jsonschema/MsgUtcLeapSecond.json b/jsonschema/MsgUtcLeapSecond.json index 817ddd74eb..19acc642ee 100644 --- a/jsonschema/MsgUtcLeapSecond.json +++ b/jsonschema/MsgUtcLeapSecond.json @@ -16,9 +16,25 @@ "description":"Emulates the GPS CNAV message, reserving bytes for future broadcast of the drift model parameters.\n", "type": "object", "properties": { - "stub": {"type": "array", "items": {"type": "integer"}} + "bias_coeff": {"type": "integer"}, + "drift_coeff": {"type": "integer"}, + "drift_rate_coeff": {"type": "integer"}, + "count_before": {"type": "integer"}, + "tow_s": {"type": "integer"}, + "wn": {"type": "integer"}, + "ref_wn": {"type": "integer"}, + "ref_dn": {"type": "integer"}, + "count_after": {"type": "integer"} }, "required": [ - "stub" + "bias_coeff", + "drift_coeff", + "drift_rate_coeff", + "count_before", + "tow_s", + "wn", + "ref_wn", + "ref_dn", + "count_after" ] } \ No newline at end of file diff --git a/proto/integrity.proto b/proto/integrity.proto index 15dd760132..2c49f425d6 100644 --- a/proto/integrity.proto +++ b/proto/integrity.proto @@ -21,12 +21,38 @@ package swiftnav.sbp.integrity; import "gnss.proto"; +/** Common fields for SSR integrity messages + * +None + */ +message IntegritySSRHeader { + gnss.GpsTimeSec obs_time = 1; + uint32 num_msgs = 2; + uint32 seq_num = 3; + uint32 ssr_sol_id = 4; + uint32 tile_set_id = 5; + uint32 tile_id = 6; + uint32 chain_id = 7; +} + /** High level integrity flags * None */ message MsgSsrFlagHighLevel { - repeated uint32 stub = 1; + gnss.GpsTimeSec obs_time = 1; + gnss.GpsTimeSec corr_time = 2; + uint32 ssr_sol_id = 3; + uint32 tile_set_id = 4; + uint32 tile_id = 5; + uint32 chain_id = 6; + uint32 use_gps_sat = 7; + uint32 use_gal_sat = 8; + uint32 use_bds_sat = 9; + uint32 use_tropo_grid_points = 11; + uint32 use_iono_grid_points = 12; + uint32 use_iono_tile_sat_los = 13; + uint32 use_iono_grid_point_sat_los = 14; } /** List of satellites which are faulty, per constellation @@ -34,7 +60,14 @@ message MsgSsrFlagHighLevel { None */ message MsgSsrFlagSatellites { - repeated uint32 stub = 1; + gnss.GpsTimeSec obs_time = 1; + uint32 num_msgs = 2; + uint32 seq_num = 3; + uint32 ssr_sol_id = 4; + uint32 chain_id = 5; + uint32 const_id = 6; + uint32 n_faulty_sats = 7; + repeated uint32 faulty_sats = 8; } /** List of grid points which are faulty @@ -42,7 +75,9 @@ message MsgSsrFlagSatellites { None */ message MsgSsrFlagTropoGridPoints { - repeated uint32 stub = 1; + IntegritySSRHeader header = 1; + uint32 n_faulty_points = 2; + repeated uint32 faulty_points = 3; } /** List of grid points which are faulty @@ -50,7 +85,9 @@ message MsgSsrFlagTropoGridPoints { None */ message MsgSsrFlagIonoGridPoints { - repeated uint32 stub = 1; + IntegritySSRHeader header = 1; + uint32 n_faulty_points = 2; + repeated uint32 faulty_points = 3; } /** List of all the LOS which are faulty @@ -58,7 +95,9 @@ message MsgSsrFlagIonoGridPoints { None */ message MsgSsrFlagIonoTileSatLos { - repeated uint32 stub = 1; + IntegritySSRHeader header = 1; + uint32 n_faulty_los = 2; + repeated SvId faulty_los = 3; } /** List of all the grid points to satellite which are faulty @@ -66,5 +105,8 @@ message MsgSsrFlagIonoTileSatLos { None */ message MsgSsrFlagIonoGridPointSatLos { - repeated uint32 stub = 1; + IntegritySSRHeader header = 1; + uint32 grid_point_id = 2; + uint32 n_faulty_los = 3; + repeated SvId faulty_los = 4; } \ No newline at end of file diff --git a/proto/navigation.proto b/proto/navigation.proto index 40a4f671c5..ec1e8a4d13 100644 --- a/proto/navigation.proto +++ b/proto/navigation.proto @@ -656,13 +656,40 @@ message MsgProtectionLevel { * drift model parameters. */ message MsgUtcLeapSecond { - repeated uint32 stub = 1; + sint32 bias_coeff = 1; + sint32 drift_coeff = 2; + sint32 drift_rate_coeff = 3; + sint32 count_before = 4; + uint32 tow_s = 5; + uint32 wn = 6; + uint32 ref_wn = 7; + uint32 ref_dn = 8; + sint32 count_after = 9; } -/** Reference Frame Transformation Parameter +/** Reference Frame Transformation Parameters * None */ message MsgReferenceFrameParam { - repeated uint32 stub = 1; + uint32 ssr_iod = 1; + string sn = 2; + string tn = 3; + uint32 sin = 4; + uint32 utn = 5; + uint32 re_t0 = 6; + sint32 delta_X0 = 7; + sint32 delta_Y0 = 8; + sint32 delta_Z0 = 9; + sint32 theta_01 = 10; + sint32 theta_02 = 11; + sint32 theta_03 = 12; + sint32 scale = 13; + sint32 dot_delta_X0 = 14; + sint32 dot_delta_Y0 = 15; + sint32 dot_delta_Z0 = 16; + sint32 dot_theta_01 = 17; + sint32 dot_theta_02 = 18; + sint32 dot_theta_03 = 19; + sint32 dot_scale = 20; } \ No newline at end of file diff --git a/proto/ssr.proto b/proto/ssr.proto index e24fb67088..e513991b80 100644 --- a/proto/ssr.proto +++ b/proto/ssr.proto @@ -182,12 +182,29 @@ message MsgSsrPhaseBiases { repeated PhaseBiasesContent biases = 9; } +/** 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; +} + /** STEC correction polynomial coefficients * None */ message MsgSsrStecCorrection { - repeated uint32 stub = 1; + 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 @@ -203,13 +220,37 @@ 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 * * Note 1: Range: 0-17.5 m. i<= 200, mean = 0.01i; 200230, mean=5+0.5(i-230). */ message MsgSsrGriddedCorrectionBounds { - repeated uint32 stub = 1; + 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_v_hydro_bound_mu = 8; + uint32 tropo_v_hydro_bound_sig = 9; + uint32 tropo_v_wet_bound_mu = 10; + uint32 tropo_v_wet_bound_sig = 11; + uint32 n_sats = 12; + repeated STECSatElementIntegrity stec_sat_list = 13; } /** Definition of a SSR atmospheric correction tile. @@ -224,7 +265,16 @@ message MsgSsrGriddedCorrectionBounds { * correction points, not lists of points. */ message MsgSsrTileDefinition { - repeated uint32 stub = 1; + 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 @@ -248,21 +298,76 @@ message MsgSsrSatelliteApc { repeated SatelliteAPC apc = 1; } -/** Stubbed version of Combined Orbit and Clock Bound +/** None * - * Note 1: Range: 0-55 m. i<=200, mean=0.0251i; 200240, mean=25+2(i-240). + * Orbit and clock bound. + */ +message OrbitClockBound { + uint32 sat_id = 1; + uint32 orb_radial_bound_mu = 2; + uint32 orb_along_bound_mu = 3; + uint32 orb_cross_bound_mu = 4; + uint32 orb_radial_bound_sig = 5; + uint32 orb_along_bound_sig = 6; + uint32 orb_cross_bound_sig = 7; + uint32 clock_bound_mu = 8; + uint32 clock_bound_sig = 9; +} + +/** Combined Orbit and Clock Bound + * + * Note 1: Range: 0-17.5 m. i<=200, mean=0.01i; 200230, mean=5+0.5(i-230). + * + * Note 2: Range: 0-17.5 m. i<=200, std=0.01i; 200230, std=5+0.5(i-230). */ message MsgSsrOrbitClockBounds { - repeated uint32 stub = 1; + BoundsHeader header = 1; + uint32 ssr_iod = 2; + uint32 const_id = 3; + uint32 n_sats = 4; + repeated OrbitClockBound orbit_clock_bounds = 5; } -/** Stubbed version of Combined Code and Phase Biases Bounds +/** Code and Phase Biases Bounds per Satellite-Signal couple + * +None + */ +message CodePhaseBiasesSatSig { + uint32 sat_id = 1; + uint32 signal_id = 2; + uint32 code_bias_bound_mu = 3; + uint32 code_bias_bound_sig = 4; + uint32 phase_bias_bound_mu = 5; + uint32 phase_bias_bound_sig = 6; +} + +/** Combined Code and Phase Biases Bounds * None */ message MsgSsrCodePhaseBiasesBounds { - repeated uint32 stub = 1; + BoundsHeader header = 1; + uint32 ssr_iod = 2; + uint32 const_id = 3; + uint32 n_sats_signals = 4; + repeated CodePhaseBiasesSatSig satellites_signals = 5; +} + +/** None + * + * Orbit and clock bound degradation. + */ +message OrbitClockBoundDegradation { + uint32 orb_radial_bound_mu_dot = 1; + uint32 orb_along_bound_mu_dot = 2; + uint32 orb_cross_bound_mu_dot = 3; + uint32 orb_radial_bound_sig_dot = 4; + uint32 orb_along_bound_sig_dot = 5; + uint32 orb_cross_bound_sig_dot = 6; + uint32 clock_bound_mu_dot = 7; + uint32 clock_bound_sig_dot = 8; } /** Combined Orbit and Clock Bound Degradation Parameter @@ -270,5 +375,9 @@ message MsgSsrCodePhaseBiasesBounds { None */ message MsgSsrOrbitClockBoundsDegradation { - repeated uint32 stub = 1; + BoundsHeader header = 1; + uint32 ssr_iod = 2; + uint32 const_id = 3; + uint64 sat_bitmask = 4; + OrbitClockBoundDegradation orbit_clock_bounds_degradation = 5; } \ No newline at end of file diff --git a/python/sbp/integrity.py b/python/sbp/integrity.py index aa7c31937e..42ed49965e 100644 --- a/python/sbp/integrity.py +++ b/python/sbp/integrity.py @@ -20,11 +20,72 @@ from sbp.msg import SBP, SENDER_ID from sbp.utils import fmt_repr, exclude_fields, walk_json_dict, containerize +from sbp.gnss import GPSTimeSec, SvId # Automatically generated from piksi/yaml/swiftnav/sbp/integrity.yaml with generate.py. # Please do not hand edit! +class IntegritySSRHeader(object): + """IntegritySSRHeader. + + + Parameters + ---------- + obs_time : GPSTimeSec + GNSS reference time of the observation used to generate the flag. + num_msgs : int + Number of messages in the dataset + seq_num : int + Position of this message in the dataset + ssr_sol_id : int + SSR Solution ID. + 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. + chain_id : int + Chain and type of flag. + + """ + _parser = construct.Struct( + 'obs_time' / GPSTimeSec._parser, + 'num_msgs' / construct.Int8ul, + 'seq_num' / construct.Int8ul, + 'ssr_sol_id' / construct.Int8ul, + 'tile_set_id' / construct.Int16ul, + 'tile_id' / construct.Int16ul, + 'chain_id' / construct.Int8ul,) + __slots__ = [ + 'obs_time', + 'num_msgs', + 'seq_num', + 'ssr_sol_id', + 'tile_set_id', + 'tile_id', + 'chain_id', + ] + + def __init__(self, payload=None, **kwargs): + if payload: + self.from_binary(payload) + else: + self.obs_time = kwargs.pop('obs_time') + self.num_msgs = kwargs.pop('num_msgs') + self.seq_num = kwargs.pop('seq_num') + 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.chain_id = kwargs.pop('chain_id') + + def __repr__(self): + return fmt_repr(self) + + def from_binary(self, d): + p = IntegritySSRHeader._parser.parse(d) + for n in self.__class__.__slots__: + setattr(self, n, getattr(p, n)) + SBP_MSG_SSR_FLAG_HIGH_LEVEL = 0x0BB9 class MsgSsrFlagHighLevel(SBP): """SBP class for message MSG_SSR_FLAG_HIGH_LEVEL (0x0BB9). @@ -39,15 +100,68 @@ class MsgSsrFlagHighLevel(SBP): ---------- sbp : SBP SBP parent object to inherit from. - stub : array + obs_time : GPSTimeSec + GNSS reference time of the observation used to generate the flag. + corr_time : GPSTimeSec + GNSS reference time of the correction associated to the flag. + ssr_sol_id : int + SSR Solution ID. + 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. + chain_id : int + Chain and type of flag. + use_gps_sat : int + Use GPS satellites. + use_gal_sat : int + Use GAL satellites. + use_bds_sat : int + Use BDS satellites. + reserved : array + Reserved + use_tropo_grid_points : int + Use tropo grid points. + use_iono_grid_points : int + Use iono grid points. + use_iono_tile_sat_los : int + Use iono tile satellite LoS. + use_iono_grid_point_sat_los : int + Use iono grid point satellite LoS. sender : int Optional sender ID, defaults to SENDER_ID (see sbp/msg.py). """ _parser = construct.Struct( - 'stub' / construct.GreedyRange(construct.Int8ul),) + 'obs_time' / GPSTimeSec._parser, + 'corr_time' / GPSTimeSec._parser, + 'ssr_sol_id' / construct.Int8ul, + 'tile_set_id' / construct.Int16ul, + 'tile_id' / construct.Int16ul, + 'chain_id' / construct.Int8ul, + 'use_gps_sat' / construct.Int8ul, + 'use_gal_sat' / construct.Int8ul, + 'use_bds_sat' / construct.Int8ul, + 'reserved' / construct.Array(6, construct.Int8ul), + 'use_tropo_grid_points' / construct.Int8ul, + 'use_iono_grid_points' / construct.Int8ul, + 'use_iono_tile_sat_los' / construct.Int8ul, + 'use_iono_grid_point_sat_los' / construct.Int8ul,) __slots__ = [ - 'stub', + 'obs_time', + 'corr_time', + 'ssr_sol_id', + 'tile_set_id', + 'tile_id', + 'chain_id', + 'use_gps_sat', + 'use_gal_sat', + 'use_bds_sat', + 'reserved', + 'use_tropo_grid_points', + 'use_iono_grid_points', + 'use_iono_tile_sat_los', + 'use_iono_grid_point_sat_los', ] def __init__(self, sbp=None, **kwargs): @@ -60,7 +174,20 @@ def __init__(self, sbp=None, **kwargs): super( MsgSsrFlagHighLevel, self).__init__() self.msg_type = SBP_MSG_SSR_FLAG_HIGH_LEVEL self.sender = kwargs.pop('sender', SENDER_ID) - self.stub = kwargs.pop('stub') + self.obs_time = kwargs.pop('obs_time') + self.corr_time = kwargs.pop('corr_time') + 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.chain_id = kwargs.pop('chain_id') + self.use_gps_sat = kwargs.pop('use_gps_sat') + self.use_gal_sat = kwargs.pop('use_gal_sat') + self.use_bds_sat = kwargs.pop('use_bds_sat') + self.reserved = kwargs.pop('reserved') + self.use_tropo_grid_points = kwargs.pop('use_tropo_grid_points') + self.use_iono_grid_points = kwargs.pop('use_iono_grid_points') + self.use_iono_tile_sat_los = kwargs.pop('use_iono_tile_sat_los') + self.use_iono_grid_point_sat_los = kwargs.pop('use_iono_grid_point_sat_los') def __repr__(self): return fmt_repr(self) @@ -126,15 +253,44 @@ class MsgSsrFlagSatellites(SBP): ---------- sbp : SBP SBP parent object to inherit from. - stub : array + obs_time : GPSTimeSec + GNSS reference time of the observation used to generate the flag. + num_msgs : int + Number of messages in the dataset + seq_num : int + Position of this message in the dataset + ssr_sol_id : int + SSR Solution ID. + chain_id : int + Chain and type of flag. + const_id : int + Constellation ID. + n_faulty_sats : int + Number of faulty satellites. + faulty_sats : array + List of faulty satellites. sender : int Optional sender ID, defaults to SENDER_ID (see sbp/msg.py). """ _parser = construct.Struct( - 'stub' / construct.GreedyRange(construct.Int8ul),) + 'obs_time' / GPSTimeSec._parser, + 'num_msgs' / construct.Int8ul, + 'seq_num' / construct.Int8ul, + 'ssr_sol_id' / construct.Int8ul, + 'chain_id' / construct.Int8ul, + 'const_id' / construct.Int8ul, + 'n_faulty_sats' / construct.Int8ul, + 'faulty_sats' / construct.GreedyRange(construct.Int8ul),) __slots__ = [ - 'stub', + 'obs_time', + 'num_msgs', + 'seq_num', + 'ssr_sol_id', + 'chain_id', + 'const_id', + 'n_faulty_sats', + 'faulty_sats', ] def __init__(self, sbp=None, **kwargs): @@ -147,7 +303,14 @@ def __init__(self, sbp=None, **kwargs): super( MsgSsrFlagSatellites, self).__init__() self.msg_type = SBP_MSG_SSR_FLAG_SATELLITES self.sender = kwargs.pop('sender', SENDER_ID) - self.stub = kwargs.pop('stub') + self.obs_time = kwargs.pop('obs_time') + self.num_msgs = kwargs.pop('num_msgs') + self.seq_num = kwargs.pop('seq_num') + self.ssr_sol_id = kwargs.pop('ssr_sol_id') + self.chain_id = kwargs.pop('chain_id') + self.const_id = kwargs.pop('const_id') + self.n_faulty_sats = kwargs.pop('n_faulty_sats') + self.faulty_sats = kwargs.pop('faulty_sats') def __repr__(self): return fmt_repr(self) @@ -213,15 +376,24 @@ class MsgSsrFlagTropoGridPoints(SBP): ---------- sbp : SBP SBP parent object to inherit from. - stub : array + header : IntegritySSRHeader + Header of an integrity message. + n_faulty_points : int + Number of faulty grid points. + faulty_points : array + List of faulty grid points. sender : int Optional sender ID, defaults to SENDER_ID (see sbp/msg.py). """ _parser = construct.Struct( - 'stub' / construct.GreedyRange(construct.Int8ul),) + 'header' / IntegritySSRHeader._parser, + 'n_faulty_points' / construct.Int8ul, + 'faulty_points' / construct.GreedyRange(construct.Int16ul),) __slots__ = [ - 'stub', + 'header', + 'n_faulty_points', + 'faulty_points', ] def __init__(self, sbp=None, **kwargs): @@ -234,7 +406,9 @@ def __init__(self, sbp=None, **kwargs): super( MsgSsrFlagTropoGridPoints, self).__init__() self.msg_type = SBP_MSG_SSR_FLAG_TROPO_GRID_POINTS self.sender = kwargs.pop('sender', SENDER_ID) - self.stub = kwargs.pop('stub') + self.header = kwargs.pop('header') + self.n_faulty_points = kwargs.pop('n_faulty_points') + self.faulty_points = kwargs.pop('faulty_points') def __repr__(self): return fmt_repr(self) @@ -300,15 +474,24 @@ class MsgSsrFlagIonoGridPoints(SBP): ---------- sbp : SBP SBP parent object to inherit from. - stub : array + header : IntegritySSRHeader + Header of an integrity message. + n_faulty_points : int + Number of faulty grid points. + faulty_points : array + List of faulty grid points. sender : int Optional sender ID, defaults to SENDER_ID (see sbp/msg.py). """ _parser = construct.Struct( - 'stub' / construct.GreedyRange(construct.Int8ul),) + 'header' / IntegritySSRHeader._parser, + 'n_faulty_points' / construct.Int8ul, + 'faulty_points' / construct.GreedyRange(construct.Int16ul),) __slots__ = [ - 'stub', + 'header', + 'n_faulty_points', + 'faulty_points', ] def __init__(self, sbp=None, **kwargs): @@ -321,7 +504,9 @@ def __init__(self, sbp=None, **kwargs): super( MsgSsrFlagIonoGridPoints, self).__init__() self.msg_type = SBP_MSG_SSR_FLAG_IONO_GRID_POINTS self.sender = kwargs.pop('sender', SENDER_ID) - self.stub = kwargs.pop('stub') + self.header = kwargs.pop('header') + self.n_faulty_points = kwargs.pop('n_faulty_points') + self.faulty_points = kwargs.pop('faulty_points') def __repr__(self): return fmt_repr(self) @@ -387,15 +572,24 @@ class MsgSsrFlagIonoTileSatLos(SBP): ---------- sbp : SBP SBP parent object to inherit from. - stub : array + header : IntegritySSRHeader + Header of an integrity message. + n_faulty_los : int + Number of faulty LOS. + faulty_los : array + List of faulty LOS sender : int Optional sender ID, defaults to SENDER_ID (see sbp/msg.py). """ _parser = construct.Struct( - 'stub' / construct.GreedyRange(construct.Int8ul),) + 'header' / IntegritySSRHeader._parser, + 'n_faulty_los' / construct.Int8ul, + 'faulty_los' / construct.GreedyRange(SvId._parser),) __slots__ = [ - 'stub', + 'header', + 'n_faulty_los', + 'faulty_los', ] def __init__(self, sbp=None, **kwargs): @@ -408,7 +602,9 @@ def __init__(self, sbp=None, **kwargs): super( MsgSsrFlagIonoTileSatLos, self).__init__() self.msg_type = SBP_MSG_SSR_FLAG_IONO_TILE_SAT_LOS self.sender = kwargs.pop('sender', SENDER_ID) - self.stub = kwargs.pop('stub') + self.header = kwargs.pop('header') + self.n_faulty_los = kwargs.pop('n_faulty_los') + self.faulty_los = kwargs.pop('faulty_los') def __repr__(self): return fmt_repr(self) @@ -474,15 +670,28 @@ class MsgSsrFlagIonoGridPointSatLos(SBP): ---------- sbp : SBP SBP parent object to inherit from. - stub : array + header : IntegritySSRHeader + Header of an integrity message. + grid_point_id : int + Index of the grid point. + n_faulty_los : int + Number of faulty LOS. + faulty_los : array + List of faulty LOS sender : int Optional sender ID, defaults to SENDER_ID (see sbp/msg.py). """ _parser = construct.Struct( - 'stub' / construct.GreedyRange(construct.Int8ul),) + 'header' / IntegritySSRHeader._parser, + 'grid_point_id' / construct.Int16ul, + 'n_faulty_los' / construct.Int8ul, + 'faulty_los' / construct.GreedyRange(SvId._parser),) __slots__ = [ - 'stub', + 'header', + 'grid_point_id', + 'n_faulty_los', + 'faulty_los', ] def __init__(self, sbp=None, **kwargs): @@ -495,7 +704,10 @@ def __init__(self, sbp=None, **kwargs): super( MsgSsrFlagIonoGridPointSatLos, self).__init__() self.msg_type = SBP_MSG_SSR_FLAG_IONO_GRID_POINT_SAT_LOS self.sender = kwargs.pop('sender', SENDER_ID) - self.stub = kwargs.pop('stub') + self.header = kwargs.pop('header') + self.grid_point_id = kwargs.pop('grid_point_id') + self.n_faulty_los = kwargs.pop('n_faulty_los') + self.faulty_los = kwargs.pop('faulty_los') def __repr__(self): return fmt_repr(self) diff --git a/python/sbp/navigation.py b/python/sbp/navigation.py index 007b1a22f8..1ccdb9d276 100755 --- a/python/sbp/navigation.py +++ b/python/sbp/navigation.py @@ -5121,15 +5121,51 @@ class MsgUtcLeapSecond(SBP): ---------- sbp : SBP SBP parent object to inherit from. - stub : array + bias_coeff : int + Reserved. Bias coefficient of GPS time scale with respect to UTC drift + model. + drift_coeff : int + Reserved. Drift coefficient of GPS time scale with respect to UTC drift + model. + drift_rate_coeff : int + Reserved. Drift rate correction coefficient of GPS time scale with respect + to UTC drift model. + count_before : int + Leap second count before insertion. + tow_s : int + Reserved. Drift model reference week second. + wn : int + Reserved. Drift model reference week number. + ref_wn : int + Leap second reference week number. + ref_dn : int + Leap second reference day number. + count_after : int + Leap second count after insertion. sender : int Optional sender ID, defaults to SENDER_ID (see sbp/msg.py). """ _parser = construct.Struct( - 'stub' / construct.GreedyRange(construct.Int8ul),) + 'bias_coeff' / construct.Int16sl, + 'drift_coeff' / construct.Int16sl, + 'drift_rate_coeff' / construct.Int8sl, + 'count_before' / construct.Int8sl, + 'tow_s' / construct.Int16ul, + 'wn' / construct.Int16ul, + 'ref_wn' / construct.Int16ul, + 'ref_dn' / construct.Int8ul, + 'count_after' / construct.Int8sl,) __slots__ = [ - 'stub', + 'bias_coeff', + 'drift_coeff', + 'drift_rate_coeff', + 'count_before', + 'tow_s', + 'wn', + 'ref_wn', + 'ref_dn', + 'count_after', ] def __init__(self, sbp=None, **kwargs): @@ -5142,7 +5178,15 @@ def __init__(self, sbp=None, **kwargs): super( MsgUtcLeapSecond, self).__init__() self.msg_type = SBP_MSG_UTC_LEAP_SECOND self.sender = kwargs.pop('sender', SENDER_ID) - self.stub = kwargs.pop('stub') + self.bias_coeff = kwargs.pop('bias_coeff') + self.drift_coeff = kwargs.pop('drift_coeff') + self.drift_rate_coeff = kwargs.pop('drift_rate_coeff') + self.count_before = kwargs.pop('count_before') + self.tow_s = kwargs.pop('tow_s') + self.wn = kwargs.pop('wn') + self.ref_wn = kwargs.pop('ref_wn') + self.ref_dn = kwargs.pop('ref_dn') + self.count_after = kwargs.pop('count_after') def __repr__(self): return fmt_repr(self) @@ -5208,15 +5252,93 @@ class MsgReferenceFrameParam(SBP): ---------- sbp : SBP SBP parent object to inherit from. - stub : array + ssr_iod : int + SSR IOD parameter. + sn : string + Name of source coordinate-system using the EPSG identification code. + tn : string + Name of target coordinate-system using the EPSG identification code. + sin : int + System Identification Number. + utn : int + Utilized Transformation Message. + re_t0 : int + Reference Epoch t0 for transformation parameter set given as Modified + Julian Day (MDJ) Number minus 44244 days. + delta_X0 : int + Translation in X for Reference Epoch t0. + delta_Y0 : int + Translation in Y for Reference Epoch t0. + delta_Z0 : int + Translation in Z for Reference Epoch t0. + theta_01 : int + Rotation around the X-axis for Reference Epoch t0. + theta_02 : int + Rotation around the Y-axis for Reference Epoch t0. + theta_03 : int + Rotation around the Z-axis for Reference Epoch t0. + scale : int + Scale correction for Reference Epoch t0. + dot_delta_X0 : int + Rate of change of translation in X. + dot_delta_Y0 : int + Rate of change of translation in Y. + dot_delta_Z0 : int + Rate of change of translation in Z. + dot_theta_01 : int + Rate of change of rotation around the X-axis. + dot_theta_02 : int + Rate of change of rotation around the Y-axis. + dot_theta_03 : int + Rate of change of rotation around the Z-axis. + dot_scale : int + Rate of change of scale correction. sender : int Optional sender ID, defaults to SENDER_ID (see sbp/msg.py). """ _parser = construct.Struct( - 'stub' / construct.GreedyRange(construct.Int8ul),) + 'ssr_iod' / construct.Int8ul, + 'sn'/ construct.Bytes(32), + 'tn'/ construct.Bytes(32), + 'sin' / construct.Int8ul, + 'utn' / construct.Int16ul, + 're_t0' / construct.Int16ul, + 'delta_X0' / construct.Int32sl, + 'delta_Y0' / construct.Int32sl, + 'delta_Z0' / construct.Int32sl, + 'theta_01' / construct.Int32sl, + 'theta_02' / construct.Int32sl, + 'theta_03' / construct.Int32sl, + 'scale' / construct.Int32sl, + 'dot_delta_X0' / construct.Int32sl, + 'dot_delta_Y0' / construct.Int32sl, + 'dot_delta_Z0' / construct.Int32sl, + 'dot_theta_01' / construct.Int32sl, + 'dot_theta_02' / construct.Int32sl, + 'dot_theta_03' / construct.Int32sl, + 'dot_scale' / construct.Int16sl,) __slots__ = [ - 'stub', + 'ssr_iod', + 'sn', + 'tn', + 'sin', + 'utn', + 're_t0', + 'delta_X0', + 'delta_Y0', + 'delta_Z0', + 'theta_01', + 'theta_02', + 'theta_03', + 'scale', + 'dot_delta_X0', + 'dot_delta_Y0', + 'dot_delta_Z0', + 'dot_theta_01', + 'dot_theta_02', + 'dot_theta_03', + 'dot_scale', ] def __init__(self, sbp=None, **kwargs): @@ -5229,7 +5351,26 @@ def __init__(self, sbp=None, **kwargs): super( MsgReferenceFrameParam, self).__init__() self.msg_type = SBP_MSG_REFERENCE_FRAME_PARAM self.sender = kwargs.pop('sender', SENDER_ID) - self.stub = kwargs.pop('stub') + self.ssr_iod = kwargs.pop('ssr_iod') + self.sn = kwargs.pop('sn') + self.tn = kwargs.pop('tn') + self.sin = kwargs.pop('sin') + self.utn = kwargs.pop('utn') + self.re_t0 = kwargs.pop('re_t0') + self.delta_X0 = kwargs.pop('delta_X0') + self.delta_Y0 = kwargs.pop('delta_Y0') + self.delta_Z0 = kwargs.pop('delta_Z0') + self.theta_01 = kwargs.pop('theta_01') + self.theta_02 = kwargs.pop('theta_02') + self.theta_03 = kwargs.pop('theta_03') + self.scale = kwargs.pop('scale') + self.dot_delta_X0 = kwargs.pop('dot_delta_X0') + self.dot_delta_Y0 = kwargs.pop('dot_delta_Y0') + self.dot_delta_Z0 = kwargs.pop('dot_delta_Z0') + self.dot_theta_01 = kwargs.pop('dot_theta_01') + self.dot_theta_02 = kwargs.pop('dot_theta_02') + self.dot_theta_03 = kwargs.pop('dot_theta_03') + self.dot_scale = kwargs.pop('dot_scale') def __repr__(self): return fmt_repr(self) diff --git a/python/sbp/ssr.py b/python/sbp/ssr.py index b30096f8f4..cc1a595e83 100644 --- a/python/sbp/ssr.py +++ b/python/sbp/ssr.py @@ -263,7 +263,8 @@ class STECSatElement(object): Quality of the STEC data. Encoded following RTCM DF389 specification but in units of TECU instead of m. stec_coeff : array - Coefficients of the STEC polynomial in the order of C00, C01, C10, C11 + Coefficients of the STEC polynomial in the order of C00, C01, C10, C11. + C00 = 0.05 TECU, C01/C10 = 0.02 TECU/deg, C11 0.02 TECU/deg^2 """ _parser = construct.Struct( @@ -336,11 +337,12 @@ class TroposphericDelayCorrection(object): Parameters ---------- hydro : int - Hydrostatic vertical delay + Hydrostatic vertical delay. Add 2.3 m to get actual value. wet : int - Wet vertical delay + Wet vertical delay. Add 0.252 m to get actual value. stddev : int - stddev + Modified DF389 scale. Class is upper 3 bits, value is lower 5. stddev <= + (3^class * (1 + value/16) - 1) mm """ _parser = construct.Struct( @@ -418,7 +420,8 @@ class STECResidual(object): residual : int STEC residual stddev : int - stddev + Modified DF389 scale. Class is upper 3 bits, value is lower 5. stddev <= + (3^class * (1 + value/16) - 1) * 10 TECU """ _parser = construct.Struct( @@ -447,6 +450,107 @@ 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 + Error Bound Mean. See Note 1. + stec_bound_sig : int + Error Bound StDev. See Note 1. + stec_bound_mu_dot : int + Error Bound Mean First derivative. + stec_bound_sig_dot : int + Error Bound StDev First derivative. + + """ + _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,6 +777,203 @@ def from_binary(self, d): for n in self.__class__.__slots__: setattr(self, n, getattr(p, n)) +class OrbitClockBound(object): + """OrbitClockBound. + + Orbit and clock bound. + + Parameters + ---------- + sat_id : int + Satellite ID. Similar to either RTCM DF068 (GPS), DF252 (Galileo), or + DF488 (BDS) depending on the constellation. + orb_radial_bound_mu : int + Mean Radial. See Note 1. + orb_along_bound_mu : int + Mean Along-Track. See Note 1. + orb_cross_bound_mu : int + Mean Cross-Track. See Note 1. + orb_radial_bound_sig : int + Standard Deviation Radial. See Note 2. + orb_along_bound_sig : int + Standard Deviation Along-Track. See Note 2. + orb_cross_bound_sig : int + Standard Deviation Cross-Track. See Note 2. + clock_bound_mu : int + Clock Bound Mean. See Note 1. + clock_bound_sig : int + Clock Bound Standard Deviation. See Note 2. + + """ + _parser = construct.Struct( + 'sat_id' / construct.Int8ul, + 'orb_radial_bound_mu' / construct.Int8ul, + 'orb_along_bound_mu' / construct.Int8ul, + 'orb_cross_bound_mu' / construct.Int8ul, + 'orb_radial_bound_sig' / construct.Int8ul, + 'orb_along_bound_sig' / construct.Int8ul, + 'orb_cross_bound_sig' / construct.Int8ul, + 'clock_bound_mu' / construct.Int8ul, + 'clock_bound_sig' / construct.Int8ul,) + __slots__ = [ + 'sat_id', + 'orb_radial_bound_mu', + 'orb_along_bound_mu', + 'orb_cross_bound_mu', + 'orb_radial_bound_sig', + 'orb_along_bound_sig', + 'orb_cross_bound_sig', + 'clock_bound_mu', + 'clock_bound_sig', + ] + + def __init__(self, payload=None, **kwargs): + if payload: + self.from_binary(payload) + else: + self.sat_id = kwargs.pop('sat_id') + self.orb_radial_bound_mu = kwargs.pop('orb_radial_bound_mu') + self.orb_along_bound_mu = kwargs.pop('orb_along_bound_mu') + self.orb_cross_bound_mu = kwargs.pop('orb_cross_bound_mu') + self.orb_radial_bound_sig = kwargs.pop('orb_radial_bound_sig') + self.orb_along_bound_sig = kwargs.pop('orb_along_bound_sig') + self.orb_cross_bound_sig = kwargs.pop('orb_cross_bound_sig') + self.clock_bound_mu = kwargs.pop('clock_bound_mu') + self.clock_bound_sig = kwargs.pop('clock_bound_sig') + + def __repr__(self): + return fmt_repr(self) + + def from_binary(self, d): + p = OrbitClockBound._parser.parse(d) + for n in self.__class__.__slots__: + setattr(self, n, getattr(p, n)) + +class CodePhaseBiasesSatSig(object): + """CodePhaseBiasesSatSig. + + + Parameters + ---------- + sat_id : int + Satellite ID. Similar to either RTCM DF068 (GPS), DF252 (Galileo), or + DF488 (BDS) depending on the constellation. + signal_id : int + Signal and Tracking Mode Identifier. Similar to either RTCM DF380 (GPS), + DF382 (Galileo) or DF467 (BDS) depending on the constellation. + code_bias_bound_mu : int + Code Bias Mean. Range: 0-1.275 m + code_bias_bound_sig : int + Code Bias Standard Deviation. Range: 0-1.275 m + phase_bias_bound_mu : int + Phase Bias Mean. Range: 0-1.275 m + phase_bias_bound_sig : int + Phase Bias Standard Deviation. Range: 0-1.275 m + + """ + _parser = construct.Struct( + 'sat_id' / construct.Int8ul, + 'signal_id' / construct.Int8ul, + 'code_bias_bound_mu' / construct.Int8ul, + 'code_bias_bound_sig' / construct.Int8ul, + 'phase_bias_bound_mu' / construct.Int8ul, + 'phase_bias_bound_sig' / construct.Int8ul,) + __slots__ = [ + 'sat_id', + 'signal_id', + 'code_bias_bound_mu', + 'code_bias_bound_sig', + 'phase_bias_bound_mu', + 'phase_bias_bound_sig', + ] + + def __init__(self, payload=None, **kwargs): + if payload: + self.from_binary(payload) + else: + self.sat_id = kwargs.pop('sat_id') + self.signal_id = kwargs.pop('signal_id') + self.code_bias_bound_mu = kwargs.pop('code_bias_bound_mu') + self.code_bias_bound_sig = kwargs.pop('code_bias_bound_sig') + self.phase_bias_bound_mu = kwargs.pop('phase_bias_bound_mu') + self.phase_bias_bound_sig = kwargs.pop('phase_bias_bound_sig') + + def __repr__(self): + return fmt_repr(self) + + def from_binary(self, d): + p = CodePhaseBiasesSatSig._parser.parse(d) + for n in self.__class__.__slots__: + setattr(self, n, getattr(p, n)) + +class OrbitClockBoundDegradation(object): + """OrbitClockBoundDegradation. + + Orbit and clock bound degradation. + + Parameters + ---------- + orb_radial_bound_mu_dot : int + Orbit Bound Mean Radial First derivative. Range: 0-0.255 m/s + orb_along_bound_mu_dot : int + Orbit Bound Mean Along-Track First derivative. Range: 0-0.255 m/s + orb_cross_bound_mu_dot : int + Orbit Bound Mean Cross-Track First derivative. Range: 0-0.255 m/s + orb_radial_bound_sig_dot : int + Orbit Bound Standard Deviation Radial First derivative. Range: 0-0.255 m/s + orb_along_bound_sig_dot : int + Orbit Bound Standard Deviation Along-Track First derivative. Range: + 0-0.255 m/s + orb_cross_bound_sig_dot : int + Orbit Bound Standard Deviation Cross-Track First derivative. Range: + 0-0.255 m/s + clock_bound_mu_dot : int + Clock Bound Mean First derivative. Range: 0-0.255 m/s + clock_bound_sig_dot : int + Clock Bound Standard Deviation First derivative. Range: 0-0.255 m/s + + """ + _parser = construct.Struct( + 'orb_radial_bound_mu_dot' / construct.Int8ul, + 'orb_along_bound_mu_dot' / construct.Int8ul, + 'orb_cross_bound_mu_dot' / construct.Int8ul, + 'orb_radial_bound_sig_dot' / construct.Int8ul, + 'orb_along_bound_sig_dot' / construct.Int8ul, + 'orb_cross_bound_sig_dot' / construct.Int8ul, + 'clock_bound_mu_dot' / construct.Int8ul, + 'clock_bound_sig_dot' / construct.Int8ul,) + __slots__ = [ + 'orb_radial_bound_mu_dot', + 'orb_along_bound_mu_dot', + 'orb_cross_bound_mu_dot', + 'orb_radial_bound_sig_dot', + 'orb_along_bound_sig_dot', + 'orb_cross_bound_sig_dot', + 'clock_bound_mu_dot', + 'clock_bound_sig_dot', + ] + + def __init__(self, payload=None, **kwargs): + if payload: + self.from_binary(payload) + else: + self.orb_radial_bound_mu_dot = kwargs.pop('orb_radial_bound_mu_dot') + self.orb_along_bound_mu_dot = kwargs.pop('orb_along_bound_mu_dot') + self.orb_cross_bound_mu_dot = kwargs.pop('orb_cross_bound_mu_dot') + self.orb_radial_bound_sig_dot = kwargs.pop('orb_radial_bound_sig_dot') + self.orb_along_bound_sig_dot = kwargs.pop('orb_along_bound_sig_dot') + self.orb_cross_bound_sig_dot = kwargs.pop('orb_cross_bound_sig_dot') + self.clock_bound_mu_dot = kwargs.pop('clock_bound_mu_dot') + self.clock_bound_sig_dot = kwargs.pop('clock_bound_sig_dot') + + def __repr__(self): + return fmt_repr(self) + + def from_binary(self, d): + p = OrbitClockBoundDegradation._parser.parse(d) + for n in self.__class__.__slots__: + setattr(self, n, getattr(p, n)) + SBP_MSG_SSR_ORBIT_CLOCK = 0x05DD class MsgSsrOrbitClock(SBP): """SBP class for message MSG_SSR_ORBIT_CLOCK (0x05DD). @@ -1192,15 +1493,36 @@ class MsgSsrStecCorrection(SBP): ---------- sbp : SBP SBP parent object to inherit from. - stub : array + 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( - 'stub' / construct.GreedyRange(construct.Int8ul),) + '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__ = [ - 'stub', + 'header', + 'ssr_iod_atmo', + 'tile_set_id', + 'tile_id', + 'n_sats', + 'stec_sat_list', ] def __init__(self, sbp=None, **kwargs): @@ -1213,7 +1535,12 @@ def __init__(self, sbp=None, **kwargs): super( MsgSsrStecCorrection, self).__init__() self.msg_type = SBP_MSG_SSR_STEC_CORRECTION self.sender = kwargs.pop('sender', SENDER_ID) - self.stub = kwargs.pop('stub') + 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): return fmt_repr(self) @@ -1380,20 +1707,72 @@ class MsgSsrGriddedCorrectionBounds(SBP): of its fields. + Note 1: Range: 0-17.5 m. i<= 200, mean = 0.01i; 200230, mean=5+0.5(i-230). Parameters ---------- sbp : SBP SBP parent object to inherit from. - stub : array + header : BoundsHeader + Header of a bounds message. + ssr_iod_atmo : int + IOD of the correction. + tile_set_id : int + 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_v_hydro_bound_mu : int + Vertical Hydrostatic Error Bound Mean. + tropo_v_hydro_bound_sig : int + Vertical Hydrostatic Error Bound StDev. + tropo_v_wet_bound_mu : int + Vertical Wet Error Bound Mean. + tropo_v_wet_bound_sig : int + Vertical Wet Error Bound StDev. + 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( - 'stub' / construct.GreedyRange(construct.Int8ul),) + '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_v_hydro_bound_mu' / construct.Int8ul, + 'tropo_v_hydro_bound_sig' / construct.Int8ul, + 'tropo_v_wet_bound_mu' / construct.Int8ul, + 'tropo_v_wet_bound_sig' / construct.Int8ul, + 'n_sats' / construct.Int8ul, + 'stec_sat_list' / construct.GreedyRange(STECSatElementIntegrity._parser),) __slots__ = [ - 'stub', + 'header', + 'ssr_iod_atmo', + 'tile_set_id', + 'tile_id', + 'tropo_qi', + 'grid_point_id', + 'tropo_delay_correction', + 'tropo_v_hydro_bound_mu', + 'tropo_v_hydro_bound_sig', + 'tropo_v_wet_bound_mu', + 'tropo_v_wet_bound_sig', + 'n_sats', + 'stec_sat_list', ] def __init__(self, sbp=None, **kwargs): @@ -1406,7 +1785,19 @@ def __init__(self, sbp=None, **kwargs): super( MsgSsrGriddedCorrectionBounds, self).__init__() self.msg_type = SBP_MSG_SSR_GRIDDED_CORRECTION_BOUNDS self.sender = kwargs.pop('sender', SENDER_ID) - self.stub = kwargs.pop('stub') + 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_v_hydro_bound_mu = kwargs.pop('tropo_v_hydro_bound_mu') + self.tropo_v_hydro_bound_sig = kwargs.pop('tropo_v_hydro_bound_sig') + self.tropo_v_wet_bound_mu = kwargs.pop('tropo_v_wet_bound_mu') + self.tropo_v_wet_bound_sig = kwargs.pop('tropo_v_wet_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) @@ -1651,15 +2042,89 @@ class MsgSsrTileDefinition(SBP): ---------- sbp : SBP SBP parent object to inherit from. - stub : array + ssr_sol_id : int + SSR Solution ID. + 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( - 'stub' / construct.GreedyRange(construct.Int8ul),) + 'ssr_sol_id' / construct.Int8ul, + '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__ = [ - 'stub', + 'ssr_sol_id', + 'tile_set_id', + 'tile_id', + 'corner_nw_lat', + 'corner_nw_lon', + 'spacing_lat', + 'spacing_lon', + 'rows', + 'cols', + 'bitmask', ] def __init__(self, sbp=None, **kwargs): @@ -1672,7 +2137,16 @@ 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.stub = kwargs.pop('stub') + 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') + 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) @@ -2371,20 +2845,42 @@ class MsgSsrOrbitClockBounds(SBP): of its fields. + Note 1: Range: 0-17.5 m. i<=200, mean=0.01i; 200230, mean=5+0.5(i-230). + + Note 2: Range: 0-17.5 m. i<=200, std=0.01i; 200230, std=5+0.5(i-230). Parameters ---------- sbp : SBP SBP parent object to inherit from. - stub : array + header : BoundsHeader + Header of a bounds message. + ssr_iod : int + IOD of the SSR bound. + const_id : int + Constellation ID to which the SVs belong. + n_sats : int + Number of satellites. + orbit_clock_bounds : array + Orbit and Clock Bounds per Satellite sender : int Optional sender ID, defaults to SENDER_ID (see sbp/msg.py). """ _parser = construct.Struct( - 'stub' / construct.GreedyRange(construct.Int8ul),) + 'header' / BoundsHeader._parser, + 'ssr_iod' / construct.Int8ul, + 'const_id' / construct.Int8ul, + 'n_sats' / construct.Int8ul, + 'orbit_clock_bounds' / construct.GreedyRange(OrbitClockBound._parser),) __slots__ = [ - 'stub', + 'header', + 'ssr_iod', + 'const_id', + 'n_sats', + 'orbit_clock_bounds', ] def __init__(self, sbp=None, **kwargs): @@ -2397,7 +2893,11 @@ def __init__(self, sbp=None, **kwargs): super( MsgSsrOrbitClockBounds, self).__init__() self.msg_type = SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS self.sender = kwargs.pop('sender', SENDER_ID) - self.stub = kwargs.pop('stub') + self.header = kwargs.pop('header') + self.ssr_iod = kwargs.pop('ssr_iod') + self.const_id = kwargs.pop('const_id') + self.n_sats = kwargs.pop('n_sats') + self.orbit_clock_bounds = kwargs.pop('orbit_clock_bounds') def __repr__(self): return fmt_repr(self) @@ -2463,15 +2963,32 @@ class MsgSsrCodePhaseBiasesBounds(SBP): ---------- sbp : SBP SBP parent object to inherit from. - stub : array + header : BoundsHeader + Header of a bounds message. + ssr_iod : int + IOD of the SSR bound. + const_id : int + Constellation ID to which the SVs belong. + n_sats_signals : int + Number of satellite-signal couples. + satellites_signals : array + Code and Phase Biases Bounds per Satellite-Signal couple. sender : int Optional sender ID, defaults to SENDER_ID (see sbp/msg.py). """ _parser = construct.Struct( - 'stub' / construct.GreedyRange(construct.Int8ul),) + 'header' / BoundsHeader._parser, + 'ssr_iod' / construct.Int8ul, + 'const_id' / construct.Int8ul, + 'n_sats_signals' / construct.Int8ul, + 'satellites_signals' / construct.GreedyRange(CodePhaseBiasesSatSig._parser),) __slots__ = [ - 'stub', + 'header', + 'ssr_iod', + 'const_id', + 'n_sats_signals', + 'satellites_signals', ] def __init__(self, sbp=None, **kwargs): @@ -2484,7 +3001,11 @@ def __init__(self, sbp=None, **kwargs): super( MsgSsrCodePhaseBiasesBounds, self).__init__() self.msg_type = SBP_MSG_SSR_CODE_PHASE_BIASES_BOUNDS self.sender = kwargs.pop('sender', SENDER_ID) - self.stub = kwargs.pop('stub') + self.header = kwargs.pop('header') + self.ssr_iod = kwargs.pop('ssr_iod') + self.const_id = kwargs.pop('const_id') + self.n_sats_signals = kwargs.pop('n_sats_signals') + self.satellites_signals = kwargs.pop('satellites_signals') def __repr__(self): return fmt_repr(self) @@ -2550,15 +3071,34 @@ class MsgSsrOrbitClockBoundsDegradation(SBP): ---------- sbp : SBP SBP parent object to inherit from. - stub : array + header : BoundsHeader + Header of a bounds message. + ssr_iod : int + IOD of the SSR bound degradation parameter. + const_id : int + Constellation ID to which the SVs belong. + sat_bitmask : int + Satellite Bit Mask. Put 1 for each satellite where the following + degradation parameters are applicable, 0 otherwise. Encoded following RTCM + DF394 specification. + orbit_clock_bounds_degradation : OrbitClockBoundDegradation + Orbit and Clock Bounds Degradation Parameters sender : int Optional sender ID, defaults to SENDER_ID (see sbp/msg.py). """ _parser = construct.Struct( - 'stub' / construct.GreedyRange(construct.Int8ul),) + 'header' / BoundsHeader._parser, + 'ssr_iod' / construct.Int8ul, + 'const_id' / construct.Int8ul, + 'sat_bitmask' / construct.Int64ul, + 'orbit_clock_bounds_degradation' / OrbitClockBoundDegradation._parser,) __slots__ = [ - 'stub', + 'header', + 'ssr_iod', + 'const_id', + 'sat_bitmask', + 'orbit_clock_bounds_degradation', ] def __init__(self, sbp=None, **kwargs): @@ -2571,7 +3111,11 @@ def __init__(self, sbp=None, **kwargs): super( MsgSsrOrbitClockBoundsDegradation, self).__init__() self.msg_type = SBP_MSG_SSR_ORBIT_CLOCK_BOUNDS_DEGRADATION self.sender = kwargs.pop('sender', SENDER_ID) - self.stub = kwargs.pop('stub') + self.header = kwargs.pop('header') + self.ssr_iod = kwargs.pop('ssr_iod') + self.const_id = kwargs.pop('const_id') + self.sat_bitmask = kwargs.pop('sat_bitmask') + self.orbit_clock_bounds_degradation = kwargs.pop('orbit_clock_bounds_degradation') def __repr__(self): return fmt_repr(self) diff --git a/rust/sbp/src/messages/integrity.rs b/rust/sbp/src/messages/integrity.rs index ad131da447..7f8137c3a2 100644 --- a/rust/sbp/src/messages/integrity.rs +++ b/rust/sbp/src/messages/integrity.rs @@ -13,6 +13,7 @@ // with generate.py. Please do not hand edit! //****************************************************************************/ //! Integrity flag messages +pub use integrity_ssr_header::IntegritySSRHeader; pub use msg_ssr_flag_high_level::MsgSsrFlagHighLevel; pub use msg_ssr_flag_iono_grid_point_sat_los::MsgSsrFlagIonoGridPointSatLos; pub use msg_ssr_flag_iono_grid_points::MsgSsrFlagIonoGridPoints; @@ -20,6 +21,79 @@ pub use msg_ssr_flag_iono_tile_sat_los::MsgSsrFlagIonoTileSatLos; pub use msg_ssr_flag_satellites::MsgSsrFlagSatellites; pub use msg_ssr_flag_tropo_grid_points::MsgSsrFlagTropoGridPoints; +pub mod integrity_ssr_header { + #![allow(unused_imports)] + + use super::*; + use crate::messages::gnss::*; + use crate::messages::lib::*; + /// Common fields for SSR integrity messages + #[cfg_attr(feature = "serde", derive(serde::Serialize))] + #[derive(Debug, PartialEq, Clone)] + pub struct IntegritySSRHeader { + /// GNSS reference time of the observation used to generate the flag. + #[cfg_attr(feature = "serde", serde(rename(serialize = "obs_time")))] + pub obs_time: GpsTimeSec, + /// Number of messages in the dataset + #[cfg_attr(feature = "serde", serde(rename(serialize = "num_msgs")))] + pub num_msgs: u8, + /// Position of this message in the dataset + #[cfg_attr(feature = "serde", serde(rename(serialize = "seq_num")))] + pub seq_num: u8, + /// SSR Solution ID. + #[cfg_attr(feature = "serde", serde(rename(serialize = "ssr_sol_id")))] + pub ssr_sol_id: 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, + /// Chain and type of flag. + #[cfg_attr(feature = "serde", serde(rename(serialize = "chain_id")))] + pub chain_id: u8, + } + + impl WireFormat for IntegritySSRHeader { + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN; + fn len(&self) -> usize { + WireFormat::len(&self.obs_time) + + WireFormat::len(&self.num_msgs) + + WireFormat::len(&self.seq_num) + + WireFormat::len(&self.ssr_sol_id) + + WireFormat::len(&self.tile_set_id) + + WireFormat::len(&self.tile_id) + + WireFormat::len(&self.chain_id) + } + fn write(&self, buf: &mut B) { + WireFormat::write(&self.obs_time, buf); + WireFormat::write(&self.num_msgs, buf); + WireFormat::write(&self.seq_num, buf); + WireFormat::write(&self.ssr_sol_id, buf); + WireFormat::write(&self.tile_set_id, buf); + WireFormat::write(&self.tile_id, buf); + WireFormat::write(&self.chain_id, buf); + } + fn parse_unchecked(buf: &mut B) -> Self { + IntegritySSRHeader { + obs_time: WireFormat::parse_unchecked(buf), + num_msgs: WireFormat::parse_unchecked(buf), + seq_num: WireFormat::parse_unchecked(buf), + ssr_sol_id: WireFormat::parse_unchecked(buf), + tile_set_id: WireFormat::parse_unchecked(buf), + tile_id: WireFormat::parse_unchecked(buf), + chain_id: WireFormat::parse_unchecked(buf), + } + } + } +} + pub mod msg_ssr_flag_high_level { #![allow(unused_imports)] @@ -33,8 +107,51 @@ pub mod msg_ssr_flag_high_level { /// The message sender_id #[cfg_attr(feature = "serde", serde(skip_serializing))] pub sender_id: Option, - #[cfg_attr(feature = "serde", serde(rename(serialize = "stub")))] - pub stub: Vec, + /// GNSS reference time of the observation used to generate the flag. + #[cfg_attr(feature = "serde", serde(rename(serialize = "obs_time")))] + pub obs_time: GpsTimeSec, + /// GNSS reference time of the correction associated to the flag. + #[cfg_attr(feature = "serde", serde(rename(serialize = "corr_time")))] + pub corr_time: GpsTimeSec, + /// SSR Solution ID. + #[cfg_attr(feature = "serde", serde(rename(serialize = "ssr_sol_id")))] + pub ssr_sol_id: 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, + /// Chain and type of flag. + #[cfg_attr(feature = "serde", serde(rename(serialize = "chain_id")))] + pub chain_id: u8, + /// Use GPS satellites. + #[cfg_attr(feature = "serde", serde(rename(serialize = "use_gps_sat")))] + pub use_gps_sat: u8, + /// Use GAL satellites. + #[cfg_attr(feature = "serde", serde(rename(serialize = "use_gal_sat")))] + pub use_gal_sat: u8, + /// Use BDS satellites. + #[cfg_attr(feature = "serde", serde(rename(serialize = "use_bds_sat")))] + pub use_bds_sat: u8, + /// Reserved + #[cfg_attr(feature = "serde", serde(rename(serialize = "reserved")))] + pub reserved: [u8; 6], + /// Use tropo grid points. + #[cfg_attr(feature = "serde", serde(rename(serialize = "use_tropo_grid_points")))] + pub use_tropo_grid_points: u8, + /// Use iono grid points. + #[cfg_attr(feature = "serde", serde(rename(serialize = "use_iono_grid_points")))] + pub use_iono_grid_points: u8, + /// Use iono tile satellite LoS. + #[cfg_attr(feature = "serde", serde(rename(serialize = "use_iono_tile_sat_los")))] + pub use_iono_tile_sat_los: u8, + /// Use iono grid point satellite LoS. + #[cfg_attr( + feature = "serde", + serde(rename(serialize = "use_iono_grid_point_sat_los")) + )] + pub use_iono_grid_point_sat_los: u8, } impl ConcreteMessage for MsgSsrFlagHighLevel { @@ -71,17 +188,69 @@ pub mod msg_ssr_flag_high_level { } impl WireFormat for MsgSsrFlagHighLevel { - const MIN_LEN: usize = as WireFormat>::MIN_LEN; + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + <[u8; 6] as WireFormat>::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN; fn len(&self) -> usize { - WireFormat::len(&self.stub) + WireFormat::len(&self.obs_time) + + WireFormat::len(&self.corr_time) + + WireFormat::len(&self.ssr_sol_id) + + WireFormat::len(&self.tile_set_id) + + WireFormat::len(&self.tile_id) + + WireFormat::len(&self.chain_id) + + WireFormat::len(&self.use_gps_sat) + + WireFormat::len(&self.use_gal_sat) + + WireFormat::len(&self.use_bds_sat) + + WireFormat::len(&self.reserved) + + WireFormat::len(&self.use_tropo_grid_points) + + WireFormat::len(&self.use_iono_grid_points) + + WireFormat::len(&self.use_iono_tile_sat_los) + + WireFormat::len(&self.use_iono_grid_point_sat_los) } fn write(&self, buf: &mut B) { - WireFormat::write(&self.stub, buf); + WireFormat::write(&self.obs_time, buf); + WireFormat::write(&self.corr_time, buf); + WireFormat::write(&self.ssr_sol_id, buf); + WireFormat::write(&self.tile_set_id, buf); + WireFormat::write(&self.tile_id, buf); + WireFormat::write(&self.chain_id, buf); + WireFormat::write(&self.use_gps_sat, buf); + WireFormat::write(&self.use_gal_sat, buf); + WireFormat::write(&self.use_bds_sat, buf); + WireFormat::write(&self.reserved, buf); + WireFormat::write(&self.use_tropo_grid_points, buf); + WireFormat::write(&self.use_iono_grid_points, buf); + WireFormat::write(&self.use_iono_tile_sat_los, buf); + WireFormat::write(&self.use_iono_grid_point_sat_los, buf); } fn parse_unchecked(buf: &mut B) -> Self { MsgSsrFlagHighLevel { sender_id: None, - stub: WireFormat::parse_unchecked(buf), + obs_time: WireFormat::parse_unchecked(buf), + corr_time: WireFormat::parse_unchecked(buf), + ssr_sol_id: WireFormat::parse_unchecked(buf), + tile_set_id: WireFormat::parse_unchecked(buf), + tile_id: WireFormat::parse_unchecked(buf), + chain_id: WireFormat::parse_unchecked(buf), + use_gps_sat: WireFormat::parse_unchecked(buf), + use_gal_sat: WireFormat::parse_unchecked(buf), + use_bds_sat: WireFormat::parse_unchecked(buf), + reserved: WireFormat::parse_unchecked(buf), + use_tropo_grid_points: WireFormat::parse_unchecked(buf), + use_iono_grid_points: WireFormat::parse_unchecked(buf), + use_iono_tile_sat_los: WireFormat::parse_unchecked(buf), + use_iono_grid_point_sat_los: WireFormat::parse_unchecked(buf), } } } @@ -100,8 +269,15 @@ pub mod msg_ssr_flag_iono_grid_points { /// The message sender_id #[cfg_attr(feature = "serde", serde(skip_serializing))] pub sender_id: Option, - #[cfg_attr(feature = "serde", serde(rename(serialize = "stub")))] - pub stub: Vec, + /// Header of an integrity message. + #[cfg_attr(feature = "serde", serde(rename(serialize = "header")))] + pub header: IntegritySSRHeader, + /// Number of faulty grid points. + #[cfg_attr(feature = "serde", serde(rename(serialize = "n_faulty_points")))] + pub n_faulty_points: u8, + /// List of faulty grid points. + #[cfg_attr(feature = "serde", serde(rename(serialize = "faulty_points")))] + pub faulty_points: Vec, } impl ConcreteMessage for MsgSsrFlagIonoGridPoints { @@ -138,17 +314,25 @@ pub mod msg_ssr_flag_iono_grid_points { } impl WireFormat for MsgSsrFlagIonoGridPoints { - const MIN_LEN: usize = as WireFormat>::MIN_LEN; + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + as WireFormat>::MIN_LEN; fn len(&self) -> usize { - WireFormat::len(&self.stub) + WireFormat::len(&self.header) + + WireFormat::len(&self.n_faulty_points) + + WireFormat::len(&self.faulty_points) } fn write(&self, buf: &mut B) { - WireFormat::write(&self.stub, buf); + WireFormat::write(&self.header, buf); + WireFormat::write(&self.n_faulty_points, buf); + WireFormat::write(&self.faulty_points, buf); } fn parse_unchecked(buf: &mut B) -> Self { MsgSsrFlagIonoGridPoints { sender_id: None, - stub: WireFormat::parse_unchecked(buf), + header: WireFormat::parse_unchecked(buf), + n_faulty_points: WireFormat::parse_unchecked(buf), + faulty_points: WireFormat::parse_unchecked(buf), } } } @@ -167,8 +351,18 @@ pub mod msg_ssr_flag_iono_grid_point_sat_los { /// The message sender_id #[cfg_attr(feature = "serde", serde(skip_serializing))] pub sender_id: Option, - #[cfg_attr(feature = "serde", serde(rename(serialize = "stub")))] - pub stub: Vec, + /// Header of an integrity message. + #[cfg_attr(feature = "serde", serde(rename(serialize = "header")))] + pub header: IntegritySSRHeader, + /// Index of the grid point. + #[cfg_attr(feature = "serde", serde(rename(serialize = "grid_point_id")))] + pub grid_point_id: u16, + /// Number of faulty LOS. + #[cfg_attr(feature = "serde", serde(rename(serialize = "n_faulty_los")))] + pub n_faulty_los: u8, + /// List of faulty LOS + #[cfg_attr(feature = "serde", serde(rename(serialize = "faulty_los")))] + pub faulty_los: Vec, } impl ConcreteMessage for MsgSsrFlagIonoGridPointSatLos { @@ -205,17 +399,29 @@ pub mod msg_ssr_flag_iono_grid_point_sat_los { } impl WireFormat for MsgSsrFlagIonoGridPointSatLos { - const MIN_LEN: usize = as WireFormat>::MIN_LEN; + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + as WireFormat>::MIN_LEN; fn len(&self) -> usize { - WireFormat::len(&self.stub) + WireFormat::len(&self.header) + + WireFormat::len(&self.grid_point_id) + + WireFormat::len(&self.n_faulty_los) + + WireFormat::len(&self.faulty_los) } fn write(&self, buf: &mut B) { - WireFormat::write(&self.stub, buf); + WireFormat::write(&self.header, buf); + WireFormat::write(&self.grid_point_id, buf); + WireFormat::write(&self.n_faulty_los, buf); + WireFormat::write(&self.faulty_los, buf); } fn parse_unchecked(buf: &mut B) -> Self { MsgSsrFlagIonoGridPointSatLos { sender_id: None, - stub: WireFormat::parse_unchecked(buf), + header: WireFormat::parse_unchecked(buf), + grid_point_id: WireFormat::parse_unchecked(buf), + n_faulty_los: WireFormat::parse_unchecked(buf), + faulty_los: WireFormat::parse_unchecked(buf), } } } @@ -234,8 +440,15 @@ pub mod msg_ssr_flag_iono_tile_sat_los { /// The message sender_id #[cfg_attr(feature = "serde", serde(skip_serializing))] pub sender_id: Option, - #[cfg_attr(feature = "serde", serde(rename(serialize = "stub")))] - pub stub: Vec, + /// Header of an integrity message. + #[cfg_attr(feature = "serde", serde(rename(serialize = "header")))] + pub header: IntegritySSRHeader, + /// Number of faulty LOS. + #[cfg_attr(feature = "serde", serde(rename(serialize = "n_faulty_los")))] + pub n_faulty_los: u8, + /// List of faulty LOS + #[cfg_attr(feature = "serde", serde(rename(serialize = "faulty_los")))] + pub faulty_los: Vec, } impl ConcreteMessage for MsgSsrFlagIonoTileSatLos { @@ -272,17 +485,25 @@ pub mod msg_ssr_flag_iono_tile_sat_los { } impl WireFormat for MsgSsrFlagIonoTileSatLos { - const MIN_LEN: usize = as WireFormat>::MIN_LEN; + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + as WireFormat>::MIN_LEN; fn len(&self) -> usize { - WireFormat::len(&self.stub) + WireFormat::len(&self.header) + + WireFormat::len(&self.n_faulty_los) + + WireFormat::len(&self.faulty_los) } fn write(&self, buf: &mut B) { - WireFormat::write(&self.stub, buf); + WireFormat::write(&self.header, buf); + WireFormat::write(&self.n_faulty_los, buf); + WireFormat::write(&self.faulty_los, buf); } fn parse_unchecked(buf: &mut B) -> Self { MsgSsrFlagIonoTileSatLos { sender_id: None, - stub: WireFormat::parse_unchecked(buf), + header: WireFormat::parse_unchecked(buf), + n_faulty_los: WireFormat::parse_unchecked(buf), + faulty_los: WireFormat::parse_unchecked(buf), } } } @@ -301,8 +522,30 @@ pub mod msg_ssr_flag_satellites { /// The message sender_id #[cfg_attr(feature = "serde", serde(skip_serializing))] pub sender_id: Option, - #[cfg_attr(feature = "serde", serde(rename(serialize = "stub")))] - pub stub: Vec, + /// GNSS reference time of the observation used to generate the flag. + #[cfg_attr(feature = "serde", serde(rename(serialize = "obs_time")))] + pub obs_time: GpsTimeSec, + /// Number of messages in the dataset + #[cfg_attr(feature = "serde", serde(rename(serialize = "num_msgs")))] + pub num_msgs: u8, + /// Position of this message in the dataset + #[cfg_attr(feature = "serde", serde(rename(serialize = "seq_num")))] + pub seq_num: u8, + /// SSR Solution ID. + #[cfg_attr(feature = "serde", serde(rename(serialize = "ssr_sol_id")))] + pub ssr_sol_id: u8, + /// Chain and type of flag. + #[cfg_attr(feature = "serde", serde(rename(serialize = "chain_id")))] + pub chain_id: u8, + /// Constellation ID. + #[cfg_attr(feature = "serde", serde(rename(serialize = "const_id")))] + pub const_id: u8, + /// Number of faulty satellites. + #[cfg_attr(feature = "serde", serde(rename(serialize = "n_faulty_sats")))] + pub n_faulty_sats: u8, + /// List of faulty satellites. + #[cfg_attr(feature = "serde", serde(rename(serialize = "faulty_sats")))] + pub faulty_sats: Vec, } impl ConcreteMessage for MsgSsrFlagSatellites { @@ -339,17 +582,45 @@ pub mod msg_ssr_flag_satellites { } impl WireFormat for MsgSsrFlagSatellites { - const MIN_LEN: usize = as WireFormat>::MIN_LEN; + const MIN_LEN: usize = ::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.stub) + WireFormat::len(&self.obs_time) + + WireFormat::len(&self.num_msgs) + + WireFormat::len(&self.seq_num) + + WireFormat::len(&self.ssr_sol_id) + + WireFormat::len(&self.chain_id) + + WireFormat::len(&self.const_id) + + WireFormat::len(&self.n_faulty_sats) + + WireFormat::len(&self.faulty_sats) } fn write(&self, buf: &mut B) { - WireFormat::write(&self.stub, buf); + WireFormat::write(&self.obs_time, buf); + WireFormat::write(&self.num_msgs, buf); + WireFormat::write(&self.seq_num, buf); + WireFormat::write(&self.ssr_sol_id, buf); + WireFormat::write(&self.chain_id, buf); + WireFormat::write(&self.const_id, buf); + WireFormat::write(&self.n_faulty_sats, buf); + WireFormat::write(&self.faulty_sats, buf); } fn parse_unchecked(buf: &mut B) -> Self { MsgSsrFlagSatellites { sender_id: None, - stub: WireFormat::parse_unchecked(buf), + obs_time: WireFormat::parse_unchecked(buf), + num_msgs: WireFormat::parse_unchecked(buf), + seq_num: WireFormat::parse_unchecked(buf), + ssr_sol_id: WireFormat::parse_unchecked(buf), + chain_id: WireFormat::parse_unchecked(buf), + const_id: WireFormat::parse_unchecked(buf), + n_faulty_sats: WireFormat::parse_unchecked(buf), + faulty_sats: WireFormat::parse_unchecked(buf), } } } @@ -368,8 +639,15 @@ pub mod msg_ssr_flag_tropo_grid_points { /// The message sender_id #[cfg_attr(feature = "serde", serde(skip_serializing))] pub sender_id: Option, - #[cfg_attr(feature = "serde", serde(rename(serialize = "stub")))] - pub stub: Vec, + /// Header of an integrity message. + #[cfg_attr(feature = "serde", serde(rename(serialize = "header")))] + pub header: IntegritySSRHeader, + /// Number of faulty grid points. + #[cfg_attr(feature = "serde", serde(rename(serialize = "n_faulty_points")))] + pub n_faulty_points: u8, + /// List of faulty grid points. + #[cfg_attr(feature = "serde", serde(rename(serialize = "faulty_points")))] + pub faulty_points: Vec, } impl ConcreteMessage for MsgSsrFlagTropoGridPoints { @@ -406,17 +684,25 @@ pub mod msg_ssr_flag_tropo_grid_points { } impl WireFormat for MsgSsrFlagTropoGridPoints { - const MIN_LEN: usize = as WireFormat>::MIN_LEN; + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + as WireFormat>::MIN_LEN; fn len(&self) -> usize { - WireFormat::len(&self.stub) + WireFormat::len(&self.header) + + WireFormat::len(&self.n_faulty_points) + + WireFormat::len(&self.faulty_points) } fn write(&self, buf: &mut B) { - WireFormat::write(&self.stub, buf); + WireFormat::write(&self.header, buf); + WireFormat::write(&self.n_faulty_points, buf); + WireFormat::write(&self.faulty_points, buf); } fn parse_unchecked(buf: &mut B) -> Self { MsgSsrFlagTropoGridPoints { sender_id: None, - stub: WireFormat::parse_unchecked(buf), + header: WireFormat::parse_unchecked(buf), + n_faulty_points: WireFormat::parse_unchecked(buf), + faulty_points: WireFormat::parse_unchecked(buf), } } } diff --git a/rust/sbp/src/messages/mod.rs b/rust/sbp/src/messages/mod.rs index cf39ed7b69..3462ccb0a6 100644 --- a/rust/sbp/src/messages/mod.rs +++ b/rust/sbp/src/messages/mod.rs @@ -653,7 +653,7 @@ pub enum Sbp { MsgVelEcefCovGnss(MsgVelEcefCovGnss), /// Leap second SBP message. MsgUtcLeapSecond(MsgUtcLeapSecond), - /// Reference Frame Transformation Parameter + /// Reference Frame Transformation Parameters MsgReferenceFrameParam(MsgReferenceFrameParam), /// Navigation DataBase Event MsgNdbEvent(MsgNdbEvent), @@ -665,7 +665,7 @@ pub enum Sbp { MsgSsrOrbitClockDepA(MsgSsrOrbitClockDepA), /// Precise orbit and clock correction MsgSsrOrbitClock(MsgSsrOrbitClock), - /// Stubbed version of Combined Orbit and Clock Bound + /// Combined Orbit and Clock Bound MsgSsrOrbitClockBounds(MsgSsrOrbitClockBounds), /// Combined Orbit and Clock Bound Degradation Parameter MsgSsrOrbitClockBoundsDegradation(MsgSsrOrbitClockBoundsDegradation), @@ -675,7 +675,7 @@ pub enum Sbp { MsgSsrPhaseBiases(MsgSsrPhaseBiases), /// Deprecated MsgSsrStecCorrectionDepA(MsgSsrStecCorrectionDepA), - /// Stubbed version of Combined Code and Phase Biases Bounds + /// Combined Code and Phase Biases Bounds MsgSsrCodePhaseBiasesBounds(MsgSsrCodePhaseBiasesBounds), /// Deprecated MsgSsrGriddedCorrectionNoStdDepA(MsgSsrGriddedCorrectionNoStdDepA), diff --git a/rust/sbp/src/messages/navigation.rs b/rust/sbp/src/messages/navigation.rs index a6d787430e..f260c74d9c 100644 --- a/rust/sbp/src/messages/navigation.rs +++ b/rust/sbp/src/messages/navigation.rs @@ -45,11 +45,9 @@ pub use msg_baseline_ned::MsgBaselineNed; pub use msg_baseline_ned_dep_a::MsgBaselineNedDepA; pub use msg_dops::MsgDops; pub use msg_dops_dep_a::MsgDopsDepA; -pub use msg_gps_leap_second::MsgGpsLeapSecond; pub use msg_gps_time::MsgGpsTime; pub use msg_gps_time_dep_a::MsgGpsTimeDepA; pub use msg_gps_time_gnss::MsgGpsTimeGnss; -pub use msg_itrf::MsgItrf; pub use msg_pos_ecef::MsgPosEcef; pub use msg_pos_ecef_cov::MsgPosEcefCov; pub use msg_pos_ecef_cov_gnss::MsgPosEcefCovGnss; @@ -1688,138 +1686,6 @@ pub mod msg_dops_dep_a { } } -pub mod msg_gps_leap_second { - #![allow(unused_imports)] - - use super::*; - use crate::messages::lib::*; - - /// Leap second SBP message. - - /// - /// Emulates the GPS CNAV message, reserving bytes for future broadcast of the - /// drift model parameters. - /// - #[cfg_attr(feature = "serde", derive(serde::Serialize))] - #[derive(Debug, Clone)] - pub struct MsgGpsLeapSecond { - /// The message sender_id - #[cfg_attr(feature = "serde", serde(skip_serializing))] - pub sender_id: Option, - /// Reserved. Bias coefficient of GPS time scale with respect to UTC drift - /// model. - #[cfg_attr(feature = "serde", serde(rename(serialize = "bias_coeff")))] - pub bias_coeff: i16, - /// Reserved. Drift coefficient of GPS time scale with respect to UTC drift - /// model. - #[cfg_attr(feature = "serde", serde(rename(serialize = "drift_coeff")))] - pub drift_coeff: i16, - /// Reserved. Drift rate correction coefficient of GPS time scale with - /// respect to UTC drift model. - #[cfg_attr(feature = "serde", serde(rename(serialize = "drift_rate_coeff")))] - pub drift_rate_coeff: i8, - /// Leap second count before insertion. - #[cfg_attr(feature = "serde", serde(rename(serialize = "count_before")))] - pub count_before: i8, - /// Reserved. Drift model reference week second. - #[cfg_attr(feature = "serde", serde(rename(serialize = "tow_s")))] - pub tow_s: u16, - /// Reserved. Drift model reference week number. - #[cfg_attr(feature = "serde", serde(rename(serialize = "wn")))] - pub wn: u16, - /// Leap second reference week number. - #[cfg_attr(feature = "serde", serde(rename(serialize = "ref_wn")))] - pub ref_wn: u16, - /// Leap second reference day number. - #[cfg_attr(feature = "serde", serde(rename(serialize = "ref_dn")))] - pub ref_dn: u8, - /// Leap second count after insertion. - #[cfg_attr(feature = "serde", serde(rename(serialize = "count_after")))] - pub count_after: i8, - } - - impl ConcreteMessage for MsgGpsLeapSecond { - const MESSAGE_TYPE: u16 = 570; - const MESSAGE_NAME: &'static str = "MSG_GPS_LEAP_SECOND"; - } - - impl SbpMessage for MsgGpsLeapSecond { - 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 MsgGpsLeapSecond { - type Error = TryFromSbpError; - fn try_from(msg: Sbp) -> Result { - match msg { - Sbp::MsgGpsLeapSecond(m) => Ok(m), - _ => Err(TryFromSbpError), - } - } - } - - impl WireFormat for MsgGpsLeapSecond { - const MIN_LEN: usize = ::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.bias_coeff) - + WireFormat::len(&self.drift_coeff) - + WireFormat::len(&self.drift_rate_coeff) - + WireFormat::len(&self.count_before) - + WireFormat::len(&self.tow_s) - + WireFormat::len(&self.wn) - + WireFormat::len(&self.ref_wn) - + WireFormat::len(&self.ref_dn) - + WireFormat::len(&self.count_after) - } - fn write(&self, buf: &mut B) { - WireFormat::write(&self.bias_coeff, buf); - WireFormat::write(&self.drift_coeff, buf); - WireFormat::write(&self.drift_rate_coeff, buf); - WireFormat::write(&self.count_before, buf); - WireFormat::write(&self.tow_s, buf); - WireFormat::write(&self.wn, buf); - WireFormat::write(&self.ref_wn, buf); - WireFormat::write(&self.ref_dn, buf); - WireFormat::write(&self.count_after, buf); - } - fn parse_unchecked(buf: &mut B) -> Self { - MsgGpsLeapSecond { - sender_id: None, - bias_coeff: WireFormat::parse_unchecked(buf), - drift_coeff: WireFormat::parse_unchecked(buf), - drift_rate_coeff: WireFormat::parse_unchecked(buf), - count_before: WireFormat::parse_unchecked(buf), - tow_s: WireFormat::parse_unchecked(buf), - wn: WireFormat::parse_unchecked(buf), - ref_wn: WireFormat::parse_unchecked(buf), - ref_dn: WireFormat::parse_unchecked(buf), - count_after: WireFormat::parse_unchecked(buf), - } - } - } -} - pub mod msg_gps_time { #![allow(unused_imports)] @@ -2273,221 +2139,6 @@ pub mod msg_gps_time_gnss { } } -pub mod msg_itrf { - #![allow(unused_imports)] - - use super::*; - use crate::messages::lib::*; - /// Reference Frame Transformation Parameter - #[cfg_attr(feature = "serde", derive(serde::Serialize))] - #[derive(Debug, Clone)] - pub struct MsgItrf { - /// The message sender_id - #[cfg_attr(feature = "serde", serde(skip_serializing))] - pub sender_id: Option, - /// SSR IOD parameter. - #[cfg_attr(feature = "serde", serde(rename(serialize = "ssr_iod")))] - pub ssr_iod: u8, - /// Source-Name Counter N. - #[cfg_attr(feature = "serde", serde(rename(serialize = "sn_counter_n")))] - pub sn_counter_n: u8, - /// Source-Name - #[cfg_attr(feature = "serde", serde(rename(serialize = "sn")))] - pub sn: SbpString<[u8; 31], Unterminated>, - /// Target-Name Counter M. - #[cfg_attr(feature = "serde", serde(rename(serialize = "tn_counter_m")))] - pub tn_counter_m: u8, - /// Target-Name - #[cfg_attr(feature = "serde", serde(rename(serialize = "tn")))] - pub tn: SbpString<[u8; 31], Unterminated>, - /// System Identification Number. - #[cfg_attr(feature = "serde", serde(rename(serialize = "sin")))] - pub sin: u8, - /// Utilized Transformation Message. - #[cfg_attr(feature = "serde", serde(rename(serialize = "utn")))] - pub utn: u16, - /// Reference Epoch t0 for transformation parameter set given as Modified - /// Julian Day (MDJ) Number minus 44244 days. - #[cfg_attr(feature = "serde", serde(rename(serialize = "re_t0")))] - pub re_t0: u16, - /// Translation in X for Reference Epoch t0. - #[cfg_attr(feature = "serde", serde(rename(serialize = "delta_X0")))] - pub delta_x0: i32, - /// Translation in Y for Reference Epoch t0. - #[cfg_attr(feature = "serde", serde(rename(serialize = "delta_Y0")))] - pub delta_y0: i32, - /// Translation in Z for Reference Epoch t0. - #[cfg_attr(feature = "serde", serde(rename(serialize = "delta_Z0")))] - pub delta_z0: i32, - /// Rotation around the X-axis for Reference Epoch t0. - #[cfg_attr(feature = "serde", serde(rename(serialize = "theta_01")))] - pub theta_01: i32, - /// Rotation around the Y-axis for Reference Epoch t0. - #[cfg_attr(feature = "serde", serde(rename(serialize = "theta_02")))] - pub theta_02: i32, - /// Rotation around the Z-axis for Reference Epoch t0. - #[cfg_attr(feature = "serde", serde(rename(serialize = "theta_03")))] - pub theta_03: i32, - /// Scale correction for Reference Epoch t0. - #[cfg_attr(feature = "serde", serde(rename(serialize = "scale")))] - pub scale: i32, - /// Rate of change of translation in X. - #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_delta_X0")))] - pub dot_delta_x0: i32, - /// Rate of change of translation in Y. - #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_delta_Y0")))] - pub dot_delta_y0: i32, - /// Rate of change of translation in Z. - #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_delta_Z0")))] - pub dot_delta_z0: i32, - /// Rate of change of rotation around the X-axis. - #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_theta_01")))] - pub dot_theta_01: i32, - /// Rate of change of rotation around the Y-axis. - #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_theta_02")))] - pub dot_theta_02: i32, - /// Rate of change of rotation around the Z-axis. - #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_theta_03")))] - pub dot_theta_03: i32, - /// Rate of change of scale correction. - #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_scale")))] - pub dot_scale: i16, - } - - impl ConcreteMessage for MsgItrf { - const MESSAGE_TYPE: u16 = 580; - const MESSAGE_NAME: &'static str = "MSG_ITRF"; - } - - impl SbpMessage for MsgItrf { - 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 MsgItrf { - type Error = TryFromSbpError; - fn try_from(msg: Sbp) -> Result { - match msg { - Sbp::MsgItrf(m) => Ok(m), - _ => Err(TryFromSbpError), - } - } - } - - impl WireFormat for MsgItrf { - const MIN_LEN: usize = ::MIN_LEN - + ::MIN_LEN - + as WireFormat>::MIN_LEN - + ::MIN_LEN - + as WireFormat>::MIN_LEN - + ::MIN_LEN - + ::MIN_LEN - + ::MIN_LEN - + ::MIN_LEN - + ::MIN_LEN - + ::MIN_LEN - + ::MIN_LEN - + ::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_iod) - + WireFormat::len(&self.sn_counter_n) - + WireFormat::len(&self.sn) - + WireFormat::len(&self.tn_counter_m) - + WireFormat::len(&self.tn) - + WireFormat::len(&self.sin) - + WireFormat::len(&self.utn) - + WireFormat::len(&self.re_t0) - + WireFormat::len(&self.delta_x0) - + WireFormat::len(&self.delta_y0) - + WireFormat::len(&self.delta_z0) - + WireFormat::len(&self.theta_01) - + WireFormat::len(&self.theta_02) - + WireFormat::len(&self.theta_03) - + WireFormat::len(&self.scale) - + WireFormat::len(&self.dot_delta_x0) - + WireFormat::len(&self.dot_delta_y0) - + WireFormat::len(&self.dot_delta_z0) - + WireFormat::len(&self.dot_theta_01) - + WireFormat::len(&self.dot_theta_02) - + WireFormat::len(&self.dot_theta_03) - + WireFormat::len(&self.dot_scale) - } - fn write(&self, buf: &mut B) { - WireFormat::write(&self.ssr_iod, buf); - WireFormat::write(&self.sn_counter_n, buf); - WireFormat::write(&self.sn, buf); - WireFormat::write(&self.tn_counter_m, buf); - WireFormat::write(&self.tn, buf); - WireFormat::write(&self.sin, buf); - WireFormat::write(&self.utn, buf); - WireFormat::write(&self.re_t0, buf); - WireFormat::write(&self.delta_x0, buf); - WireFormat::write(&self.delta_y0, buf); - WireFormat::write(&self.delta_z0, buf); - WireFormat::write(&self.theta_01, buf); - WireFormat::write(&self.theta_02, buf); - WireFormat::write(&self.theta_03, buf); - WireFormat::write(&self.scale, buf); - WireFormat::write(&self.dot_delta_x0, buf); - WireFormat::write(&self.dot_delta_y0, buf); - WireFormat::write(&self.dot_delta_z0, buf); - WireFormat::write(&self.dot_theta_01, buf); - WireFormat::write(&self.dot_theta_02, buf); - WireFormat::write(&self.dot_theta_03, buf); - WireFormat::write(&self.dot_scale, buf); - } - fn parse_unchecked(buf: &mut B) -> Self { - MsgItrf { - sender_id: None, - ssr_iod: WireFormat::parse_unchecked(buf), - sn_counter_n: WireFormat::parse_unchecked(buf), - sn: WireFormat::parse_unchecked(buf), - tn_counter_m: WireFormat::parse_unchecked(buf), - tn: WireFormat::parse_unchecked(buf), - sin: WireFormat::parse_unchecked(buf), - utn: WireFormat::parse_unchecked(buf), - re_t0: WireFormat::parse_unchecked(buf), - delta_x0: WireFormat::parse_unchecked(buf), - delta_y0: WireFormat::parse_unchecked(buf), - delta_z0: WireFormat::parse_unchecked(buf), - theta_01: WireFormat::parse_unchecked(buf), - theta_02: WireFormat::parse_unchecked(buf), - theta_03: WireFormat::parse_unchecked(buf), - scale: WireFormat::parse_unchecked(buf), - dot_delta_x0: WireFormat::parse_unchecked(buf), - dot_delta_y0: WireFormat::parse_unchecked(buf), - dot_delta_z0: WireFormat::parse_unchecked(buf), - dot_theta_01: WireFormat::parse_unchecked(buf), - dot_theta_02: WireFormat::parse_unchecked(buf), - dot_theta_03: WireFormat::parse_unchecked(buf), - dot_scale: WireFormat::parse_unchecked(buf), - } - } - } -} - pub mod msg_pos_ecef { #![allow(unused_imports)] @@ -6348,15 +5999,74 @@ pub mod msg_reference_frame_param { use super::*; use crate::messages::lib::*; - /// Reference Frame Transformation Parameter + /// Reference Frame Transformation Parameters #[cfg_attr(feature = "serde", derive(serde::Serialize))] #[derive(Debug, PartialEq, Clone)] pub struct MsgReferenceFrameParam { /// The message sender_id #[cfg_attr(feature = "serde", serde(skip_serializing))] pub sender_id: Option, - #[cfg_attr(feature = "serde", serde(rename(serialize = "stub")))] - pub stub: Vec, + /// SSR IOD parameter. + #[cfg_attr(feature = "serde", serde(rename(serialize = "ssr_iod")))] + pub ssr_iod: u8, + /// Name of source coordinate-system using the EPSG identification code. + #[cfg_attr(feature = "serde", serde(rename(serialize = "sn")))] + pub sn: SbpString<[u8; 32], NullTerminated>, + /// Name of target coordinate-system using the EPSG identification code. + #[cfg_attr(feature = "serde", serde(rename(serialize = "tn")))] + pub tn: SbpString<[u8; 32], NullTerminated>, + /// System Identification Number. + #[cfg_attr(feature = "serde", serde(rename(serialize = "sin")))] + pub sin: u8, + /// Utilized Transformation Message. + #[cfg_attr(feature = "serde", serde(rename(serialize = "utn")))] + pub utn: u16, + /// Reference Epoch t0 for transformation parameter set given as Modified + /// Julian Day (MDJ) Number minus 44244 days. + #[cfg_attr(feature = "serde", serde(rename(serialize = "re_t0")))] + pub re_t0: u16, + /// Translation in X for Reference Epoch t0. + #[cfg_attr(feature = "serde", serde(rename(serialize = "delta_X0")))] + pub delta_x0: i32, + /// Translation in Y for Reference Epoch t0. + #[cfg_attr(feature = "serde", serde(rename(serialize = "delta_Y0")))] + pub delta_y0: i32, + /// Translation in Z for Reference Epoch t0. + #[cfg_attr(feature = "serde", serde(rename(serialize = "delta_Z0")))] + pub delta_z0: i32, + /// Rotation around the X-axis for Reference Epoch t0. + #[cfg_attr(feature = "serde", serde(rename(serialize = "theta_01")))] + pub theta_01: i32, + /// Rotation around the Y-axis for Reference Epoch t0. + #[cfg_attr(feature = "serde", serde(rename(serialize = "theta_02")))] + pub theta_02: i32, + /// Rotation around the Z-axis for Reference Epoch t0. + #[cfg_attr(feature = "serde", serde(rename(serialize = "theta_03")))] + pub theta_03: i32, + /// Scale correction for Reference Epoch t0. + #[cfg_attr(feature = "serde", serde(rename(serialize = "scale")))] + pub scale: i32, + /// Rate of change of translation in X. + #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_delta_X0")))] + pub dot_delta_x0: i32, + /// Rate of change of translation in Y. + #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_delta_Y0")))] + pub dot_delta_y0: i32, + /// Rate of change of translation in Z. + #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_delta_Z0")))] + pub dot_delta_z0: i32, + /// Rate of change of rotation around the X-axis. + #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_theta_01")))] + pub dot_theta_01: i32, + /// Rate of change of rotation around the Y-axis. + #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_theta_02")))] + pub dot_theta_02: i32, + /// Rate of change of rotation around the Z-axis. + #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_theta_03")))] + pub dot_theta_03: i32, + /// Rate of change of scale correction. + #[cfg_attr(feature = "serde", serde(rename(serialize = "dot_scale")))] + pub dot_scale: i16, } impl ConcreteMessage for MsgReferenceFrameParam { @@ -6393,17 +6103,93 @@ pub mod msg_reference_frame_param { } impl WireFormat for MsgReferenceFrameParam { - const MIN_LEN: usize = as WireFormat>::MIN_LEN; + const MIN_LEN: usize = ::MIN_LEN + + as WireFormat>::MIN_LEN + + as WireFormat>::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::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.stub) + WireFormat::len(&self.ssr_iod) + + WireFormat::len(&self.sn) + + WireFormat::len(&self.tn) + + WireFormat::len(&self.sin) + + WireFormat::len(&self.utn) + + WireFormat::len(&self.re_t0) + + WireFormat::len(&self.delta_x0) + + WireFormat::len(&self.delta_y0) + + WireFormat::len(&self.delta_z0) + + WireFormat::len(&self.theta_01) + + WireFormat::len(&self.theta_02) + + WireFormat::len(&self.theta_03) + + WireFormat::len(&self.scale) + + WireFormat::len(&self.dot_delta_x0) + + WireFormat::len(&self.dot_delta_y0) + + WireFormat::len(&self.dot_delta_z0) + + WireFormat::len(&self.dot_theta_01) + + WireFormat::len(&self.dot_theta_02) + + WireFormat::len(&self.dot_theta_03) + + WireFormat::len(&self.dot_scale) } fn write(&self, buf: &mut B) { - WireFormat::write(&self.stub, buf); + WireFormat::write(&self.ssr_iod, buf); + WireFormat::write(&self.sn, buf); + WireFormat::write(&self.tn, buf); + WireFormat::write(&self.sin, buf); + WireFormat::write(&self.utn, buf); + WireFormat::write(&self.re_t0, buf); + WireFormat::write(&self.delta_x0, buf); + WireFormat::write(&self.delta_y0, buf); + WireFormat::write(&self.delta_z0, buf); + WireFormat::write(&self.theta_01, buf); + WireFormat::write(&self.theta_02, buf); + WireFormat::write(&self.theta_03, buf); + WireFormat::write(&self.scale, buf); + WireFormat::write(&self.dot_delta_x0, buf); + WireFormat::write(&self.dot_delta_y0, buf); + WireFormat::write(&self.dot_delta_z0, buf); + WireFormat::write(&self.dot_theta_01, buf); + WireFormat::write(&self.dot_theta_02, buf); + WireFormat::write(&self.dot_theta_03, buf); + WireFormat::write(&self.dot_scale, buf); } fn parse_unchecked(buf: &mut B) -> Self { MsgReferenceFrameParam { sender_id: None, - stub: WireFormat::parse_unchecked(buf), + ssr_iod: WireFormat::parse_unchecked(buf), + sn: WireFormat::parse_unchecked(buf), + tn: WireFormat::parse_unchecked(buf), + sin: WireFormat::parse_unchecked(buf), + utn: WireFormat::parse_unchecked(buf), + re_t0: WireFormat::parse_unchecked(buf), + delta_x0: WireFormat::parse_unchecked(buf), + delta_y0: WireFormat::parse_unchecked(buf), + delta_z0: WireFormat::parse_unchecked(buf), + theta_01: WireFormat::parse_unchecked(buf), + theta_02: WireFormat::parse_unchecked(buf), + theta_03: WireFormat::parse_unchecked(buf), + scale: WireFormat::parse_unchecked(buf), + dot_delta_x0: WireFormat::parse_unchecked(buf), + dot_delta_y0: WireFormat::parse_unchecked(buf), + dot_delta_z0: WireFormat::parse_unchecked(buf), + dot_theta_01: WireFormat::parse_unchecked(buf), + dot_theta_02: WireFormat::parse_unchecked(buf), + dot_theta_03: WireFormat::parse_unchecked(buf), + dot_scale: WireFormat::parse_unchecked(buf), } } } @@ -6427,8 +6213,36 @@ pub mod msg_utc_leap_second { /// The message sender_id #[cfg_attr(feature = "serde", serde(skip_serializing))] pub sender_id: Option, - #[cfg_attr(feature = "serde", serde(rename(serialize = "stub")))] - pub stub: Vec, + /// Reserved. Bias coefficient of GPS time scale with respect to UTC drift + /// model. + #[cfg_attr(feature = "serde", serde(rename(serialize = "bias_coeff")))] + pub bias_coeff: i16, + /// Reserved. Drift coefficient of GPS time scale with respect to UTC drift + /// model. + #[cfg_attr(feature = "serde", serde(rename(serialize = "drift_coeff")))] + pub drift_coeff: i16, + /// Reserved. Drift rate correction coefficient of GPS time scale with + /// respect to UTC drift model. + #[cfg_attr(feature = "serde", serde(rename(serialize = "drift_rate_coeff")))] + pub drift_rate_coeff: i8, + /// Leap second count before insertion. + #[cfg_attr(feature = "serde", serde(rename(serialize = "count_before")))] + pub count_before: i8, + /// Reserved. Drift model reference week second. + #[cfg_attr(feature = "serde", serde(rename(serialize = "tow_s")))] + pub tow_s: u16, + /// Reserved. Drift model reference week number. + #[cfg_attr(feature = "serde", serde(rename(serialize = "wn")))] + pub wn: u16, + /// Leap second reference week number. + #[cfg_attr(feature = "serde", serde(rename(serialize = "ref_wn")))] + pub ref_wn: u16, + /// Leap second reference day number. + #[cfg_attr(feature = "serde", serde(rename(serialize = "ref_dn")))] + pub ref_dn: u8, + /// Leap second count after insertion. + #[cfg_attr(feature = "serde", serde(rename(serialize = "count_after")))] + pub count_after: i8, } impl ConcreteMessage for MsgUtcLeapSecond { @@ -6465,17 +6279,49 @@ pub mod msg_utc_leap_second { } impl WireFormat for MsgUtcLeapSecond { - const MIN_LEN: usize = as WireFormat>::MIN_LEN; + const MIN_LEN: usize = ::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.stub) + WireFormat::len(&self.bias_coeff) + + WireFormat::len(&self.drift_coeff) + + WireFormat::len(&self.drift_rate_coeff) + + WireFormat::len(&self.count_before) + + WireFormat::len(&self.tow_s) + + WireFormat::len(&self.wn) + + WireFormat::len(&self.ref_wn) + + WireFormat::len(&self.ref_dn) + + WireFormat::len(&self.count_after) } fn write(&self, buf: &mut B) { - WireFormat::write(&self.stub, buf); + WireFormat::write(&self.bias_coeff, buf); + WireFormat::write(&self.drift_coeff, buf); + WireFormat::write(&self.drift_rate_coeff, buf); + WireFormat::write(&self.count_before, buf); + WireFormat::write(&self.tow_s, buf); + WireFormat::write(&self.wn, buf); + WireFormat::write(&self.ref_wn, buf); + WireFormat::write(&self.ref_dn, buf); + WireFormat::write(&self.count_after, buf); } fn parse_unchecked(buf: &mut B) -> Self { MsgUtcLeapSecond { sender_id: None, - stub: WireFormat::parse_unchecked(buf), + bias_coeff: WireFormat::parse_unchecked(buf), + drift_coeff: WireFormat::parse_unchecked(buf), + drift_rate_coeff: WireFormat::parse_unchecked(buf), + count_before: WireFormat::parse_unchecked(buf), + tow_s: WireFormat::parse_unchecked(buf), + wn: WireFormat::parse_unchecked(buf), + ref_wn: WireFormat::parse_unchecked(buf), + ref_dn: WireFormat::parse_unchecked(buf), + count_after: WireFormat::parse_unchecked(buf), } } } diff --git a/rust/sbp/src/messages/ssr.rs b/rust/sbp/src/messages/ssr.rs index 2dcd3531ef..48147c93de 100644 --- a/rust/sbp/src/messages/ssr.rs +++ b/rust/sbp/src/messages/ssr.rs @@ -13,7 +13,9 @@ // with generate.py. Please do not hand edit! //****************************************************************************/ //! Precise State Space Representation (SSR) corrections format +pub use bounds_header::BoundsHeader; pub use code_biases_content::CodeBiasesContent; +pub use code_phase_biases_sat_sig::CodePhaseBiasesSatSig; pub use grid_definition_header_dep_a::GridDefinitionHeaderDepA; pub use gridded_correction_header::GriddedCorrectionHeader; pub use gridded_correction_header_dep_a::GriddedCorrectionHeaderDepA; @@ -35,6 +37,8 @@ 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 orbit_clock_bound_degradation::OrbitClockBoundDegradation; pub use phase_biases_content::PhaseBiasesContent; pub use satellite_apc::SatelliteAPC; pub use stec_header::STECHeader; @@ -42,9 +46,69 @@ 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; +pub mod bounds_header { + #![allow(unused_imports)] + + use super::*; + use crate::messages::gnss::*; + use crate::messages::lib::*; + /// Header for the Bounds messages + #[cfg_attr(feature = "serde", derive(serde::Serialize))] + #[derive(Debug, PartialEq, Clone)] + pub struct BoundsHeader { + /// GNSS reference time of the bound + #[cfg_attr(feature = "serde", serde(rename(serialize = "time")))] + pub time: GpsTimeSec, + /// Number of messages in the dataset + #[cfg_attr(feature = "serde", serde(rename(serialize = "num_msgs")))] + pub num_msgs: u8, + /// Position of this message in the dataset + #[cfg_attr(feature = "serde", serde(rename(serialize = "seq_num")))] + pub seq_num: u8, + /// Update interval between consecutive bounds. Similar to RTCM DF391. + #[cfg_attr(feature = "serde", serde(rename(serialize = "update_interval")))] + pub update_interval: u8, + /// SSR Solution ID. + #[cfg_attr(feature = "serde", serde(rename(serialize = "sol_id")))] + pub sol_id: u8, + } + + impl WireFormat for BoundsHeader { + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN; + fn len(&self) -> usize { + WireFormat::len(&self.time) + + WireFormat::len(&self.num_msgs) + + WireFormat::len(&self.seq_num) + + WireFormat::len(&self.update_interval) + + WireFormat::len(&self.sol_id) + } + fn write(&self, buf: &mut B) { + WireFormat::write(&self.time, buf); + WireFormat::write(&self.num_msgs, buf); + WireFormat::write(&self.seq_num, buf); + WireFormat::write(&self.update_interval, buf); + WireFormat::write(&self.sol_id, buf); + } + fn parse_unchecked(buf: &mut B) -> Self { + BoundsHeader { + time: WireFormat::parse_unchecked(buf), + num_msgs: WireFormat::parse_unchecked(buf), + seq_num: WireFormat::parse_unchecked(buf), + update_interval: WireFormat::parse_unchecked(buf), + sol_id: WireFormat::parse_unchecked(buf), + } + } + } +} + pub mod code_biases_content { #![allow(unused_imports)] @@ -87,6 +151,74 @@ pub mod code_biases_content { } } +pub mod code_phase_biases_sat_sig { + #![allow(unused_imports)] + + use super::*; + use crate::messages::gnss::*; + use crate::messages::lib::*; + /// Code and Phase Biases Bounds per Satellite-Signal couple + #[cfg_attr(feature = "serde", derive(serde::Serialize))] + #[derive(Debug, PartialEq, Clone)] + pub struct CodePhaseBiasesSatSig { + /// Satellite ID. Similar to either RTCM DF068 (GPS), DF252 (Galileo), or + /// DF488 (BDS) depending on the constellation. + #[cfg_attr(feature = "serde", serde(rename(serialize = "sat_id")))] + pub sat_id: u8, + /// Signal and Tracking Mode Identifier. Similar to either RTCM DF380 (GPS), + /// DF382 (Galileo) or DF467 (BDS) depending on the constellation. + #[cfg_attr(feature = "serde", serde(rename(serialize = "signal_id")))] + pub signal_id: u8, + /// Code Bias Mean. Range: 0-1.275 m + #[cfg_attr(feature = "serde", serde(rename(serialize = "code_bias_bound_mu")))] + pub code_bias_bound_mu: u8, + /// Code Bias Standard Deviation. Range: 0-1.275 m + #[cfg_attr(feature = "serde", serde(rename(serialize = "code_bias_bound_sig")))] + pub code_bias_bound_sig: u8, + /// Phase Bias Mean. Range: 0-1.275 m + #[cfg_attr(feature = "serde", serde(rename(serialize = "phase_bias_bound_mu")))] + pub phase_bias_bound_mu: u8, + /// Phase Bias Standard Deviation. Range: 0-1.275 m + #[cfg_attr(feature = "serde", serde(rename(serialize = "phase_bias_bound_sig")))] + pub phase_bias_bound_sig: u8, + } + + impl WireFormat for CodePhaseBiasesSatSig { + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN; + fn len(&self) -> usize { + WireFormat::len(&self.sat_id) + + WireFormat::len(&self.signal_id) + + WireFormat::len(&self.code_bias_bound_mu) + + WireFormat::len(&self.code_bias_bound_sig) + + WireFormat::len(&self.phase_bias_bound_mu) + + WireFormat::len(&self.phase_bias_bound_sig) + } + fn write(&self, buf: &mut B) { + WireFormat::write(&self.sat_id, buf); + WireFormat::write(&self.signal_id, buf); + WireFormat::write(&self.code_bias_bound_mu, buf); + WireFormat::write(&self.code_bias_bound_sig, buf); + WireFormat::write(&self.phase_bias_bound_mu, buf); + WireFormat::write(&self.phase_bias_bound_sig, buf); + } + fn parse_unchecked(buf: &mut B) -> Self { + CodePhaseBiasesSatSig { + sat_id: WireFormat::parse_unchecked(buf), + signal_id: WireFormat::parse_unchecked(buf), + code_bias_bound_mu: WireFormat::parse_unchecked(buf), + code_bias_bound_sig: WireFormat::parse_unchecked(buf), + phase_bias_bound_mu: WireFormat::parse_unchecked(buf), + phase_bias_bound_sig: WireFormat::parse_unchecked(buf), + } + } + } +} + pub mod grid_definition_header_dep_a { #![allow(unused_imports)] @@ -436,15 +568,28 @@ pub mod msg_ssr_code_phase_biases_bounds { use super::*; use crate::messages::gnss::*; use crate::messages::lib::*; - /// Stubbed version of Combined Code and Phase Biases Bounds + /// Combined Code and Phase Biases Bounds #[cfg_attr(feature = "serde", derive(serde::Serialize))] #[derive(Debug, PartialEq, Clone)] pub struct MsgSsrCodePhaseBiasesBounds { /// The message sender_id #[cfg_attr(feature = "serde", serde(skip_serializing))] pub sender_id: Option, - #[cfg_attr(feature = "serde", serde(rename(serialize = "stub")))] - pub stub: Vec, + /// Header of a bounds message. + #[cfg_attr(feature = "serde", serde(rename(serialize = "header")))] + pub header: BoundsHeader, + /// IOD of the SSR bound. + #[cfg_attr(feature = "serde", serde(rename(serialize = "ssr_iod")))] + pub ssr_iod: u8, + /// Constellation ID to which the SVs belong. + #[cfg_attr(feature = "serde", serde(rename(serialize = "const_id")))] + pub const_id: u8, + /// Number of satellite-signal couples. + #[cfg_attr(feature = "serde", serde(rename(serialize = "n_sats_signals")))] + pub n_sats_signals: u8, + /// Code and Phase Biases Bounds per Satellite-Signal couple. + #[cfg_attr(feature = "serde", serde(rename(serialize = "satellites_signals")))] + pub satellites_signals: Vec, } impl ConcreteMessage for MsgSsrCodePhaseBiasesBounds { @@ -481,17 +626,33 @@ pub mod msg_ssr_code_phase_biases_bounds { } impl WireFormat for MsgSsrCodePhaseBiasesBounds { - const MIN_LEN: usize = as WireFormat>::MIN_LEN; + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + as WireFormat>::MIN_LEN; fn len(&self) -> usize { - WireFormat::len(&self.stub) + WireFormat::len(&self.header) + + WireFormat::len(&self.ssr_iod) + + WireFormat::len(&self.const_id) + + WireFormat::len(&self.n_sats_signals) + + WireFormat::len(&self.satellites_signals) } fn write(&self, buf: &mut B) { - WireFormat::write(&self.stub, buf); + WireFormat::write(&self.header, buf); + WireFormat::write(&self.ssr_iod, buf); + WireFormat::write(&self.const_id, buf); + WireFormat::write(&self.n_sats_signals, buf); + WireFormat::write(&self.satellites_signals, buf); } fn parse_unchecked(buf: &mut B) -> Self { MsgSsrCodePhaseBiasesBounds { sender_id: None, - stub: WireFormat::parse_unchecked(buf), + header: WireFormat::parse_unchecked(buf), + ssr_iod: WireFormat::parse_unchecked(buf), + const_id: WireFormat::parse_unchecked(buf), + n_sats_signals: WireFormat::parse_unchecked(buf), + satellites_signals: WireFormat::parse_unchecked(buf), } } } @@ -598,15 +759,61 @@ pub mod msg_ssr_gridded_correction_bounds { use super::*; use crate::messages::gnss::*; use crate::messages::lib::*; + /// Gridded troposhere and STEC correction residuals bounds + /// + /// Note 1: Range: 0-17.5 m. i<= 200, mean = 0.01i; 200230, mean=5+0.5(i-230). + /// #[cfg_attr(feature = "serde", derive(serde::Serialize))] #[derive(Debug, PartialEq, Clone)] pub struct MsgSsrGriddedCorrectionBounds { /// The message sender_id #[cfg_attr(feature = "serde", serde(skip_serializing))] pub sender_id: Option, - #[cfg_attr(feature = "serde", serde(rename(serialize = "stub")))] - pub stub: Vec, + /// Header of a bounds message. + #[cfg_attr(feature = "serde", serde(rename(serialize = "header")))] + pub header: BoundsHeader, + /// IOD of the correction. + #[cfg_attr(feature = "serde", serde(rename(serialize = "ssr_iod_atmo")))] + pub ssr_iod_atmo: u8, + /// 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, + /// Vertical Hydrostatic Error Bound Mean. + #[cfg_attr(feature = "serde", serde(rename(serialize = "tropo_v_hydro_bound_mu")))] + pub tropo_v_hydro_bound_mu: u8, + /// Vertical Hydrostatic Error Bound StDev. + #[cfg_attr( + feature = "serde", + serde(rename(serialize = "tropo_v_hydro_bound_sig")) + )] + pub tropo_v_hydro_bound_sig: u8, + /// Vertical Wet Error Bound Mean. + #[cfg_attr(feature = "serde", serde(rename(serialize = "tropo_v_wet_bound_mu")))] + pub tropo_v_wet_bound_mu: u8, + /// Vertical Wet Error Bound StDev. + #[cfg_attr(feature = "serde", serde(rename(serialize = "tropo_v_wet_bound_sig")))] + pub tropo_v_wet_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 { @@ -643,17 +850,65 @@ pub mod msg_ssr_gridded_correction_bounds { } impl WireFormat for MsgSsrGriddedCorrectionBounds { - const MIN_LEN: usize = as WireFormat>::MIN_LEN; + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + ::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.stub) + 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_v_hydro_bound_mu) + + WireFormat::len(&self.tropo_v_hydro_bound_sig) + + WireFormat::len(&self.tropo_v_wet_bound_mu) + + WireFormat::len(&self.tropo_v_wet_bound_sig) + + WireFormat::len(&self.n_sats) + + WireFormat::len(&self.stec_sat_list) } fn write(&self, buf: &mut B) { - WireFormat::write(&self.stub, buf); + 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_v_hydro_bound_mu, buf); + WireFormat::write(&self.tropo_v_hydro_bound_sig, buf); + WireFormat::write(&self.tropo_v_wet_bound_mu, buf); + WireFormat::write(&self.tropo_v_wet_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, - stub: WireFormat::parse_unchecked(buf), + 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_v_hydro_bound_mu: WireFormat::parse_unchecked(buf), + tropo_v_hydro_bound_sig: WireFormat::parse_unchecked(buf), + tropo_v_wet_bound_mu: WireFormat::parse_unchecked(buf), + tropo_v_wet_bound_sig: WireFormat::parse_unchecked(buf), + n_sats: WireFormat::parse_unchecked(buf), + stec_sat_list: WireFormat::parse_unchecked(buf), } } } @@ -1087,15 +1342,36 @@ pub mod msg_ssr_orbit_clock_bounds { use super::*; use crate::messages::gnss::*; use crate::messages::lib::*; - /// Stubbed version of Combined Orbit and Clock Bound + + /// Combined Orbit and Clock Bound + /// + /// Note 1: Range: 0-17.5 m. i<=200, mean=0.01i; 200230, mean=5+0.5(i-230). + /// + /// Note 2: Range: 0-17.5 m. i<=200, std=0.01i; 200230, std=5+0.5(i-230). + /// #[cfg_attr(feature = "serde", derive(serde::Serialize))] #[derive(Debug, PartialEq, Clone)] pub struct MsgSsrOrbitClockBounds { /// The message sender_id #[cfg_attr(feature = "serde", serde(skip_serializing))] pub sender_id: Option, - #[cfg_attr(feature = "serde", serde(rename(serialize = "stub")))] - pub stub: Vec, + /// Header of a bounds message. + #[cfg_attr(feature = "serde", serde(rename(serialize = "header")))] + pub header: BoundsHeader, + /// IOD of the SSR bound. + #[cfg_attr(feature = "serde", serde(rename(serialize = "ssr_iod")))] + pub ssr_iod: u8, + /// Constellation ID to which the SVs belong. + #[cfg_attr(feature = "serde", serde(rename(serialize = "const_id")))] + pub const_id: u8, + /// Number of satellites. + #[cfg_attr(feature = "serde", serde(rename(serialize = "n_sats")))] + pub n_sats: u8, + /// Orbit and Clock Bounds per Satellite + #[cfg_attr(feature = "serde", serde(rename(serialize = "orbit_clock_bounds")))] + pub orbit_clock_bounds: Vec, } impl ConcreteMessage for MsgSsrOrbitClockBounds { @@ -1132,17 +1408,33 @@ pub mod msg_ssr_orbit_clock_bounds { } impl WireFormat for MsgSsrOrbitClockBounds { - const MIN_LEN: usize = as WireFormat>::MIN_LEN; + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + as WireFormat>::MIN_LEN; fn len(&self) -> usize { - WireFormat::len(&self.stub) + WireFormat::len(&self.header) + + WireFormat::len(&self.ssr_iod) + + WireFormat::len(&self.const_id) + + WireFormat::len(&self.n_sats) + + WireFormat::len(&self.orbit_clock_bounds) } fn write(&self, buf: &mut B) { - WireFormat::write(&self.stub, buf); + WireFormat::write(&self.header, buf); + WireFormat::write(&self.ssr_iod, buf); + WireFormat::write(&self.const_id, buf); + WireFormat::write(&self.n_sats, buf); + WireFormat::write(&self.orbit_clock_bounds, buf); } fn parse_unchecked(buf: &mut B) -> Self { MsgSsrOrbitClockBounds { sender_id: None, - stub: WireFormat::parse_unchecked(buf), + header: WireFormat::parse_unchecked(buf), + ssr_iod: WireFormat::parse_unchecked(buf), + const_id: WireFormat::parse_unchecked(buf), + n_sats: WireFormat::parse_unchecked(buf), + orbit_clock_bounds: WireFormat::parse_unchecked(buf), } } } @@ -1161,8 +1453,26 @@ pub mod msg_ssr_orbit_clock_bounds_degradation { /// The message sender_id #[cfg_attr(feature = "serde", serde(skip_serializing))] pub sender_id: Option, - #[cfg_attr(feature = "serde", serde(rename(serialize = "stub")))] - pub stub: Vec, + /// Header of a bounds message. + #[cfg_attr(feature = "serde", serde(rename(serialize = "header")))] + pub header: BoundsHeader, + /// IOD of the SSR bound degradation parameter. + #[cfg_attr(feature = "serde", serde(rename(serialize = "ssr_iod")))] + pub ssr_iod: u8, + /// Constellation ID to which the SVs belong. + #[cfg_attr(feature = "serde", serde(rename(serialize = "const_id")))] + pub const_id: u8, + /// Satellite Bit Mask. Put 1 for each satellite where the following + /// degradation parameters are applicable, 0 otherwise. Encoded following + /// RTCM DF394 specification. + #[cfg_attr(feature = "serde", serde(rename(serialize = "sat_bitmask")))] + pub sat_bitmask: u64, + /// Orbit and Clock Bounds Degradation Parameters + #[cfg_attr( + feature = "serde", + serde(rename(serialize = "orbit_clock_bounds_degradation")) + )] + pub orbit_clock_bounds_degradation: OrbitClockBoundDegradation, } impl ConcreteMessage for MsgSsrOrbitClockBoundsDegradation { @@ -1199,17 +1509,33 @@ pub mod msg_ssr_orbit_clock_bounds_degradation { } impl WireFormat for MsgSsrOrbitClockBoundsDegradation { - const MIN_LEN: usize = as WireFormat>::MIN_LEN; + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN; fn len(&self) -> usize { - WireFormat::len(&self.stub) + WireFormat::len(&self.header) + + WireFormat::len(&self.ssr_iod) + + WireFormat::len(&self.const_id) + + WireFormat::len(&self.sat_bitmask) + + WireFormat::len(&self.orbit_clock_bounds_degradation) } fn write(&self, buf: &mut B) { - WireFormat::write(&self.stub, buf); + WireFormat::write(&self.header, buf); + WireFormat::write(&self.ssr_iod, buf); + WireFormat::write(&self.const_id, buf); + WireFormat::write(&self.sat_bitmask, buf); + WireFormat::write(&self.orbit_clock_bounds_degradation, buf); } fn parse_unchecked(buf: &mut B) -> Self { MsgSsrOrbitClockBoundsDegradation { sender_id: None, - stub: WireFormat::parse_unchecked(buf), + header: WireFormat::parse_unchecked(buf), + ssr_iod: WireFormat::parse_unchecked(buf), + const_id: WireFormat::parse_unchecked(buf), + sat_bitmask: WireFormat::parse_unchecked(buf), + orbit_clock_bounds_degradation: WireFormat::parse_unchecked(buf), } } } @@ -1591,8 +1917,24 @@ pub mod msg_ssr_stec_correction { /// The message sender_id #[cfg_attr(feature = "serde", serde(skip_serializing))] pub sender_id: Option, - #[cfg_attr(feature = "serde", serde(rename(serialize = "stub")))] - pub stub: Vec, + /// 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 { @@ -1629,17 +1971,37 @@ pub mod msg_ssr_stec_correction { } impl WireFormat for MsgSsrStecCorrection { - const MIN_LEN: usize = as WireFormat>::MIN_LEN; + 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.stub) + 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.stub, buf); + 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, - stub: WireFormat::parse_unchecked(buf), + 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), } } } @@ -1826,8 +2188,73 @@ pub mod msg_ssr_tile_definition { /// The message sender_id #[cfg_attr(feature = "serde", serde(skip_serializing))] pub sender_id: Option, - #[cfg_attr(feature = "serde", serde(rename(serialize = "stub")))] - pub stub: Vec, + /// 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, + /// 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 MsgSsrTileDefinition { @@ -1864,17 +2291,53 @@ pub mod msg_ssr_tile_definition { } impl WireFormat for MsgSsrTileDefinition { - const MIN_LEN: usize = as WireFormat>::MIN_LEN; + 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.stub) + 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.stub, buf); + 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, - stub: WireFormat::parse_unchecked(buf), + 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), } } } @@ -2052,6 +2515,197 @@ pub mod msg_ssr_tile_definition_dep { } } +pub mod orbit_clock_bound { + #![allow(unused_imports)] + + use super::*; + use crate::messages::gnss::*; + use crate::messages::lib::*; + + /// None + /// + /// Orbit and clock bound. + /// + #[cfg_attr(feature = "serde", derive(serde::Serialize))] + #[derive(Debug, PartialEq, Clone)] + pub struct OrbitClockBound { + /// Satellite ID. Similar to either RTCM DF068 (GPS), DF252 (Galileo), or + /// DF488 (BDS) depending on the constellation. + #[cfg_attr(feature = "serde", serde(rename(serialize = "sat_id")))] + pub sat_id: u8, + /// Mean Radial. See Note 1. + #[cfg_attr(feature = "serde", serde(rename(serialize = "orb_radial_bound_mu")))] + pub orb_radial_bound_mu: u8, + /// Mean Along-Track. See Note 1. + #[cfg_attr(feature = "serde", serde(rename(serialize = "orb_along_bound_mu")))] + pub orb_along_bound_mu: u8, + /// Mean Cross-Track. See Note 1. + #[cfg_attr(feature = "serde", serde(rename(serialize = "orb_cross_bound_mu")))] + pub orb_cross_bound_mu: u8, + /// Standard Deviation Radial. See Note 2. + #[cfg_attr(feature = "serde", serde(rename(serialize = "orb_radial_bound_sig")))] + pub orb_radial_bound_sig: u8, + /// Standard Deviation Along-Track. See Note 2. + #[cfg_attr(feature = "serde", serde(rename(serialize = "orb_along_bound_sig")))] + pub orb_along_bound_sig: u8, + /// Standard Deviation Cross-Track. See Note 2. + #[cfg_attr(feature = "serde", serde(rename(serialize = "orb_cross_bound_sig")))] + pub orb_cross_bound_sig: u8, + /// Clock Bound Mean. See Note 1. + #[cfg_attr(feature = "serde", serde(rename(serialize = "clock_bound_mu")))] + pub clock_bound_mu: u8, + /// Clock Bound Standard Deviation. See Note 2. + #[cfg_attr(feature = "serde", serde(rename(serialize = "clock_bound_sig")))] + pub clock_bound_sig: u8, + } + + impl WireFormat for OrbitClockBound { + const MIN_LEN: usize = ::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.sat_id) + + WireFormat::len(&self.orb_radial_bound_mu) + + WireFormat::len(&self.orb_along_bound_mu) + + WireFormat::len(&self.orb_cross_bound_mu) + + WireFormat::len(&self.orb_radial_bound_sig) + + WireFormat::len(&self.orb_along_bound_sig) + + WireFormat::len(&self.orb_cross_bound_sig) + + WireFormat::len(&self.clock_bound_mu) + + WireFormat::len(&self.clock_bound_sig) + } + fn write(&self, buf: &mut B) { + WireFormat::write(&self.sat_id, buf); + WireFormat::write(&self.orb_radial_bound_mu, buf); + WireFormat::write(&self.orb_along_bound_mu, buf); + WireFormat::write(&self.orb_cross_bound_mu, buf); + WireFormat::write(&self.orb_radial_bound_sig, buf); + WireFormat::write(&self.orb_along_bound_sig, buf); + WireFormat::write(&self.orb_cross_bound_sig, buf); + WireFormat::write(&self.clock_bound_mu, buf); + WireFormat::write(&self.clock_bound_sig, buf); + } + fn parse_unchecked(buf: &mut B) -> Self { + OrbitClockBound { + sat_id: WireFormat::parse_unchecked(buf), + orb_radial_bound_mu: WireFormat::parse_unchecked(buf), + orb_along_bound_mu: WireFormat::parse_unchecked(buf), + orb_cross_bound_mu: WireFormat::parse_unchecked(buf), + orb_radial_bound_sig: WireFormat::parse_unchecked(buf), + orb_along_bound_sig: WireFormat::parse_unchecked(buf), + orb_cross_bound_sig: WireFormat::parse_unchecked(buf), + clock_bound_mu: WireFormat::parse_unchecked(buf), + clock_bound_sig: WireFormat::parse_unchecked(buf), + } + } + } +} + +pub mod orbit_clock_bound_degradation { + #![allow(unused_imports)] + + use super::*; + use crate::messages::gnss::*; + use crate::messages::lib::*; + + /// None + /// + /// Orbit and clock bound degradation. + /// + #[cfg_attr(feature = "serde", derive(serde::Serialize))] + #[derive(Debug, PartialEq, Clone)] + pub struct OrbitClockBoundDegradation { + /// Orbit Bound Mean Radial First derivative. Range: 0-0.255 m/s + #[cfg_attr( + feature = "serde", + serde(rename(serialize = "orb_radial_bound_mu_dot")) + )] + pub orb_radial_bound_mu_dot: u8, + /// Orbit Bound Mean Along-Track First derivative. Range: 0-0.255 m/s + #[cfg_attr(feature = "serde", serde(rename(serialize = "orb_along_bound_mu_dot")))] + pub orb_along_bound_mu_dot: u8, + /// Orbit Bound Mean Cross-Track First derivative. Range: 0-0.255 m/s + #[cfg_attr(feature = "serde", serde(rename(serialize = "orb_cross_bound_mu_dot")))] + pub orb_cross_bound_mu_dot: u8, + /// Orbit Bound Standard Deviation Radial First derivative. Range: 0-0.255 + /// m/s + #[cfg_attr( + feature = "serde", + serde(rename(serialize = "orb_radial_bound_sig_dot")) + )] + pub orb_radial_bound_sig_dot: u8, + /// Orbit Bound Standard Deviation Along-Track First derivative. Range: + /// 0-0.255 m/s + #[cfg_attr( + feature = "serde", + serde(rename(serialize = "orb_along_bound_sig_dot")) + )] + pub orb_along_bound_sig_dot: u8, + /// Orbit Bound Standard Deviation Cross-Track First derivative. Range: + /// 0-0.255 m/s + #[cfg_attr( + feature = "serde", + serde(rename(serialize = "orb_cross_bound_sig_dot")) + )] + pub orb_cross_bound_sig_dot: u8, + /// Clock Bound Mean First derivative. Range: 0-0.255 m/s + #[cfg_attr(feature = "serde", serde(rename(serialize = "clock_bound_mu_dot")))] + pub clock_bound_mu_dot: u8, + /// Clock Bound Standard Deviation First derivative. Range: 0-0.255 m/s + #[cfg_attr(feature = "serde", serde(rename(serialize = "clock_bound_sig_dot")))] + pub clock_bound_sig_dot: u8, + } + + impl WireFormat for OrbitClockBoundDegradation { + const MIN_LEN: usize = ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN + + ::MIN_LEN; + fn len(&self) -> usize { + WireFormat::len(&self.orb_radial_bound_mu_dot) + + WireFormat::len(&self.orb_along_bound_mu_dot) + + WireFormat::len(&self.orb_cross_bound_mu_dot) + + WireFormat::len(&self.orb_radial_bound_sig_dot) + + WireFormat::len(&self.orb_along_bound_sig_dot) + + WireFormat::len(&self.orb_cross_bound_sig_dot) + + WireFormat::len(&self.clock_bound_mu_dot) + + WireFormat::len(&self.clock_bound_sig_dot) + } + fn write(&self, buf: &mut B) { + WireFormat::write(&self.orb_radial_bound_mu_dot, buf); + WireFormat::write(&self.orb_along_bound_mu_dot, buf); + WireFormat::write(&self.orb_cross_bound_mu_dot, buf); + WireFormat::write(&self.orb_radial_bound_sig_dot, buf); + WireFormat::write(&self.orb_along_bound_sig_dot, buf); + WireFormat::write(&self.orb_cross_bound_sig_dot, buf); + WireFormat::write(&self.clock_bound_mu_dot, buf); + WireFormat::write(&self.clock_bound_sig_dot, buf); + } + fn parse_unchecked(buf: &mut B) -> Self { + OrbitClockBoundDegradation { + orb_radial_bound_mu_dot: WireFormat::parse_unchecked(buf), + orb_along_bound_mu_dot: WireFormat::parse_unchecked(buf), + orb_cross_bound_mu_dot: WireFormat::parse_unchecked(buf), + orb_radial_bound_sig_dot: WireFormat::parse_unchecked(buf), + orb_along_bound_sig_dot: WireFormat::parse_unchecked(buf), + orb_cross_bound_sig_dot: WireFormat::parse_unchecked(buf), + clock_bound_mu_dot: WireFormat::parse_unchecked(buf), + clock_bound_sig_dot: WireFormat::parse_unchecked(buf), + } + } + } +} + pub mod phase_biases_content { #![allow(unused_imports)] @@ -2287,7 +2941,8 @@ pub mod stec_residual { /// STEC residual #[cfg_attr(feature = "serde", serde(rename(serialize = "residual")))] pub residual: i16, - /// stddev + /// Modified DF389 scale. Class is upper 3 bits, value is lower 5. stddev <= + /// (3^class * (1 + value/16) - 1) * 10 TECU #[cfg_attr(feature = "serde", serde(rename(serialize = "stddev")))] pub stddev: u8, } @@ -2377,7 +3032,8 @@ pub mod stec_sat_element { /// in units of TECU instead of m. #[cfg_attr(feature = "serde", serde(rename(serialize = "stec_quality_indicator")))] pub stec_quality_indicator: u8, - /// Coefficients of the STEC polynomial in the order of C00, C01, C10, C11 + /// Coefficients of the STEC polynomial in the order of C00, C01, C10, C11. + /// C00 = 0.05 TECU, C01/C10 = 0.02 TECU/deg, C11 0.02 TECU/deg^2 #[cfg_attr(feature = "serde", serde(rename(serialize = "stec_coeff")))] pub stec_coeff: [i16; 4], } @@ -2406,6 +3062,69 @@ 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, PartialEq, Clone)] + pub struct STECSatElementIntegrity { + /// STEC residuals (mean, stddev) + #[cfg_attr(feature = "serde", serde(rename(serialize = "stec_residual")))] + pub stec_residual: STECResidual, + /// Error Bound Mean. See Note 1. + #[cfg_attr(feature = "serde", serde(rename(serialize = "stec_bound_mu")))] + pub stec_bound_mu: u8, + /// Error Bound StDev. See Note 1. + #[cfg_attr(feature = "serde", serde(rename(serialize = "stec_bound_sig")))] + pub stec_bound_sig: u8, + /// Error Bound Mean First derivative. + #[cfg_attr(feature = "serde", serde(rename(serialize = "stec_bound_mu_dot")))] + pub stec_bound_mu_dot: u8, + /// Error Bound StDev First derivative. + #[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)] @@ -2624,13 +3343,14 @@ pub mod tropospheric_delay_correction { #[cfg_attr(feature = "serde", derive(serde::Serialize))] #[derive(Debug, PartialEq, Clone)] pub struct TroposphericDelayCorrection { - /// Hydrostatic vertical delay + /// Hydrostatic vertical delay. Add 2.3 m to get actual value. #[cfg_attr(feature = "serde", serde(rename(serialize = "hydro")))] pub hydro: i16, - /// Wet vertical delay + /// Wet vertical delay. Add 0.252 m to get actual value. #[cfg_attr(feature = "serde", serde(rename(serialize = "wet")))] pub wet: i8, - /// stddev + /// Modified DF389 scale. Class is upper 3 bits, value is lower 5. stddev <= + /// (3^class * (1 + value/16) - 1) mm #[cfg_attr(feature = "serde", serde(rename(serialize = "stddev")))] pub stddev: u8, } diff --git a/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_high_level.rs b/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_high_level.rs index f9ecef3a25..caf7c4c59f 100644 --- a/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_high_level.rs +++ b/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_high_level.rs @@ -43,159 +43,109 @@ fn test_auto_check_sbp_integrity_msg_ssr_flag_high_level() { sender_id ); assert_eq!( - msg.stub[0], 180, - "incorrect value for stub[0], expected 180, is {}", - msg.stub[0] + msg.chain_id, 40, + "incorrect value for chain_id, expected 40, is {}", + msg.chain_id ); assert_eq!( - msg.stub[1], 0, - "incorrect value for stub[1], expected 0, is {}", - msg.stub[1] + msg.corr_time.tow, 360, + "incorrect value for corr_time.tow, expected 360, is {}", + msg.corr_time.tow ); assert_eq!( - msg.stub[2], 0, - "incorrect value for stub[2], expected 0, is {}", - msg.stub[2] + msg.corr_time.wn, 6, + "incorrect value for corr_time.wn, expected 6, is {}", + msg.corr_time.wn ); assert_eq!( - msg.stub[3], 0, - "incorrect value for stub[3], expected 0, is {}", - msg.stub[3] + msg.obs_time.tow, 180, + "incorrect value for obs_time.tow, expected 180, is {}", + msg.obs_time.tow ); assert_eq!( - msg.stub[4], 3, - "incorrect value for stub[4], expected 3, is {}", - msg.stub[4] + msg.obs_time.wn, 3, + "incorrect value for obs_time.wn, expected 3, is {}", + msg.obs_time.wn ); assert_eq!( - msg.stub[5], 0, - "incorrect value for stub[5], expected 0, is {}", - msg.stub[5] + msg.reserved[0], 0, + "incorrect value for reserved[0], expected 0, is {}", + msg.reserved[0] ); assert_eq!( - msg.stub[6], 104, - "incorrect value for stub[6], expected 104, is {}", - msg.stub[6] + msg.reserved[1], 0, + "incorrect value for reserved[1], expected 0, is {}", + msg.reserved[1] ); assert_eq!( - msg.stub[7], 1, - "incorrect value for stub[7], expected 1, is {}", - msg.stub[7] + msg.reserved[2], 0, + "incorrect value for reserved[2], expected 0, is {}", + msg.reserved[2] ); assert_eq!( - msg.stub[8], 0, - "incorrect value for stub[8], expected 0, is {}", - msg.stub[8] + msg.reserved[3], 0, + "incorrect value for reserved[3], expected 0, is {}", + msg.reserved[3] ); assert_eq!( - msg.stub[9], 0, - "incorrect value for stub[9], expected 0, is {}", - msg.stub[9] + msg.reserved[4], 0, + "incorrect value for reserved[4], expected 0, is {}", + msg.reserved[4] ); assert_eq!( - msg.stub[10], 6, - "incorrect value for stub[10], expected 6, is {}", - msg.stub[10] + msg.reserved[5], 0, + "incorrect value for reserved[5], expected 0, is {}", + msg.reserved[5] ); assert_eq!( - msg.stub[11], 0, - "incorrect value for stub[11], expected 0, is {}", - msg.stub[11] + msg.ssr_sol_id, 10, + "incorrect value for ssr_sol_id, expected 10, is {}", + msg.ssr_sol_id ); assert_eq!( - msg.stub[12], 10, - "incorrect value for stub[12], expected 10, is {}", - msg.stub[12] + msg.tile_id, 30, + "incorrect value for tile_id, expected 30, is {}", + msg.tile_id ); assert_eq!( - msg.stub[13], 20, - "incorrect value for stub[13], expected 20, is {}", - msg.stub[13] + msg.tile_set_id, 20, + "incorrect value for tile_set_id, expected 20, is {}", + msg.tile_set_id ); assert_eq!( - msg.stub[14], 0, - "incorrect value for stub[14], expected 0, is {}", - msg.stub[14] + msg.use_bds_sat, 3, + "incorrect value for use_bds_sat, expected 3, is {}", + msg.use_bds_sat ); assert_eq!( - msg.stub[15], 30, - "incorrect value for stub[15], expected 30, is {}", - msg.stub[15] + msg.use_gal_sat, 2, + "incorrect value for use_gal_sat, expected 2, is {}", + msg.use_gal_sat ); assert_eq!( - msg.stub[16], 0, - "incorrect value for stub[16], expected 0, is {}", - msg.stub[16] + msg.use_gps_sat, 1, + "incorrect value for use_gps_sat, expected 1, is {}", + msg.use_gps_sat ); assert_eq!( - msg.stub[17], 40, - "incorrect value for stub[17], expected 40, is {}", - msg.stub[17] + msg.use_iono_grid_point_sat_los, 7, + "incorrect value for use_iono_grid_point_sat_los, expected 7, is {}", + msg.use_iono_grid_point_sat_los ); assert_eq!( - msg.stub[18], 1, - "incorrect value for stub[18], expected 1, is {}", - msg.stub[18] + msg.use_iono_grid_points, 5, + "incorrect value for use_iono_grid_points, expected 5, is {}", + msg.use_iono_grid_points ); assert_eq!( - msg.stub[19], 2, - "incorrect value for stub[19], expected 2, is {}", - msg.stub[19] + msg.use_iono_tile_sat_los, 6, + "incorrect value for use_iono_tile_sat_los, expected 6, is {}", + msg.use_iono_tile_sat_los ); assert_eq!( - msg.stub[20], 3, - "incorrect value for stub[20], expected 3, is {}", - msg.stub[20] - ); - assert_eq!( - msg.stub[21], 0, - "incorrect value for stub[21], expected 0, is {}", - msg.stub[21] - ); - assert_eq!( - msg.stub[22], 0, - "incorrect value for stub[22], expected 0, is {}", - msg.stub[22] - ); - assert_eq!( - msg.stub[23], 0, - "incorrect value for stub[23], expected 0, is {}", - msg.stub[23] - ); - assert_eq!( - msg.stub[24], 0, - "incorrect value for stub[24], expected 0, is {}", - msg.stub[24] - ); - assert_eq!( - msg.stub[25], 0, - "incorrect value for stub[25], expected 0, is {}", - msg.stub[25] - ); - assert_eq!( - msg.stub[26], 0, - "incorrect value for stub[26], expected 0, is {}", - msg.stub[26] - ); - assert_eq!( - msg.stub[27], 4, - "incorrect value for stub[27], expected 4, is {}", - msg.stub[27] - ); - assert_eq!( - msg.stub[28], 5, - "incorrect value for stub[28], expected 5, is {}", - msg.stub[28] - ); - assert_eq!( - msg.stub[29], 6, - "incorrect value for stub[29], expected 6, is {}", - msg.stub[29] - ); - assert_eq!( - msg.stub[30], 7, - "incorrect value for stub[30], expected 7, is {}", - msg.stub[30] + msg.use_tropo_grid_points, 4, + "incorrect value for use_tropo_grid_points, expected 4, is {}", + msg.use_tropo_grid_points ); } _ => panic!("Invalid message type! Expected a MsgSsrFlagHighLevel"), diff --git a/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_iono_grid_point_sat_los.rs b/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_iono_grid_point_sat_los.rs index f26bb9f3cc..1194250cc7 100644 --- a/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_iono_grid_point_sat_los.rs +++ b/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_iono_grid_point_sat_los.rs @@ -43,109 +43,74 @@ fn test_auto_check_sbp_integrity_msg_ssr_flag_iono_grid_point_sat_los() { sender_id ); assert_eq!( - msg.stub[0], 180, - "incorrect value for stub[0], expected 180, is {}", - msg.stub[0] + msg.faulty_los[0].constellation, 11, + "incorrect value for faulty_los[0].constellation, expected 11, is {}", + msg.faulty_los[0].constellation ); assert_eq!( - msg.stub[1], 0, - "incorrect value for stub[1], expected 0, is {}", - msg.stub[1] + msg.faulty_los[0].sat_id, 10, + "incorrect value for faulty_los[0].sat_id, expected 10, is {}", + msg.faulty_los[0].sat_id ); assert_eq!( - msg.stub[2], 0, - "incorrect value for stub[2], expected 0, is {}", - msg.stub[2] + msg.faulty_los[1].constellation, 14, + "incorrect value for faulty_los[1].constellation, expected 14, is {}", + msg.faulty_los[1].constellation ); assert_eq!( - msg.stub[3], 0, - "incorrect value for stub[3], expected 0, is {}", - msg.stub[3] + msg.faulty_los[1].sat_id, 15, + "incorrect value for faulty_los[1].sat_id, expected 15, is {}", + msg.faulty_los[1].sat_id ); assert_eq!( - msg.stub[4], 3, - "incorrect value for stub[4], expected 3, is {}", - msg.stub[4] + msg.grid_point_id, 30, + "incorrect value for grid_point_id, expected 30, is {}", + msg.grid_point_id ); assert_eq!( - msg.stub[5], 0, - "incorrect value for stub[5], expected 0, is {}", - msg.stub[5] + msg.header.chain_id, 6, + "incorrect value for header.chain_id, expected 6, is {}", + msg.header.chain_id ); assert_eq!( - msg.stub[6], 1, - "incorrect value for stub[6], expected 1, is {}", - msg.stub[6] + msg.header.num_msgs, 1, + "incorrect value for header.num_msgs, expected 1, is {}", + msg.header.num_msgs ); assert_eq!( - msg.stub[7], 2, - "incorrect value for stub[7], expected 2, is {}", - msg.stub[7] + msg.header.obs_time.tow, 180, + "incorrect value for header.obs_time.tow, expected 180, is {}", + msg.header.obs_time.tow ); assert_eq!( - msg.stub[8], 3, - "incorrect value for stub[8], expected 3, is {}", - msg.stub[8] + msg.header.obs_time.wn, 3, + "incorrect value for header.obs_time.wn, expected 3, is {}", + msg.header.obs_time.wn ); assert_eq!( - msg.stub[9], 4, - "incorrect value for stub[9], expected 4, is {}", - msg.stub[9] + msg.header.seq_num, 2, + "incorrect value for header.seq_num, expected 2, is {}", + msg.header.seq_num ); assert_eq!( - msg.stub[10], 0, - "incorrect value for stub[10], expected 0, is {}", - msg.stub[10] + msg.header.ssr_sol_id, 3, + "incorrect value for header.ssr_sol_id, expected 3, is {}", + msg.header.ssr_sol_id ); assert_eq!( - msg.stub[11], 5, - "incorrect value for stub[11], expected 5, is {}", - msg.stub[11] + msg.header.tile_id, 5, + "incorrect value for header.tile_id, expected 5, is {}", + msg.header.tile_id ); assert_eq!( - msg.stub[12], 0, - "incorrect value for stub[12], expected 0, is {}", - msg.stub[12] + msg.header.tile_set_id, 4, + "incorrect value for header.tile_set_id, expected 4, is {}", + msg.header.tile_set_id ); assert_eq!( - msg.stub[13], 6, - "incorrect value for stub[13], expected 6, is {}", - msg.stub[13] - ); - assert_eq!( - msg.stub[14], 30, - "incorrect value for stub[14], expected 30, is {}", - msg.stub[14] - ); - assert_eq!( - msg.stub[15], 0, - "incorrect value for stub[15], expected 0, is {}", - msg.stub[15] - ); - assert_eq!( - msg.stub[16], 2, - "incorrect value for stub[16], expected 2, is {}", - msg.stub[16] - ); - assert_eq!( - msg.stub[17], 10, - "incorrect value for stub[17], expected 10, is {}", - msg.stub[17] - ); - assert_eq!( - msg.stub[18], 11, - "incorrect value for stub[18], expected 11, is {}", - msg.stub[18] - ); - assert_eq!( - msg.stub[19], 15, - "incorrect value for stub[19], expected 15, is {}", - msg.stub[19] - ); - assert_eq!( - msg.stub[20], 14, - "incorrect value for stub[20], expected 14, is {}", - msg.stub[20] + msg.n_faulty_los, 2, + "incorrect value for n_faulty_los, expected 2, is {}", + msg.n_faulty_los ); } _ => panic!("Invalid message type! Expected a MsgSsrFlagIonoGridPointSatLos"), diff --git a/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_iono_grid_points.rs b/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_iono_grid_points.rs index 88e2628d9b..7f1011fcf7 100644 --- a/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_iono_grid_points.rs +++ b/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_iono_grid_points.rs @@ -43,109 +43,64 @@ fn test_auto_check_sbp_integrity_msg_ssr_flag_iono_grid_points() { sender_id ); assert_eq!( - msg.stub[0], 180, - "incorrect value for stub[0], expected 180, is {}", - msg.stub[0] + msg.faulty_points[0], 10, + "incorrect value for faulty_points[0], expected 10, is {}", + msg.faulty_points[0] ); assert_eq!( - msg.stub[1], 0, - "incorrect value for stub[1], expected 0, is {}", - msg.stub[1] + msg.faulty_points[1], 11, + "incorrect value for faulty_points[1], expected 11, is {}", + msg.faulty_points[1] ); assert_eq!( - msg.stub[2], 0, - "incorrect value for stub[2], expected 0, is {}", - msg.stub[2] + msg.faulty_points[2], 12, + "incorrect value for faulty_points[2], expected 12, is {}", + msg.faulty_points[2] ); assert_eq!( - msg.stub[3], 0, - "incorrect value for stub[3], expected 0, is {}", - msg.stub[3] + msg.header.chain_id, 6, + "incorrect value for header.chain_id, expected 6, is {}", + msg.header.chain_id ); assert_eq!( - msg.stub[4], 3, - "incorrect value for stub[4], expected 3, is {}", - msg.stub[4] + msg.header.num_msgs, 1, + "incorrect value for header.num_msgs, expected 1, is {}", + msg.header.num_msgs ); assert_eq!( - msg.stub[5], 0, - "incorrect value for stub[5], expected 0, is {}", - msg.stub[5] + msg.header.obs_time.tow, 180, + "incorrect value for header.obs_time.tow, expected 180, is {}", + msg.header.obs_time.tow ); assert_eq!( - msg.stub[6], 1, - "incorrect value for stub[6], expected 1, is {}", - msg.stub[6] + msg.header.obs_time.wn, 3, + "incorrect value for header.obs_time.wn, expected 3, is {}", + msg.header.obs_time.wn ); assert_eq!( - msg.stub[7], 2, - "incorrect value for stub[7], expected 2, is {}", - msg.stub[7] + msg.header.seq_num, 2, + "incorrect value for header.seq_num, expected 2, is {}", + msg.header.seq_num ); assert_eq!( - msg.stub[8], 3, - "incorrect value for stub[8], expected 3, is {}", - msg.stub[8] + msg.header.ssr_sol_id, 3, + "incorrect value for header.ssr_sol_id, expected 3, is {}", + msg.header.ssr_sol_id ); assert_eq!( - msg.stub[9], 4, - "incorrect value for stub[9], expected 4, is {}", - msg.stub[9] + msg.header.tile_id, 5, + "incorrect value for header.tile_id, expected 5, is {}", + msg.header.tile_id ); assert_eq!( - msg.stub[10], 0, - "incorrect value for stub[10], expected 0, is {}", - msg.stub[10] + msg.header.tile_set_id, 4, + "incorrect value for header.tile_set_id, expected 4, is {}", + msg.header.tile_set_id ); assert_eq!( - msg.stub[11], 5, - "incorrect value for stub[11], expected 5, is {}", - msg.stub[11] - ); - assert_eq!( - msg.stub[12], 0, - "incorrect value for stub[12], expected 0, is {}", - msg.stub[12] - ); - assert_eq!( - msg.stub[13], 6, - "incorrect value for stub[13], expected 6, is {}", - msg.stub[13] - ); - assert_eq!( - msg.stub[14], 3, - "incorrect value for stub[14], expected 3, is {}", - msg.stub[14] - ); - assert_eq!( - msg.stub[15], 10, - "incorrect value for stub[15], expected 10, is {}", - msg.stub[15] - ); - assert_eq!( - msg.stub[16], 0, - "incorrect value for stub[16], expected 0, is {}", - msg.stub[16] - ); - assert_eq!( - msg.stub[17], 11, - "incorrect value for stub[17], expected 11, is {}", - msg.stub[17] - ); - assert_eq!( - msg.stub[18], 0, - "incorrect value for stub[18], expected 0, is {}", - msg.stub[18] - ); - assert_eq!( - msg.stub[19], 12, - "incorrect value for stub[19], expected 12, is {}", - msg.stub[19] - ); - assert_eq!( - msg.stub[20], 0, - "incorrect value for stub[20], expected 0, is {}", - msg.stub[20] + msg.n_faulty_points, 3, + "incorrect value for n_faulty_points, expected 3, is {}", + msg.n_faulty_points ); } _ => panic!("Invalid message type! Expected a MsgSsrFlagIonoGridPoints"), diff --git a/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_iono_tile_sat_los.rs b/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_iono_tile_sat_los.rs index 1b0e7020cb..48692a3879 100644 --- a/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_iono_tile_sat_los.rs +++ b/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_iono_tile_sat_los.rs @@ -43,99 +43,69 @@ fn test_auto_check_sbp_integrity_msg_ssr_flag_iono_tile_sat_los() { sender_id ); assert_eq!( - msg.stub[0], 180, - "incorrect value for stub[0], expected 180, is {}", - msg.stub[0] + msg.faulty_los[0].constellation, 11, + "incorrect value for faulty_los[0].constellation, expected 11, is {}", + msg.faulty_los[0].constellation ); assert_eq!( - msg.stub[1], 0, - "incorrect value for stub[1], expected 0, is {}", - msg.stub[1] + msg.faulty_los[0].sat_id, 10, + "incorrect value for faulty_los[0].sat_id, expected 10, is {}", + msg.faulty_los[0].sat_id ); assert_eq!( - msg.stub[2], 0, - "incorrect value for stub[2], expected 0, is {}", - msg.stub[2] + msg.faulty_los[1].constellation, 14, + "incorrect value for faulty_los[1].constellation, expected 14, is {}", + msg.faulty_los[1].constellation ); assert_eq!( - msg.stub[3], 0, - "incorrect value for stub[3], expected 0, is {}", - msg.stub[3] + msg.faulty_los[1].sat_id, 15, + "incorrect value for faulty_los[1].sat_id, expected 15, is {}", + msg.faulty_los[1].sat_id ); assert_eq!( - msg.stub[4], 3, - "incorrect value for stub[4], expected 3, is {}", - msg.stub[4] + msg.header.chain_id, 6, + "incorrect value for header.chain_id, expected 6, is {}", + msg.header.chain_id ); assert_eq!( - msg.stub[5], 0, - "incorrect value for stub[5], expected 0, is {}", - msg.stub[5] + msg.header.num_msgs, 1, + "incorrect value for header.num_msgs, expected 1, is {}", + msg.header.num_msgs ); assert_eq!( - msg.stub[6], 1, - "incorrect value for stub[6], expected 1, is {}", - msg.stub[6] + msg.header.obs_time.tow, 180, + "incorrect value for header.obs_time.tow, expected 180, is {}", + msg.header.obs_time.tow ); assert_eq!( - msg.stub[7], 2, - "incorrect value for stub[7], expected 2, is {}", - msg.stub[7] + msg.header.obs_time.wn, 3, + "incorrect value for header.obs_time.wn, expected 3, is {}", + msg.header.obs_time.wn ); assert_eq!( - msg.stub[8], 3, - "incorrect value for stub[8], expected 3, is {}", - msg.stub[8] + msg.header.seq_num, 2, + "incorrect value for header.seq_num, expected 2, is {}", + msg.header.seq_num ); assert_eq!( - msg.stub[9], 4, - "incorrect value for stub[9], expected 4, is {}", - msg.stub[9] + msg.header.ssr_sol_id, 3, + "incorrect value for header.ssr_sol_id, expected 3, is {}", + msg.header.ssr_sol_id ); assert_eq!( - msg.stub[10], 0, - "incorrect value for stub[10], expected 0, is {}", - msg.stub[10] + msg.header.tile_id, 5, + "incorrect value for header.tile_id, expected 5, is {}", + msg.header.tile_id ); assert_eq!( - msg.stub[11], 5, - "incorrect value for stub[11], expected 5, is {}", - msg.stub[11] + msg.header.tile_set_id, 4, + "incorrect value for header.tile_set_id, expected 4, is {}", + msg.header.tile_set_id ); assert_eq!( - msg.stub[12], 0, - "incorrect value for stub[12], expected 0, is {}", - msg.stub[12] - ); - assert_eq!( - msg.stub[13], 6, - "incorrect value for stub[13], expected 6, is {}", - msg.stub[13] - ); - assert_eq!( - msg.stub[14], 2, - "incorrect value for stub[14], expected 2, is {}", - msg.stub[14] - ); - assert_eq!( - msg.stub[15], 10, - "incorrect value for stub[15], expected 10, is {}", - msg.stub[15] - ); - assert_eq!( - msg.stub[16], 11, - "incorrect value for stub[16], expected 11, is {}", - msg.stub[16] - ); - assert_eq!( - msg.stub[17], 15, - "incorrect value for stub[17], expected 15, is {}", - msg.stub[17] - ); - assert_eq!( - msg.stub[18], 14, - "incorrect value for stub[18], expected 14, is {}", - msg.stub[18] + msg.n_faulty_los, 2, + "incorrect value for n_faulty_los, expected 2, is {}", + msg.n_faulty_los ); } _ => panic!("Invalid message type! Expected a MsgSsrFlagIonoTileSatLos"), diff --git a/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_satellites.rs b/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_satellites.rs index 268646855d..afe84fac45 100644 --- a/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_satellites.rs +++ b/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_satellites.rs @@ -42,79 +42,59 @@ fn test_auto_check_sbp_integrity_msg_ssr_flag_satellites() { sender_id ); assert_eq!( - msg.stub[0], 180, - "incorrect value for stub[0], expected 180, is {}", - msg.stub[0] + msg.chain_id, 4, + "incorrect value for chain_id, expected 4, is {}", + msg.chain_id ); assert_eq!( - msg.stub[1], 0, - "incorrect value for stub[1], expected 0, is {}", - msg.stub[1] + msg.const_id, 5, + "incorrect value for const_id, expected 5, is {}", + msg.const_id ); assert_eq!( - msg.stub[2], 0, - "incorrect value for stub[2], expected 0, is {}", - msg.stub[2] + msg.faulty_sats[0], 10, + "incorrect value for faulty_sats[0], expected 10, is {}", + msg.faulty_sats[0] ); assert_eq!( - msg.stub[3], 0, - "incorrect value for stub[3], expected 0, is {}", - msg.stub[3] + msg.faulty_sats[1], 11, + "incorrect value for faulty_sats[1], expected 11, is {}", + msg.faulty_sats[1] ); assert_eq!( - msg.stub[4], 3, - "incorrect value for stub[4], expected 3, is {}", - msg.stub[4] + msg.faulty_sats[2], 12, + "incorrect value for faulty_sats[2], expected 12, is {}", + msg.faulty_sats[2] ); assert_eq!( - msg.stub[5], 0, - "incorrect value for stub[5], expected 0, is {}", - msg.stub[5] + msg.n_faulty_sats, 3, + "incorrect value for n_faulty_sats, expected 3, is {}", + msg.n_faulty_sats ); assert_eq!( - msg.stub[6], 1, - "incorrect value for stub[6], expected 1, is {}", - msg.stub[6] + msg.num_msgs, 1, + "incorrect value for num_msgs, expected 1, is {}", + msg.num_msgs ); assert_eq!( - msg.stub[7], 2, - "incorrect value for stub[7], expected 2, is {}", - msg.stub[7] + msg.obs_time.tow, 180, + "incorrect value for obs_time.tow, expected 180, is {}", + msg.obs_time.tow ); assert_eq!( - msg.stub[8], 3, - "incorrect value for stub[8], expected 3, is {}", - msg.stub[8] + msg.obs_time.wn, 3, + "incorrect value for obs_time.wn, expected 3, is {}", + msg.obs_time.wn ); assert_eq!( - msg.stub[9], 4, - "incorrect value for stub[9], expected 4, is {}", - msg.stub[9] + msg.seq_num, 2, + "incorrect value for seq_num, expected 2, is {}", + msg.seq_num ); assert_eq!( - msg.stub[10], 5, - "incorrect value for stub[10], expected 5, is {}", - msg.stub[10] - ); - assert_eq!( - msg.stub[11], 3, - "incorrect value for stub[11], expected 3, is {}", - msg.stub[11] - ); - assert_eq!( - msg.stub[12], 10, - "incorrect value for stub[12], expected 10, is {}", - msg.stub[12] - ); - assert_eq!( - msg.stub[13], 11, - "incorrect value for stub[13], expected 11, is {}", - msg.stub[13] - ); - assert_eq!( - msg.stub[14], 12, - "incorrect value for stub[14], expected 12, is {}", - msg.stub[14] + msg.ssr_sol_id, 3, + "incorrect value for ssr_sol_id, expected 3, is {}", + msg.ssr_sol_id ); } _ => panic!("Invalid message type! Expected a MsgSsrFlagSatellites"), diff --git a/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_tropo_grid_points.rs b/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_tropo_grid_points.rs index a43ddbc987..ec2e647fed 100644 --- a/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_tropo_grid_points.rs +++ b/rust/sbp/tests/integration/auto_check_sbp_integrity_msg_ssr_flag_tropo_grid_points.rs @@ -43,109 +43,64 @@ fn test_auto_check_sbp_integrity_msg_ssr_flag_tropo_grid_points() { sender_id ); assert_eq!( - msg.stub[0], 180, - "incorrect value for stub[0], expected 180, is {}", - msg.stub[0] + msg.faulty_points[0], 10, + "incorrect value for faulty_points[0], expected 10, is {}", + msg.faulty_points[0] ); assert_eq!( - msg.stub[1], 0, - "incorrect value for stub[1], expected 0, is {}", - msg.stub[1] + msg.faulty_points[1], 11, + "incorrect value for faulty_points[1], expected 11, is {}", + msg.faulty_points[1] ); assert_eq!( - msg.stub[2], 0, - "incorrect value for stub[2], expected 0, is {}", - msg.stub[2] + msg.faulty_points[2], 12, + "incorrect value for faulty_points[2], expected 12, is {}", + msg.faulty_points[2] ); assert_eq!( - msg.stub[3], 0, - "incorrect value for stub[3], expected 0, is {}", - msg.stub[3] + msg.header.chain_id, 6, + "incorrect value for header.chain_id, expected 6, is {}", + msg.header.chain_id ); assert_eq!( - msg.stub[4], 3, - "incorrect value for stub[4], expected 3, is {}", - msg.stub[4] + msg.header.num_msgs, 1, + "incorrect value for header.num_msgs, expected 1, is {}", + msg.header.num_msgs ); assert_eq!( - msg.stub[5], 0, - "incorrect value for stub[5], expected 0, is {}", - msg.stub[5] + msg.header.obs_time.tow, 180, + "incorrect value for header.obs_time.tow, expected 180, is {}", + msg.header.obs_time.tow ); assert_eq!( - msg.stub[6], 1, - "incorrect value for stub[6], expected 1, is {}", - msg.stub[6] + msg.header.obs_time.wn, 3, + "incorrect value for header.obs_time.wn, expected 3, is {}", + msg.header.obs_time.wn ); assert_eq!( - msg.stub[7], 2, - "incorrect value for stub[7], expected 2, is {}", - msg.stub[7] + msg.header.seq_num, 2, + "incorrect value for header.seq_num, expected 2, is {}", + msg.header.seq_num ); assert_eq!( - msg.stub[8], 3, - "incorrect value for stub[8], expected 3, is {}", - msg.stub[8] + msg.header.ssr_sol_id, 3, + "incorrect value for header.ssr_sol_id, expected 3, is {}", + msg.header.ssr_sol_id ); assert_eq!( - msg.stub[9], 4, - "incorrect value for stub[9], expected 4, is {}", - msg.stub[9] + msg.header.tile_id, 5, + "incorrect value for header.tile_id, expected 5, is {}", + msg.header.tile_id ); assert_eq!( - msg.stub[10], 0, - "incorrect value for stub[10], expected 0, is {}", - msg.stub[10] + msg.header.tile_set_id, 4, + "incorrect value for header.tile_set_id, expected 4, is {}", + msg.header.tile_set_id ); assert_eq!( - msg.stub[11], 5, - "incorrect value for stub[11], expected 5, is {}", - msg.stub[11] - ); - assert_eq!( - msg.stub[12], 0, - "incorrect value for stub[12], expected 0, is {}", - msg.stub[12] - ); - assert_eq!( - msg.stub[13], 6, - "incorrect value for stub[13], expected 6, is {}", - msg.stub[13] - ); - assert_eq!( - msg.stub[14], 3, - "incorrect value for stub[14], expected 3, is {}", - msg.stub[14] - ); - assert_eq!( - msg.stub[15], 10, - "incorrect value for stub[15], expected 10, is {}", - msg.stub[15] - ); - assert_eq!( - msg.stub[16], 0, - "incorrect value for stub[16], expected 0, is {}", - msg.stub[16] - ); - assert_eq!( - msg.stub[17], 11, - "incorrect value for stub[17], expected 11, is {}", - msg.stub[17] - ); - assert_eq!( - msg.stub[18], 0, - "incorrect value for stub[18], expected 0, is {}", - msg.stub[18] - ); - assert_eq!( - msg.stub[19], 12, - "incorrect value for stub[19], expected 12, is {}", - msg.stub[19] - ); - assert_eq!( - msg.stub[20], 0, - "incorrect value for stub[20], expected 0, is {}", - msg.stub[20] + msg.n_faulty_points, 3, + "incorrect value for n_faulty_points, expected 3, is {}", + msg.n_faulty_points ); } _ => panic!("Invalid message type! Expected a MsgSsrFlagTropoGridPoints"), diff --git a/rust/sbp/tests/integration/auto_check_sbp_navigation_msg_reference_frame_param.rs b/rust/sbp/tests/integration/auto_check_sbp_navigation_msg_reference_frame_param.rs index 4891c85b12dbe23cfb79b06ec9870136505ec674..f2571b1aca46e0f5402c5bb01ae902f098eb1a8b 100644 GIT binary patch delta 1179 zcmb7DO-LJ25LP$QjmEUSRC-$j*2b*+llYTru?QB^f*=$Mmf{kV)h^hqW}j%39(wa8 zVUAMJvzLOW9((iTP4V7KFTHzo=Iy@CCY4ZgdGqtlH#6U4uP?g)nm?XPkdX?oD$T&L zG{)a$DG74yDy}N#lzIL;=12n-dy|!{JwsKdVS6wu3m^W>YE7q+Dh9|pA`1~@-GG}p zfkdZ?+(+cg2y)+mi+O=W2a%5}F0({O9BP8#$!HM1E$gj;)-oE$oNOz@F%I5G%lx?_ zJlKBzLll95dV2sn@e;3G+O$NW3_A zU~5JTtVZgs?5}O+5unD%fukkEH!vM{s;WWCpLu4Be3kvm%>=v&9g~?l#4>~49jR0@@fIh-#Z()j8+H^svP6I5;Ir=S{Gb9NtJ=4Ke) z#aCe-&l599X602N$-`ORHP?B*$hwtEwp=XcXuBi4*$fWqcEvACCuz{oz^vM{|E2&#ukwGRv{O z^9cW4#95xk=gU00fTpe@Xe%}MaefUAxcz50(i#Q-Or1xQF!eu`H=_*R1G{mvHOy{>ITST);9%Xq}c?fTBD(j$85`8$6Me^4;oH{21NsC{`u*GL!7qX>*Gi@XD4iDe2M}*2g?((c z30=V6!*^CY4&AzE0i#-arHjtSHr8zoU*I6Q#}xl->W$>-97$~+n1B*dtN-)`aV8aj=sZ- zGB55YbMw^JYK`1~W82FR7EW9bVK-8Ei9H23B9G4mw_y&e>JRIk+TJDjZnwMMhi>-_ zAD+DW!Y{&J9GIW~`C?3PAHodQ+I$-Qf3LW+fA~Bk%TIkw^M^%LJa|4<`26~#(S9)j z*H7$&kLGELI$4hqwo@{z!Goc|C|c)_$Nksa-euT9eR0&VbD9lNasdZA#)So2$<~jH z2jyjQpN5O#E6Ml9#I*vil<(DQJ$M~^KX!Y*N|^X!W4E88Z|=G4$!CY(!=?eqm*-!r z-{3{}F7sV@vqa~oCR>NxA%oT9y#w|XQU$jF{{CRU0LPF6hn3C?+;7widmINF_Z19#Ycv}LFAvSnh7rY|@#}FI5qYG|PqwH5F zrP%0@+F5-CKe)J`04z$8&%UKn-=zim(q%_0^4Ygs>dmgKQj1dLvu~-?n_bzY7M;jv z-!iE;yRt~F$fT6wzgCr9YDF@o6rWvLr&i=sO7Yp1jcP?or4*lCS*liKRZ8*MmAx8> zyhOF$g7m%vnzWw z5P6kSe0F881|qLgiqEd>)j;G`O7Yp1y&8zTN+~|OvR7*&uTqN54k=Zy)!R~kO7Yp1?OGR|w^EAFuI$#j=)9Fue0F88)!d6iOZc1WpuwIT8Nmkyk0jXIJ)WQ{+`j@!6HV+C;CiuclJUvBO(=yso7}O82#j zUVZV_A-n{SAAkL;@6D|%!SKE(KXzrWHbq{glpA;7>%frG9e4EV#yhK4Bfk3l#<*k3 zvBSHw{Kj3`t4)ztDdpI`$6eX0E%Yk;#to$$yYGD)NU6@5mdLA=a_qk24k=xBkyl%o z;Lx%d3#mo$n&AwlL+`z302KSKFfVRZ6khA*DL*ZIM?g z#b;OcY8wp+#RGN*ANg&Fw#clMa`4{l%4Thg&R8kMXID0B zTVz&B@!6Hl+D5bT-|$Q^2k-rcXNc*}c#&J%m~!ymGhW%PZPB%0O7Yp1-P#tpl~R0m zWw&AA8Lw>Dj>xW*a`4_WUfHf4(RnMS`0UDV?TFk;DL%Wh zTRZ4h{;ybi=t=`p6d%-gESudA2cKL#h5a_=rq<=G3JKf_qB^LWqgrqZB=xU7-P!# zbTZ4n4`{2HbHk4%9=+Cm%qj1H$ho#EI-$jwGQQ}P)>bj*hTnhoD{I$QMc!S-1o+zK zrE*J9l62>ozI|eAx63qPO;f+wuV1K1=3XlB#2wVNQOj4v~Kj$xv2r>6*#xLsPDS3~FD<~ILMX25z`s_ze53d`MN8`{ W`Q panic!("Invalid message type! Expected a MsgUtcLeapSecond"), diff --git a/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_code_phase_biases_bounds.rs b/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_code_phase_biases_bounds.rs index fbff80aa31..e94bf8663e 100644 --- a/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_code_phase_biases_bounds.rs +++ b/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_code_phase_biases_bounds.rs @@ -43,159 +43,91 @@ fn test_auto_check_sbp_ssr_msg_ssr_code_phase_biases_bounds() { sender_id ); assert_eq!( - msg.stub[0], 180, - "incorrect value for stub[0], expected 180, is {}", - msg.stub[0] + msg.const_id, 1, + "incorrect value for const_id, expected 1, is {}", + msg.const_id ); assert_eq!( - msg.stub[1], 0, - "incorrect value for stub[1], expected 0, is {}", - msg.stub[1] + msg.header.num_msgs, 1, + "incorrect value for header.num_msgs, expected 1, is {}", + msg.header.num_msgs ); assert_eq!( - msg.stub[2], 0, - "incorrect value for stub[2], expected 0, is {}", - msg.stub[2] + msg.header.seq_num, 2, + "incorrect value for header.seq_num, expected 2, is {}", + msg.header.seq_num ); assert_eq!( - msg.stub[3], 0, - "incorrect value for stub[3], expected 0, is {}", - msg.stub[3] + msg.header.sol_id, 14, + "incorrect value for header.sol_id, expected 14, is {}", + msg.header.sol_id ); assert_eq!( - msg.stub[4], 3, - "incorrect value for stub[4], expected 3, is {}", - msg.stub[4] + msg.header.time.tow, 180, + "incorrect value for header.time.tow, expected 180, is {}", + msg.header.time.tow ); assert_eq!( - msg.stub[5], 0, - "incorrect value for stub[5], expected 0, is {}", - msg.stub[5] + msg.header.time.wn, 3, + "incorrect value for header.time.wn, expected 3, is {}", + msg.header.time.wn ); assert_eq!( - msg.stub[6], 1, - "incorrect value for stub[6], expected 1, is {}", - msg.stub[6] + msg.header.update_interval, 1, + "incorrect value for header.update_interval, expected 1, is {}", + msg.header.update_interval ); assert_eq!( - msg.stub[7], 2, - "incorrect value for stub[7], expected 2, is {}", - msg.stub[7] + msg.n_sats_signals, 3, + "incorrect value for n_sats_signals, expected 3, is {}", + msg.n_sats_signals ); + assert_eq!(msg.satellites_signals[0].code_bias_bound_mu, 39, "incorrect value for satellites_signals[0].code_bias_bound_mu, expected 39, is {}", msg.satellites_signals[0].code_bias_bound_mu); + assert_eq!(msg.satellites_signals[0].code_bias_bound_sig, 1, "incorrect value for satellites_signals[0].code_bias_bound_sig, expected 1, is {}", msg.satellites_signals[0].code_bias_bound_sig); + assert_eq!(msg.satellites_signals[0].phase_bias_bound_mu, 39, "incorrect value for satellites_signals[0].phase_bias_bound_mu, expected 39, is {}", msg.satellites_signals[0].phase_bias_bound_mu); + assert_eq!(msg.satellites_signals[0].phase_bias_bound_sig, 1, "incorrect value for satellites_signals[0].phase_bias_bound_sig, expected 1, is {}", msg.satellites_signals[0].phase_bias_bound_sig); assert_eq!( - msg.stub[8], 1, - "incorrect value for stub[8], expected 1, is {}", - msg.stub[8] + msg.satellites_signals[0].sat_id, 0, + "incorrect value for satellites_signals[0].sat_id, expected 0, is {}", + msg.satellites_signals[0].sat_id ); assert_eq!( - msg.stub[9], 14, - "incorrect value for stub[9], expected 14, is {}", - msg.stub[9] + msg.satellites_signals[0].signal_id, 3, + "incorrect value for satellites_signals[0].signal_id, expected 3, is {}", + msg.satellites_signals[0].signal_id ); + assert_eq!(msg.satellites_signals[1].code_bias_bound_mu, 39, "incorrect value for satellites_signals[1].code_bias_bound_mu, expected 39, is {}", msg.satellites_signals[1].code_bias_bound_mu); + assert_eq!(msg.satellites_signals[1].code_bias_bound_sig, 1, "incorrect value for satellites_signals[1].code_bias_bound_sig, expected 1, is {}", msg.satellites_signals[1].code_bias_bound_sig); + assert_eq!(msg.satellites_signals[1].phase_bias_bound_mu, 39, "incorrect value for satellites_signals[1].phase_bias_bound_mu, expected 39, is {}", msg.satellites_signals[1].phase_bias_bound_mu); + assert_eq!(msg.satellites_signals[1].phase_bias_bound_sig, 1, "incorrect value for satellites_signals[1].phase_bias_bound_sig, expected 1, is {}", msg.satellites_signals[1].phase_bias_bound_sig); assert_eq!( - msg.stub[10], 15, - "incorrect value for stub[10], expected 15, is {}", - msg.stub[10] + msg.satellites_signals[1].sat_id, 1, + "incorrect value for satellites_signals[1].sat_id, expected 1, is {}", + msg.satellites_signals[1].sat_id ); assert_eq!( - msg.stub[11], 1, - "incorrect value for stub[11], expected 1, is {}", - msg.stub[11] + msg.satellites_signals[1].signal_id, 3, + "incorrect value for satellites_signals[1].signal_id, expected 3, is {}", + msg.satellites_signals[1].signal_id ); + assert_eq!(msg.satellites_signals[2].code_bias_bound_mu, 39, "incorrect value for satellites_signals[2].code_bias_bound_mu, expected 39, is {}", msg.satellites_signals[2].code_bias_bound_mu); + assert_eq!(msg.satellites_signals[2].code_bias_bound_sig, 1, "incorrect value for satellites_signals[2].code_bias_bound_sig, expected 1, is {}", msg.satellites_signals[2].code_bias_bound_sig); + assert_eq!(msg.satellites_signals[2].phase_bias_bound_mu, 39, "incorrect value for satellites_signals[2].phase_bias_bound_mu, expected 39, is {}", msg.satellites_signals[2].phase_bias_bound_mu); + assert_eq!(msg.satellites_signals[2].phase_bias_bound_sig, 1, "incorrect value for satellites_signals[2].phase_bias_bound_sig, expected 1, is {}", msg.satellites_signals[2].phase_bias_bound_sig); assert_eq!( - msg.stub[12], 3, - "incorrect value for stub[12], expected 3, is {}", - msg.stub[12] + msg.satellites_signals[2].sat_id, 1, + "incorrect value for satellites_signals[2].sat_id, expected 1, is {}", + msg.satellites_signals[2].sat_id ); assert_eq!( - msg.stub[13], 0, - "incorrect value for stub[13], expected 0, is {}", - msg.stub[13] + msg.satellites_signals[2].signal_id, 1, + "incorrect value for satellites_signals[2].signal_id, expected 1, is {}", + msg.satellites_signals[2].signal_id ); assert_eq!( - msg.stub[14], 3, - "incorrect value for stub[14], expected 3, is {}", - msg.stub[14] - ); - assert_eq!( - msg.stub[15], 39, - "incorrect value for stub[15], expected 39, is {}", - msg.stub[15] - ); - assert_eq!( - msg.stub[16], 1, - "incorrect value for stub[16], expected 1, is {}", - msg.stub[16] - ); - assert_eq!( - msg.stub[17], 39, - "incorrect value for stub[17], expected 39, is {}", - msg.stub[17] - ); - assert_eq!( - msg.stub[18], 1, - "incorrect value for stub[18], expected 1, is {}", - msg.stub[18] - ); - assert_eq!( - msg.stub[19], 1, - "incorrect value for stub[19], expected 1, is {}", - msg.stub[19] - ); - assert_eq!( - msg.stub[20], 3, - "incorrect value for stub[20], expected 3, is {}", - msg.stub[20] - ); - assert_eq!( - msg.stub[21], 39, - "incorrect value for stub[21], expected 39, is {}", - msg.stub[21] - ); - assert_eq!( - msg.stub[22], 1, - "incorrect value for stub[22], expected 1, is {}", - msg.stub[22] - ); - assert_eq!( - msg.stub[23], 39, - "incorrect value for stub[23], expected 39, is {}", - msg.stub[23] - ); - assert_eq!( - msg.stub[24], 1, - "incorrect value for stub[24], expected 1, is {}", - msg.stub[24] - ); - assert_eq!( - msg.stub[25], 1, - "incorrect value for stub[25], expected 1, is {}", - msg.stub[25] - ); - assert_eq!( - msg.stub[26], 1, - "incorrect value for stub[26], expected 1, is {}", - msg.stub[26] - ); - assert_eq!( - msg.stub[27], 39, - "incorrect value for stub[27], expected 39, is {}", - msg.stub[27] - ); - assert_eq!( - msg.stub[28], 1, - "incorrect value for stub[28], expected 1, is {}", - msg.stub[28] - ); - assert_eq!( - msg.stub[29], 39, - "incorrect value for stub[29], expected 39, is {}", - msg.stub[29] - ); - assert_eq!( - msg.stub[30], 1, - "incorrect value for stub[30], expected 1, is {}", - msg.stub[30] + msg.ssr_iod, 15, + "incorrect value for ssr_iod, expected 15, is {}", + msg.ssr_iod ); } _ => panic!("Invalid message type! Expected a MsgSsrCodePhaseBiasesBounds"), 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 index dda7f5597a..53882576e2 100644 --- 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 @@ -17,9 +17,9 @@ use crate::*; 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, + 85, 254, 5, 66, 0, 45, 180, 0, 0, 0, 3, 0, 1, 1, 10, 0, 15, 1, 0, 10, 0, 39, 232, 3, + 244, 1, 100, 200, 150, 100, 150, 100, 2, 5, 10, 16, 0, 17, 18, 19, 20, 21, 6, 10, 22, + 0, 23, 24, 25, 26, 27, 119, 82, ]); // Test the round trip payload parsing @@ -44,219 +44,155 @@ fn test_auto_check_sbp_ssr_msg_ssr_gridded_correction_bounds() { sender_id ); assert_eq!( - msg.stub[0], 180, - "incorrect value for stub[0], expected 180, is {}", - msg.stub[0] + msg.grid_point_id, 1000, + "incorrect value for grid_point_id, expected 1000, is {}", + msg.grid_point_id ); assert_eq!( - msg.stub[1], 0, - "incorrect value for stub[1], expected 0, is {}", - msg.stub[1] + msg.header.num_msgs, 1, + "incorrect value for header.num_msgs, expected 1, is {}", + msg.header.num_msgs ); assert_eq!( - msg.stub[2], 0, - "incorrect value for stub[2], expected 0, is {}", - msg.stub[2] + msg.header.seq_num, 1, + "incorrect value for header.seq_num, expected 1, is {}", + msg.header.seq_num ); assert_eq!( - msg.stub[3], 0, - "incorrect value for stub[3], expected 0, is {}", - msg.stub[3] + msg.header.sol_id, 0, + "incorrect value for header.sol_id, expected 0, is {}", + msg.header.sol_id ); assert_eq!( - msg.stub[4], 3, - "incorrect value for stub[4], expected 3, is {}", - msg.stub[4] + msg.header.time.tow, 180, + "incorrect value for header.time.tow, expected 180, is {}", + msg.header.time.tow ); assert_eq!( - msg.stub[5], 0, - "incorrect value for stub[5], expected 0, is {}", - msg.stub[5] + msg.header.time.wn, 3, + "incorrect value for header.time.wn, expected 3, is {}", + msg.header.time.wn ); assert_eq!( - msg.stub[6], 1, - "incorrect value for stub[6], expected 1, is {}", - msg.stub[6] + msg.header.update_interval, 10, + "incorrect value for header.update_interval, expected 10, is {}", + msg.header.update_interval ); assert_eq!( - msg.stub[7], 1, - "incorrect value for stub[7], expected 1, is {}", - msg.stub[7] + msg.n_sats, 2, + "incorrect value for n_sats, expected 2, is {}", + msg.n_sats ); assert_eq!( - msg.stub[8], 10, - "incorrect value for stub[8], expected 10, is {}", - msg.stub[8] + msg.ssr_iod_atmo, 15, + "incorrect value for ssr_iod_atmo, expected 15, is {}", + msg.ssr_iod_atmo ); assert_eq!( - msg.stub[9], 0, - "incorrect value for stub[9], expected 0, is {}", - msg.stub[9] + 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.stub[10], 15, - "incorrect value for stub[10], expected 15, is {}", - msg.stub[10] + 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.stub[11], 1, - "incorrect value for stub[11], expected 1, is {}", - msg.stub[11] + 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.stub[12], 0, - "incorrect value for stub[12], expected 0, is {}", - msg.stub[12] + 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.stub[13], 10, - "incorrect value for stub[13], expected 10, is {}", - msg.stub[13] + 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.stub[14], 0, - "incorrect value for stub[14], expected 0, is {}", - msg.stub[14] + 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.stub[15], 39, - "incorrect value for stub[15], expected 39, is {}", - msg.stub[15] + 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.stub[16], 232, - "incorrect value for stub[16], expected 232, is {}", - msg.stub[16] + 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.stub[17], 3, - "incorrect value for stub[17], expected 3, is {}", - msg.stub[17] + 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.stub[18], 244, - "incorrect value for stub[18], expected 244, is {}", - msg.stub[18] + 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.stub[19], 1, - "incorrect value for stub[19], expected 1, is {}", - msg.stub[19] + msg.tile_id, 10, + "incorrect value for tile_id, expected 10, is {}", + msg.tile_id ); assert_eq!( - msg.stub[20], 100, - "incorrect value for stub[20], expected 100, is {}", - msg.stub[20] + msg.tile_set_id, 1, + "incorrect value for tile_set_id, expected 1, is {}", + msg.tile_set_id ); assert_eq!( - msg.stub[21], 200, - "incorrect value for stub[21], expected 200, is {}", - msg.stub[21] + msg.tropo_delay_correction.hydro, 500, + "incorrect value for tropo_delay_correction.hydro, expected 500, is {}", + msg.tropo_delay_correction.hydro ); assert_eq!( - msg.stub[22], 150, - "incorrect value for stub[22], expected 150, is {}", - msg.stub[22] + msg.tropo_delay_correction.stddev, 200, + "incorrect value for tropo_delay_correction.stddev, expected 200, is {}", + msg.tropo_delay_correction.stddev ); assert_eq!( - msg.stub[23], 100, - "incorrect value for stub[23], expected 100, is {}", - msg.stub[23] + msg.tropo_delay_correction.wet, 100, + "incorrect value for tropo_delay_correction.wet, expected 100, is {}", + msg.tropo_delay_correction.wet ); assert_eq!( - msg.stub[24], 2, - "incorrect value for stub[24], expected 2, is {}", - msg.stub[24] + msg.tropo_qi, 39, + "incorrect value for tropo_qi, expected 39, is {}", + msg.tropo_qi ); assert_eq!( - msg.stub[25], 5, - "incorrect value for stub[25], expected 5, is {}", - msg.stub[25] + msg.tropo_v_hydro_bound_mu, 150, + "incorrect value for tropo_v_hydro_bound_mu, expected 150, is {}", + msg.tropo_v_hydro_bound_mu ); assert_eq!( - msg.stub[26], 10, - "incorrect value for stub[26], expected 10, is {}", - msg.stub[26] + msg.tropo_v_hydro_bound_sig, 100, + "incorrect value for tropo_v_hydro_bound_sig, expected 100, is {}", + msg.tropo_v_hydro_bound_sig ); assert_eq!( - msg.stub[27], 16, - "incorrect value for stub[27], expected 16, is {}", - msg.stub[27] + msg.tropo_v_wet_bound_mu, 150, + "incorrect value for tropo_v_wet_bound_mu, expected 150, is {}", + msg.tropo_v_wet_bound_mu ); assert_eq!( - msg.stub[28], 0, - "incorrect value for stub[28], expected 0, is {}", - msg.stub[28] - ); - assert_eq!( - msg.stub[29], 17, - "incorrect value for stub[29], expected 17, is {}", - msg.stub[29] - ); - assert_eq!( - msg.stub[30], 18, - "incorrect value for stub[30], expected 18, is {}", - msg.stub[30] - ); - assert_eq!( - msg.stub[31], 19, - "incorrect value for stub[31], expected 19, is {}", - msg.stub[31] - ); - assert_eq!( - msg.stub[32], 20, - "incorrect value for stub[32], expected 20, is {}", - msg.stub[32] - ); - assert_eq!( - msg.stub[33], 21, - "incorrect value for stub[33], expected 21, is {}", - msg.stub[33] - ); - assert_eq!( - msg.stub[34], 6, - "incorrect value for stub[34], expected 6, is {}", - msg.stub[34] - ); - assert_eq!( - msg.stub[35], 10, - "incorrect value for stub[35], expected 10, is {}", - msg.stub[35] - ); - assert_eq!( - msg.stub[36], 22, - "incorrect value for stub[36], expected 22, is {}", - msg.stub[36] - ); - assert_eq!( - msg.stub[37], 0, - "incorrect value for stub[37], expected 0, is {}", - msg.stub[37] - ); - assert_eq!( - msg.stub[38], 23, - "incorrect value for stub[38], expected 23, is {}", - msg.stub[38] - ); - assert_eq!( - msg.stub[39], 24, - "incorrect value for stub[39], expected 24, is {}", - msg.stub[39] - ); - assert_eq!( - msg.stub[40], 25, - "incorrect value for stub[40], expected 25, is {}", - msg.stub[40] - ); - assert_eq!( - msg.stub[41], 26, - "incorrect value for stub[41], expected 26, is {}", - msg.stub[41] - ); - assert_eq!( - msg.stub[42], 27, - "incorrect value for stub[42], expected 27, is {}", - msg.stub[42] + msg.tropo_v_wet_bound_sig, 100, + "incorrect value for tropo_v_wet_bound_sig, expected 100, is {}", + msg.tropo_v_wet_bound_sig ); } _ => panic!("Invalid message type! Expected a MsgSsrGriddedCorrectionBounds"), diff --git a/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_orbit_clock_bounds.rs b/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_orbit_clock_bounds.rs index 65bd7dc225..325450dc49 100644 --- a/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_orbit_clock_bounds.rs +++ b/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_orbit_clock_bounds.rs @@ -43,159 +43,91 @@ fn test_auto_check_sbp_ssr_msg_ssr_orbit_clock_bounds() { sender_id ); assert_eq!( - msg.stub[0], 180, - "incorrect value for stub[0], expected 180, is {}", - msg.stub[0] + msg.const_id, 1, + "incorrect value for const_id, expected 1, is {}", + msg.const_id ); assert_eq!( - msg.stub[1], 0, - "incorrect value for stub[1], expected 0, is {}", - msg.stub[1] + msg.header.num_msgs, 1, + "incorrect value for header.num_msgs, expected 1, is {}", + msg.header.num_msgs ); assert_eq!( - msg.stub[2], 0, - "incorrect value for stub[2], expected 0, is {}", - msg.stub[2] + msg.header.seq_num, 2, + "incorrect value for header.seq_num, expected 2, is {}", + msg.header.seq_num ); assert_eq!( - msg.stub[3], 0, - "incorrect value for stub[3], expected 0, is {}", - msg.stub[3] + msg.header.sol_id, 48, + "incorrect value for header.sol_id, expected 48, is {}", + msg.header.sol_id ); assert_eq!( - msg.stub[4], 3, - "incorrect value for stub[4], expected 3, is {}", - msg.stub[4] + msg.header.time.tow, 180, + "incorrect value for header.time.tow, expected 180, is {}", + msg.header.time.tow ); assert_eq!( - msg.stub[5], 0, - "incorrect value for stub[5], expected 0, is {}", - msg.stub[5] + msg.header.time.wn, 3, + "incorrect value for header.time.wn, expected 3, is {}", + msg.header.time.wn ); assert_eq!( - msg.stub[6], 1, - "incorrect value for stub[6], expected 1, is {}", - msg.stub[6] + msg.header.update_interval, 3, + "incorrect value for header.update_interval, expected 3, is {}", + msg.header.update_interval ); assert_eq!( - msg.stub[7], 2, - "incorrect value for stub[7], expected 2, is {}", - msg.stub[7] + msg.n_sats, 2, + "incorrect value for n_sats, expected 2, is {}", + msg.n_sats ); assert_eq!( - msg.stub[8], 3, - "incorrect value for stub[8], expected 3, is {}", - msg.stub[8] + msg.orbit_clock_bounds[0].clock_bound_mu, 39, + "incorrect value for orbit_clock_bounds[0].clock_bound_mu, expected 39, is {}", + msg.orbit_clock_bounds[0].clock_bound_mu ); assert_eq!( - msg.stub[9], 48, - "incorrect value for stub[9], expected 48, is {}", - msg.stub[9] + msg.orbit_clock_bounds[0].clock_bound_sig, 1, + "incorrect value for orbit_clock_bounds[0].clock_bound_sig, expected 1, is {}", + msg.orbit_clock_bounds[0].clock_bound_sig ); + assert_eq!(msg.orbit_clock_bounds[0].orb_along_bound_mu, 38, "incorrect value for orbit_clock_bounds[0].orb_along_bound_mu, expected 38, is {}", msg.orbit_clock_bounds[0].orb_along_bound_mu); + assert_eq!(msg.orbit_clock_bounds[0].orb_along_bound_sig, 2, "incorrect value for orbit_clock_bounds[0].orb_along_bound_sig, expected 2, is {}", msg.orbit_clock_bounds[0].orb_along_bound_sig); + assert_eq!(msg.orbit_clock_bounds[0].orb_cross_bound_mu, 37, "incorrect value for orbit_clock_bounds[0].orb_cross_bound_mu, expected 37, is {}", msg.orbit_clock_bounds[0].orb_cross_bound_mu); + assert_eq!(msg.orbit_clock_bounds[0].orb_cross_bound_sig, 3, "incorrect value for orbit_clock_bounds[0].orb_cross_bound_sig, expected 3, is {}", msg.orbit_clock_bounds[0].orb_cross_bound_sig); + assert_eq!(msg.orbit_clock_bounds[0].orb_radial_bound_mu, 39, "incorrect value for orbit_clock_bounds[0].orb_radial_bound_mu, expected 39, is {}", msg.orbit_clock_bounds[0].orb_radial_bound_mu); + assert_eq!(msg.orbit_clock_bounds[0].orb_radial_bound_sig, 1, "incorrect value for orbit_clock_bounds[0].orb_radial_bound_sig, expected 1, is {}", msg.orbit_clock_bounds[0].orb_radial_bound_sig); assert_eq!( - msg.stub[10], 15, - "incorrect value for stub[10], expected 15, is {}", - msg.stub[10] + msg.orbit_clock_bounds[0].sat_id, 24, + "incorrect value for orbit_clock_bounds[0].sat_id, expected 24, is {}", + msg.orbit_clock_bounds[0].sat_id ); assert_eq!( - msg.stub[11], 1, - "incorrect value for stub[11], expected 1, is {}", - msg.stub[11] + msg.orbit_clock_bounds[1].clock_bound_mu, 39, + "incorrect value for orbit_clock_bounds[1].clock_bound_mu, expected 39, is {}", + msg.orbit_clock_bounds[1].clock_bound_mu ); assert_eq!( - msg.stub[12], 2, - "incorrect value for stub[12], expected 2, is {}", - msg.stub[12] + msg.orbit_clock_bounds[1].clock_bound_sig, 1, + "incorrect value for orbit_clock_bounds[1].clock_bound_sig, expected 1, is {}", + msg.orbit_clock_bounds[1].clock_bound_sig ); + assert_eq!(msg.orbit_clock_bounds[1].orb_along_bound_mu, 38, "incorrect value for orbit_clock_bounds[1].orb_along_bound_mu, expected 38, is {}", msg.orbit_clock_bounds[1].orb_along_bound_mu); + assert_eq!(msg.orbit_clock_bounds[1].orb_along_bound_sig, 2, "incorrect value for orbit_clock_bounds[1].orb_along_bound_sig, expected 2, is {}", msg.orbit_clock_bounds[1].orb_along_bound_sig); + assert_eq!(msg.orbit_clock_bounds[1].orb_cross_bound_mu, 37, "incorrect value for orbit_clock_bounds[1].orb_cross_bound_mu, expected 37, is {}", msg.orbit_clock_bounds[1].orb_cross_bound_mu); + assert_eq!(msg.orbit_clock_bounds[1].orb_cross_bound_sig, 3, "incorrect value for orbit_clock_bounds[1].orb_cross_bound_sig, expected 3, is {}", msg.orbit_clock_bounds[1].orb_cross_bound_sig); + assert_eq!(msg.orbit_clock_bounds[1].orb_radial_bound_mu, 39, "incorrect value for orbit_clock_bounds[1].orb_radial_bound_mu, expected 39, is {}", msg.orbit_clock_bounds[1].orb_radial_bound_mu); + assert_eq!(msg.orbit_clock_bounds[1].orb_radial_bound_sig, 1, "incorrect value for orbit_clock_bounds[1].orb_radial_bound_sig, expected 1, is {}", msg.orbit_clock_bounds[1].orb_radial_bound_sig); assert_eq!( - msg.stub[13], 24, - "incorrect value for stub[13], expected 24, is {}", - msg.stub[13] + msg.orbit_clock_bounds[1].sat_id, 3, + "incorrect value for orbit_clock_bounds[1].sat_id, expected 3, is {}", + msg.orbit_clock_bounds[1].sat_id ); assert_eq!( - msg.stub[14], 39, - "incorrect value for stub[14], expected 39, is {}", - msg.stub[14] - ); - assert_eq!( - msg.stub[15], 38, - "incorrect value for stub[15], expected 38, is {}", - msg.stub[15] - ); - assert_eq!( - msg.stub[16], 37, - "incorrect value for stub[16], expected 37, is {}", - msg.stub[16] - ); - assert_eq!( - msg.stub[17], 1, - "incorrect value for stub[17], expected 1, is {}", - msg.stub[17] - ); - assert_eq!( - msg.stub[18], 2, - "incorrect value for stub[18], expected 2, is {}", - msg.stub[18] - ); - assert_eq!( - msg.stub[19], 3, - "incorrect value for stub[19], expected 3, is {}", - msg.stub[19] - ); - assert_eq!( - msg.stub[20], 39, - "incorrect value for stub[20], expected 39, is {}", - msg.stub[20] - ); - assert_eq!( - msg.stub[21], 1, - "incorrect value for stub[21], expected 1, is {}", - msg.stub[21] - ); - assert_eq!( - msg.stub[22], 3, - "incorrect value for stub[22], expected 3, is {}", - msg.stub[22] - ); - assert_eq!( - msg.stub[23], 39, - "incorrect value for stub[23], expected 39, is {}", - msg.stub[23] - ); - assert_eq!( - msg.stub[24], 38, - "incorrect value for stub[24], expected 38, is {}", - msg.stub[24] - ); - assert_eq!( - msg.stub[25], 37, - "incorrect value for stub[25], expected 37, is {}", - msg.stub[25] - ); - assert_eq!( - msg.stub[26], 1, - "incorrect value for stub[26], expected 1, is {}", - msg.stub[26] - ); - assert_eq!( - msg.stub[27], 2, - "incorrect value for stub[27], expected 2, is {}", - msg.stub[27] - ); - assert_eq!( - msg.stub[28], 3, - "incorrect value for stub[28], expected 3, is {}", - msg.stub[28] - ); - assert_eq!( - msg.stub[29], 39, - "incorrect value for stub[29], expected 39, is {}", - msg.stub[29] - ); - assert_eq!( - msg.stub[30], 1, - "incorrect value for stub[30], expected 1, is {}", - msg.stub[30] + msg.ssr_iod, 15, + "incorrect value for ssr_iod, expected 15, is {}", + msg.ssr_iod ); } _ => panic!("Invalid message type! Expected a MsgSsrOrbitClockBounds"), diff --git a/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_orbit_clock_bounds_degradation.rs b/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_orbit_clock_bounds_degradation.rs index cec3090bfa..9f7539000e 100644 --- a/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_orbit_clock_bounds_degradation.rs +++ b/rust/sbp/tests/integration/auto_check_sbp_ssr_msg_ssr_orbit_clock_bounds_degradation.rs @@ -43,144 +43,57 @@ fn test_auto_check_sbp_ssr_msg_ssr_orbit_clock_bounds_degradation() { sender_id ); assert_eq!( - msg.stub[0], 180, - "incorrect value for stub[0], expected 180, is {}", - msg.stub[0] + msg.const_id, 1, + "incorrect value for const_id, expected 1, is {}", + msg.const_id ); assert_eq!( - msg.stub[1], 0, - "incorrect value for stub[1], expected 0, is {}", - msg.stub[1] + msg.header.num_msgs, 1, + "incorrect value for header.num_msgs, expected 1, is {}", + msg.header.num_msgs ); assert_eq!( - msg.stub[2], 0, - "incorrect value for stub[2], expected 0, is {}", - msg.stub[2] + msg.header.seq_num, 2, + "incorrect value for header.seq_num, expected 2, is {}", + msg.header.seq_num ); assert_eq!( - msg.stub[3], 0, - "incorrect value for stub[3], expected 0, is {}", - msg.stub[3] + msg.header.sol_id, 48, + "incorrect value for header.sol_id, expected 48, is {}", + msg.header.sol_id ); assert_eq!( - msg.stub[4], 3, - "incorrect value for stub[4], expected 3, is {}", - msg.stub[4] + msg.header.time.tow, 180, + "incorrect value for header.time.tow, expected 180, is {}", + msg.header.time.tow ); assert_eq!( - msg.stub[5], 0, - "incorrect value for stub[5], expected 0, is {}", - msg.stub[5] + msg.header.time.wn, 3, + "incorrect value for header.time.wn, expected 3, is {}", + msg.header.time.wn ); assert_eq!( - msg.stub[6], 1, - "incorrect value for stub[6], expected 1, is {}", - msg.stub[6] + msg.header.update_interval, 3, + "incorrect value for header.update_interval, expected 3, is {}", + msg.header.update_interval ); + assert_eq!(msg.orbit_clock_bounds_degradation.clock_bound_mu_dot, 194, "incorrect value for orbit_clock_bounds_degradation.clock_bound_mu_dot, expected 194, is {}", msg.orbit_clock_bounds_degradation.clock_bound_mu_dot); + assert_eq!(msg.orbit_clock_bounds_degradation.clock_bound_sig_dot, 193, "incorrect value for orbit_clock_bounds_degradation.clock_bound_sig_dot, expected 193, is {}", msg.orbit_clock_bounds_degradation.clock_bound_sig_dot); + assert_eq!(msg.orbit_clock_bounds_degradation.orb_along_bound_mu_dot, 199, "incorrect value for orbit_clock_bounds_degradation.orb_along_bound_mu_dot, expected 199, is {}", msg.orbit_clock_bounds_degradation.orb_along_bound_mu_dot); + assert_eq!(msg.orbit_clock_bounds_degradation.orb_along_bound_sig_dot, 196, "incorrect value for orbit_clock_bounds_degradation.orb_along_bound_sig_dot, expected 196, is {}", msg.orbit_clock_bounds_degradation.orb_along_bound_sig_dot); + assert_eq!(msg.orbit_clock_bounds_degradation.orb_cross_bound_mu_dot, 198, "incorrect value for orbit_clock_bounds_degradation.orb_cross_bound_mu_dot, expected 198, is {}", msg.orbit_clock_bounds_degradation.orb_cross_bound_mu_dot); + assert_eq!(msg.orbit_clock_bounds_degradation.orb_cross_bound_sig_dot, 195, "incorrect value for orbit_clock_bounds_degradation.orb_cross_bound_sig_dot, expected 195, is {}", msg.orbit_clock_bounds_degradation.orb_cross_bound_sig_dot); + assert_eq!(msg.orbit_clock_bounds_degradation.orb_radial_bound_mu_dot, 200, "incorrect value for orbit_clock_bounds_degradation.orb_radial_bound_mu_dot, expected 200, is {}", msg.orbit_clock_bounds_degradation.orb_radial_bound_mu_dot); + assert_eq!(msg.orbit_clock_bounds_degradation.orb_radial_bound_sig_dot, 197, "incorrect value for orbit_clock_bounds_degradation.orb_radial_bound_sig_dot, expected 197, is {}", msg.orbit_clock_bounds_degradation.orb_radial_bound_sig_dot); assert_eq!( - msg.stub[7], 2, - "incorrect value for stub[7], expected 2, is {}", - msg.stub[7] + msg.sat_bitmask, 10, + "incorrect value for sat_bitmask, expected 10, is {}", + msg.sat_bitmask ); assert_eq!( - msg.stub[8], 3, - "incorrect value for stub[8], expected 3, is {}", - msg.stub[8] - ); - assert_eq!( - msg.stub[9], 48, - "incorrect value for stub[9], expected 48, is {}", - msg.stub[9] - ); - assert_eq!( - msg.stub[10], 15, - "incorrect value for stub[10], expected 15, is {}", - msg.stub[10] - ); - assert_eq!( - msg.stub[11], 1, - "incorrect value for stub[11], expected 1, is {}", - msg.stub[11] - ); - assert_eq!( - msg.stub[12], 10, - "incorrect value for stub[12], expected 10, is {}", - msg.stub[12] - ); - assert_eq!( - msg.stub[13], 0, - "incorrect value for stub[13], expected 0, is {}", - msg.stub[13] - ); - assert_eq!( - msg.stub[14], 0, - "incorrect value for stub[14], expected 0, is {}", - msg.stub[14] - ); - assert_eq!( - msg.stub[15], 0, - "incorrect value for stub[15], expected 0, is {}", - msg.stub[15] - ); - assert_eq!( - msg.stub[16], 0, - "incorrect value for stub[16], expected 0, is {}", - msg.stub[16] - ); - assert_eq!( - msg.stub[17], 0, - "incorrect value for stub[17], expected 0, is {}", - msg.stub[17] - ); - assert_eq!( - msg.stub[18], 0, - "incorrect value for stub[18], expected 0, is {}", - msg.stub[18] - ); - assert_eq!( - msg.stub[19], 0, - "incorrect value for stub[19], expected 0, is {}", - msg.stub[19] - ); - assert_eq!( - msg.stub[20], 200, - "incorrect value for stub[20], expected 200, is {}", - msg.stub[20] - ); - assert_eq!( - msg.stub[21], 199, - "incorrect value for stub[21], expected 199, is {}", - msg.stub[21] - ); - assert_eq!( - msg.stub[22], 198, - "incorrect value for stub[22], expected 198, is {}", - msg.stub[22] - ); - assert_eq!( - msg.stub[23], 197, - "incorrect value for stub[23], expected 197, is {}", - msg.stub[23] - ); - assert_eq!( - msg.stub[24], 196, - "incorrect value for stub[24], expected 196, is {}", - msg.stub[24] - ); - assert_eq!( - msg.stub[25], 195, - "incorrect value for stub[25], expected 195, is {}", - msg.stub[25] - ); - assert_eq!( - msg.stub[26], 194, - "incorrect value for stub[26], expected 194, is {}", - msg.stub[26] - ); - assert_eq!( - msg.stub[27], 193, - "incorrect value for stub[27], expected 193, is {}", - msg.stub[27] + msg.ssr_iod, 15, + "incorrect value for ssr_iod, expected 15, is {}", + msg.ssr_iod ); } _ => panic!("Invalid message type! Expected a MsgSsrOrbitClockBoundsDegradation"), 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 index 59fec93822..6c84a0ca11 100644 --- 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 @@ -43,194 +43,116 @@ fn test_auto_check_sbp_ssr_msg_ssr_stec_correction() { sender_id ); assert_eq!( - msg.stub[0], 180, - "incorrect value for stub[0], expected 180, is {}", - msg.stub[0] + msg.header.num_msgs, 1, + "incorrect value for header.num_msgs, expected 1, is {}", + msg.header.num_msgs ); assert_eq!( - msg.stub[1], 0, - "incorrect value for stub[1], expected 0, is {}", - msg.stub[1] + msg.header.seq_num, 1, + "incorrect value for header.seq_num, expected 1, is {}", + msg.header.seq_num ); assert_eq!( - msg.stub[2], 0, - "incorrect value for stub[2], expected 0, is {}", - msg.stub[2] + msg.header.sol_id, 0, + "incorrect value for header.sol_id, expected 0, is {}", + msg.header.sol_id ); assert_eq!( - msg.stub[3], 0, - "incorrect value for stub[3], expected 0, is {}", - msg.stub[3] + msg.header.time.tow, 180, + "incorrect value for header.time.tow, expected 180, is {}", + msg.header.time.tow ); assert_eq!( - msg.stub[4], 3, - "incorrect value for stub[4], expected 3, is {}", - msg.stub[4] + msg.header.time.wn, 3, + "incorrect value for header.time.wn, expected 3, is {}", + msg.header.time.wn ); assert_eq!( - msg.stub[5], 0, - "incorrect value for stub[5], expected 0, is {}", - msg.stub[5] + msg.header.update_interval, 10, + "incorrect value for header.update_interval, expected 10, is {}", + msg.header.update_interval ); assert_eq!( - msg.stub[6], 1, - "incorrect value for stub[6], expected 1, is {}", - msg.stub[6] + msg.n_sats, 2, + "incorrect value for n_sats, expected 2, is {}", + msg.n_sats ); assert_eq!( - msg.stub[7], 1, - "incorrect value for stub[7], expected 1, is {}", - msg.stub[7] + msg.ssr_iod_atmo, 15, + "incorrect value for ssr_iod_atmo, expected 15, is {}", + msg.ssr_iod_atmo ); assert_eq!( - msg.stub[8], 10, - "incorrect value for stub[8], expected 10, is {}", - msg.stub[8] + 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.stub[9], 0, - "incorrect value for stub[9], expected 0, is {}", - msg.stub[9] + 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.stub[10], 15, - "incorrect value for stub[10], expected 15, is {}", - msg.stub[10] + 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.stub[11], 1, - "incorrect value for stub[11], expected 1, is {}", - msg.stub[11] + 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.stub[12], 0, - "incorrect value for stub[12], expected 0, is {}", - msg.stub[12] + 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.stub[13], 10, - "incorrect value for stub[13], expected 10, is {}", - msg.stub[13] + 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.stub[14], 0, - "incorrect value for stub[14], expected 0, is {}", - msg.stub[14] + 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.stub[15], 2, - "incorrect value for stub[15], expected 2, is {}", - msg.stub[15] + 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.stub[16], 1, - "incorrect value for stub[16], expected 1, is {}", - msg.stub[16] + 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.stub[17], 1, - "incorrect value for stub[17], expected 1, is {}", - msg.stub[17] + 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.stub[18], 1, - "incorrect value for stub[18], expected 1, is {}", - msg.stub[18] + 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.stub[19], 63, - "incorrect value for stub[19], expected 63, is {}", - msg.stub[19] + 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.stub[20], 0, - "incorrect value for stub[20], expected 0, is {}", - msg.stub[20] + msg.tile_id, 10, + "incorrect value for tile_id, expected 10, is {}", + msg.tile_id ); assert_eq!( - msg.stub[21], 62, - "incorrect value for stub[21], expected 62, is {}", - msg.stub[21] - ); - assert_eq!( - msg.stub[22], 0, - "incorrect value for stub[22], expected 0, is {}", - msg.stub[22] - ); - assert_eq!( - msg.stub[23], 61, - "incorrect value for stub[23], expected 61, is {}", - msg.stub[23] - ); - assert_eq!( - msg.stub[24], 0, - "incorrect value for stub[24], expected 0, is {}", - msg.stub[24] - ); - assert_eq!( - msg.stub[25], 60, - "incorrect value for stub[25], expected 60, is {}", - msg.stub[25] - ); - assert_eq!( - msg.stub[26], 0, - "incorrect value for stub[26], expected 0, is {}", - msg.stub[26] - ); - assert_eq!( - msg.stub[27], 31, - "incorrect value for stub[27], expected 31, is {}", - msg.stub[27] - ); - assert_eq!( - msg.stub[28], 15, - "incorrect value for stub[28], expected 15, is {}", - msg.stub[28] - ); - assert_eq!( - msg.stub[29], 5, - "incorrect value for stub[29], expected 5, is {}", - msg.stub[29] - ); - assert_eq!( - msg.stub[30], 63, - "incorrect value for stub[30], expected 63, is {}", - msg.stub[30] - ); - assert_eq!( - msg.stub[31], 0, - "incorrect value for stub[31], expected 0, is {}", - msg.stub[31] - ); - assert_eq!( - msg.stub[32], 64, - "incorrect value for stub[32], expected 64, is {}", - msg.stub[32] - ); - assert_eq!( - msg.stub[33], 0, - "incorrect value for stub[33], expected 0, is {}", - msg.stub[33] - ); - assert_eq!( - msg.stub[34], 65, - "incorrect value for stub[34], expected 65, is {}", - msg.stub[34] - ); - assert_eq!( - msg.stub[35], 0, - "incorrect value for stub[35], expected 0, is {}", - msg.stub[35] - ); - assert_eq!( - msg.stub[36], 66, - "incorrect value for stub[36], expected 66, is {}", - msg.stub[36] - ); - assert_eq!( - msg.stub[37], 0, - "incorrect value for stub[37], expected 0, is {}", - msg.stub[37] + 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"), 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 index fd4631733a..0759f5c936 100644 --- 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 @@ -43,129 +43,54 @@ fn test_auto_check_sbp_ssr_msg_ssr_tile_definition() { sender_id ); assert_eq!( - msg.stub[0], 31, - "incorrect value for stub[0], expected 31, is {}", - msg.stub[0] + msg.bitmask, 1234567890, + "incorrect value for bitmask, expected 1234567890, is {}", + msg.bitmask ); assert_eq!( - msg.stub[1], 0, - "incorrect value for stub[1], expected 0, is {}", - msg.stub[1] + msg.cols, 32768, + "incorrect value for cols, expected 32768, is {}", + msg.cols ); assert_eq!( - msg.stub[2], 1, - "incorrect value for stub[2], expected 1, is {}", - msg.stub[2] + msg.corner_nw_lat, 1024, + "incorrect value for corner_nw_lat, expected 1024, is {}", + msg.corner_nw_lat ); assert_eq!( - msg.stub[3], 0, - "incorrect value for stub[3], expected 0, is {}", - msg.stub[3] + msg.corner_nw_lon, 2048, + "incorrect value for corner_nw_lon, expected 2048, is {}", + msg.corner_nw_lon ); assert_eq!( - msg.stub[4], 2, - "incorrect value for stub[4], expected 2, is {}", - msg.stub[4] + msg.rows, 16384, + "incorrect value for rows, expected 16384, is {}", + msg.rows ); assert_eq!( - msg.stub[5], 0, - "incorrect value for stub[5], expected 0, is {}", - msg.stub[5] + msg.spacing_lat, 4096, + "incorrect value for spacing_lat, expected 4096, is {}", + msg.spacing_lat ); assert_eq!( - msg.stub[6], 4, - "incorrect value for stub[6], expected 4, is {}", - msg.stub[6] + msg.spacing_lon, 8192, + "incorrect value for spacing_lon, expected 8192, is {}", + msg.spacing_lon ); assert_eq!( - msg.stub[7], 0, - "incorrect value for stub[7], expected 0, is {}", - msg.stub[7] + msg.ssr_sol_id, 31, + "incorrect value for ssr_sol_id, expected 31, is {}", + msg.ssr_sol_id ); assert_eq!( - msg.stub[8], 8, - "incorrect value for stub[8], expected 8, is {}", - msg.stub[8] + msg.tile_id, 512, + "incorrect value for tile_id, expected 512, is {}", + msg.tile_id ); assert_eq!( - msg.stub[9], 0, - "incorrect value for stub[9], expected 0, is {}", - msg.stub[9] - ); - assert_eq!( - msg.stub[10], 16, - "incorrect value for stub[10], expected 16, is {}", - msg.stub[10] - ); - assert_eq!( - msg.stub[11], 0, - "incorrect value for stub[11], expected 0, is {}", - msg.stub[11] - ); - assert_eq!( - msg.stub[12], 32, - "incorrect value for stub[12], expected 32, is {}", - msg.stub[12] - ); - assert_eq!( - msg.stub[13], 0, - "incorrect value for stub[13], expected 0, is {}", - msg.stub[13] - ); - assert_eq!( - msg.stub[14], 64, - "incorrect value for stub[14], expected 64, is {}", - msg.stub[14] - ); - assert_eq!( - msg.stub[15], 0, - "incorrect value for stub[15], expected 0, is {}", - msg.stub[15] - ); - assert_eq!( - msg.stub[16], 128, - "incorrect value for stub[16], expected 128, is {}", - msg.stub[16] - ); - assert_eq!( - msg.stub[17], 210, - "incorrect value for stub[17], expected 210, is {}", - msg.stub[17] - ); - assert_eq!( - msg.stub[18], 2, - "incorrect value for stub[18], expected 2, is {}", - msg.stub[18] - ); - assert_eq!( - msg.stub[19], 150, - "incorrect value for stub[19], expected 150, is {}", - msg.stub[19] - ); - assert_eq!( - msg.stub[20], 73, - "incorrect value for stub[20], expected 73, is {}", - msg.stub[20] - ); - assert_eq!( - msg.stub[21], 0, - "incorrect value for stub[21], expected 0, is {}", - msg.stub[21] - ); - assert_eq!( - msg.stub[22], 0, - "incorrect value for stub[22], expected 0, is {}", - msg.stub[22] - ); - assert_eq!( - msg.stub[23], 0, - "incorrect value for stub[23], expected 0, is {}", - msg.stub[23] - ); - assert_eq!( - msg.stub[24], 0, - "incorrect value for stub[24], expected 0, is {}", - msg.stub[24] + 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"), diff --git a/sbpjson/elm/SbpJson.elm b/sbpjson/elm/SbpJson.elm index c2528de2cc..d18b0494df 100644 --- a/sbpjson/elm/SbpJson.elm +++ b/sbpjson/elm/SbpJson.elm @@ -5,14 +5,16 @@ -- add these imports -- -- import Json.Decode exposing (decodeString)`); --- import SbpJson exposing (acqSvProfile, almanacCommonContent, carrierPhase, codeBiasesContent, 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, msgReferenceFrameParam, msgReset, msgResetFilters, msgSbasRaw, msgSensorAidEvent, msgSetTime, msgSettingsReadByIndexDone, msgSettingsReadByIndexReq, msgSettingsReadByIndexResp, msgSettingsReadReq, msgSettingsReadResp, msgSettingsRegister, msgSettingsRegisterResp, msgSettingsSave, msgSettingsWrite, msgSettingsWriteResp, msgSolnMeta, msgSpecan, msgSsrCodeBiases, msgSsrCodePhaseBiasesBounds, msgSsrFlagHighLevel, msgSsrFlagIonoGridPointSatLos, msgSsrFlagIonoGridPoints, msgSsrFlagIonoTileSatLos, msgSsrFlagSatellites, msgSsrFlagTropoGridPoints, msgSsrGriddedCorrection, msgSsrGriddedCorrectionBounds, msgSsrOrbitClock, msgSsrOrbitClockBounds, msgSsrOrbitClockBoundsDegradation, msgSsrPhaseBiases, msgSsrSatelliteApc, msgSsrStecCorrection, msgSsrTileDefinition, msgStartup, msgStatusJournal, msgStatusReport, msgStmFlashLockSector, msgStmFlashUnlockSector, msgStmUniqueIDReq, msgStmUniqueIDResp, msgSvAzEl, msgThreadState, msgTrackingIq, msgTrackingState, msgUARTState, msgUserData, msgUTCLeapSecond, msgUTCTime, msgUTCTimeGnss, msgVelBody, msgVelCog, msgVelECEF, msgVelECEFCov, msgVelECEFCovGnss, msgVelECEFGnss, msgVelNED, msgVelNEDCov, msgVelNEDCovGnss, msgVelNEDGnss, msgWheeltick, networkUsage, observationHeader, odoInputType, 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, integritySSRHeader, 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, msgReferenceFrameParam, msgReset, msgResetFilters, msgSbasRaw, msgSensorAidEvent, msgSetTime, msgSettingsReadByIndexDone, msgSettingsReadByIndexReq, msgSettingsReadByIndexResp, msgSettingsReadReq, msgSettingsReadResp, msgSettingsRegister, msgSettingsRegisterResp, msgSettingsSave, msgSettingsWrite, msgSettingsWriteResp, msgSolnMeta, msgSpecan, msgSsrCodeBiases, msgSsrCodePhaseBiasesBounds, msgSsrFlagHighLevel, msgSsrFlagIonoGridPointSatLos, msgSsrFlagIonoGridPoints, msgSsrFlagIonoTileSatLos, msgSsrFlagSatellites, msgSsrFlagTropoGridPoints, msgSsrGriddedCorrection, msgSsrGriddedCorrectionBounds, msgSsrOrbitClock, msgSsrOrbitClockBounds, msgSsrOrbitClockBoundsDegradation, msgSsrPhaseBiases, msgSsrSatelliteApc, msgSsrStecCorrection, msgSsrTileDefinition, msgStartup, msgStatusJournal, msgStatusReport, msgStmFlashLockSector, msgStmFlashUnlockSector, msgStmUniqueIDReq, msgStmUniqueIDResp, msgSvAzEl, msgThreadState, msgTrackingIq, msgTrackingState, msgUARTState, msgUserData, msgUTCLeapSecond, msgUTCTime, msgUTCTimeGnss, msgVelBody, msgVelCog, msgVelECEF, msgVelECEFCov, msgVelECEFCovGnss, msgVelECEFGnss, msgVelNED, msgVelNEDCov, msgVelNEDCovGnss, msgVelNEDGnss, msgWheeltick, networkUsage, observationHeader, odoInputType, orbitClockBound, orbitClockBoundDegradation, 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 -- -- decodeString acqSvProfile myJsonString -- decodeString almanacCommonContent myJsonString +-- decodeString boundsHeader myJsonString -- decodeString carrierPhase myJsonString -- decodeString codeBiasesContent myJsonString +-- decodeString codePhaseBiasesSatSig myJsonString -- decodeString doppler myJsonString -- decodeString ephemerisCommonContent myJsonString -- decodeString estimatedHorizontalErrorEllipse myJsonString @@ -25,6 +27,7 @@ -- decodeString gridElementNoStd myJsonString -- decodeString griddedCorrectionHeader myJsonString -- decodeString imuInputType myJsonString +-- decodeString integritySSRHeader myJsonString -- decodeString latency myJsonString -- decodeString measurementState myJsonString -- decodeString msgAcqResult myJsonString @@ -190,6 +193,8 @@ -- decodeString networkUsage myJsonString -- decodeString observationHeader myJsonString -- decodeString odoInputType myJsonString +-- decodeString orbitClockBound myJsonString +-- decodeString orbitClockBoundDegradation myJsonString -- decodeString packedObsContent myJsonString -- decodeString packedOsrContent myJsonString -- decodeString period myJsonString @@ -198,6 +203,7 @@ -- decodeString stecResidual myJsonString -- decodeString stecResidualNoStd myJsonString -- decodeString stecSatElement myJsonString +-- decodeString stecSatElementIntegrity myJsonString -- decodeString satelliteAPC myJsonString -- decodeString solutionInputType myJsonString -- decodeString statusJournalItem myJsonString @@ -217,12 +223,18 @@ module SbpJson exposing , AlmanacCommonContent , almanacCommonContentToString , almanacCommonContent + , BoundsHeader + , boundsHeaderToString + , boundsHeader , CarrierPhase , carrierPhaseToString , carrierPhase , CodeBiasesContent , codeBiasesContentToString , codeBiasesContent + , CodePhaseBiasesSatSig + , codePhaseBiasesSatSigToString + , codePhaseBiasesSatSig , Doppler , dopplerToString , doppler @@ -259,6 +271,9 @@ module SbpJson exposing , IMUInputType , imuInputTypeToString , imuInputType + , IntegritySSRHeader + , integritySSRHeaderToString + , integritySSRHeader , Latency , latencyToString , latency @@ -754,6 +769,12 @@ module SbpJson exposing , OdoInputType , odoInputTypeToString , odoInputType + , OrbitClockBound + , orbitClockBoundToString + , orbitClockBound + , OrbitClockBoundDegradation + , orbitClockBoundDegradationToString + , orbitClockBoundDegradation , PackedObsContent , packedObsContentToString , packedObsContent @@ -778,6 +799,9 @@ module SbpJson exposing , STECSatElement , stecSatElementToString , stecSatElement + , STECSatElementIntegrity + , stecSatElementIntegrityToString + , stecSatElementIntegrity , SatelliteAPC , satelliteAPCToString , satelliteAPC @@ -2273,7 +2297,26 @@ type alias MsgProtectionLevel = } type alias MsgReferenceFrameParam = - { stub : Array Int + { deltaX0 : Int + , deltaY0 : Int + , deltaZ0 : Int + , dotDeltaX0 : Int + , dotDeltaY0 : Int + , dotDeltaZ0 : Int + , dotScale : Int + , dotTheta01 : Int + , dotTheta02 : Int + , dotTheta03 : Int + , reT0 : Int + , scale : Int + , sin : Int + , sn : String + , ssrIod : Int + , theta01 : Int + , theta02 : Int + , theta03 : Int + , tn : String + , utn : Int } {-| This message from the host resets the Piksi back into the bootloader. -} @@ -2458,31 +2501,90 @@ type alias CodeBiasesContent = } type alias MsgSsrCodePhaseBiasesBounds = - { stub : Array Int + { constID : Int + , header : BoundsHeader + , nSatsSignals : Int + , satellitesSignals : Array CodePhaseBiasesSatSig + , ssrIod : Int + } + +type alias BoundsHeader = + { numMsgs : Int + , seqNum : Int + , solID : Int + , time : GpsTimeSEC + , updateInterval : Int + } + +type alias CodePhaseBiasesSatSig = + { codeBiasBoundMu : Int + , codeBiasBoundSig : Int + , phaseBiasBoundMu : Int + , phaseBiasBoundSig : Int + , satID : Int + , signalID : Int } type alias MsgSsrFlagHighLevel = - { stub : Array Int + { chainID : Int + , corrTime : GpsTimeSEC + , obsTime : GpsTimeSEC + , ssrSolID : Int + , tileID : Int + , tileSetID : Int + , useBdsSat : Int + , useGalSat : Int + , useGpsSat : Int + , useIonoGridPointSatLos : Int + , useIonoGridPoints : Int + , useIonoTileSatLos : Int + , useTropoGridPoints : Int } type alias MsgSsrFlagIonoGridPointSatLos = - { stub : Array Int + { faultyLos : Array SvID + , gridPointID : Int + , header : IntegritySSRHeader + , nFaultyLos : Int + } + +type alias IntegritySSRHeader = + { chainID : Int + , numMsgs : Int + , obsTime : GpsTimeSEC + , seqNum : Int + , ssrSolID : Int + , tileID : Int + , tileSetID : Int } type alias MsgSsrFlagIonoGridPoints = - { stub : Array Int + { faultyPoints : Array Int + , header : IntegritySSRHeader + , nFaultyPoints : Int } type alias MsgSsrFlagIonoTileSatLos = - { stub : Array Int + { faultyLos : Array SvID + , header : IntegritySSRHeader + , nFaultyLos : Int } type alias MsgSsrFlagSatellites = - { stub : Array Int + { chainID : Int + , constID : Int + , faultySats : Array Int + , nFaultySats : Int + , numMsgs : Int + , obsTime : GpsTimeSEC + , seqNum : Int + , ssrSolID : Int } type alias MsgSsrFlagTropoGridPoints = - { stub : Array Int + { faultyPoints : Array Int + , header : IntegritySSRHeader + , nFaultyPoints : Int } {-| STEC residuals are per space vehicle, troposphere is not., @@ -2514,7 +2616,28 @@ type alias GriddedCorrectionHeader = mean=5+0.5(i-230). -} type alias MsgSsrGriddedCorrectionBounds = - { stub : Array Int + { gridPointID : Int + , header : BoundsHeader + , nSats : Int + , ssrIodAtmo : Int + , stecSatList : Array STECSatElementIntegrity + , tileID : Int + , tileSetID : Int + , tropoDelayCorrection : TroposphericDelayCorrection + , tropoQi : Int + , tropoVHydroBoundMu : Int + , tropoVHydroBoundSig : Int + , tropoVWetBoundMu : Int + , tropoVWetBoundSig : 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 @@ -2537,15 +2660,51 @@ type alias MsgSsrOrbitClock = , updateInterval : Int } -{-| Note 1: Range: 0-55 m. i<=200, mean=0.0251i; 200240, -mean=25+2(i-240). +{-| Note 1: Range: 0-17.5 m. i<=200, mean=0.01i; 200230, +mean=5+0.5(i-230)., +, +Note 2: Range: 0-17.5 m. i<=200, std=0.01i; 200230, +std=5+0.5(i-230). -} type alias MsgSsrOrbitClockBounds = - { stub : Array Int + { constID : Int + , header : BoundsHeader + , nSats : Int + , orbitClockBounds : Array OrbitClockBound + , ssrIod : Int + } + +{-| Orbit and clock bound. -} +type alias OrbitClockBound = + { clockBoundMu : Int + , clockBoundSig : Int + , orbAlongBoundMu : Int + , orbAlongBoundSig : Int + , orbCrossBoundMu : Int + , orbCrossBoundSig : Int + , orbRadialBoundMu : Int + , orbRadialBoundSig : Int + , satID : Int } type alias MsgSsrOrbitClockBoundsDegradation = - { stub : Array Int + { constID : Int + , header : BoundsHeader + , orbitClockBoundsDegradation : OrbitClockBoundDegradation + , satBitmask : Int + , ssrIod : Int + } + +{-| Orbit and clock bound degradation. -} +type alias OrbitClockBoundDegradation = + { clockBoundMuDot : Int + , clockBoundSigDot : Int + , orbAlongBoundMuDot : Int + , orbAlongBoundSigDot : Int + , orbCrossBoundMuDot : Int + , orbCrossBoundSigDot : Int + , orbRadialBoundMuDot : Int + , orbRadialBoundSigDot : Int } {-| The precise phase biases message contains the biases to be added to the carrier phase of @@ -2590,7 +2749,19 @@ type alias SatelliteAPC = } type alias MsgSsrStecCorrection = - { stub : Array Int + { header : BoundsHeader + , nSats : Int + , ssrIodAtmo : Int + , stecSatList : Array STECSatElement + , tileID : Int + , tileSetID : Int + } + +{-| STEC polynomial for the given satellite. -} +type alias STECSatElement = + { stecCoeff : Array Int + , stecQualityIndicator : Int + , svID : SvID } {-| Provides the correction point coordinates for the atmospheric correction values in the @@ -2601,7 +2772,16 @@ GNSS-SSR-CorrectionPoints. SBP only supports gridded arrays of correction points lists of points. -} type alias MsgSsrTileDefinition = - { stub : Array Int + { bitmask : Int + , cols : Int + , cornerNwLat : Int + , cornerNwLon : Int + , rows : Int + , spacingLat : Int + , spacingLon : Int + , ssrSolID : Int + , tileID : Int + , tileSetID : Int } {-| The system start-up message is sent once on system start-up. It notifies the host or @@ -2794,7 +2974,15 @@ type alias MsgUserData = parameters. -} type alias MsgUTCLeapSecond = - { stub : Array Int + { biasCoeff : Int + , countAfter : Int + , countBefore : Int + , driftCoeff : Int + , driftRateCoeff : Int + , refDN : Int + , refWn : Int + , towS : Int + , wn : Int } {-| This message reports the Universal Coordinated Time (UTC). Note the flags which indicate @@ -3046,13 +3234,6 @@ type alias STECHeader = , updateInterval : Int } -{-| STEC polynomial for the given satellite. -} -type alias STECSatElement = - { stecCoeff : Array Int - , stecQualityIndicator : Int - , svID : SvID - } - -- decoders and encoders acqSvProfileToString : AcqSvProfile -> String @@ -3061,12 +3242,18 @@ acqSvProfileToString r = Jenc.encode 0 (encodeAcqSvProfile r) almanacCommonContentToString : AlmanacCommonContent -> String almanacCommonContentToString r = Jenc.encode 0 (encodeAlmanacCommonContent r) +boundsHeaderToString : BoundsHeader -> String +boundsHeaderToString r = Jenc.encode 0 (encodeBoundsHeader r) + carrierPhaseToString : CarrierPhase -> String carrierPhaseToString r = Jenc.encode 0 (encodeCarrierPhase r) codeBiasesContentToString : CodeBiasesContent -> String codeBiasesContentToString r = Jenc.encode 0 (encodeCodeBiasesContent r) +codePhaseBiasesSatSigToString : CodePhaseBiasesSatSig -> String +codePhaseBiasesSatSigToString r = Jenc.encode 0 (encodeCodePhaseBiasesSatSig r) + dopplerToString : Doppler -> String dopplerToString r = Jenc.encode 0 (encodeDoppler r) @@ -3103,6 +3290,9 @@ griddedCorrectionHeaderToString r = Jenc.encode 0 (encodeGriddedCorrectionHeader imuInputTypeToString : IMUInputType -> String imuInputTypeToString r = Jenc.encode 0 (encodeIMUInputType r) +integritySSRHeaderToString : IntegritySSRHeader -> String +integritySSRHeaderToString r = Jenc.encode 0 (encodeIntegritySSRHeader r) + latencyToString : Latency -> String latencyToString r = Jenc.encode 0 (encodeLatency r) @@ -3628,6 +3818,12 @@ observationHeaderToString r = Jenc.encode 0 (encodeObservationHeader r) odoInputTypeToString : OdoInputType -> String odoInputTypeToString r = Jenc.encode 0 (encodeOdoInputType r) +orbitClockBoundToString : OrbitClockBound -> String +orbitClockBoundToString r = Jenc.encode 0 (encodeOrbitClockBound r) + +orbitClockBoundDegradationToString : OrbitClockBoundDegradation -> String +orbitClockBoundDegradationToString r = Jenc.encode 0 (encodeOrbitClockBoundDegradation r) + packedObsContentToString : PackedObsContent -> String packedObsContentToString r = Jenc.encode 0 (encodePackedObsContent r) @@ -3652,6 +3848,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) @@ -5954,12 +6153,50 @@ encodeMsgProtectionLevel x = msgReferenceFrameParam : Jdec.Decoder MsgReferenceFrameParam msgReferenceFrameParam = Jpipe.decode MsgReferenceFrameParam - |> Jpipe.required "stub" (Jdec.array Jdec.int) + |> Jpipe.required "delta_X0" Jdec.int + |> Jpipe.required "delta_Y0" Jdec.int + |> Jpipe.required "delta_Z0" Jdec.int + |> Jpipe.required "dot_delta_X0" Jdec.int + |> Jpipe.required "dot_delta_Y0" Jdec.int + |> Jpipe.required "dot_delta_Z0" Jdec.int + |> Jpipe.required "dot_scale" Jdec.int + |> Jpipe.required "dot_theta_01" Jdec.int + |> Jpipe.required "dot_theta_02" Jdec.int + |> Jpipe.required "dot_theta_03" Jdec.int + |> Jpipe.required "re_t0" Jdec.int + |> Jpipe.required "scale" Jdec.int + |> Jpipe.required "sin" Jdec.int + |> Jpipe.required "sn" Jdec.string + |> Jpipe.required "ssr_iod" Jdec.int + |> Jpipe.required "theta_01" Jdec.int + |> Jpipe.required "theta_02" Jdec.int + |> Jpipe.required "theta_03" Jdec.int + |> Jpipe.required "tn" Jdec.string + |> Jpipe.required "utn" Jdec.int encodeMsgReferenceFrameParam : MsgReferenceFrameParam -> Jenc.Value encodeMsgReferenceFrameParam x = Jenc.object - [ ("stub", makeArrayEncoder Jenc.int x.stub) + [ ("delta_X0", Jenc.int x.deltaX0) + , ("delta_Y0", Jenc.int x.deltaY0) + , ("delta_Z0", Jenc.int x.deltaZ0) + , ("dot_delta_X0", Jenc.int x.dotDeltaX0) + , ("dot_delta_Y0", Jenc.int x.dotDeltaY0) + , ("dot_delta_Z0", Jenc.int x.dotDeltaZ0) + , ("dot_scale", Jenc.int x.dotScale) + , ("dot_theta_01", Jenc.int x.dotTheta01) + , ("dot_theta_02", Jenc.int x.dotTheta02) + , ("dot_theta_03", Jenc.int x.dotTheta03) + , ("re_t0", Jenc.int x.reT0) + , ("scale", Jenc.int x.scale) + , ("sin", Jenc.int x.sin) + , ("sn", Jenc.string x.sn) + , ("ssr_iod", Jenc.int x.ssrIod) + , ("theta_01", Jenc.int x.theta01) + , ("theta_02", Jenc.int x.theta02) + , ("theta_03", Jenc.int x.theta03) + , ("tn", Jenc.string x.tn) + , ("utn", Jenc.int x.utn) ] msgReset : Jdec.Decoder MsgReset @@ -6214,78 +6451,205 @@ encodeCodeBiasesContent x = msgSsrCodePhaseBiasesBounds : Jdec.Decoder MsgSsrCodePhaseBiasesBounds msgSsrCodePhaseBiasesBounds = Jpipe.decode MsgSsrCodePhaseBiasesBounds - |> Jpipe.required "stub" (Jdec.array Jdec.int) + |> Jpipe.required "const_id" Jdec.int + |> Jpipe.required "header" boundsHeader + |> Jpipe.required "n_sats_signals" Jdec.int + |> Jpipe.required "satellites_signals" (Jdec.array codePhaseBiasesSatSig) + |> Jpipe.required "ssr_iod" Jdec.int encodeMsgSsrCodePhaseBiasesBounds : MsgSsrCodePhaseBiasesBounds -> Jenc.Value encodeMsgSsrCodePhaseBiasesBounds x = Jenc.object - [ ("stub", makeArrayEncoder Jenc.int x.stub) + [ ("const_id", Jenc.int x.constID) + , ("header", encodeBoundsHeader x.header) + , ("n_sats_signals", Jenc.int x.nSatsSignals) + , ("satellites_signals", makeArrayEncoder encodeCodePhaseBiasesSatSig x.satellitesSignals) + , ("ssr_iod", Jenc.int x.ssrIod) + ] + +boundsHeader : Jdec.Decoder BoundsHeader +boundsHeader = + Jpipe.decode BoundsHeader + |> Jpipe.required "num_msgs" Jdec.int + |> Jpipe.required "seq_num" Jdec.int + |> Jpipe.required "sol_id" Jdec.int + |> Jpipe.required "time" gpsTimeSEC + |> Jpipe.required "update_interval" Jdec.int + +encodeBoundsHeader : BoundsHeader -> Jenc.Value +encodeBoundsHeader x = + Jenc.object + [ ("num_msgs", Jenc.int x.numMsgs) + , ("seq_num", Jenc.int x.seqNum) + , ("sol_id", Jenc.int x.solID) + , ("time", encodeGpsTimeSEC x.time) + , ("update_interval", Jenc.int x.updateInterval) + ] + +codePhaseBiasesSatSig : Jdec.Decoder CodePhaseBiasesSatSig +codePhaseBiasesSatSig = + Jpipe.decode CodePhaseBiasesSatSig + |> Jpipe.required "code_bias_bound_mu" Jdec.int + |> Jpipe.required "code_bias_bound_sig" Jdec.int + |> Jpipe.required "phase_bias_bound_mu" Jdec.int + |> Jpipe.required "phase_bias_bound_sig" Jdec.int + |> Jpipe.required "sat_id" Jdec.int + |> Jpipe.required "signal_id" Jdec.int + +encodeCodePhaseBiasesSatSig : CodePhaseBiasesSatSig -> Jenc.Value +encodeCodePhaseBiasesSatSig x = + Jenc.object + [ ("code_bias_bound_mu", Jenc.int x.codeBiasBoundMu) + , ("code_bias_bound_sig", Jenc.int x.codeBiasBoundSig) + , ("phase_bias_bound_mu", Jenc.int x.phaseBiasBoundMu) + , ("phase_bias_bound_sig", Jenc.int x.phaseBiasBoundSig) + , ("sat_id", Jenc.int x.satID) + , ("signal_id", Jenc.int x.signalID) ] msgSsrFlagHighLevel : Jdec.Decoder MsgSsrFlagHighLevel msgSsrFlagHighLevel = Jpipe.decode MsgSsrFlagHighLevel - |> Jpipe.required "stub" (Jdec.array Jdec.int) + |> Jpipe.required "chain_id" Jdec.int + |> Jpipe.required "corr_time" gpsTimeSEC + |> Jpipe.required "obs_time" gpsTimeSEC + |> Jpipe.required "ssr_sol_id" Jdec.int + |> Jpipe.required "tile_id" Jdec.int + |> Jpipe.required "tile_set_id" Jdec.int + |> Jpipe.required "use_bds_sat" Jdec.int + |> Jpipe.required "use_gal_sat" Jdec.int + |> Jpipe.required "use_gps_sat" Jdec.int + |> Jpipe.required "use_iono_grid_point_sat_los" Jdec.int + |> Jpipe.required "use_iono_grid_points" Jdec.int + |> Jpipe.required "use_iono_tile_sat_los" Jdec.int + |> Jpipe.required "use_tropo_grid_points" Jdec.int encodeMsgSsrFlagHighLevel : MsgSsrFlagHighLevel -> Jenc.Value encodeMsgSsrFlagHighLevel x = Jenc.object - [ ("stub", makeArrayEncoder Jenc.int x.stub) + [ ("chain_id", Jenc.int x.chainID) + , ("corr_time", encodeGpsTimeSEC x.corrTime) + , ("obs_time", encodeGpsTimeSEC x.obsTime) + , ("ssr_sol_id", Jenc.int x.ssrSolID) + , ("tile_id", Jenc.int x.tileID) + , ("tile_set_id", Jenc.int x.tileSetID) + , ("use_bds_sat", Jenc.int x.useBdsSat) + , ("use_gal_sat", Jenc.int x.useGalSat) + , ("use_gps_sat", Jenc.int x.useGpsSat) + , ("use_iono_grid_point_sat_los", Jenc.int x.useIonoGridPointSatLos) + , ("use_iono_grid_points", Jenc.int x.useIonoGridPoints) + , ("use_iono_tile_sat_los", Jenc.int x.useIonoTileSatLos) + , ("use_tropo_grid_points", Jenc.int x.useTropoGridPoints) ] msgSsrFlagIonoGridPointSatLos : Jdec.Decoder MsgSsrFlagIonoGridPointSatLos msgSsrFlagIonoGridPointSatLos = Jpipe.decode MsgSsrFlagIonoGridPointSatLos - |> Jpipe.required "stub" (Jdec.array Jdec.int) + |> Jpipe.required "faulty_los" (Jdec.array svID) + |> Jpipe.required "grid_point_id" Jdec.int + |> Jpipe.required "header" integritySSRHeader + |> Jpipe.required "n_faulty_los" Jdec.int encodeMsgSsrFlagIonoGridPointSatLos : MsgSsrFlagIonoGridPointSatLos -> Jenc.Value encodeMsgSsrFlagIonoGridPointSatLos x = Jenc.object - [ ("stub", makeArrayEncoder Jenc.int x.stub) + [ ("faulty_los", makeArrayEncoder encodeSvID x.faultyLos) + , ("grid_point_id", Jenc.int x.gridPointID) + , ("header", encodeIntegritySSRHeader x.header) + , ("n_faulty_los", Jenc.int x.nFaultyLos) + ] + +integritySSRHeader : Jdec.Decoder IntegritySSRHeader +integritySSRHeader = + Jpipe.decode IntegritySSRHeader + |> Jpipe.required "chain_id" Jdec.int + |> Jpipe.required "num_msgs" Jdec.int + |> Jpipe.required "obs_time" gpsTimeSEC + |> Jpipe.required "seq_num" Jdec.int + |> Jpipe.required "ssr_sol_id" Jdec.int + |> Jpipe.required "tile_id" Jdec.int + |> Jpipe.required "tile_set_id" Jdec.int + +encodeIntegritySSRHeader : IntegritySSRHeader -> Jenc.Value +encodeIntegritySSRHeader x = + Jenc.object + [ ("chain_id", Jenc.int x.chainID) + , ("num_msgs", Jenc.int x.numMsgs) + , ("obs_time", encodeGpsTimeSEC x.obsTime) + , ("seq_num", Jenc.int x.seqNum) + , ("ssr_sol_id", Jenc.int x.ssrSolID) + , ("tile_id", Jenc.int x.tileID) + , ("tile_set_id", Jenc.int x.tileSetID) ] msgSsrFlagIonoGridPoints : Jdec.Decoder MsgSsrFlagIonoGridPoints msgSsrFlagIonoGridPoints = Jpipe.decode MsgSsrFlagIonoGridPoints - |> Jpipe.required "stub" (Jdec.array Jdec.int) + |> Jpipe.required "faulty_points" (Jdec.array Jdec.int) + |> Jpipe.required "header" integritySSRHeader + |> Jpipe.required "n_faulty_points" Jdec.int encodeMsgSsrFlagIonoGridPoints : MsgSsrFlagIonoGridPoints -> Jenc.Value encodeMsgSsrFlagIonoGridPoints x = Jenc.object - [ ("stub", makeArrayEncoder Jenc.int x.stub) + [ ("faulty_points", makeArrayEncoder Jenc.int x.faultyPoints) + , ("header", encodeIntegritySSRHeader x.header) + , ("n_faulty_points", Jenc.int x.nFaultyPoints) ] msgSsrFlagIonoTileSatLos : Jdec.Decoder MsgSsrFlagIonoTileSatLos msgSsrFlagIonoTileSatLos = Jpipe.decode MsgSsrFlagIonoTileSatLos - |> Jpipe.required "stub" (Jdec.array Jdec.int) + |> Jpipe.required "faulty_los" (Jdec.array svID) + |> Jpipe.required "header" integritySSRHeader + |> Jpipe.required "n_faulty_los" Jdec.int encodeMsgSsrFlagIonoTileSatLos : MsgSsrFlagIonoTileSatLos -> Jenc.Value encodeMsgSsrFlagIonoTileSatLos x = Jenc.object - [ ("stub", makeArrayEncoder Jenc.int x.stub) + [ ("faulty_los", makeArrayEncoder encodeSvID x.faultyLos) + , ("header", encodeIntegritySSRHeader x.header) + , ("n_faulty_los", Jenc.int x.nFaultyLos) ] msgSsrFlagSatellites : Jdec.Decoder MsgSsrFlagSatellites msgSsrFlagSatellites = Jpipe.decode MsgSsrFlagSatellites - |> Jpipe.required "stub" (Jdec.array Jdec.int) + |> Jpipe.required "chain_id" Jdec.int + |> Jpipe.required "const_id" Jdec.int + |> Jpipe.required "faulty_sats" (Jdec.array Jdec.int) + |> Jpipe.required "n_faulty_sats" Jdec.int + |> Jpipe.required "num_msgs" Jdec.int + |> Jpipe.required "obs_time" gpsTimeSEC + |> Jpipe.required "seq_num" Jdec.int + |> Jpipe.required "ssr_sol_id" Jdec.int encodeMsgSsrFlagSatellites : MsgSsrFlagSatellites -> Jenc.Value encodeMsgSsrFlagSatellites x = Jenc.object - [ ("stub", makeArrayEncoder Jenc.int x.stub) + [ ("chain_id", Jenc.int x.chainID) + , ("const_id", Jenc.int x.constID) + , ("faulty_sats", makeArrayEncoder Jenc.int x.faultySats) + , ("n_faulty_sats", Jenc.int x.nFaultySats) + , ("num_msgs", Jenc.int x.numMsgs) + , ("obs_time", encodeGpsTimeSEC x.obsTime) + , ("seq_num", Jenc.int x.seqNum) + , ("ssr_sol_id", Jenc.int x.ssrSolID) ] msgSsrFlagTropoGridPoints : Jdec.Decoder MsgSsrFlagTropoGridPoints msgSsrFlagTropoGridPoints = Jpipe.decode MsgSsrFlagTropoGridPoints - |> Jpipe.required "stub" (Jdec.array Jdec.int) + |> Jpipe.required "faulty_points" (Jdec.array Jdec.int) + |> Jpipe.required "header" integritySSRHeader + |> Jpipe.required "n_faulty_points" Jdec.int encodeMsgSsrFlagTropoGridPoints : MsgSsrFlagTropoGridPoints -> Jenc.Value encodeMsgSsrFlagTropoGridPoints x = Jenc.object - [ ("stub", makeArrayEncoder Jenc.int x.stub) + [ ("faulty_points", makeArrayEncoder Jenc.int x.faultyPoints) + , ("header", encodeIntegritySSRHeader x.header) + , ("n_faulty_points", Jenc.int x.nFaultyPoints) ] msgSsrGriddedCorrection : Jdec.Decoder MsgSsrGriddedCorrection @@ -6333,12 +6697,55 @@ encodeGriddedCorrectionHeader x = msgSsrGriddedCorrectionBounds : Jdec.Decoder MsgSsrGriddedCorrectionBounds msgSsrGriddedCorrectionBounds = Jpipe.decode MsgSsrGriddedCorrectionBounds - |> Jpipe.required "stub" (Jdec.array Jdec.int) + |> 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_delay_correction" troposphericDelayCorrection + |> Jpipe.required "tropo_qi" Jdec.int + |> Jpipe.required "tropo_v_hydro_bound_mu" Jdec.int + |> Jpipe.required "tropo_v_hydro_bound_sig" Jdec.int + |> Jpipe.required "tropo_v_wet_bound_mu" Jdec.int + |> Jpipe.required "tropo_v_wet_bound_sig" Jdec.int encodeMsgSsrGriddedCorrectionBounds : MsgSsrGriddedCorrectionBounds -> Jenc.Value encodeMsgSsrGriddedCorrectionBounds x = Jenc.object - [ ("stub", makeArrayEncoder Jenc.int x.stub) + [ ("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_delay_correction", encodeTroposphericDelayCorrection x.tropoDelayCorrection) + , ("tropo_qi", Jenc.int x.tropoQi) + , ("tropo_v_hydro_bound_mu", Jenc.int x.tropoVHydroBoundMu) + , ("tropo_v_hydro_bound_sig", Jenc.int x.tropoVHydroBoundSig) + , ("tropo_v_wet_bound_mu", Jenc.int x.tropoVWetBoundMu) + , ("tropo_v_wet_bound_sig", Jenc.int x.tropoVWetBoundSig) + ] + +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 @@ -6381,23 +6788,91 @@ encodeMsgSsrOrbitClock x = msgSsrOrbitClockBounds : Jdec.Decoder MsgSsrOrbitClockBounds msgSsrOrbitClockBounds = Jpipe.decode MsgSsrOrbitClockBounds - |> Jpipe.required "stub" (Jdec.array Jdec.int) + |> Jpipe.required "const_id" Jdec.int + |> Jpipe.required "header" boundsHeader + |> Jpipe.required "n_sats" Jdec.int + |> Jpipe.required "orbit_clock_bounds" (Jdec.array orbitClockBound) + |> Jpipe.required "ssr_iod" Jdec.int encodeMsgSsrOrbitClockBounds : MsgSsrOrbitClockBounds -> Jenc.Value encodeMsgSsrOrbitClockBounds x = Jenc.object - [ ("stub", makeArrayEncoder Jenc.int x.stub) + [ ("const_id", Jenc.int x.constID) + , ("header", encodeBoundsHeader x.header) + , ("n_sats", Jenc.int x.nSats) + , ("orbit_clock_bounds", makeArrayEncoder encodeOrbitClockBound x.orbitClockBounds) + , ("ssr_iod", Jenc.int x.ssrIod) + ] + +orbitClockBound : Jdec.Decoder OrbitClockBound +orbitClockBound = + Jpipe.decode OrbitClockBound + |> Jpipe.required "clock_bound_mu" Jdec.int + |> Jpipe.required "clock_bound_sig" Jdec.int + |> Jpipe.required "orb_along_bound_mu" Jdec.int + |> Jpipe.required "orb_along_bound_sig" Jdec.int + |> Jpipe.required "orb_cross_bound_mu" Jdec.int + |> Jpipe.required "orb_cross_bound_sig" Jdec.int + |> Jpipe.required "orb_radial_bound_mu" Jdec.int + |> Jpipe.required "orb_radial_bound_sig" Jdec.int + |> Jpipe.required "sat_id" Jdec.int + +encodeOrbitClockBound : OrbitClockBound -> Jenc.Value +encodeOrbitClockBound x = + Jenc.object + [ ("clock_bound_mu", Jenc.int x.clockBoundMu) + , ("clock_bound_sig", Jenc.int x.clockBoundSig) + , ("orb_along_bound_mu", Jenc.int x.orbAlongBoundMu) + , ("orb_along_bound_sig", Jenc.int x.orbAlongBoundSig) + , ("orb_cross_bound_mu", Jenc.int x.orbCrossBoundMu) + , ("orb_cross_bound_sig", Jenc.int x.orbCrossBoundSig) + , ("orb_radial_bound_mu", Jenc.int x.orbRadialBoundMu) + , ("orb_radial_bound_sig", Jenc.int x.orbRadialBoundSig) + , ("sat_id", Jenc.int x.satID) ] msgSsrOrbitClockBoundsDegradation : Jdec.Decoder MsgSsrOrbitClockBoundsDegradation msgSsrOrbitClockBoundsDegradation = Jpipe.decode MsgSsrOrbitClockBoundsDegradation - |> Jpipe.required "stub" (Jdec.array Jdec.int) + |> Jpipe.required "const_id" Jdec.int + |> Jpipe.required "header" boundsHeader + |> Jpipe.required "orbit_clock_bounds_degradation" orbitClockBoundDegradation + |> Jpipe.required "sat_bitmask" Jdec.int + |> Jpipe.required "ssr_iod" Jdec.int encodeMsgSsrOrbitClockBoundsDegradation : MsgSsrOrbitClockBoundsDegradation -> Jenc.Value encodeMsgSsrOrbitClockBoundsDegradation x = Jenc.object - [ ("stub", makeArrayEncoder Jenc.int x.stub) + [ ("const_id", Jenc.int x.constID) + , ("header", encodeBoundsHeader x.header) + , ("orbit_clock_bounds_degradation", encodeOrbitClockBoundDegradation x.orbitClockBoundsDegradation) + , ("sat_bitmask", Jenc.int x.satBitmask) + , ("ssr_iod", Jenc.int x.ssrIod) + ] + +orbitClockBoundDegradation : Jdec.Decoder OrbitClockBoundDegradation +orbitClockBoundDegradation = + Jpipe.decode OrbitClockBoundDegradation + |> Jpipe.required "clock_bound_mu_dot" Jdec.int + |> Jpipe.required "clock_bound_sig_dot" Jdec.int + |> Jpipe.required "orb_along_bound_mu_dot" Jdec.int + |> Jpipe.required "orb_along_bound_sig_dot" Jdec.int + |> Jpipe.required "orb_cross_bound_mu_dot" Jdec.int + |> Jpipe.required "orb_cross_bound_sig_dot" Jdec.int + |> Jpipe.required "orb_radial_bound_mu_dot" Jdec.int + |> Jpipe.required "orb_radial_bound_sig_dot" Jdec.int + +encodeOrbitClockBoundDegradation : OrbitClockBoundDegradation -> Jenc.Value +encodeOrbitClockBoundDegradation x = + Jenc.object + [ ("clock_bound_mu_dot", Jenc.int x.clockBoundMuDot) + , ("clock_bound_sig_dot", Jenc.int x.clockBoundSigDot) + , ("orb_along_bound_mu_dot", Jenc.int x.orbAlongBoundMuDot) + , ("orb_along_bound_sig_dot", Jenc.int x.orbAlongBoundSigDot) + , ("orb_cross_bound_mu_dot", Jenc.int x.orbCrossBoundMuDot) + , ("orb_cross_bound_sig_dot", Jenc.int x.orbCrossBoundSigDot) + , ("orb_radial_bound_mu_dot", Jenc.int x.orbRadialBoundMuDot) + , ("orb_radial_bound_sig_dot", Jenc.int x.orbRadialBoundSigDot) ] msgSsrPhaseBiases : Jdec.Decoder MsgSsrPhaseBiases @@ -6479,23 +6954,66 @@ encodeSatelliteAPC x = msgSsrStecCorrection : Jdec.Decoder MsgSsrStecCorrection msgSsrStecCorrection = Jpipe.decode MsgSsrStecCorrection - |> Jpipe.required "stub" (Jdec.array 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 stecSatElement) + |> Jpipe.required "tile_id" Jdec.int + |> Jpipe.required "tile_set_id" Jdec.int encodeMsgSsrStecCorrection : MsgSsrStecCorrection -> Jenc.Value encodeMsgSsrStecCorrection x = Jenc.object - [ ("stub", makeArrayEncoder Jenc.int x.stub) + [ ("header", encodeBoundsHeader x.header) + , ("n_sats", Jenc.int x.nSats) + , ("ssr_iod_atmo", Jenc.int x.ssrIodAtmo) + , ("stec_sat_list", makeArrayEncoder encodeSTECSatElement x.stecSatList) + , ("tile_id", Jenc.int x.tileID) + , ("tile_set_id", Jenc.int x.tileSetID) + ] + +stecSatElement : Jdec.Decoder STECSatElement +stecSatElement = + Jpipe.decode STECSatElement + |> Jpipe.required "stec_coeff" (Jdec.array Jdec.int) + |> Jpipe.required "stec_quality_indicator" Jdec.int + |> Jpipe.required "sv_id" svID + +encodeSTECSatElement : STECSatElement -> Jenc.Value +encodeSTECSatElement x = + Jenc.object + [ ("stec_coeff", makeArrayEncoder Jenc.int x.stecCoeff) + , ("stec_quality_indicator", Jenc.int x.stecQualityIndicator) + , ("sv_id", encodeSvID x.svID) ] msgSsrTileDefinition : Jdec.Decoder MsgSsrTileDefinition msgSsrTileDefinition = Jpipe.decode MsgSsrTileDefinition - |> Jpipe.required "stub" (Jdec.array Jdec.int) + |> Jpipe.required "bitmask" Jdec.int + |> Jpipe.required "cols" Jdec.int + |> Jpipe.required "corner_nw_lat" Jdec.int + |> Jpipe.required "corner_nw_lon" Jdec.int + |> 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 encodeMsgSsrTileDefinition : MsgSsrTileDefinition -> Jenc.Value encodeMsgSsrTileDefinition x = Jenc.object - [ ("stub", makeArrayEncoder Jenc.int x.stub) + [ ("bitmask", Jenc.int x.bitmask) + , ("cols", Jenc.int x.cols) + , ("corner_nw_lat", Jenc.int x.cornerNwLat) + , ("corner_nw_lon", Jenc.int x.cornerNwLon) + , ("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) ] msgStartup : Jdec.Decoder MsgStartup @@ -6793,12 +7311,28 @@ encodeMsgUserData x = msgUTCLeapSecond : Jdec.Decoder MsgUTCLeapSecond msgUTCLeapSecond = Jpipe.decode MsgUTCLeapSecond - |> Jpipe.required "stub" (Jdec.array Jdec.int) + |> Jpipe.required "bias_coeff" Jdec.int + |> Jpipe.required "count_after" Jdec.int + |> Jpipe.required "count_before" Jdec.int + |> Jpipe.required "drift_coeff" Jdec.int + |> Jpipe.required "drift_rate_coeff" Jdec.int + |> Jpipe.required "ref_dn" Jdec.int + |> Jpipe.required "ref_wn" Jdec.int + |> Jpipe.required "tow_s" Jdec.int + |> Jpipe.required "wn" Jdec.int encodeMsgUTCLeapSecond : MsgUTCLeapSecond -> Jenc.Value encodeMsgUTCLeapSecond x = Jenc.object - [ ("stub", makeArrayEncoder Jenc.int x.stub) + [ ("bias_coeff", Jenc.int x.biasCoeff) + , ("count_after", Jenc.int x.countAfter) + , ("count_before", Jenc.int x.countBefore) + , ("drift_coeff", Jenc.int x.driftCoeff) + , ("drift_rate_coeff", Jenc.int x.driftRateCoeff) + , ("ref_dn", Jenc.int x.refDN) + , ("ref_wn", Jenc.int x.refWn) + , ("tow_s", Jenc.int x.towS) + , ("wn", Jenc.int x.wn) ] msgUTCTime : Jdec.Decoder MsgUTCTime @@ -7192,21 +7726,6 @@ encodeSTECHeader x = , ("update_interval", Jenc.int x.updateInterval) ] -stecSatElement : Jdec.Decoder STECSatElement -stecSatElement = - Jpipe.decode STECSatElement - |> Jpipe.required "stec_coeff" (Jdec.array Jdec.int) - |> Jpipe.required "stec_quality_indicator" Jdec.int - |> Jpipe.required "sv_id" svID - -encodeSTECSatElement : STECSatElement -> Jenc.Value -encodeSTECSatElement x = - Jenc.object - [ ("stec_coeff", makeArrayEncoder Jenc.int x.stecCoeff) - , ("stec_quality_indicator", Jenc.int x.stecQualityIndicator) - , ("sv_id", encodeSvID x.svID) - ] - --- encoder helpers makeArrayEncoder : (a -> Jenc.Value) -> Array a -> Jenc.Value diff --git a/sbpjson/javascript/SbpJson.js b/sbpjson/javascript/SbpJson.js index 2c41070c1b..bb25b1a539 100644 --- a/sbpjson/javascript/SbpJson.js +++ b/sbpjson/javascript/SbpJson.js @@ -4,8 +4,10 @@ // // const acqSvProfile = Convert.toAcqSvProfile(json); // const almanacCommonContent = Convert.toAlmanacCommonContent(json); +// const boundsHeader = Convert.toBoundsHeader(json); // const carrierPhase = Convert.toCarrierPhase(json); // const codeBiasesContent = Convert.toCodeBiasesContent(json); +// const codePhaseBiasesSatSig = Convert.toCodePhaseBiasesSatSig(json); // const doppler = Convert.toDoppler(json); // const ephemerisCommonContent = Convert.toEphemerisCommonContent(json); // const estimatedHorizontalErrorEllipse = Convert.toEstimatedHorizontalErrorEllipse(json); @@ -70,7 +72,6 @@ // const msgFlashReadResp = Convert.toMsgFlashReadResp(json); // const msgFrontEndGain = Convert.toMsgFrontEndGain(json); // const msgFwd = Convert.toMsgFwd(json); -// const msgGPSLeapSecond = Convert.toMsgGPSLeapSecond(json); // const msgGPSTime = Convert.toMsgGPSTime(json); // const msgGPSTimeGnss = Convert.toMsgGPSTimeGnss(json); // const msgGloBiases = Convert.toMsgGloBiases(json); @@ -85,7 +86,6 @@ // const msgInsStatus = Convert.toMsgInsStatus(json); // const msgInsUpdates = Convert.toMsgInsUpdates(json); // const msgIono = Convert.toMsgIono(json); -// const msgItrf = Convert.toMsgItrf(json); // const msgLinuxCPUState = Convert.toMsgLinuxCPUState(json); // const msgLinuxMemState = Convert.toMsgLinuxMemState(json); // const msgLinuxProcessFdCount = Convert.toMsgLinuxProcessFdCount(json); @@ -186,6 +186,8 @@ // const networkUsage = Convert.toNetworkUsage(json); // const observationHeader = Convert.toObservationHeader(json); // const odoInputType = Convert.toOdoInputType(json); +// const orbitClockBound = Convert.toOrbitClockBound(json); +// const orbitClockBoundDegradation = Convert.toOrbitClockBoundDegradation(json); // const packedObsContent = Convert.toPackedObsContent(json); // const packedOsrContent = Convert.toPackedOsrContent(json); // const period = Convert.toPeriod(json); @@ -194,6 +196,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); @@ -227,6 +230,14 @@ function almanacCommonContentToJson(value) { return JSON.stringify(uncast(value, r("AlmanacCommonContent")), null, 2); } +function toBoundsHeader(json) { + return cast(JSON.parse(json), r("BoundsHeader")); +} + +function boundsHeaderToJson(value) { + return JSON.stringify(uncast(value, r("BoundsHeader")), null, 2); +} + function toCarrierPhase(json) { return cast(JSON.parse(json), r("CarrierPhase")); } @@ -243,6 +254,14 @@ function codeBiasesContentToJson(value) { return JSON.stringify(uncast(value, r("CodeBiasesContent")), null, 2); } +function toCodePhaseBiasesSatSig(json) { + return cast(JSON.parse(json), r("CodePhaseBiasesSatSig")); +} + +function codePhaseBiasesSatSigToJson(value) { + return JSON.stringify(uncast(value, r("CodePhaseBiasesSatSig")), null, 2); +} + function toDoppler(json) { return cast(JSON.parse(json), r("Doppler")); } @@ -755,14 +774,6 @@ function msgFwdToJson(value) { return JSON.stringify(uncast(value, r("MsgFwd")), null, 2); } -function toMsgGPSLeapSecond(json) { - return cast(JSON.parse(json), r("MsgGPSLeapSecond")); -} - -function msgGPSLeapSecondToJson(value) { - return JSON.stringify(uncast(value, r("MsgGPSLeapSecond")), null, 2); -} - function toMsgGPSTime(json) { return cast(JSON.parse(json), r("MsgGPSTime")); } @@ -875,14 +886,6 @@ function msgIonoToJson(value) { return JSON.stringify(uncast(value, r("MsgIono")), null, 2); } -function toMsgItrf(json) { - return cast(JSON.parse(json), r("MsgItrf")); -} - -function msgItrfToJson(value) { - return JSON.stringify(uncast(value, r("MsgItrf")), null, 2); -} - function toMsgLinuxCPUState(json) { return cast(JSON.parse(json), r("MsgLinuxCPUState")); } @@ -1683,6 +1686,22 @@ function odoInputTypeToJson(value) { return JSON.stringify(uncast(value, r("OdoInputType")), null, 2); } +function toOrbitClockBound(json) { + return cast(JSON.parse(json), r("OrbitClockBound")); +} + +function orbitClockBoundToJson(value) { + return JSON.stringify(uncast(value, r("OrbitClockBound")), null, 2); +} + +function toOrbitClockBoundDegradation(json) { + return cast(JSON.parse(json), r("OrbitClockBoundDegradation")); +} + +function orbitClockBoundDegradationToJson(value) { + return JSON.stringify(uncast(value, r("OrbitClockBoundDegradation")), null, 2); +} + function toPackedObsContent(json) { return cast(JSON.parse(json), r("PackedObsContent")); } @@ -1747,6 +1766,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")); } @@ -2375,17 +2402,6 @@ const typeMap = { { json: "protocol", js: "protocol", typ: 0 }, { json: "source", js: "source", typ: 0 }, ], "any"), - "MsgGPSLeapSecond": o([ - { json: "bias_coeff", js: "bias_coeff", typ: 0 }, - { json: "count_after", js: "count_after", typ: 0 }, - { json: "count_before", js: "count_before", typ: 0 }, - { json: "drift_coeff", js: "drift_coeff", typ: 0 }, - { json: "drift_rate_coeff", js: "drift_rate_coeff", typ: 0 }, - { json: "ref_dn", js: "ref_dn", typ: 0 }, - { json: "ref_wn", js: "ref_wn", typ: 0 }, - { json: "tow_s", js: "tow_s", typ: 0 }, - { json: "wn", js: "wn", typ: 0 }, - ], "any"), "MsgGPSTime": o([ { json: "flags", js: "flags", typ: 0 }, { json: "ns_residual", js: "ns_residual", typ: 0 }, @@ -2490,30 +2506,6 @@ const typeMap = { { json: "b3", js: "b3", typ: 3.14 }, { json: "t_nmct", js: "t_nmct", typ: r("GpsTimeSEC") }, ], "any"), - "MsgItrf": o([ - { json: "delta_X0", js: "delta_X0", typ: 0 }, - { json: "delta_Y0", js: "delta_Y0", typ: 0 }, - { json: "delta_Z0", js: "delta_Z0", typ: 0 }, - { json: "dot_delta_X0", js: "dot_delta_X0", typ: 0 }, - { json: "dot_delta_Y0", js: "dot_delta_Y0", typ: 0 }, - { json: "dot_delta_Z0", js: "dot_delta_Z0", typ: 0 }, - { json: "dot_scale", js: "dot_scale", typ: 0 }, - { json: "dot_theta_01", js: "dot_theta_01", typ: 0 }, - { json: "dot_theta_02", js: "dot_theta_02", typ: 0 }, - { json: "dot_theta_03", js: "dot_theta_03", typ: 0 }, - { json: "re_t0", js: "re_t0", typ: 0 }, - { json: "scale", js: "scale", typ: 0 }, - { json: "sin", js: "sin", typ: 0 }, - { json: "sn", js: "sn", typ: "" }, - { json: "sn_counter_n", js: "sn_counter_n", typ: 0 }, - { json: "ssr_iod", js: "ssr_iod", typ: 0 }, - { json: "theta_01", js: "theta_01", typ: 0 }, - { json: "theta_02", js: "theta_02", typ: 0 }, - { json: "theta_03", js: "theta_03", typ: 0 }, - { json: "tn", js: "tn", typ: "" }, - { json: "tn_counter_m", js: "tn_counter_m", typ: 0 }, - { json: "utn", js: "utn", typ: 0 }, - ], "any"), "MsgLinuxCPUState": o([ { json: "cmdline", js: "cmdline", typ: "" }, { json: "flags", js: "flags", typ: 0 }, @@ -2847,7 +2839,26 @@ const typeMap = { { json: "wn", js: "wn", typ: 0 }, ], "any"), "MsgReferenceFrameParam": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "delta_X0", js: "delta_X0", typ: 0 }, + { json: "delta_Y0", js: "delta_Y0", typ: 0 }, + { json: "delta_Z0", js: "delta_Z0", typ: 0 }, + { json: "dot_delta_X0", js: "dot_delta_X0", typ: 0 }, + { json: "dot_delta_Y0", js: "dot_delta_Y0", typ: 0 }, + { json: "dot_delta_Z0", js: "dot_delta_Z0", typ: 0 }, + { json: "dot_scale", js: "dot_scale", typ: 0 }, + { json: "dot_theta_01", js: "dot_theta_01", typ: 0 }, + { json: "dot_theta_02", js: "dot_theta_02", typ: 0 }, + { json: "dot_theta_03", js: "dot_theta_03", typ: 0 }, + { json: "re_t0", js: "re_t0", typ: 0 }, + { json: "scale", js: "scale", typ: 0 }, + { json: "sin", js: "sin", typ: 0 }, + { json: "sn", js: "sn", typ: "" }, + { json: "ssr_iod", js: "ssr_iod", typ: 0 }, + { json: "theta_01", js: "theta_01", typ: 0 }, + { json: "theta_02", js: "theta_02", typ: 0 }, + { json: "theta_03", js: "theta_03", typ: 0 }, + { json: "tn", js: "tn", typ: "" }, + { json: "utn", js: "utn", typ: 0 }, ], "any"), "MsgReset": o([ { json: "flags", js: "flags", typ: 0 }, @@ -2932,25 +2943,26 @@ const typeMap = { { json: "value", js: "value", typ: 0 }, ], "any"), "MsgSsrCodePhaseBiasesBounds": o([ - { json: "stub", js: "stub", typ: a(0) }, - ], "any"), - "MsgSsrFlagHighLevel": o([ - { json: "stub", js: "stub", typ: a(0) }, - ], "any"), - "MsgSsrFlagIonoGridPointSatLos": o([ - { json: "stub", js: "stub", typ: a(0) }, - ], "any"), - "MsgSsrFlagIonoGridPoints": o([ - { json: "stub", js: "stub", typ: a(0) }, - ], "any"), - "MsgSsrFlagIonoTileSatLos": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "const_id", js: "const_id", typ: 0 }, + { json: "header", js: "header", typ: r("BoundsHeader") }, + { json: "n_sats_signals", js: "n_sats_signals", typ: 0 }, + { json: "satellites_signals", js: "satellites_signals", typ: a(r("CodePhaseBiasesSatSig")) }, + { json: "ssr_iod", js: "ssr_iod", typ: 0 }, ], "any"), - "MsgSsrFlagSatellites": o([ - { json: "stub", js: "stub", typ: a(0) }, + "BoundsHeader": o([ + { json: "num_msgs", js: "num_msgs", typ: 0 }, + { json: "seq_num", js: "seq_num", typ: 0 }, + { json: "sol_id", js: "sol_id", typ: 0 }, + { json: "time", js: "time", typ: r("GpsTimeSEC") }, + { json: "update_interval", js: "update_interval", typ: 0 }, ], "any"), - "MsgSsrFlagTropoGridPoints": o([ - { json: "stub", js: "stub", typ: a(0) }, + "CodePhaseBiasesSatSig": o([ + { json: "code_bias_bound_mu", js: "code_bias_bound_mu", typ: 0 }, + { json: "code_bias_bound_sig", js: "code_bias_bound_sig", typ: 0 }, + { json: "phase_bias_bound_mu", js: "phase_bias_bound_mu", typ: 0 }, + { json: "phase_bias_bound_sig", js: "phase_bias_bound_sig", typ: 0 }, + { json: "sat_id", js: "sat_id", typ: 0 }, + { json: "signal_id", js: "signal_id", typ: 0 }, ], "any"), "MsgSsrFlagHighLevel": o([ { json: "chain_id", js: "chain_id", typ: 0 }, @@ -3024,7 +3036,26 @@ const typeMap = { { json: "update_interval", js: "update_interval", typ: 0 }, ], "any"), "MsgSsrGriddedCorrectionBounds": o([ - { json: "stub", js: "stub", typ: a(0) }, + { 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_delay_correction", js: "tropo_delay_correction", typ: r("TroposphericDelayCorrection") }, + { json: "tropo_qi", js: "tropo_qi", typ: 0 }, + { json: "tropo_v_hydro_bound_mu", js: "tropo_v_hydro_bound_mu", typ: 0 }, + { json: "tropo_v_hydro_bound_sig", js: "tropo_v_hydro_bound_sig", typ: 0 }, + { json: "tropo_v_wet_bound_mu", js: "tropo_v_wet_bound_mu", typ: 0 }, + { json: "tropo_v_wet_bound_sig", js: "tropo_v_wet_bound_sig", 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 }, @@ -3043,10 +3074,39 @@ const typeMap = { { json: "update_interval", js: "update_interval", typ: 0 }, ], "any"), "MsgSsrOrbitClockBounds": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "const_id", js: "const_id", typ: 0 }, + { json: "header", js: "header", typ: r("BoundsHeader") }, + { json: "n_sats", js: "n_sats", typ: 0 }, + { json: "orbit_clock_bounds", js: "orbit_clock_bounds", typ: a(r("OrbitClockBound")) }, + { json: "ssr_iod", js: "ssr_iod", typ: 0 }, + ], "any"), + "OrbitClockBound": o([ + { json: "clock_bound_mu", js: "clock_bound_mu", typ: 0 }, + { json: "clock_bound_sig", js: "clock_bound_sig", typ: 0 }, + { json: "orb_along_bound_mu", js: "orb_along_bound_mu", typ: 0 }, + { json: "orb_along_bound_sig", js: "orb_along_bound_sig", typ: 0 }, + { json: "orb_cross_bound_mu", js: "orb_cross_bound_mu", typ: 0 }, + { json: "orb_cross_bound_sig", js: "orb_cross_bound_sig", typ: 0 }, + { json: "orb_radial_bound_mu", js: "orb_radial_bound_mu", typ: 0 }, + { json: "orb_radial_bound_sig", js: "orb_radial_bound_sig", typ: 0 }, + { json: "sat_id", js: "sat_id", typ: 0 }, ], "any"), "MsgSsrOrbitClockBoundsDegradation": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "const_id", js: "const_id", typ: 0 }, + { json: "header", js: "header", typ: r("BoundsHeader") }, + { json: "orbit_clock_bounds_degradation", js: "orbit_clock_bounds_degradation", typ: r("OrbitClockBoundDegradation") }, + { json: "sat_bitmask", js: "sat_bitmask", typ: 0 }, + { json: "ssr_iod", js: "ssr_iod", typ: 0 }, + ], "any"), + "OrbitClockBoundDegradation": o([ + { json: "clock_bound_mu_dot", js: "clock_bound_mu_dot", typ: 0 }, + { json: "clock_bound_sig_dot", js: "clock_bound_sig_dot", typ: 0 }, + { json: "orb_along_bound_mu_dot", js: "orb_along_bound_mu_dot", typ: 0 }, + { json: "orb_along_bound_sig_dot", js: "orb_along_bound_sig_dot", typ: 0 }, + { json: "orb_cross_bound_mu_dot", js: "orb_cross_bound_mu_dot", typ: 0 }, + { json: "orb_cross_bound_sig_dot", js: "orb_cross_bound_sig_dot", typ: 0 }, + { json: "orb_radial_bound_mu_dot", js: "orb_radial_bound_mu_dot", typ: 0 }, + { json: "orb_radial_bound_sig_dot", js: "orb_radial_bound_sig_dot", typ: 0 }, ], "any"), "MsgSsrPhaseBiases": o([ { json: "biases", js: "biases", typ: a(r("PhaseBiasesContent")) }, @@ -3077,10 +3137,29 @@ const typeMap = { { json: "svn", js: "svn", typ: 0 }, ], "any"), "MsgSsrStecCorrection": o([ - { json: "stub", js: "stub", typ: a(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("STECSatElement")) }, + { json: "tile_id", js: "tile_id", typ: 0 }, + { json: "tile_set_id", js: "tile_set_id", typ: 0 }, + ], "any"), + "STECSatElement": o([ + { json: "stec_coeff", js: "stec_coeff", typ: a(0) }, + { json: "stec_quality_indicator", js: "stec_quality_indicator", typ: 0 }, + { json: "sv_id", js: "sv_id", typ: r("SvID") }, ], "any"), "MsgSsrTileDefinition": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "bitmask", js: "bitmask", typ: 0 }, + { json: "cols", js: "cols", typ: 0 }, + { json: "corner_nw_lat", js: "corner_nw_lat", typ: 0 }, + { json: "corner_nw_lon", js: "corner_nw_lon", typ: 0 }, + { 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"), "MsgStartup": o([ { json: "cause", js: "cause", typ: 0 }, @@ -3179,7 +3258,15 @@ const typeMap = { { json: "contents", js: "contents", typ: a(0) }, ], "any"), "MsgUTCLeapSecond": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "bias_coeff", js: "bias_coeff", typ: 0 }, + { json: "count_after", js: "count_after", typ: 0 }, + { json: "count_before", js: "count_before", typ: 0 }, + { json: "drift_coeff", js: "drift_coeff", typ: 0 }, + { json: "drift_rate_coeff", js: "drift_rate_coeff", typ: 0 }, + { json: "ref_dn", js: "ref_dn", typ: 0 }, + { json: "ref_wn", js: "ref_wn", typ: 0 }, + { json: "tow_s", js: "tow_s", typ: 0 }, + { json: "wn", js: "wn", typ: 0 }, ], "any"), "MsgUTCTime": o([ { json: "day", js: "day", typ: 0 }, @@ -3339,11 +3426,6 @@ const typeMap = { { 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) }, - { json: "stec_quality_indicator", js: "stec_quality_indicator", typ: 0 }, - { json: "sv_id", js: "sv_id", typ: r("SvID") }, - ], "any"), }; module.exports = { @@ -3351,10 +3433,14 @@ module.exports = { "toAcqSvProfile": toAcqSvProfile, "almanacCommonContentToJson": almanacCommonContentToJson, "toAlmanacCommonContent": toAlmanacCommonContent, + "boundsHeaderToJson": boundsHeaderToJson, + "toBoundsHeader": toBoundsHeader, "carrierPhaseToJson": carrierPhaseToJson, "toCarrierPhase": toCarrierPhase, "codeBiasesContentToJson": codeBiasesContentToJson, "toCodeBiasesContent": toCodeBiasesContent, + "codePhaseBiasesSatSigToJson": codePhaseBiasesSatSigToJson, + "toCodePhaseBiasesSatSig": toCodePhaseBiasesSatSig, "dopplerToJson": dopplerToJson, "toDoppler": toDoppler, "ephemerisCommonContentToJson": ephemerisCommonContentToJson, @@ -3483,8 +3569,6 @@ module.exports = { "toMsgFrontEndGain": toMsgFrontEndGain, "msgFwdToJson": msgFwdToJson, "toMsgFwd": toMsgFwd, - "msgGPSLeapSecondToJson": msgGPSLeapSecondToJson, - "toMsgGPSLeapSecond": toMsgGPSLeapSecond, "msgGPSTimeToJson": msgGPSTimeToJson, "toMsgGPSTime": toMsgGPSTime, "msgGPSTimeGnssToJson": msgGPSTimeGnssToJson, @@ -3513,8 +3597,6 @@ module.exports = { "toMsgInsUpdates": toMsgInsUpdates, "msgIonoToJson": msgIonoToJson, "toMsgIono": toMsgIono, - "msgItrfToJson": msgItrfToJson, - "toMsgItrf": toMsgItrf, "msgLinuxCPUStateToJson": msgLinuxCPUStateToJson, "toMsgLinuxCPUState": toMsgLinuxCPUState, "msgLinuxMemStateToJson": msgLinuxMemStateToJson, @@ -3715,6 +3797,10 @@ module.exports = { "toObservationHeader": toObservationHeader, "odoInputTypeToJson": odoInputTypeToJson, "toOdoInputType": toOdoInputType, + "orbitClockBoundToJson": orbitClockBoundToJson, + "toOrbitClockBound": toOrbitClockBound, + "orbitClockBoundDegradationToJson": orbitClockBoundDegradationToJson, + "toOrbitClockBoundDegradation": toOrbitClockBoundDegradation, "packedObsContentToJson": packedObsContentToJson, "toPackedObsContent": toPackedObsContent, "packedOsrContentToJson": packedOsrContentToJson, @@ -3731,6 +3817,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 7718afdc5f..9803c0cd49 100644 --- a/sbpjson/typescript/SbpJson.ts +++ b/sbpjson/typescript/SbpJson.ts @@ -1,11 +1,13 @@ // To parse this data: // -// import { Convert, AcqSvProfile, AlmanacCommonContent, CarrierPhase, CodeBiasesContent, 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, MsgReferenceFrameParam, MsgReset, MsgResetFilters, MsgSbasRaw, MsgSensorAidEvent, MsgSettingsReadByIndexReq, MsgSettingsReadByIndexResp, MsgSettingsReadReq, MsgSettingsReadResp, MsgSettingsRegister, MsgSettingsRegisterResp, MsgSettingsWrite, MsgSettingsWriteResp, MsgSolnMeta, MsgSpecan, MsgSsrCodeBiases, MsgSsrCodePhaseBiasesBounds, MsgSsrFlagHighLevel, MsgSsrFlagIonoGridPointSatLos, MsgSsrFlagIonoGridPoints, MsgSsrFlagIonoTileSatLos, MsgSsrFlagSatellites, MsgSsrFlagTropoGridPoints, MsgSsrGriddedCorrection, MsgSsrGriddedCorrectionBounds, MsgSsrOrbitClock, MsgSsrOrbitClockBounds, MsgSsrOrbitClockBoundsDegradation, MsgSsrPhaseBiases, MsgSsrSatelliteApc, MsgSsrStecCorrection, MsgSsrTileDefinition, MsgStartup, MsgStatusJournal, MsgStatusReport, MsgStmFlashLockSector, MsgStmFlashUnlockSector, MsgStmUniqueIDResp, MsgSvAzEl, MsgThreadState, MsgTrackingIq, MsgTrackingState, MsgUARTState, MsgUserData, MsgUTCLeapSecond, MsgUTCTime, MsgUTCTimeGnss, MsgVelBody, MsgVelCog, MsgVelECEF, MsgVelECEFCov, MsgVelECEFCovGnss, MsgVelECEFGnss, MsgVelNED, MsgVelNEDCov, MsgVelNEDCovGnss, MsgVelNEDGnss, MsgWheeltick, NetworkUsage, ObservationHeader, OdoInputType, 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, IntegritySSRHeader, 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, MsgReferenceFrameParam, MsgReset, MsgResetFilters, MsgSbasRaw, MsgSensorAidEvent, MsgSettingsReadByIndexReq, MsgSettingsReadByIndexResp, MsgSettingsReadReq, MsgSettingsReadResp, MsgSettingsRegister, MsgSettingsRegisterResp, MsgSettingsWrite, MsgSettingsWriteResp, MsgSolnMeta, MsgSpecan, MsgSsrCodeBiases, MsgSsrCodePhaseBiasesBounds, MsgSsrFlagHighLevel, MsgSsrFlagIonoGridPointSatLos, MsgSsrFlagIonoGridPoints, MsgSsrFlagIonoTileSatLos, MsgSsrFlagSatellites, MsgSsrFlagTropoGridPoints, MsgSsrGriddedCorrection, MsgSsrGriddedCorrectionBounds, MsgSsrOrbitClock, MsgSsrOrbitClockBounds, MsgSsrOrbitClockBoundsDegradation, MsgSsrPhaseBiases, MsgSsrSatelliteApc, MsgSsrStecCorrection, MsgSsrTileDefinition, MsgStartup, MsgStatusJournal, MsgStatusReport, MsgStmFlashLockSector, MsgStmFlashUnlockSector, MsgStmUniqueIDResp, MsgSvAzEl, MsgThreadState, MsgTrackingIq, MsgTrackingState, MsgUARTState, MsgUserData, MsgUTCLeapSecond, MsgUTCTime, MsgUTCTimeGnss, MsgVelBody, MsgVelCog, MsgVelECEF, MsgVelECEFCov, MsgVelECEFCovGnss, MsgVelECEFGnss, MsgVelNED, MsgVelNEDCov, MsgVelNEDCovGnss, MsgVelNEDGnss, MsgWheeltick, NetworkUsage, ObservationHeader, OdoInputType, OrbitClockBound, OrbitClockBoundDegradation, 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); +// const boundsHeader = Convert.toBoundsHeader(json); // const carrierPhase = Convert.toCarrierPhase(json); // const codeBiasesContent = Convert.toCodeBiasesContent(json); +// const codePhaseBiasesSatSig = Convert.toCodePhaseBiasesSatSig(json); // const doppler = Convert.toDoppler(json); // const ephemerisCommonContent = Convert.toEphemerisCommonContent(json); // const estimatedHorizontalErrorEllipse = Convert.toEstimatedHorizontalErrorEllipse(json); @@ -18,6 +20,7 @@ // const gridElementNoStd = Convert.toGridElementNoStd(json); // const griddedCorrectionHeader = Convert.toGriddedCorrectionHeader(json); // const iMUInputType = Convert.toIMUInputType(json); +// const integritySSRHeader = Convert.toIntegritySSRHeader(json); // const latency = Convert.toLatency(json); // const measurementState = Convert.toMeasurementState(json); // const msgAcqResult = Convert.toMsgAcqResult(json); @@ -183,6 +186,8 @@ // const networkUsage = Convert.toNetworkUsage(json); // const observationHeader = Convert.toObservationHeader(json); // const odoInputType = Convert.toOdoInputType(json); +// const orbitClockBound = Convert.toOrbitClockBound(json); +// const orbitClockBoundDegradation = Convert.toOrbitClockBoundDegradation(json); // const packedObsContent = Convert.toPackedObsContent(json); // const packedOsrContent = Convert.toPackedOsrContent(json); // const period = Convert.toPeriod(json); @@ -191,6 +196,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); @@ -1770,7 +1776,26 @@ export interface MsgProtectionLevel { } export interface MsgReferenceFrameParam { - stub: number[]; + delta_X0: number; + delta_Y0: number; + delta_Z0: number; + dot_delta_X0: number; + dot_delta_Y0: number; + dot_delta_Z0: number; + dot_scale: number; + dot_theta_01: number; + dot_theta_02: number; + dot_theta_03: number; + re_t0: number; + scale: number; + sin: number; + sn: string; + ssr_iod: number; + theta_01: number; + theta_02: number; + theta_03: number; + tn: string; + utn: number; } /** @@ -1974,31 +1999,90 @@ export interface CodeBiasesContent { } export interface MsgSsrCodePhaseBiasesBounds { - stub: number[]; + const_id: number; + header: BoundsHeader; + n_sats_signals: number; + satellites_signals: CodePhaseBiasesSatSig[]; + ssr_iod: number; +} + +export interface BoundsHeader { + num_msgs: number; + seq_num: number; + sol_id: number; + time: GpsTimeSEC; + update_interval: number; +} + +export interface CodePhaseBiasesSatSig { + code_bias_bound_mu: number; + code_bias_bound_sig: number; + phase_bias_bound_mu: number; + phase_bias_bound_sig: number; + sat_id: number; + signal_id: number; } export interface MsgSsrFlagHighLevel { - stub: number[]; + chain_id: number; + corr_time: GpsTimeSEC; + obs_time: GpsTimeSEC; + ssr_sol_id: number; + tile_id: number; + tile_set_id: number; + use_bds_sat: number; + use_gal_sat: number; + use_gps_sat: number; + use_iono_grid_point_sat_los: number; + use_iono_grid_points: number; + use_iono_tile_sat_los: number; + use_tropo_grid_points: number; } export interface MsgSsrFlagIonoGridPointSatLos { - stub: number[]; + faulty_los: SvID[]; + grid_point_id: number; + header: IntegritySSRHeader; + n_faulty_los: number; +} + +export interface IntegritySSRHeader { + chain_id: number; + num_msgs: number; + obs_time: GpsTimeSEC; + seq_num: number; + ssr_sol_id: number; + tile_id: number; + tile_set_id: number; } export interface MsgSsrFlagIonoGridPoints { - stub: number[]; + faulty_points: number[]; + header: IntegritySSRHeader; + n_faulty_points: number; } export interface MsgSsrFlagIonoTileSatLos { - stub: number[]; + faulty_los: SvID[]; + header: IntegritySSRHeader; + n_faulty_los: number; } export interface MsgSsrFlagSatellites { - stub: number[]; + chain_id: number; + const_id: number; + faulty_sats: number[]; + n_faulty_sats: number; + num_msgs: number; + obs_time: GpsTimeSEC; + seq_num: number; + ssr_sol_id: number; } export interface MsgSsrFlagTropoGridPoints { - stub: number[]; + faulty_points: number[]; + header: IntegritySSRHeader; + n_faulty_points: number; } /** @@ -2033,7 +2117,30 @@ export interface GriddedCorrectionHeader { * mean=5+0.5(i-230). */ export interface MsgSsrGriddedCorrectionBounds { - stub: number[]; + 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_delay_correction: TroposphericDelayCorrection; + tropo_qi: number; + tropo_v_hydro_bound_mu: number; + tropo_v_hydro_bound_sig: number; + tropo_v_wet_bound_mu: number; + tropo_v_wet_bound_sig: 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; } /** @@ -2058,15 +2165,55 @@ export interface MsgSsrOrbitClock { } /** - * Note 1: Range: 0-55 m. i<=200, mean=0.0251i; 200240, - * mean=25+2(i-240). + * Note 1: Range: 0-17.5 m. i<=200, mean=0.01i; 200230, + * mean=5+0.5(i-230)., + * , + * Note 2: Range: 0-17.5 m. i<=200, std=0.01i; 200230, + * std=5+0.5(i-230). */ export interface MsgSsrOrbitClockBounds { - stub: number[]; + const_id: number; + header: BoundsHeader; + n_sats: number; + orbit_clock_bounds: OrbitClockBound[]; + ssr_iod: number; +} + +/** + * Orbit and clock bound. + */ +export interface OrbitClockBound { + clock_bound_mu: number; + clock_bound_sig: number; + orb_along_bound_mu: number; + orb_along_bound_sig: number; + orb_cross_bound_mu: number; + orb_cross_bound_sig: number; + orb_radial_bound_mu: number; + orb_radial_bound_sig: number; + sat_id: number; } export interface MsgSsrOrbitClockBoundsDegradation { - stub: number[]; + const_id: number; + header: BoundsHeader; + orbit_clock_bounds_degradation: OrbitClockBoundDegradation; + sat_bitmask: number; + ssr_iod: number; +} + +/** + * Orbit and clock bound degradation. + */ +export interface OrbitClockBoundDegradation { + clock_bound_mu_dot: number; + clock_bound_sig_dot: number; + orb_along_bound_mu_dot: number; + orb_along_bound_sig_dot: number; + orb_cross_bound_mu_dot: number; + orb_cross_bound_sig_dot: number; + orb_radial_bound_mu_dot: number; + orb_radial_bound_sig_dot: number; } /** @@ -2115,7 +2262,21 @@ export interface SatelliteAPC { } export interface MsgSsrStecCorrection { - stub: number[]; + header: BoundsHeader; + n_sats: number; + ssr_iod_atmo: number; + stec_sat_list: STECSatElement[]; + tile_id: number; + tile_set_id: number; +} + +/** + * STEC polynomial for the given satellite. + */ +export interface STECSatElement { + stec_coeff: number[]; + stec_quality_indicator: number; + sv_id: SvID; } /** @@ -2127,7 +2288,16 @@ export interface MsgSsrStecCorrection { * lists of points. */ export interface MsgSsrTileDefinition { - stub: number[]; + bitmask: number; + cols: number; + corner_nw_lat: number; + corner_nw_lon: number; + rows: number; + spacing_lat: number; + spacing_lon: number; + ssr_sol_id: number; + tile_id: number; + tile_set_id: number; } /** @@ -2345,7 +2515,15 @@ export interface MsgUserData { * parameters. */ export interface MsgUTCLeapSecond { - stub: number[]; + bias_coeff: number; + count_after: number; + count_before: number; + drift_coeff: number; + drift_rate_coeff: number; + ref_dn: number; + ref_wn: number; + tow_s: number; + wn: number; } /** @@ -2612,15 +2790,6 @@ export interface STECHeader { update_interval: number; } -/** - * STEC polynomial for the given satellite. - */ -export interface STECSatElement { - stec_coeff: number[]; - stec_quality_indicator: number; - sv_id: SvID; -} - // Converts JSON strings to/from your types // and asserts the results of JSON.parse at runtime export class Convert { @@ -2640,6 +2809,14 @@ export class Convert { return JSON.stringify(uncast(value, r("AlmanacCommonContent")), null, 2); } + public static toBoundsHeader(json: string): BoundsHeader { + return cast(JSON.parse(json), r("BoundsHeader")); + } + + public static boundsHeaderToJson(value: BoundsHeader): string { + return JSON.stringify(uncast(value, r("BoundsHeader")), null, 2); + } + public static toCarrierPhase(json: string): CarrierPhase { return cast(JSON.parse(json), r("CarrierPhase")); } @@ -2656,6 +2833,14 @@ export class Convert { return JSON.stringify(uncast(value, r("CodeBiasesContent")), null, 2); } + public static toCodePhaseBiasesSatSig(json: string): CodePhaseBiasesSatSig { + return cast(JSON.parse(json), r("CodePhaseBiasesSatSig")); + } + + public static codePhaseBiasesSatSigToJson(value: CodePhaseBiasesSatSig): string { + return JSON.stringify(uncast(value, r("CodePhaseBiasesSatSig")), null, 2); + } + public static toDoppler(json: string): Doppler { return cast(JSON.parse(json), r("Doppler")); } @@ -2752,6 +2937,14 @@ export class Convert { return JSON.stringify(uncast(value, r("IMUInputType")), null, 2); } + public static toIntegritySSRHeader(json: string): IntegritySSRHeader { + return cast(JSON.parse(json), r("IntegritySSRHeader")); + } + + public static integritySSRHeaderToJson(value: IntegritySSRHeader): string { + return JSON.stringify(uncast(value, r("IntegritySSRHeader")), null, 2); + } + public static toLatency(json: string): Latency { return cast(JSON.parse(json), r("Latency")); } @@ -4072,6 +4265,22 @@ export class Convert { return JSON.stringify(uncast(value, r("OdoInputType")), null, 2); } + public static toOrbitClockBound(json: string): OrbitClockBound { + return cast(JSON.parse(json), r("OrbitClockBound")); + } + + public static orbitClockBoundToJson(value: OrbitClockBound): string { + return JSON.stringify(uncast(value, r("OrbitClockBound")), null, 2); + } + + public static toOrbitClockBoundDegradation(json: string): OrbitClockBoundDegradation { + return cast(JSON.parse(json), r("OrbitClockBoundDegradation")); + } + + public static orbitClockBoundDegradationToJson(value: OrbitClockBoundDegradation): string { + return JSON.stringify(uncast(value, r("OrbitClockBoundDegradation")), null, 2); + } + public static toPackedObsContent(json: string): PackedObsContent { return cast(JSON.parse(json), r("PackedObsContent")); } @@ -4136,6 +4345,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")); } @@ -5202,7 +5419,26 @@ const typeMap: any = { { json: "wn", js: "wn", typ: 0 }, ], "any"), "MsgReferenceFrameParam": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "delta_X0", js: "delta_X0", typ: 0 }, + { json: "delta_Y0", js: "delta_Y0", typ: 0 }, + { json: "delta_Z0", js: "delta_Z0", typ: 0 }, + { json: "dot_delta_X0", js: "dot_delta_X0", typ: 0 }, + { json: "dot_delta_Y0", js: "dot_delta_Y0", typ: 0 }, + { json: "dot_delta_Z0", js: "dot_delta_Z0", typ: 0 }, + { json: "dot_scale", js: "dot_scale", typ: 0 }, + { json: "dot_theta_01", js: "dot_theta_01", typ: 0 }, + { json: "dot_theta_02", js: "dot_theta_02", typ: 0 }, + { json: "dot_theta_03", js: "dot_theta_03", typ: 0 }, + { json: "re_t0", js: "re_t0", typ: 0 }, + { json: "scale", js: "scale", typ: 0 }, + { json: "sin", js: "sin", typ: 0 }, + { json: "sn", js: "sn", typ: "" }, + { json: "ssr_iod", js: "ssr_iod", typ: 0 }, + { json: "theta_01", js: "theta_01", typ: 0 }, + { json: "theta_02", js: "theta_02", typ: 0 }, + { json: "theta_03", js: "theta_03", typ: 0 }, + { json: "tn", js: "tn", typ: "" }, + { json: "utn", js: "utn", typ: 0 }, ], "any"), "MsgReset": o([ { json: "flags", js: "flags", typ: 0 }, @@ -5287,25 +5523,81 @@ const typeMap: any = { { json: "value", js: "value", typ: 0 }, ], "any"), "MsgSsrCodePhaseBiasesBounds": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "const_id", js: "const_id", typ: 0 }, + { json: "header", js: "header", typ: r("BoundsHeader") }, + { json: "n_sats_signals", js: "n_sats_signals", typ: 0 }, + { json: "satellites_signals", js: "satellites_signals", typ: a(r("CodePhaseBiasesSatSig")) }, + { json: "ssr_iod", js: "ssr_iod", typ: 0 }, + ], "any"), + "BoundsHeader": o([ + { json: "num_msgs", js: "num_msgs", typ: 0 }, + { json: "seq_num", js: "seq_num", typ: 0 }, + { json: "sol_id", js: "sol_id", typ: 0 }, + { json: "time", js: "time", typ: r("GpsTimeSEC") }, + { json: "update_interval", js: "update_interval", typ: 0 }, + ], "any"), + "CodePhaseBiasesSatSig": o([ + { json: "code_bias_bound_mu", js: "code_bias_bound_mu", typ: 0 }, + { json: "code_bias_bound_sig", js: "code_bias_bound_sig", typ: 0 }, + { json: "phase_bias_bound_mu", js: "phase_bias_bound_mu", typ: 0 }, + { json: "phase_bias_bound_sig", js: "phase_bias_bound_sig", typ: 0 }, + { json: "sat_id", js: "sat_id", typ: 0 }, + { json: "signal_id", js: "signal_id", typ: 0 }, ], "any"), "MsgSsrFlagHighLevel": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "chain_id", js: "chain_id", typ: 0 }, + { json: "corr_time", js: "corr_time", typ: r("GpsTimeSEC") }, + { json: "obs_time", js: "obs_time", typ: r("GpsTimeSEC") }, + { 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 }, + { json: "use_bds_sat", js: "use_bds_sat", typ: 0 }, + { json: "use_gal_sat", js: "use_gal_sat", typ: 0 }, + { json: "use_gps_sat", js: "use_gps_sat", typ: 0 }, + { json: "use_iono_grid_point_sat_los", js: "use_iono_grid_point_sat_los", typ: 0 }, + { json: "use_iono_grid_points", js: "use_iono_grid_points", typ: 0 }, + { json: "use_iono_tile_sat_los", js: "use_iono_tile_sat_los", typ: 0 }, + { json: "use_tropo_grid_points", js: "use_tropo_grid_points", typ: 0 }, ], "any"), "MsgSsrFlagIonoGridPointSatLos": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "faulty_los", js: "faulty_los", typ: a(r("SvID")) }, + { json: "grid_point_id", js: "grid_point_id", typ: 0 }, + { json: "header", js: "header", typ: r("IntegritySSRHeader") }, + { json: "n_faulty_los", js: "n_faulty_los", typ: 0 }, + ], "any"), + "IntegritySSRHeader": o([ + { json: "chain_id", js: "chain_id", typ: 0 }, + { json: "num_msgs", js: "num_msgs", typ: 0 }, + { json: "obs_time", js: "obs_time", typ: r("GpsTimeSEC") }, + { json: "seq_num", js: "seq_num", 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"), "MsgSsrFlagIonoGridPoints": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "faulty_points", js: "faulty_points", typ: a(0) }, + { json: "header", js: "header", typ: r("IntegritySSRHeader") }, + { json: "n_faulty_points", js: "n_faulty_points", typ: 0 }, ], "any"), "MsgSsrFlagIonoTileSatLos": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "faulty_los", js: "faulty_los", typ: a(r("SvID")) }, + { json: "header", js: "header", typ: r("IntegritySSRHeader") }, + { json: "n_faulty_los", js: "n_faulty_los", typ: 0 }, ], "any"), "MsgSsrFlagSatellites": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "chain_id", js: "chain_id", typ: 0 }, + { json: "const_id", js: "const_id", typ: 0 }, + { json: "faulty_sats", js: "faulty_sats", typ: a(0) }, + { json: "n_faulty_sats", js: "n_faulty_sats", typ: 0 }, + { json: "num_msgs", js: "num_msgs", typ: 0 }, + { json: "obs_time", js: "obs_time", typ: r("GpsTimeSEC") }, + { json: "seq_num", js: "seq_num", typ: 0 }, + { json: "ssr_sol_id", js: "ssr_sol_id", typ: 0 }, ], "any"), "MsgSsrFlagTropoGridPoints": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "faulty_points", js: "faulty_points", typ: a(0) }, + { json: "header", js: "header", typ: r("IntegritySSRHeader") }, + { json: "n_faulty_points", js: "n_faulty_points", typ: 0 }, ], "any"), "MsgSsrGriddedCorrection": o([ { json: "header", js: "header", typ: r("GriddedCorrectionHeader") }, @@ -5324,7 +5616,26 @@ const typeMap: any = { { json: "update_interval", js: "update_interval", typ: 0 }, ], "any"), "MsgSsrGriddedCorrectionBounds": o([ - { json: "stub", js: "stub", typ: a(0) }, + { 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_delay_correction", js: "tropo_delay_correction", typ: r("TroposphericDelayCorrection") }, + { json: "tropo_qi", js: "tropo_qi", typ: 0 }, + { json: "tropo_v_hydro_bound_mu", js: "tropo_v_hydro_bound_mu", typ: 0 }, + { json: "tropo_v_hydro_bound_sig", js: "tropo_v_hydro_bound_sig", typ: 0 }, + { json: "tropo_v_wet_bound_mu", js: "tropo_v_wet_bound_mu", typ: 0 }, + { json: "tropo_v_wet_bound_sig", js: "tropo_v_wet_bound_sig", 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 }, @@ -5343,10 +5654,39 @@ const typeMap: any = { { json: "update_interval", js: "update_interval", typ: 0 }, ], "any"), "MsgSsrOrbitClockBounds": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "const_id", js: "const_id", typ: 0 }, + { json: "header", js: "header", typ: r("BoundsHeader") }, + { json: "n_sats", js: "n_sats", typ: 0 }, + { json: "orbit_clock_bounds", js: "orbit_clock_bounds", typ: a(r("OrbitClockBound")) }, + { json: "ssr_iod", js: "ssr_iod", typ: 0 }, + ], "any"), + "OrbitClockBound": o([ + { json: "clock_bound_mu", js: "clock_bound_mu", typ: 0 }, + { json: "clock_bound_sig", js: "clock_bound_sig", typ: 0 }, + { json: "orb_along_bound_mu", js: "orb_along_bound_mu", typ: 0 }, + { json: "orb_along_bound_sig", js: "orb_along_bound_sig", typ: 0 }, + { json: "orb_cross_bound_mu", js: "orb_cross_bound_mu", typ: 0 }, + { json: "orb_cross_bound_sig", js: "orb_cross_bound_sig", typ: 0 }, + { json: "orb_radial_bound_mu", js: "orb_radial_bound_mu", typ: 0 }, + { json: "orb_radial_bound_sig", js: "orb_radial_bound_sig", typ: 0 }, + { json: "sat_id", js: "sat_id", typ: 0 }, ], "any"), "MsgSsrOrbitClockBoundsDegradation": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "const_id", js: "const_id", typ: 0 }, + { json: "header", js: "header", typ: r("BoundsHeader") }, + { json: "orbit_clock_bounds_degradation", js: "orbit_clock_bounds_degradation", typ: r("OrbitClockBoundDegradation") }, + { json: "sat_bitmask", js: "sat_bitmask", typ: 0 }, + { json: "ssr_iod", js: "ssr_iod", typ: 0 }, + ], "any"), + "OrbitClockBoundDegradation": o([ + { json: "clock_bound_mu_dot", js: "clock_bound_mu_dot", typ: 0 }, + { json: "clock_bound_sig_dot", js: "clock_bound_sig_dot", typ: 0 }, + { json: "orb_along_bound_mu_dot", js: "orb_along_bound_mu_dot", typ: 0 }, + { json: "orb_along_bound_sig_dot", js: "orb_along_bound_sig_dot", typ: 0 }, + { json: "orb_cross_bound_mu_dot", js: "orb_cross_bound_mu_dot", typ: 0 }, + { json: "orb_cross_bound_sig_dot", js: "orb_cross_bound_sig_dot", typ: 0 }, + { json: "orb_radial_bound_mu_dot", js: "orb_radial_bound_mu_dot", typ: 0 }, + { json: "orb_radial_bound_sig_dot", js: "orb_radial_bound_sig_dot", typ: 0 }, ], "any"), "MsgSsrPhaseBiases": o([ { json: "biases", js: "biases", typ: a(r("PhaseBiasesContent")) }, @@ -5377,10 +5717,29 @@ const typeMap: any = { { json: "svn", js: "svn", typ: 0 }, ], "any"), "MsgSsrStecCorrection": o([ - { json: "stub", js: "stub", typ: a(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("STECSatElement")) }, + { json: "tile_id", js: "tile_id", typ: 0 }, + { json: "tile_set_id", js: "tile_set_id", typ: 0 }, + ], "any"), + "STECSatElement": o([ + { json: "stec_coeff", js: "stec_coeff", typ: a(0) }, + { json: "stec_quality_indicator", js: "stec_quality_indicator", typ: 0 }, + { json: "sv_id", js: "sv_id", typ: r("SvID") }, ], "any"), "MsgSsrTileDefinition": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "bitmask", js: "bitmask", typ: 0 }, + { json: "cols", js: "cols", typ: 0 }, + { json: "corner_nw_lat", js: "corner_nw_lat", typ: 0 }, + { json: "corner_nw_lon", js: "corner_nw_lon", typ: 0 }, + { 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"), "MsgStartup": o([ { json: "cause", js: "cause", typ: 0 }, @@ -5479,7 +5838,15 @@ const typeMap: any = { { json: "contents", js: "contents", typ: a(0) }, ], "any"), "MsgUTCLeapSecond": o([ - { json: "stub", js: "stub", typ: a(0) }, + { json: "bias_coeff", js: "bias_coeff", typ: 0 }, + { json: "count_after", js: "count_after", typ: 0 }, + { json: "count_before", js: "count_before", typ: 0 }, + { json: "drift_coeff", js: "drift_coeff", typ: 0 }, + { json: "drift_rate_coeff", js: "drift_rate_coeff", typ: 0 }, + { json: "ref_dn", js: "ref_dn", typ: 0 }, + { json: "ref_wn", js: "ref_wn", typ: 0 }, + { json: "tow_s", js: "tow_s", typ: 0 }, + { json: "wn", js: "wn", typ: 0 }, ], "any"), "MsgUTCTime": o([ { json: "day", js: "day", typ: 0 }, @@ -5639,9 +6006,4 @@ const typeMap: any = { { 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) }, - { json: "stec_quality_indicator", js: "stec_quality_indicator", typ: 0 }, - { json: "sv_id", js: "sv_id", typ: r("SvID") }, - ], "any"), };