/* * Copyright (c) 2023 Trackunit Corporation * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_INCLUDE_DATA_NAVIGATION_H_ #define ZEPHYR_INCLUDE_DATA_NAVIGATION_H_ #include /** * @brief Navigation utilities * @defgroup navigation Navigation * @ingroup utilities * @{ */ /** * @brief Navigation data structure * * @details The structure describes the momentary navigation details of a * point relative to a sphere (commonly Earth) */ struct navigation_data { /** Latitudal position in nanodegrees (0 to +-180E9) */ int64_t latitude; /** Longitudal position in nanodegrees (0 to +-180E9) */ int64_t longitude; /** Bearing angle in millidegrees (0 to 360E3) */ uint32_t bearing; /** Speed in millimeters per second */ uint32_t speed; /** Altitude in millimeters */ int32_t altitude; }; /** * @brief Calculate the distance between two navigation points along the * surface of the sphere they are relative to. * * @param distance Destination for calculated distance in millimeters * @param p1 First navigation point * @param p2 Second navigation point * * @return 0 if successful * @return -EINVAL if either navigation point is invalid */ int navigation_distance(uint64_t *distance, const struct navigation_data *p1, const struct navigation_data *p2); /** * @brief Calculate the bearing from one navigation point to another * * @param bearing Destination for calculated bearing angle in millidegrees * @param from First navigation point * @param to Second navigation point * * @return 0 if successful * @return -EINVAL if either navigation point is invalid */ int navigation_bearing(uint32_t *bearing, const struct navigation_data *from, const struct navigation_data *to); /** * @} */ #endif /* ZEPHYR_INCLUDE_DATA_NAVIGATION_H_ */