1#include "gbc_gac_header.hpp"
11class set_distance_visitor :
public boost::static_visitor<>
14 set_distance_visitor(GbcGacHeader& hdr) : m_header(hdr) {}
16 void operator()(
const Circle& circle)
18 m_header.distance_a = circle.r;
19 m_header.distance_b = 0;
22 void operator()(
const Rectangle& rect)
24 m_header.distance_a = rect.a;
25 m_header.distance_b = rect.b;
28 void operator()(
const Ellipse& elip)
30 m_header.distance_a = elip.a;
31 m_header.distance_b = elip.b;
35 GbcGacHeader& m_header;
38class get_distance_visitor :
public boost::static_visitor<>
41 get_distance_visitor(
const GbcGacHeader& hdr) : m_header(hdr) {}
43 void operator()(Circle& circle)
45 circle.r = m_header.distance_a;
48 void operator()(Rectangle& rect)
50 rect.a = m_header.distance_a;
51 rect.b = m_header.distance_b;
54 void operator()(Ellipse& elip)
56 elip.a = m_header.distance_a;
57 elip.b = m_header.distance_b;
61 const GbcGacHeader& m_header;
64constexpr std::size_t GbcGacHeader::length_bytes;
66void GbcGacHeader::destination(
const Area& area)
68 this->position(area.position);
69 angle =
static_cast<angle_u16t
>(area.angle);
70 set_distance_visitor visitor(*
this);
71 boost::apply_visitor(visitor, area.shape);
74Area GbcGacHeader::destination(
const decltype(Area::shape)& shape)
const
78 area.position = this->position();
79 area.angle =
static_cast<units::Angle
>(angle);
80 get_distance_visitor visitor(*
this);
81 boost::apply_visitor(visitor, area.shape);
85void GbcGacHeader::position(
const GeodeticPosition& position)
87 geo_area_pos_latitude =
static_cast<geo_angle_i32t
>(position.latitude);
88 geo_area_pos_longitude =
static_cast<geo_angle_i32t
>(position.longitude);
91GeodeticPosition GbcGacHeader::position()
const
93 return GeodeticPosition(
94 static_cast<units::GeoAngle
>(geo_area_pos_latitude),
95 static_cast<units::GeoAngle
>(geo_area_pos_longitude)
99void serialize(
const GbcGacHeader& header, OutputArchive& ar)
101 geonet::serialize(header.sequence_number, ar);
102 geonet::serialize(host_cast(header.reserved1), ar);
103 geonet::serialize(header.source_position, ar);
104 geonet::serialize(header.geo_area_pos_latitude, ar);
105 geonet::serialize(header.geo_area_pos_longitude, ar);
106 geonet::serialize(header.distance_a, ar);
107 geonet::serialize(header.distance_b, ar);
108 geonet::serialize(header.angle, ar);
109 geonet::serialize(host_cast(header.reserved2), ar);
112void deserialize(GbcGacHeader& header, InputArchive& ar)
114 geonet::deserialize(header.sequence_number, ar);
115 geonet::deserialize(header.reserved1, ar);
116 geonet::deserialize(header.source_position, ar);
117 geonet::deserialize(header.geo_area_pos_latitude, ar);
118 geonet::deserialize(header.geo_area_pos_longitude, ar);
119 geonet::deserialize(header.distance_a, ar);
120 geonet::deserialize(header.distance_b, ar);
121 geonet::deserialize(header.angle, ar);
122 geonet::deserialize(header.reserved2, ar);