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