1 #include <marnav/nmea/sfi.hpp>
2 #include <marnav/nmea/io.hpp>
9 constexpr sentence_id
sfi::ID
;
10 constexpr const char * sfi::TAG
;
11 constexpr int sfi::max_number_of_frequencies
;
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"};
25 throw std::invalid_argument
{"invalid number of fields in sfi"};
27 read(*(first
+ 0), number_of_messages_
);
28 read(*(first
+ 1), message_number_
);
31 frequencies_
.reserve(size
- 2);
32 for (auto i
= 2; i
< size
; i
+= 2) {
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"};
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
));