1 #include <marnav/nmea/lcd.hpp>
2 #include <marnav/nmea/io.hpp>
9 constexpr sentence_id
lcd::ID
;
10 constexpr const char * lcd::TAG
;
12 constexpr int lcd::max_differences
;
15 : sentence(ID
, TAG
, talker::global_positioning_system
)
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
);
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
50 return time_diffs_
[index
];
53 void lcd::set_time_diff(int index
, time_difference t
)
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
];
67 append(s
, format(t
->snr
, 3));
68 append(s
, format(t
->ecd
, 3));