Build: add GCC-13, Clang-14, Clang-15, Clang-16, Clang-17
[marnav.git] / src / marnav / nmea / stalk.cpp
blobfe27c2d5caef1720862596051843a9952331c0a0
1 #include <marnav/nmea/stalk.hpp>
2 #include <marnav/nmea/io.hpp>
3 #include <stdexcept>
5 namespace marnav::nmea
7 constexpr sentence_id stalk::ID;
8 constexpr const char * stalk::TAG;
10 constexpr int stalk::MIN_FIELDS;
11 constexpr int stalk::MAX_FIELDS;
13 stalk::stalk()
14 : sentence(ID, TAG, talker::none)
18 stalk::stalk(talker talk, fields::const_iterator first, fields::const_iterator last)
19 : sentence(ID, TAG, talk)
21 const auto d = std::distance(first, last);
22 if ((d < MIN_FIELDS) || (d > MAX_FIELDS))
23 throw std::invalid_argument{"invalid number of fields in stalk"};
25 data_ = raw{};
26 data_.reserve(d);
27 for (int i = 0; i < d; ++i) {
28 const auto & s = *(first + i);
29 if (s.size() != 2u)
30 throw std::invalid_argument{"invalid format of payload"};
31 uint8_t b;
32 read(s, b, data_format::hex);
33 data_.push_back(b);
37 void stalk::append_data_to(std::string & s, const version &) const
39 if (data_.empty())
40 throw std::runtime_error{"invalid number of bytes in data"};
41 for (const auto a : data_)
42 append(s, format(a, 2, data_format::hex));
45 void stalk::set_data(const raw & t)
47 if ((t.size() < MIN_FIELDS) || (t.size() > MAX_FIELDS))
48 throw std::invalid_argument{"invalid number of bytes in data"};
49 data_ = t;