2#include "position_vector.hpp"
3#include "serialization.hpp"
10constexpr std::size_t LongPositionVector::length_bytes;
11constexpr std::size_t ShortPositionVector::length_bytes;
13LongPositionVector::LongPositionVector() : position_accuracy_indicator(false)
17GeodeticPosition LongPositionVector::position()
const
19 return GeodeticPosition {
20 static_cast<units::GeoAngle
>(latitude),
21 static_cast<units::GeoAngle
>(longitude)
25ShortPositionVector::ShortPositionVector(
const LongPositionVector& lpv) :
26 gn_addr(lpv.gn_addr), timestamp(lpv.timestamp),
27 latitude(lpv.latitude), longitude(lpv.longitude)
31bool operator==(
const LongPositionVector& lhs,
const LongPositionVector& rhs)
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;
42bool operator!=(
const LongPositionVector& lhs,
const LongPositionVector& rhs)
47bool operator==(
const ShortPositionVector& lhs,
const ShortPositionVector& rhs)
49 return lhs.gn_addr == rhs.gn_addr
50 && lhs.timestamp == rhs.timestamp
51 && lhs.latitude == rhs.latitude
52 && lhs.longitude == rhs.longitude;
55bool operator!=(
const ShortPositionVector& lhs,
const ShortPositionVector& rhs)
60bool is_empty(
const LongPositionVector& pv)
62 static const LongPositionVector zero;
66bool is_valid(
const LongPositionVector& pv)
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 };
74 }
else if (pv.latitude < -limit_lat || pv.latitude > limit_lat) {
76 }
else if (pv.longitude < -limit_lon || pv.longitude > limit_lon) {
78 }
else if (pv.heading > limit_hdg) {
85void serialize(
const LongPositionVector& lpv, OutputArchive& ar)
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);
97void deserialize(LongPositionVector& lpv, InputArchive& ar)
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);