1#include "gbc_gac_header.hpp"
12class set_distance_visitor :
public boost::static_visitor<>
15 set_distance_visitor(GbcGacHeader& hdr) : m_header(hdr) {}
17 void operator()(
const Circle& circle)
19 m_header.distance_a = circle.r;
20 m_header.distance_b = 0;
23 void operator()(
const Rectangle& rect)
25 m_header.distance_a = rect.a;
26 m_header.distance_b = rect.b;
29 void operator()(
const Ellipse& elip)
31 m_header.distance_a = elip.a;
32 m_header.distance_b = elip.b;
36 GbcGacHeader& m_header;
39class get_distance_visitor :
public boost::static_visitor<>
42 get_distance_visitor(
const GbcGacHeader& hdr) : m_header(hdr) {}
44 void operator()(Circle& circle)
46 circle.r = m_header.distance_a;
49 void operator()(Rectangle& rect)
51 rect.a = m_header.distance_a;
52 rect.b = m_header.distance_b;
55 void operator()(Ellipse& elip)
57 elip.a = m_header.distance_a;
58 elip.b = m_header.distance_b;
62 const GbcGacHeader& m_header;
65constexpr std::size_t GbcGacHeader::length_bytes;
67void GbcGacHeader::destination(
const Area& area)
69 this->position(area.position);
70 angle =
static_cast<angle_u16t
>(area.angle);
71 set_distance_visitor visitor(*
this);
72 boost::apply_visitor(visitor, area.shape);
75Area GbcGacHeader::destination(
const decltype(Area::shape)& shape)
const
79 area.position = this->position();
80 area.angle =
static_cast<units::Angle
>(angle);
81 get_distance_visitor visitor(*
this);
82 boost::apply_visitor(visitor, area.shape);
86void GbcGacHeader::position(
const GeodeticPosition& position)
88 geo_area_pos_latitude = geo_angle_i32t::from_value(std::round(position.latitude.value() * 1e7));
89 geo_area_pos_longitude = geo_angle_i32t::from_value(std::round(position.longitude.value() * 1e7));
92GeodeticPosition GbcGacHeader::position()
const
94 return GeodeticPosition(
95 static_cast<units::GeoAngle
>(geo_area_pos_latitude),
96 static_cast<units::GeoAngle
>(geo_area_pos_longitude)
100void serialize(
const GbcGacHeader& header, OutputArchive& ar)
102 geonet::serialize(header.sequence_number, ar);
103 geonet::serialize(host_cast(header.reserved1), ar);
104 geonet::serialize(header.source_position, ar);
105 geonet::serialize(header.geo_area_pos_latitude, ar);
106 geonet::serialize(header.geo_area_pos_longitude, ar);
107 geonet::serialize(header.distance_a, ar);
108 geonet::serialize(header.distance_b, ar);
109 geonet::serialize(header.angle, ar);
110 geonet::serialize(host_cast(header.reserved2), ar);
115 geonet::deserialize(header.sequence_number, ar);
116 geonet::deserialize(header.reserved1, ar);
117 geonet::deserialize(header.source_position, ar);
118 geonet::deserialize(header.geo_area_pos_latitude, ar);
119 geonet::deserialize(header.geo_area_pos_longitude, ar);
120 geonet::deserialize(header.distance_a, ar);
121 geonet::deserialize(header.distance_b, ar);
122 geonet::deserialize(header.angle, ar);
123 geonet::deserialize(header.reserved2, ar);