Vanetza
 
Loading...
Searching...
No Matches
gbc_gac_header.cpp
1#include "gbc_gac_header.hpp"
2#include "areas.hpp"
3
4namespace vanetza
5{
6namespace geonet
7{
8namespace detail
9{
10
11class set_distance_visitor : public boost::static_visitor<>
12{
13public:
14 set_distance_visitor(GbcGacHeader& hdr) : m_header(hdr) {}
15
16 void operator()(const Circle& circle)
17 {
18 m_header.distance_a = circle.r;
19 m_header.distance_b = 0;
20 }
21
22 void operator()(const Rectangle& rect)
23 {
24 m_header.distance_a = rect.a;
25 m_header.distance_b = rect.b;
26 }
27
28 void operator()(const Ellipse& elip)
29 {
30 m_header.distance_a = elip.a;
31 m_header.distance_b = elip.b;
32 }
33
34private:
35 GbcGacHeader& m_header;
36};
37
38class get_distance_visitor : public boost::static_visitor<>
39{
40public:
41 get_distance_visitor(const GbcGacHeader& hdr) : m_header(hdr) {}
42
43 void operator()(Circle& circle)
44 {
45 circle.r = m_header.distance_a;
46 }
47
48 void operator()(Rectangle& rect)
49 {
50 rect.a = m_header.distance_a;
51 rect.b = m_header.distance_b;
52 }
53
54 void operator()(Ellipse& elip)
55 {
56 elip.a = m_header.distance_a;
57 elip.b = m_header.distance_b;
58 }
59
60private:
61 const GbcGacHeader& m_header;
62};
63
64constexpr std::size_t GbcGacHeader::length_bytes;
65
66void GbcGacHeader::destination(const Area& area)
67{
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);
72}
73
74Area GbcGacHeader::destination(const decltype(Area::shape)& shape) const
75{
76 Area area;
77 area.shape = shape;
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);
82 return area;
83}
84
85void GbcGacHeader::position(const GeodeticPosition& position)
86{
87 geo_area_pos_latitude = static_cast<geo_angle_i32t>(position.latitude);
88 geo_area_pos_longitude = static_cast<geo_angle_i32t>(position.longitude);
89}
90
91GeodeticPosition GbcGacHeader::position() const
92{
93 return GeodeticPosition(
94 static_cast<units::GeoAngle>(geo_area_pos_latitude),
95 static_cast<units::GeoAngle>(geo_area_pos_longitude)
96 );
97}
98
99void serialize(const GbcGacHeader& header, OutputArchive& ar)
100{
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);
110}
111
112void deserialize(GbcGacHeader& header, InputArchive& ar)
113{
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);
123}
124
125} // namespace detail
126} // namespace geonet
127} // namepsace vanetza
128