NMEA: Qt example extended.
[marnav.git] / src / marnav / nmea / xdr.cpp
blobecca545c8e021b1c1929360fff834c31067db3df
1 #include "xdr.hpp"
2 #include <marnav/nmea/io.hpp>
4 namespace marnav
6 namespace nmea
8 MARNAV_NMEA_DEFINE_SENTENCE_PARSE_FUNC(xdr)
10 namespace
12 inline std::string to_string(const utils::optional<xdr::transducer_info> & data)
14 if (!data)
15 return std::string{};
16 auto const & value = data.value();
17 return marnav::nmea::to_string(value.transducer_type) + ","
18 + marnav::nmea::to_string(value.measurement_data) + ","
19 + marnav::nmea::to_string(value.units_of_measurement) + ","
20 + marnav::nmea::to_string(value.name);
24 constexpr const char * xdr::TAG;
26 xdr::xdr()
27 : sentence(ID, TAG, talker_id::transducer)
31 xdr::xdr(const std::string & talker, fields::const_iterator first, fields::const_iterator last)
32 : sentence(ID, TAG, talker)
34 const auto size = std::distance(first, last);
35 if ((size < 1) || (size > 4 * xdr::max_transducer_info))
36 throw std::invalid_argument{"invalid number of fields in xdr"};
38 if ((size % 4) != 0)
39 throw std::invalid_argument{"unexpected number of fields in xdr (quadruples?)"};
41 int index = 0;
42 for (auto i = 0; i < size; i += 4, ++index) {
43 xdr::transducer_info info;
44 read(*(first + i + 0), info.transducer_type);
45 read(*(first + i + 1), info.measurement_data);
46 read(*(first + i + 2), info.units_of_measurement);
47 read(*(first + i + 3), info.name);
48 set_info(index, info);
52 void xdr::check_index(int index) const
54 if ((index < 0) || (index >= 4 * max_transducer_info)) {
55 throw std::out_of_range{"transducer index out of range"};
59 void xdr::set_info(int index, const transducer_info & info)
61 check_index(index);
62 transducer_data[index] = info;
65 utils::optional<xdr::transducer_info> xdr::get_info(int index) const
67 check_index(index);
68 return transducer_data[index];
71 std::vector<std::string> xdr::get_data() const
73 std::vector<std::string> result;
74 for (const auto & data : transducer_data) {
75 auto s = to_string(data);
76 if (!s.empty())
77 result.push_back(s);
79 return result;