Dev: improve robustness of CTags.cmake
[marnav.git] / src / marnav / nmea / stalk.cpp
blob0fb9cd6c5ffae2bf415bdb3bafeb30ef8ad6c2e8
1 #include <marnav/nmea/stalk.hpp>
2 #include <marnav/nmea/io.hpp>
3 #include <stdexcept>
5 namespace marnav
7 namespace nmea
9 constexpr sentence_id stalk::ID;
10 constexpr const char * stalk::TAG;
12 constexpr int stalk::MIN_FIELDS;
13 constexpr int stalk::MAX_FIELDS;
15 stalk::stalk()
16 : sentence(ID, TAG, talker::none)
20 stalk::stalk(talker talk, fields::const_iterator first, fields::const_iterator last)
21 : sentence(ID, TAG, talk)
23 const auto d = std::distance(first, last);
24 if ((d < MIN_FIELDS) || (d > MAX_FIELDS))
25 throw std::invalid_argument{"invalid number of fields in stalk"};
27 data_ = raw{};
28 data_.reserve(d);
29 for (int i = 0; i < d; ++i) {
30 const auto & s = *(first + i);
31 if (s.size() != 2u)
32 throw std::invalid_argument{"invalid format of payload"};
33 uint8_t b;
34 read(s, b, data_format::hex);
35 data_.push_back(b);
39 void stalk::append_data_to(std::string & s) const
41 if (data_.empty())
42 throw std::runtime_error{"invalid number of bytes in data"};
43 for (const auto a : data_)
44 append(s, format(a, 2, data_format::hex));
47 void stalk::set_data(const raw & t)
49 if ((t.size() < MIN_FIELDS) || (t.size() > MAX_FIELDS))
50 throw std::invalid_argument{"invalid number of bytes in data"};
51 data_ = t;