Vanetza
Loading...
Searching...
No Matches
cam_functions.hpp
1#ifndef CAM_FUNCTIONS_HPP_PUFKBEM8
2#define CAM_FUNCTIONS_HPP_PUFKBEM8
3
4#include <vanetza/asn1/its/AltitudeConfidence.h>
5#include <vanetza/asn1/its/AltitudeValue.h>
6#include <vanetza/common/position_fix.hpp>
7#include <vanetza/security/cam_ssp.hpp>
8#include <vanetza/units/angle.hpp>
9#include <vanetza/units/length.hpp>
10
11// forward declaration of asn1c generated struct
12struct BasicVehicleContainerLowFrequency;
13struct Heading;
14struct PathHistory;
15struct ReferencePosition;
16struct Vanetza_ITS2_BasicVehicleContainerLowFrequency;
17struct Vanetza_ITS2_Heading;
18struct Vanetza_ITS2_Path;
19struct Vanetza_ITS2_PathHistory;
20struct Vanetza_ITS2_ReferencePosition;
21
22namespace vanetza
23{
24
25// forward declaration of CAM message wrappers
26namespace asn1 {
27 namespace r1 { class Cam; }
28 namespace r2 { class Cam; }
29}
30
31namespace facilities
32{
33
34class PathHistory;
35
36/**
37 * Copy PathHistory into BasicVehicleContainerLowFrequency's pathHistory element
38 * \deprecated use function with PathHistory destination instead
39 * \param Facilities' path history object (source)
40 * \param ASN.1 CAM container (destination)
41 */
42void copy(const PathHistory&, BasicVehicleContainerLowFrequency&);
43void copy(const PathHistory&, Vanetza_ITS2_BasicVehicleContainerLowFrequency&);
44
45/**
46 * Copy facilities::PathHistory into an ASN.1 PathHistory structure
47 *
48 * \param src source path history
49 * \param dest destination path history
50 */
51void copy(const PathHistory& src, ::PathHistory&);
52void copy(const PathHistory& src, Vanetza_ITS2_PathHistory&);
53void copy(const PathHistory& src, Vanetza_ITS2_Path&);
54
55/**
56 * Check if difference of two given heading values is within a limit
57 * \param a one heading
58 * \param b another heading
59 * \param limit maximum difference (positive)
60 * \return true if similar enough
61 */
62bool similar_heading(const Heading& a, const Heading& b, units::Angle limit);
63bool similar_heading(const Heading& a, units::Angle b, units::Angle limit);
64bool similar_heading(const Vanetza_ITS2_Heading& a, const Vanetza_ITS2_Heading&b, units::Angle limit);
65bool similar_heading(const Vanetza_ITS2_Heading& a, units::Angle b, units::Angle limit);
66bool similar_heading(units::Angle a, units::Angle b, units::Angle limit);
67
68/**
69 * Calculate distance between positions
70 * \param a one position
71 * \param b another position
72 * \return distance between given positions (or NaN if some position is unavailable)
73 */
74units::Length distance(const ReferencePosition& a, const ReferencePosition& b);
75units::Length distance(const ReferencePosition& a, units::GeoAngle lat, units::GeoAngle lon);
76units::Length distance(const Vanetza_ITS2_ReferencePosition& a, const Vanetza_ITS2_ReferencePosition& b);
77units::Length distance(const Vanetza_ITS2_ReferencePosition& a, units::GeoAngle lat, units::GeoAngle lon);
78
79/**
80 * Check if ASN.1 data element indicates unavailable value
81 * \return true if value is available
82 */
83bool is_available(const Heading&);
84bool is_available(const Vanetza_ITS2_Heading&);
85bool is_available(const ReferencePosition&);
86bool is_available(const Vanetza_ITS2_ReferencePosition&);
87
88/**
89 * Copy position information into a ReferencePosition structure from CDD
90 */
91void copy(const PositionFix&, ReferencePosition&);
92void copy(const PositionFix&, Vanetza_ITS2_ReferencePosition&);
93
94/**
95 * Convert altitude to AltitudeValue from CDD
96 *
97 * It is safe to cast AltitudeValue_t to Vanetza_ITS2_AltitudeValue_t.
98 */
99AltitudeValue_t to_altitude_value(units::Length);
100
101/**
102 * Convert altitude confidence to AltitudeConfidence from CDD
103 *
104 * It is safe to cast AltitudeConfidence_t to Vanetza_ITS2_AltitudeConfidence_t.
105 */
106AltitudeConfidence_t to_altitude_confidence(units::Length);
107
108/**
109 * Check if a CAM contains only allowed data elements
110 * \param cam CA message
111 * \param ssp CA service specific permissions
112 * \return true if no forbidden data elements are included
113 */
114bool check_service_specific_permissions(const asn1::r1::Cam& cam, security::CamPermissions ssp);
115bool check_service_specific_permissions(const asn1::r2::Cam& cam, security::CamPermissions ssp);
116
117/**
118 * Print CAM content with indentation of nested fields
119 * \param os output stream
120 * \param cam CA message
121 * \param indent indentation marker, by default one tab per level
122 * \param start initial level of indentation
123 *
124 * This function is an idea of Erik de Britto e Silva (erikbritto@github)
125 * from University of Antwerp - erik.debrittoesilva@uantwerpen.be
126 */
127void print_indented(std::ostream& os, const asn1::r1::Cam& cam, const std::string& indent = "\t", unsigned start = 0);
128void print_indented(std::ostream& os, const asn1::r2::Cam& cam, const std::string& indent = "\t", unsigned start = 0);
129
130} // namespace facilities
131} // namespace vanetza
132
133#endif /* CAM_FUNCTIONS_HPP_PUFKBEM8 */