Vanetza
 
Loading...
Searching...
No Matches
position_vector.cpp
1#include "areas.hpp"
2#include "position_vector.hpp"
3#include "serialization.hpp"
4
5namespace vanetza
6{
7namespace geonet
8{
9
10constexpr std::size_t LongPositionVector::length_bytes;
11constexpr std::size_t ShortPositionVector::length_bytes;
12
13LongPositionVector::LongPositionVector() : position_accuracy_indicator(false)
14{
15}
16
17GeodeticPosition LongPositionVector::position() const
18{
19 return GeodeticPosition {
20 static_cast<units::GeoAngle>(latitude),
21 static_cast<units::GeoAngle>(longitude)
22 };
23}
24
25ShortPositionVector::ShortPositionVector(const LongPositionVector& lpv) :
26 gn_addr(lpv.gn_addr), timestamp(lpv.timestamp),
27 latitude(lpv.latitude), longitude(lpv.longitude)
28{
29}
30
31bool operator==(const LongPositionVector& lhs, const LongPositionVector& rhs)
32{
33 return lhs.gn_addr == rhs.gn_addr
34 && lhs.timestamp == rhs.timestamp
35 && lhs.latitude == rhs.latitude
36 && lhs.longitude == rhs.longitude
37 && lhs.speed == rhs.speed
38 && lhs.heading == rhs.heading
39 && lhs.position_accuracy_indicator == rhs.position_accuracy_indicator;
40}
41
42bool operator!=(const LongPositionVector& lhs, const LongPositionVector& rhs)
43{
44 return !(lhs == rhs);
45}
46
47bool operator==(const ShortPositionVector& lhs, const ShortPositionVector& rhs)
48{
49 return lhs.gn_addr == rhs.gn_addr
50 && lhs.timestamp == rhs.timestamp
51 && lhs.latitude == rhs.latitude
52 && lhs.longitude == rhs.longitude;
53}
54
55bool operator!=(const ShortPositionVector& lhs, const ShortPositionVector& rhs)
56{
57 return !(lhs == rhs);
58}
59
60bool is_empty(const LongPositionVector& pv)
61{
62 static const LongPositionVector zero;
63 return pv == zero;
64}
65
66bool is_valid(const LongPositionVector& pv)
67{
68 static const geo_angle_i32t limit_lat { 90.0 * units::degree };
69 static const geo_angle_i32t limit_lon { 180.0 * units::degree };
70 static const heading_u16t limit_hdg { 360.0 * units::degree };
71
72 if (is_empty(pv)) {
73 return false;
74 } else if (pv.latitude < -limit_lat || pv.latitude > limit_lat) {
75 return false;
76 } else if (pv.longitude < -limit_lon || pv.longitude > limit_lon) {
77 return false;
78 } else if (pv.heading > limit_hdg) {
79 return false;
80 }
81
82 return true;
83}
84
85void serialize(const LongPositionVector& lpv, OutputArchive& ar)
86{
87 serialize(lpv.gn_addr, ar);
88 serialize(lpv.timestamp, ar);
89 serialize(lpv.latitude, ar);
90 serialize(lpv.longitude, ar);
91 uint16_t paiAndSpeed = lpv.speed.value().raw();
92 paiAndSpeed |= lpv.position_accuracy_indicator ? 0x8000 : 0x0000;
93 serialize(host_cast(paiAndSpeed), ar);
94 serialize(lpv.heading, ar);
95}
96
97void deserialize(LongPositionVector& lpv, InputArchive& ar)
98{
99 deserialize(lpv.gn_addr, ar);
100 deserialize(lpv.timestamp, ar);
101 deserialize(lpv.latitude, ar);
102 deserialize(lpv.longitude, ar);
103 uint16_t paiAndSpeed = 0;
104 deserialize(paiAndSpeed, ar);
105 lpv.position_accuracy_indicator = ((paiAndSpeed & 0x8000) != 0);
106 lpv.speed = LongPositionVector::speed_u15t::from_value(paiAndSpeed);
107 deserialize(lpv.heading, ar);
108}
109
110} // namespace geonet
111} // namespace vanetza