Build: add GCC-13, Clang-14, Clang-15, Clang-16, Clang-17
[marnav.git] / src / marnav / nmea / zda.cpp
blob5b5d01e010cf2b971e1587d5a6ee5d94f7052a78
1 #include <marnav/nmea/zda.hpp>
2 #include <marnav/nmea/io.hpp>
3 #include <stdexcept>
5 namespace marnav::nmea
7 constexpr sentence_id zda::ID;
8 constexpr const char * zda::TAG;
10 zda::zda()
11 : sentence(ID, TAG, talker::global_positioning_system)
15 zda::zda(talker talk, fields::const_iterator first, fields::const_iterator last)
16 : sentence(ID, TAG, talk)
18 if (std::distance(first, last) != 6)
19 throw std::invalid_argument{"invalid number of fields in zda"};
21 std::optional<uint32_t> d;
22 std::optional<uint32_t> m;
23 std::optional<uint32_t> y;
25 read(*(first + 0), time_utc_);
26 read(*(first + 1), d);
27 read(*(first + 2), m);
28 read(*(first + 3), y);
29 read(*(first + 4), local_zone_hours_);
30 read(*(first + 5), local_zone_minutes_);
32 if (d && m && y)
33 date_ = nmea::date{*y, to_month(*m), *d};
36 void zda::append_data_to(std::string & s, const version &) const
38 std::optional<uint32_t> d;
39 std::optional<uint32_t> m;
40 std::optional<uint32_t> y;
42 if (date_) {
43 d = date_->day();
44 m = to_numeric(date_->mon());
45 y = date_->year();
48 append(s, to_string(time_utc_));
49 append(s, format(d, 2));
50 append(s, format(m, 2));
51 append(s, format(y, 4));
52 append(s, format(local_zone_hours_, 2));
53 append(s, format(local_zone_minutes_, 2));