Dev: improve robustness of CTags.cmake
[marnav.git] / src / marnav / nmea / aam.cpp
blob93ed90b9af0c7427846cf2efd2cd6bf4bb04bb3d
1 #include <marnav/nmea/aam.hpp>
2 #include "checks.hpp"
3 #include <marnav/nmea/io.hpp>
5 namespace marnav
7 namespace nmea
9 constexpr sentence_id aam::ID;
10 constexpr const char * aam::TAG;
12 aam::aam()
13 : sentence(ID, TAG, talker::global_positioning_system)
17 aam::aam(talker talk, fields::const_iterator first, fields::const_iterator last)
18 : sentence(ID, TAG, talk)
20 if (std::distance(first, last) != 5)
21 throw std::invalid_argument{"invalid number of fields in aam"};
23 unit::distance radius_unit;
25 read(*(first + 0), arrival_circle_entered_);
26 read(*(first + 1), perpendicualar_passed_);
27 read(*(first + 2), arrival_circle_radius_);
28 read(*(first + 3), radius_unit);
29 read(*(first + 4), waypoint_id_);
31 check_status(arrival_circle_entered_, "arrival_circle_entered");
32 check_status(perpendicualar_passed_, "perpendicualar_passed");
33 check_value(radius_unit, {unit::distance::nm}, "arrival_circle_radius_unit");
36 void aam::set_arrival_circle_entered(status s)
38 check_status(s, "arrival_circle_entered");
39 arrival_circle_entered_ = s;
42 void aam::set_perpendicular_passed(status s)
44 check_status(s, "perpendicualar_passed");
45 perpendicualar_passed_ = s;
48 void aam::set_arrival_circle_radius(units::length t)
50 if (t.value() < 0.0)
51 throw std::invalid_argument{"invalid argument, arrival radius below zero"};
52 arrival_circle_radius_ = t.get<units::nautical_miles>();
55 void aam::append_data_to(std::string & s) const
57 append(s, to_string(arrival_circle_entered_));
58 append(s, to_string(perpendicualar_passed_));
59 append(s, to_string(arrival_circle_radius_.value()));
60 append(s, to_string(unit::distance::nm));
61 append(s, to_string(waypoint_id_));