Vanetza
Loading...
Searching...
No Matches
cam_functions.cpp
1#include <vanetza/asn1/cam.hpp>
2#include <vanetza/facilities/cam_functions.hpp>
3#include <boost/algorithm/clamp.hpp>
4#include <boost/math/constants/constants.hpp>
5#include <boost/units/cmath.hpp>
6#include <boost/units/systems/si/prefixes.hpp>
7#include <boost/units/systems/angle/degrees.hpp>
8
9namespace vanetza
10{
11namespace facilities
12{
13
14using vanetza::units::Angle;
15
16static const auto microdegree = units::degree * units::si::micro;
17static const auto tenth_microdegree = units::si::deci * microdegree;
18
19bool similar_heading(Angle a, Angle b, Angle limit)
20{
21 using namespace boost::units;
22 using boost::math::double_constants::pi;
23
24 static const Angle full_circle = 2.0 * pi * si::radian;
25 const Angle abs_diff = fmod(abs(a - b), full_circle);
26 return abs_diff <= limit || abs_diff >= full_circle - limit;
27}
28
29template<typename T, typename U>
30long round(const boost::units::quantity<T>& q, const U& u)
31{
32 boost::units::quantity<U> v { q };
33 return std::round(v.value());
34}
35
36AltitudeConfidence_t to_altitude_confidence(units::Length confidence)
37{
38 const double alt_con = confidence / units::si::meter;
39
40 if (alt_con < 0 || std::isnan(alt_con)) {
41 return AltitudeConfidence_unavailable;
42 } else if (alt_con <= 0.01) {
43 return AltitudeConfidence_alt_000_01;
44 } else if (alt_con <= 0.02) {
45 return AltitudeConfidence_alt_000_02;
46 } else if (alt_con <= 0.05) {
47 return AltitudeConfidence_alt_000_05;
48 } else if (alt_con <= 0.1) {
49 return AltitudeConfidence_alt_000_10;
50 } else if (alt_con <= 0.2) {
51 return AltitudeConfidence_alt_000_20;
52 } else if (alt_con <= 0.5) {
53 return AltitudeConfidence_alt_000_50;
54 } else if (alt_con <= 1.0) {
55 return AltitudeConfidence_alt_001_00;
56 } else if (alt_con <= 2.0) {
57 return AltitudeConfidence_alt_002_00;
58 } else if (alt_con <= 5.0) {
59 return AltitudeConfidence_alt_005_00;
60 } else if (alt_con <= 10.0) {
61 return AltitudeConfidence_alt_010_00;
62 } else if (alt_con <= 20.0) {
63 return AltitudeConfidence_alt_020_00;
64 } else if (alt_con <= 50.0) {
65 return AltitudeConfidence_alt_050_00;
66 } else if (alt_con <= 100.0) {
67 return AltitudeConfidence_alt_100_00;
68 } else if (alt_con <= 200.0) {
69 return AltitudeConfidence_alt_200_00;
70 } else {
71 return AltitudeConfidence_outOfRange;
72 }
73}
74
75AltitudeValue_t to_altitude_value(units::Length alt)
76{
77 using boost::units::isnan;
78 static_assert(AltitudeValue_oneCentimeter == 1, "AltitudeValue encodes an integer number of centimeters");
79
80 if (!isnan(alt)) {
81 alt = boost::algorithm::clamp(alt, -1000.0 * units::si::meter, 8000.0 * units::si::meter);
82 return round(alt, units::si::centi * units::si::meter);
83 } else {
84 return AltitudeValue_unavailable;
85 }
86}
87
88} // namespace facilities
89} // namespace vanetza
90
91#define ASN1_PREFIX ASN1_RELEASE1_PREFIX
92#define ITS_RELEASE 1
93#include "detail/cam.ipp"
94#include "detail/heading.ipp"
95#include "detail/path_history.ipp"
96#include "detail/reference_position.ipp"
97
98#undef ASN1_PREFIX
99#undef ITS_RELEASE
100
101#define ASN1_PREFIX ASN1_RELEASE2_PREFIX
102#define ITS_RELEASE 2
103#include "detail/cam.ipp"
104#include "detail/heading.ipp"
105#include "detail/path_history.ipp"
106#include "detail/reference_position.ipp"
107
108namespace vanetza
109{
110namespace facilities
111{
112
113bool check_service_specific_permissions(const asn1::r1::Cam& cam, security::CamPermissions ssp)
114{
115 return check_service_specific_permissions(cam->cam.camParameters, ssp);
116}
117
118bool check_service_specific_permissions(const asn1::r2::Cam& cam, security::CamPermissions ssp)
119{
120 return check_service_specific_permissions(cam->cam.camParameters, ssp);
121}
122
123void print_indented(std::ostream& os, const asn1::r1::Cam& cam, const std::string& indent, unsigned start)
124{
125 print_indented(os, cam.content(), indent, start);
126}
127
128void print_indented(std::ostream& os, const asn1::r2::Cam& cam, const std::string& indent, unsigned start)
129{
130 print_indented(os, cam.content(), indent, start);
131}
132
133} // namespace facilities
134} // namespace vanetza