#ifndef POSITION_VECTOR_HPP_WJAGEOCS #define POSITION_VECTOR_HPP_WJAGEOCS #include #include #include #include #include #include #include #include #include namespace vanetza { namespace geonet { using geodesy::GeodeticPosition; class LongPositionVector { public: static constexpr std::size_t length_bytes = 24; typedef boost::units::quantity> >::type, BitNumber> speed_u15t; // 1/100 m/s Address gn_addr; Timestamp timestamp; // ms since 2004-01-01 00:00:00.000 geo_angle_i32t latitude; geo_angle_i32t longitude; bool position_accuracy_indicator; speed_u15t speed; heading_u16t heading; LongPositionVector(); GeodeticPosition position() const; }; bool operator==(const LongPositionVector& lhs, const LongPositionVector& rhs); bool operator!=(const LongPositionVector& lhs, const LongPositionVector& rhs); /** * Check if position vector is empty (default) * \return true if all data fields are zero */ bool is_empty(const LongPositionVector&); /** * Check if position vector contains valid data, * i.e. not empty and latitude, longitude, and heading values within range * \return true if all data fields are valid */ bool is_valid(const LongPositionVector&); void serialize(const LongPositionVector&, OutputArchive&); void deserialize(LongPositionVector&, InputArchive&); class ShortPositionVector { public: static constexpr std::size_t length_bytes = 20; ShortPositionVector() = default; ShortPositionVector(const ShortPositionVector&) = default; ShortPositionVector& operator=(const ShortPositionVector&) = default; explicit ShortPositionVector(const LongPositionVector&); Address gn_addr; Timestamp timestamp; geo_angle_i32t latitude; geo_angle_i32t longitude; }; bool operator==(const ShortPositionVector& lhs, const ShortPositionVector& rhs); bool operator!=(const ShortPositionVector& lhs, const ShortPositionVector& rhs); } // namespace geonet } // namespace vanetza #endif /* POSITION_VECTOR_HPP_WJAGEOCS */