/* * Copyright (c) 2012-2022 DSR Corporation, Denver CO, USA * Copyright (c) 2021-2022 Espressif Systems (Shanghai) PTE LTD * 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 a Espressif Systems * 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 the copyright holder nor the names of its contributors * may be used to endorse or promote products derived from this software without * specific prior written permission. * * 4. Any software provided in binary form under this license must not be reverse * engineered, decompiled, modified and/or disassembled. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. */ /* PURPOSE: ZBOSS Zigbee cluster library API header */ #ifndef ZBOSS_API_TL_H #define ZBOSS_API_TL_H 1 #include "zb_types.h" #include "zcl/zb_zcl_config.h" #include "zcl/zb_zcl_common.h" #include "zcl/zb_zcl_commands.h" #include "zcl/zb_zcl_touchlink_commissioning.h" /** @cond (DOXYGEN_ZCL_SECTION && DOXYGEN_TOUCHLINK_FEATURE) */ /** * @addtogroup ZB_ZCL_TOUCHLINK_COMMON * @{ * @details * This section describes data structures and common definitions used by Touchlink cluster. */ /** Controls number of device info record stored in Touchlink transaction context. */ #define ZB_ZLL_TRANS_CTX_DEV_INFO_MAX_NUMBER 8U /** Controls number of endpoint descriptions stored in Touchlink transaction context. */ #define ZB_ZLL_TRANS_CTX_EP_INFO_MAX_NUMBER 6U /** @cond internals_doc */ /** @brief Touchlink Address range */ typedef struct zb_zll_addr_range_s { zb_uint16_t addr_begin; zb_uint16_t addr_end; } zb_zll_addr_range_t; /** @brief Touchlink Group ID range */ typedef struct zb_zll_group_id_range_s { zb_uint16_t group_id_begin; zb_uint16_t group_id_end; } zb_zll_group_id_range_t; /** Touchlink Sub-device information */ typedef struct zb_zll_sub_device_info_s { zb_uint8_t ep_id; zb_uint16_t profile_id; zb_uint16_t device_id; zb_uint8_t version; zb_uint8_t group_id_count; zb_uint8_t dev_idx; /**< Index (in the device info table) of the device endpoint belongs to. */ } zb_zll_sub_device_info_t; /** Touchlink Discovered device information */ typedef struct zb_zll_ext_device_info_s { /** @brief Our custom field to be able to address device information request. */ zb_ieee_addr_t device_addr; zb_uint8_t rssi_correction; zb_uint8_t zb_info; zb_uint8_t zll_info; zb_uint16_t key_info; zb_uint32_t resp_id; zb_ext_pan_id_t ext_pan_id; zb_uint8_t nwk_update_id; zb_uint8_t channel_number; zb_uint16_t pan_id; zb_uint16_t nwk_addr; zb_uint8_t sub_device_count; zb_uint8_t total_group_id_count; zb_uint8_t ep_info_idx; zb_int8_t rssi; } zb_zll_ext_device_info_t; /** * @brief Structure to store data for Touchlink Start new network command. * Stored in the context on the target side. */ typedef struct zb_zll_start_new_network_target_data_s { zb_uint16_t seq_number; /**< ZCL sequence number. */ zb_uint16_t pan_id; /**< Identifier of the PAN to be created. */ zb_ext_pan_id_t ext_pan_id; /**< Extended identifier of the PAN to be created. */ zb_uint8_t channel; /**< Channel to be used for PAN creation. */ zb_uint16_t short_addr; /**< New short addr */ zb_ieee_addr_t target_ieee_addr; /**< Target IEEE addr */ } zb_zll_start_new_network_target_data_t; /** @brief Touchlink Start router struct */ typedef struct zb_zll_start_router_param_s { zb_ext_pan_id_t ext_pan_id; /**< Extension Pan ID */ zb_uint16_t short_pan_id; /**< Short address Pan ID */ zb_uint8_t channel; /**< Channel number */ zb_uint16_t short_addr; /**< New short address of router */ } zb_zll_start_router_param_t; /** @brief Touchlink Rejoin struct */ typedef struct zb_zll_rejon_nwk_ed_param_s { zb_ext_pan_id_t ext_pan_id; /**< Extension Pan ID */ zb_uint16_t short_pan_id; /**< Short address Pan ID */ zb_uint8_t channel; /**< Channel number */ } zb_zll_rejon_nwk_ed_param_t; /** @brief Touchlink Join router struct */ typedef struct zb_zll_network_join_router_data_s { zb_ieee_addr_t target_ieee_addr; /**< Target IEEE addr */ } zb_zll_network_join_router_data_t; /** * @brief Type of the Touchlink command data storage. * Stored in the context on the target side for to be used in asynchronous chains. */ typedef union zb_zll_command_target_data_u { zb_zll_start_new_network_target_data_t start_new_nwk; /**< "Start new network" command data. */ zb_zll_start_router_param_t start_router_param; /**< Parameters for start router command */ zb_zll_rejon_nwk_ed_param_t rejoin_nwk_param; /**< Parameters for rejoin nwk end device router * command */ zb_zll_network_join_router_data_t nwk_join_router; /**< Parameters for rejoin nwk end device router command */ } zb_zll_command_target_data_t; /** * @brief Touchlink callback type for checking requested action is allowed. * @param action [IN] - action to check. * @returns ZB_TRUE if action allowed, ZB_FALSE otherwise. */ typedef zb_bool_t (*zb_zll_is_action_allowed_cb_t)(zb_uint8_t action); /** Touchlink device info data */ typedef struct zb_zll_device_info_s { zb_uint8_t rssi_correction; zb_uint8_t zll_info; zb_uint16_t key_info; zb_uint8_t key_index; zb_zll_addr_range_t addr_range; zb_zll_group_id_range_t group_id_range; zb_uint8_t total_group_id_count; /* TODO: Not sure it is needed maybe calculate it using group ID count for EP? */ /** @brief User-provided "report task result" callback. */ zb_callback_t report_task_result; zb_uint8_t master_key[16]; zb_uint8_t certification_key[16]; zb_uint32_t transaction_id; zb_uint32_t response_id; zb_uint8_t encr_nwk_key[16]; /* FIXME: do we really need to store it? */ zb_uint16_t identify_duration; /**< Identify duration period for ZLL commissioning server. */ zb_callback_t identify_handler; /**< User-provided identify start/stop handler. */ zb_uint8_t freqagility_channel; zb_uint8_t nwk_channel; /* Logical channel number for start/join the network (as initiator * role) */ zb_int8_t rssi_threshold; /* RSSI threshold */ zb_uint32_t target_timeout; /* Timeout for target to wait initiator */ } zb_zll_device_info_t; /** @brief Touchlink transaction data context */ typedef struct zb_zll_transaction_ctx_s { /** @brief Inter-PAN transaction identifier for the transaction under processing. */ zb_uint32_t transaction_id; /** Specifies if identify request was sent during transaction */ zb_bitfield_t identify_sent:1; /** "Send confirmed" flag. */ zb_bitfield_t send_confirmed:1; /** "Scan timed out" flag. */ zb_bitfield_t scan_timed_out:1; /** "Extended scan" flag. */ zb_bitfield_t ext_scan:1; /** "Out of memory" flag. */ zb_bitfield_t out_of_memory:1; /** Source device address received with the packet in the current transaction stage. */ zb_ieee_addr_t src_addr; /** * @brief Describe current transaction task. Possible tasks are defined in enumeration @ref * zb_zll_transaction_task_e */ zb_ushort_t transaction_task; zb_uint8_t n_device_infos; /**< Number of device infos currently stored in the table. */ zb_uint8_t current_dev_info_idx; /**< Index for the device info record iterator. */ /** Table of devices reported during the active transaction. */ zb_zll_ext_device_info_t device_infos[ZB_ZLL_TRANS_CTX_DEV_INFO_MAX_NUMBER]; /** Number of filled endpoint info records. */ zb_uint8_t n_ep_infos; /** Sub-device (endpoint) info table. */ zb_zll_sub_device_info_t ep_infos[ZB_ZLL_TRANS_CTX_DEV_INFO_MAX_NUMBER * ZB_ZLL_TRANS_CTX_EP_INFO_MAX_NUMBER]; /** @brief User-provided "check action allowed" callback. */ zb_zll_is_action_allowed_cb_t check_action_allowed; /** @internal @brief Packet send counter. * * Counts packets sent during particular transaction procedure. * @attention Should be neither referenced nor changed from the userspace. */ zb_uint8_t pckt_cnt; /** Old address range for transaction rollback needs. */ zb_zll_addr_range_t addr_range; /** Old group identifiers range for transaction rollback needs. */ zb_zll_group_id_range_t group_id_range; /** Callback-chain data for target-side command handling. */ zb_zll_command_target_data_t command_data; } zb_zll_transaction_ctx_t; /** @brief Touchlink context data */ typedef struct zb_zll_ctx_s { zb_zll_device_info_t zll_device_info; zb_zll_transaction_ctx_t zll_tran_ctx; } zb_zll_ctx_t; /** Returns Touchlink context. @return pointer Touchlink context */ zb_zll_ctx_t *zb_zll_get_ctx(void); /** Returns Touchlink device info. @return pointer Touchlink device info */ zb_zll_device_info_t *zb_zll_get_device_info(void); /** Returns Touchlink transaction context. @return pointer Touchlink transaction context */ zb_zll_transaction_ctx_t *zb_zll_get_transaction_ctx(void); /** @endcond */ /* internals_doc */ /** Returns pointer to Touchlink context */ #define ZLL_CTX() (*zb_zll_get_ctx()) /** Returns pointer to Touchlink device info */ #define ZLL_DEVICE_INFO() (*zb_zll_get_device_info()) /** Returns pointer to Touchlink transaction context */ #define ZLL_TRAN_CTX() (*zb_zll_get_transaction_ctx()) /** @} */ /* ZB_ZCL_TOUCHLINK_COMMON */ /** @endcond */ /* DOXYGEN_ZCL_SECTION && DOXYGEN_TOUCHLINK_FEATURE */ #endif /* ZBOSS_API_TL_H */