| /*! \defgroup gad 3GPP TS 23.032 GAD: Universal Geographical Area Description. |
| * @{ |
| * \file gsm_23_032.h |
| */ |
| /* |
| * (C) 2020 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> |
| * |
| * All Rights Reserved |
| * |
| * Author: Neels Hofmeyr <neels@hofmeyr.de> |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU Affero General Public License as published by |
| * the Free Software Foundation; either version 3 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU Affero General Public License for more details. |
| * |
| * You should have received a copy of the GNU Affero General Public License |
| * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| * |
| */ |
| |
| #pragma once |
| |
| #include <stdint.h> |
| #include <osmocom/core/endian.h> |
| |
| enum gad_type { |
| /*! Ellipsoid point */ |
| GAD_TYPE_ELL_POINT = 0, |
| /*! Ellipsoid point with uncertainty circle. */ |
| GAD_TYPE_ELL_POINT_UNC_CIRCLE = 1, |
| /*! Ellipsoid point with uncertainty ellipse. */ |
| GAD_TYPE_ELL_POINT_UNC_ELLIPSE = 3, |
| GAD_TYPE_POLYGON = 5, |
| /*! Ellipsoid point with altitude. */ |
| GAD_TYPE_ELL_POINT_ALT = 8, |
| /*! Ellipsoid point with altitude and uncertainty ellipsoid. */ |
| GAD_TYPE_ELL_POINT_ALT_UNC_ELL = 9, |
| /*! Ellipsoid arc */ |
| GAD_TYPE_ELL_ARC = 10, |
| /*! High accuracy ellipsoid point with uncertainty ellipse. */ |
| GAD_TYPE_HA_ELL_POINT_UNC_ELLIPSE = 11, |
| /*! High accuracy ellipsoid point with altitude and uncertainty ellipsoid. */ |
| GAD_TYPE_HA_ELL_POINT_ALT_UNC_ELL = 12, |
| }; |
| |
| struct gad_raw_head { |
| #if OSMO_IS_LITTLE_ENDIAN |
| uint8_t spare:4, |
| type:4; |
| #elif OSMO_IS_BIG_ENDIAN |
| /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */ |
| uint8_t type:4, spare:4; |
| #endif |
| } __attribute__ ((packed)); |
| |
| struct gad_raw_ell_point { |
| struct gad_raw_head h; /*!< type = GAD_TYPE_ELL_POINT */ |
| uint8_t lat[3]; |
| uint8_t lon[3]; |
| } __attribute__ ((packed)); |
| |
| struct gad_raw_ell_point_unc_circle { |
| #if OSMO_IS_LITTLE_ENDIAN |
| struct gad_raw_head h; /*!< type = GAD_TYPE_ELL_POINT_UNC_CIRCLE */ |
| uint8_t lat[3]; |
| uint8_t lon[3]; |
| uint8_t unc:7, |
| spare2:1; |
| #elif OSMO_IS_BIG_ENDIAN |
| /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */ |
| struct gad_raw_head h; |
| uint8_t lat[3]; |
| uint8_t lon[3]; |
| uint8_t spare2:1, unc:7; |
| #endif |
| } __attribute__ ((packed)); |
| |
| struct gad_raw_ell_point_unc_ellipse { |
| #if OSMO_IS_LITTLE_ENDIAN |
| struct gad_raw_head h; /*!< type = GAD_TYPE_ELL_POINT_UNC_ELLIPSE */ |
| uint8_t lat[3]; |
| uint8_t lon[3]; |
| uint8_t unc_semi_major:7, |
| spare1:1; |
| uint8_t unc_semi_minor:7, |
| spare2:1; |
| uint8_t major_ori; |
| uint8_t confidence:7, |
| spare3:1; |
| #elif OSMO_IS_BIG_ENDIAN |
| /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */ |
| struct gad_raw_head h; |
| uint8_t lat[3]; |
| uint8_t lon[3]; |
| uint8_t spare1:1, unc_semi_major:7; |
| uint8_t spare2:1, unc_semi_minor:7; |
| uint8_t major_ori; |
| uint8_t spare3:1, confidence:7; |
| #endif |
| } __attribute__ ((packed)); |
| |
| struct gad_raw_polygon { |
| struct { |
| #if OSMO_IS_LITTLE_ENDIAN |
| uint8_t num_points:4; |
| uint8_t type:4; /*!< type = GAD_TYPE_POLYGON */ |
| #elif OSMO_IS_BIG_ENDIAN |
| /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */ |
| uint8_t type:4, num_points:4; |
| #endif |
| } h; |
| struct { |
| uint8_t lat[3]; |
| uint8_t lon[3]; |
| } point[15]; |
| } __attribute__ ((packed)); |
| |
| struct gad_raw_ell_point_alt { |
| struct gad_raw_head h; /*!< type = GAD_TYPE_ELL_POINT_ALT */ |
| uint8_t lat[3]; |
| uint8_t lon[3]; |
| uint8_t alt[2]; |
| } __attribute__ ((packed)); |
| |
| struct gad_raw_ell_point_alt_unc_ell { |
| #if OSMO_IS_LITTLE_ENDIAN |
| struct gad_raw_head h; /*!< type = GAD_TYPE_ELL_POINT_ALT_UNC_ELL */ |
| uint8_t lat[3]; |
| uint8_t lon[3]; |
| uint8_t alt[2]; |
| uint8_t unc_semi_major:7, |
| spare1:1; |
| uint8_t unc_semi_minor:7, |
| spare2:1; |
| uint8_t major_ori; |
| uint8_t unc_alt:7, |
| spare3:1; |
| uint8_t confidence:7, |
| spare4:1; |
| #elif OSMO_IS_BIG_ENDIAN |
| /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */ |
| struct gad_raw_head h; |
| uint8_t lat[3]; |
| uint8_t lon[3]; |
| uint8_t alt[2]; |
| uint8_t spare1:1, unc_semi_major:7; |
| uint8_t spare2:1, unc_semi_minor:7; |
| uint8_t major_ori; |
| uint8_t spare3:1, unc_alt:7; |
| uint8_t spare4:1, confidence:7; |
| #endif |
| } __attribute__ ((packed)); |
| |
| struct gad_raw_ell_arc { |
| #if OSMO_IS_LITTLE_ENDIAN |
| struct gad_raw_head h; /*!< type = GAD_TYPE_ELL_ARC */ |
| uint8_t lat[3]; |
| uint8_t lon[3]; |
| uint8_t inner_r[2]; |
| uint8_t unc_r:7, |
| spare1:1; |
| uint8_t ofs_angle; |
| uint8_t incl_angle; |
| uint8_t confidence:7, |
| spare2:1; |
| #elif OSMO_IS_BIG_ENDIAN |
| /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */ |
| struct gad_raw_head h; |
| uint8_t lat[3]; |
| uint8_t lon[3]; |
| uint8_t inner_r[2]; |
| uint8_t spare1:1, unc_r:7; |
| uint8_t ofs_angle; |
| uint8_t incl_angle; |
| uint8_t spare2:1, confidence:7; |
| #endif |
| } __attribute__ ((packed)); |
| |
| struct gad_raw_ha_ell_point_unc_ell { |
| #if OSMO_IS_LITTLE_ENDIAN |
| struct gad_raw_head h; /*!< type = GAD_TYPE_HA_ELL_POINT_UNC_ELLIPSE */ |
| uint8_t lat[4]; |
| uint8_t lon[4]; |
| uint8_t alt[3]; |
| uint8_t unc_semi_major; |
| uint8_t unc_semi_minor; |
| uint8_t major_ori; |
| uint8_t confidence:7, |
| spare1:1; |
| #elif OSMO_IS_BIG_ENDIAN |
| /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */ |
| struct gad_raw_head h; |
| uint8_t lat[4]; |
| uint8_t lon[4]; |
| uint8_t alt[3]; |
| uint8_t unc_semi_major; |
| uint8_t unc_semi_minor; |
| uint8_t major_ori; |
| uint8_t spare1:1, confidence:7; |
| #endif |
| } __attribute__ ((packed)); |
| |
| struct gad_raw_ha_ell_point_alt_unc_ell { |
| #if OSMO_IS_LITTLE_ENDIAN |
| struct gad_raw_head h; /*!< type = GAD_TYPE_HA_ELL_POINT_ALT_UNC_ELL */ |
| uint8_t lat[4]; |
| uint8_t lon[4]; |
| uint8_t alt[3]; |
| uint8_t unc_semi_major; |
| uint8_t unc_semi_minor; |
| uint8_t major_ori; |
| uint8_t h_confidence:7, |
| spare1:1; |
| uint8_t unc_alt; |
| uint8_t v_confidence:7, |
| spare2:1; |
| #elif OSMO_IS_BIG_ENDIAN |
| /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */ |
| struct gad_raw_head h; |
| uint8_t lat[4]; |
| uint8_t lon[4]; |
| uint8_t alt[3]; |
| uint8_t unc_semi_major; |
| uint8_t unc_semi_minor; |
| uint8_t major_ori; |
| uint8_t spare1:1, h_confidence:7; |
| uint8_t unc_alt; |
| uint8_t spare2:1, v_confidence:7; |
| #endif |
| } __attribute__ ((packed)); |
| |
| /*! GAD PDU in network-byte-order according to 3GPP TS 23.032 GAD: Universal Geographical Area Description. */ |
| union gad_raw { |
| struct gad_raw_head h; |
| struct gad_raw_ell_point ell_point; |
| struct gad_raw_ell_point_unc_circle ell_point_unc_circle; |
| struct gad_raw_ell_point_unc_ellipse ell_point_unc_ellipse; |
| struct gad_raw_polygon polygon; |
| struct gad_raw_ell_point_alt ell_point_alt; |
| struct gad_raw_ell_point_alt_unc_ell ell_point_alt_unc_ell; |
| struct gad_raw_ell_arc ell_arc; |
| struct gad_raw_ha_ell_point_unc_ell ha_ell_point_unc_ell; |
| struct gad_raw_ha_ell_point_alt_unc_ell ha_ell_point_alt_unc_ell; |
| } __attribute__ ((packed)); |
| |
| /*! @} */ |