Vanetza
Loading...
Searching...
No Matches
heading.ipp
1#include <vanetza/asn1/its/Heading.h>
2#include <vanetza/asn1/its/r2/Heading.h>
3#include <vanetza/facilities/detail/macros.ipp>
4#include <vanetza/units/angle.hpp>
5
6ASSERT_EQUAL_ENUM(HeadingValue_wgs84North);
7ASSERT_EQUAL_ENUM(HeadingValue_wgs84East);
8ASSERT_EQUAL_ENUM(HeadingValue_wgs84South);
9ASSERT_EQUAL_ENUM(HeadingValue_wgs84West);
10ASSERT_EQUAL_ENUM(HeadingValue_unavailable);
11
12namespace vanetza
13{
14namespace facilities
15{
16
17bool is_available(const ASN1_PREFIXED(Heading)& hd)
18{
19 return hd.headingValue != ASN1_PREFIXED(HeadingValue_unavailable);
20}
21
22bool similar_heading(const ASN1_PREFIXED(Heading)& a, const ASN1_PREFIXED(Heading)& b, Angle limit)
23{
24 // HeadingValues are tenth of degree (900 equals 90 degree east)
25 static_assert(ASN1_PREFIXED(HeadingValue_wgs84East) == 900, "HeadingValue interpretation fails");
26
27 bool result = false;
28 if (is_available(a) && is_available(b)) {
29 using vanetza::units::degree;
30 const Angle angle_a { a.headingValue / 10.0 * degree };
31 const Angle angle_b { b.headingValue / 10.0 * degree };
32 result = similar_heading(angle_a, angle_b, limit);
33 }
34
35 return result;
36}
37
38bool similar_heading(const ASN1_PREFIXED(Heading)& a, Angle b, Angle limit)
39{
40 bool result = false;
41 if (is_available(a)) {
42 using vanetza::units::degree;
43 result = similar_heading(Angle { a.headingValue / 10.0 * degree}, b, limit);
44 }
45 return result;
46}
47
48} // namespace facilities
49} // namespace vanetza