2 #include <marnav/nmea/io.hpp>
8 MARNAV_NMEA_DEFINE_SENTENCE_PARSE_FUNC(xdr
)
12 inline std::string
to_string(const utils::optional
<xdr::transducer_info
> & data
)
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
;
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"};
39 throw std::invalid_argument
{"unexpected number of fields in xdr (quadruples?)"};
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
)
62 transducer_data
[index
] = info
;
65 utils::optional
<xdr::transducer_info
> xdr::get_info(int index
) const
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
);