NMEA: remove deprecated type talker_id
[marnav.git] / src / marnav / nmea / lcd.cpp
blob503af16594badde954db63d219e3ad1eba3c6c5a
1 #include <marnav/nmea/lcd.hpp>
2 #include <marnav/nmea/io.hpp>
3 #include <stdexcept>
5 namespace marnav
7 namespace nmea
9 constexpr sentence_id lcd::ID;
10 constexpr const char * lcd::TAG;
12 constexpr int lcd::max_differences;
14 lcd::lcd()
15 : sentence(ID, TAG, talker::global_positioning_system)
16 , master_({0, 0})
20 lcd::lcd(talker talk, fields::const_iterator first, fields::const_iterator last)
21 : sentence(ID, TAG, talk)
23 if (std::distance(first, last) != 13)
24 throw std::invalid_argument{"invalid number of fields in lcd"};
26 read(*(first + 0), gri_);
27 read(*(first + 1), master_.snr);
28 read(*(first + 2), master_.ecd);
29 for (int i = 0; i < max_differences; ++i) {
30 utils::optional<decltype(time_difference::snr)> snr;
31 utils::optional<decltype(time_difference::ecd)> ecd;
32 read(*(first + (i * 2) + 3 + 0), snr);
33 read(*(first + (i * 2) + 3 + 1), ecd);
34 if (snr && ecd) {
35 time_diffs_[i] = utils::make_optional<time_difference>(*snr, *ecd);
40 void lcd::check_index(int index) const
42 if ((index < 0) || (index >= max_differences)) {
43 throw std::out_of_range{"time difference index out of range"};
47 utils::optional<lcd::time_difference> lcd::get_time_diff(int index) const
49 check_index(index);
50 return time_diffs_[index];
53 void lcd::set_time_diff(int index, time_difference t)
55 check_index(index);
56 time_diffs_[index] = t;
59 void lcd::append_data_to(std::string & s) const
61 append(s, to_string(gri_));
62 append(s, format(master_.snr, 3));
63 append(s, format(master_.ecd, 3));
64 for (int i = 0; i < max_differences; ++i) {
65 auto const & t = time_diffs_[i];
66 if (t) {
67 append(s, format(t->snr, 3));
68 append(s, format(t->ecd, 3));
69 } else {
70 append(s, "");
71 append(s, "");