NMEA: remove deprecated type talker_id
[marnav.git] / src / marnav / nmea / sfi.cpp
blobe63e60a2e12731d7f38e05d1791f058688239c33
1 #include <marnav/nmea/sfi.hpp>
2 #include <marnav/nmea/io.hpp>
3 #include <stdexcept>
5 namespace marnav
7 namespace nmea
9 constexpr sentence_id sfi::ID;
10 constexpr const char * sfi::TAG;
11 constexpr int sfi::max_number_of_frequencies;
13 sfi::sfi()
14 : sentence(ID, TAG, talker::global_positioning_system)
18 sfi::sfi(talker talk, fields::const_iterator first, fields::const_iterator last)
19 : sentence(ID, TAG, talk)
21 const auto size = std::distance(first, last);
22 if ((size < 2) || (size > 2 + max_number_of_frequencies * 2))
23 throw std::invalid_argument{"invalid number of fields in sfi"};
24 if (size % 2 != 0)
25 throw std::invalid_argument{"invalid number of fields in sfi"};
27 read(*(first + 0), number_of_messages_);
28 read(*(first + 1), message_number_);
30 frequencies_.clear();
31 frequencies_.reserve(size - 2);
32 for (auto i = 2; i < size; i += 2) {
33 uint32_t frequency;
34 char mode;
35 read(*(first + i + 0), frequency);
36 read(*(first + i + 1), mode);
37 frequencies_.push_back({frequency, mode});
41 void sfi::set_frequencies(const std::vector<scanning_frequency> & v)
43 if (v.size() > max_number_of_frequencies)
44 throw std::invalid_argument{
45 "number of frequencies exceeds max entries in sfi::set_frequencies"};
47 frequencies_ = v;
50 void sfi::append_data_to(std::string & s) const
52 append(s, to_string(number_of_messages_));
53 append(s, to_string(message_number_));
54 for (auto const & entry : frequencies_) {
55 append(s, to_string(entry.frequency));
56 append(s, to_string(entry.mode));