/* * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and * its subsidiaries and affiliates (collectly called MKSEMI). * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form, except as embedded into an MKSEMI * integrated circuit in a product or a software update for such product, * must reproduce the above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or other materials * provided with the distribution. * * 3. Neither the name of MKSEMI nor the names of its contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * 4. This software, with or without modification, must only be used with a * MKSEMI integrated circuit. * * 5. Any software provided in binary form under this license must not be * reverse engineered, decompiled, modified and/or disassembled. * * THIS SOFTWARE IS PROVIDED BY MKSEMI "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL MKSEMI OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef PDOA_3D_LIB_H #define PDOA_3D_LIB_H #include "mk_uwb.h" /** * @addtogroup MK8000_ALGO_PDOA * @{ * * PDoA support: * - Linear 2/3/4-ants * - Square 4-ants (horizontal - 360 degree, vertical - half ball 3D) * - Triangle 3-ants * */ enum PDOA_3D_AMBIGUITY_MODE_T { PDOA_3D_AMBIGUITY_LEVEL_HIGH = 0, PDOA_3D_AMBIGUITY_LEVEL_MIDIUM, PDOA_3D_AMBIGUITY_LEVEL_LOW, PDOA_3D_AMBIGUITY_LEVEL_NONE, }; struct PDOA_3D_MAC_ADDR_T { uint8_t mac_addr[8]; uint32_t elapsed_time; }; struct PDOA_3D_PDOA_DATA_T { int16_t pdoa[18]; }; #ifdef __cplusplus extern "C" { #endif /** * @brief PDoA configuration. * * @param [in] ant_pattern antenna pattern * @param [in] ant_layout layout of PCB board configuration * @param [in] ambiguity_mode PDoA ambiguity configuration * @param [in] mac_addr_cache mac address list input * @param [in] azimuth previous PDoA data list input * @param [in] cache_len list length(equal to the tag number supported) * @param [in] timeout_ms timeout setting for PDoA ambiguity process, unit: millisecond */ void pdoa_3d_param_config(uint8_t ant_pattern, enum ANT_LAYOUT_T ant_layout, enum PDOA_3D_AMBIGUITY_MODE_T ambiguity_mode, struct PDOA_3D_MAC_ADDR_T *mac_addr_cache, struct PDOA_3D_PDOA_DATA_T *pdoa_data_cache, size_t cache_len, uint32_t timeout_ms); /** * @brief Calculate PDoA. * * @param [in] mac_addr mac address * @param [out] elevation PDoA elevation result * @param [out] azimuth PDoA azimuth result * @return 1: success, 0: failure */ uint8_t pdoa_3d_calculate(uint8_t *mac_addr, int16_t *elevation, int16_t *azimuth); /** * @brief Set gain of each PDoA channel * * @param [in] gain gain list of antenna port * @param [in] rx_ant_num The number of antenna gain(PDoA channel) to be set * @return 0: success, -1: fail */ uint8_t pdoa_3d_ant_layout_get(void); /** * @brief Set gain of each PDoA channel * * @param [in] gain gain list of antenna port, unit: 1 percent * @param [in] rx_ant_num The number of antenna gain(PDoA channel) to be set * @return 0: success, -1: fail */ int pdoa_gain_set(int16_t *gain, uint8_t rx_ant_num); /** * @brief Set offset for each angle * * @param [in] angle_offset offset list for azimuth & elevation, unit: 0.1 degree */ int pdoa_angle_offset_set(int16_t *angle_offset); /** * @brief Get pdoa fom * * @param ele_fom elevation fom, completely untrustworthy when fom equal to 0 * @param az_fom azimuth fom, completely untrustworthy when fom equal to 0 */ void pdoa_fom_get(uint8_t *ele_fom, uint8_t *az_fom); /** * @brief Reverse angle * * @param azimuth_reverse reverse azimuth * @param elevation_reverse reverse elevation */ void pdoa_angle_reverse_set(bool azimuth_reverse, bool elevation_reverse); #ifdef __cplusplus } #endif /** * @} */ #endif // PDOA_3D_LIB_H