54 const std::string& frame_id,
bool ,
58 const size_t MIN_LENGTH = 4;
60 if (sentence.get_body().size() < MIN_LENGTH)
62 std::stringstream error;
63 error <<
"Expected GSV length is at least " << MIN_LENGTH
64 <<
". The actual length is " << sentence.get_body().size();
69 msg.message_id = sentence.get_body()[0];
77 std::stringstream error;
78 error <<
"n_msgs in GSV is too large: " << msg.n_msgs <<
".";
89 std::stringstream error;
90 error <<
"msg_number in GSV is larger than n_msgs: " << msg.msg_number
91 <<
" > " << msg.n_msgs <<
".";
99 size_t n_sats_in_sentence = 4;
100 if (msg.msg_number == msg.n_msgs)
102 n_sats_in_sentence = msg.n_satellites %
static_cast<uint8_t
>(4);
103 if (msg.n_satellites % static_cast<uint8_t>(4) == 0)
105 n_sats_in_sentence = 4;
107 if (msg.n_satellites == 0)
109 n_sats_in_sentence = 0;
111 if (msg.msg_number == 1)
113 n_sats_in_sentence = msg.n_satellites;
117 size_t expected_length = MIN_LENGTH + 4 * n_sats_in_sentence + 1;
120 if (n_sats_in_sentence == 0)
124 expected_length += 4;
131 if (sentence.get_body().size() != expected_length &&
132 sentence.get_body().size() != expected_length - 1)
134 std::stringstream ss;
135 for (
size_t i = 0; i < sentence.get_body().size(); ++i)
137 ss << sentence.get_body()[i];
138 if ((i + 1) < sentence.get_body().size())
143 std::stringstream error;
144 error <<
"Expected GSV length is " << expected_length <<
" for message with " 145 << n_sats_in_sentence <<
" satellites. The actual length is " 146 << sentence.get_body().size() <<
".\n" 152 msg.satellites.resize(n_sats_in_sentence);
153 for (
size_t sat = 0, index = MIN_LENGTH; sat < n_sats_in_sentence;
157 msg.satellites[sat].prn))
159 std::stringstream error;
160 error <<
"Error parsing PRN for satellite " << sat <<
" in GSV.";
167 std::stringstream error;
168 error <<
"Error parsing elevation for satellite " << sat <<
" in GSV.";
171 msg.satellites[sat].elevation =
static_cast<uint8_t
>(elevation);
176 std::stringstream error;
177 error <<
"Error parsing azimuth for satellite " << sat <<
" in GSV.";
180 msg.satellites[sat].azimuth =
static_cast<uint16_t
>(azimuth);
182 if ((index + 3) >= sentence.get_body().size() ||
183 sentence.get_body()[index + 3].empty())
185 msg.satellites[sat].snr = -1;
191 std::stringstream error;
192 error <<
"Error parsing snr for satellite " << sat <<
" in GSV.";
195 msg.satellites[sat].snr =
static_cast<int8_t
>(snr);
Struct to split an NMEA sentence into its ID and its body, the latter tokenized into a vector of stri...
float parseFloat(const uint8_t *buffer)
Converts a 4-byte-buffer into a float.
Derived class for parsing GSV messages.
nmea_msgs::Gpgsv GpgsvMsg
Class to declare error message format when parsing, derived from the public class "std::runtime_error...
static const std::string MESSAGE_ID
Declares the string MESSAGE_ID.
const std::string getMessageID() const override
Returns the ASCII message ID, here "$GPGSV".
GpgsvMsg parseASCII(const NMEASentence &sentence, const std::string &frame_id, bool use_gnss_time, Timestamp time_obj) noexcept(false) override
Parses one GSV message.
bool parseUInt8(const std::string &string, uint8_t &value, int32_t base=10)
Interprets the contents of "string" as a unsigned integer number of type uint8_t. ...