MeshTalos-Client/managed_components/espressif__esp-zboss-lib/include/zboss_api_af.h
2025-12-03 14:20:11 +08:00

783 lines
31 KiB
C

/*
* 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 AF API
*/
#ifndef ZBOSS_API_AF_H
#define ZBOSS_API_AF_H 1
/**
* @addtogroup af_api
* @{
*/
/**
* @addtogroup af_data_service AF data service
* @{
*/
/**
Node descriptor
*/
typedef ZB_PACKED_PRE struct zb_af_node_desc_s
{
zb_uint16_t node_desc_flags; /*!< node description */
zb_uint8_t mac_capability_flags; /*!< mac capability */
zb_uint16_t manufacturer_code; /*!< Manufacturer code */
zb_uint8_t max_buf_size; /*!< Maximum buffer size */
zb_uint16_t max_incoming_transfer_size; /*!< Maximum incoming transfer size */
zb_uint16_t server_mask; /*!< Server mask */
zb_uint16_t max_outgoing_transfer_size; /*!< Maximum outgoing transfer size */
zb_uint8_t desc_capability_field; /*!< Descriptor capability field */
}
ZB_PACKED_STRUCT
zb_af_node_desc_t;
typedef zb_nwk_device_type_t zb_logical_type_t;
/** @} */ /* af_data_service */
/**
* @addtogroup af_node_desc_dev_types AF device types
* @{
*/
/** Device type - Coordinator */
#define ZB_COORDINATOR ZB_NWK_DEVICE_TYPE_COORDINATOR
/** Device type - Router */
#define ZB_ROUTER ZB_NWK_DEVICE_TYPE_ROUTER
/** Device type - End Device */
#define ZB_END_DEVICE ZB_NWK_DEVICE_TYPE_ED
/*! @} */ /* af_node_desc_dev_types */
/**
* @addtogroup af_common_constants AF common constants
* @{
*/
/**
* @name Node descriptor - frequency value
* @anchor freq_band
*
* Note: These values were members of `enum zb_freq_band_e` type but were converted to a
* set of macros due to MISRA violations.
*/
/** @{ */
#define ZB_FREQ_BAND_868 1U /*!< 868-868.6 MHz BPSK */
#define ZB_FREQ_BAND_SUB_GHZ_NA_FSK (1U << 2) /*!< 902-928 MHz BPSK */
#define ZB_FREQ_BAND_2400 (1U << 3) /*!< 2400-2483.5 MHz */
/** Zigbee R22: European FSK sub-GHz bands (863-876MHz, 915-921MHz) */
#define ZB_FREQ_BAND_SUB_GHZ_EU_FSK (1U << 4)
/** @} */
/**
* @name Node descriptor - server mask
* @anchor server_mask_bit
*
* Note: These values were members of `enum zb_server_mask_bit_e` type but were converted to a
* set of macros due to MISRA violations.
*/
/** @{ */
#define ZB_PRIMARY_TRUST_CENTER 1U /*!< Primary Trust Center */
#define ZB_BACKUP_TRUST_CENTER (1U << 1) /*!< Backup Trust Center */
#define ZB_PRIMARY_BINDING_TABLE_CENTER (1U << 2) /*!< Primary Binding Table Center */
#define ZB_BACKUP_BINDING_TABLE_CENTER (1U << 3) /*!< Backup Binding Table Center */
#define ZB_PRIMARY_DISCOVERY_CACHE (1U << 4) /*!< Primary Discovery Cache */
#define ZB_BACKUP_DISCOVERY_CACHE (1U << 5) /*!< Backup Discovery Cache */
#define ZB_NETWORK_MANAGER (1U << 6) /*!< Network Manager */
/** @} */
/**
* @name Node descriptor - capability mask
* @anchor desc_capability
*
* Note: These values were members of `enum zb_desc_capability_e` type but were converted to a
* set of macros due to MISRA violations.
*/
/** @{ */
#define ZB_EXT_ACTIVE_EP_LIST 1U /*!< Extended Active Endpoint List Available */
#define ZB_EXT_SIMPLE_DESC_LIST (1U << 1) /*!< Extended Simple Descriptor List Available */
/** @} */
/**
* @name Power descriptor types
* @anchor current_power_mode
*/
/** @{ */
/*!< Receiver synchronized with the receiver on when idle subfield of the node descriptor. */
#define ZB_POWER_MODE_SYNC_ON_WHEN_IDLE 0U
/*!< Receiver comes on periodically as defined by the node power descriptor. */
#define ZB_POWER_MODE_COME_ON_PERIODICALLY 1U
/*!< Receiver comes on when stimulated, for example, by a user pressing a button. */
#define ZB_POWER_MODE_COME_ON_WHEN_STIMULATED 2U
/** @} */
/**
* @brief Type for power descriptor types.
*
* Holds one of @ref current_power_mode. Kept only for backward compatibility as
* @ref current_power_mode were declared previously as enum. Can be removed in future releases.
*/
typedef zb_uint8_t zb_current_power_mode_t;
/**
* @name Power source types
* @anchor power_src
*/
/** @{ */
#define ZB_POWER_SRC_CONSTANT 1U /*!< Constant (mains) power */
#define ZB_POWER_SRC_RECHARGEABLE_BATTERY (1U << 1) /*!< Rechargeable battery */
#define ZB_POWER_SRC_DISPOSABLE_BATTERY (1U << 2) /*!< Disposable battery */
/** @} */
/**
* @brief Type for power source types.
*
* @deprecated holds one of @ref power_src. Kept only for backward compatibility as
* @ref power_src were declared previously as enum. Can be removed in future releases.
*/
typedef zb_uint8_t zb_power_src_t;
/**
* @name Power source level values
* @anchor power_source_level
*/
/** @{ */
#define ZB_POWER_LEVEL_CRITICAL 0U /*!< Critical */
#define ZB_POWER_LEVEL_33 4U /*!< 33% */
#define ZB_POWER_LEVEL_66 8U /*!< 66% */
#define ZB_POWER_LEVEL_100 12U /*!< 100% */
/** @} */
/**
* @brief Type for power source level values.
*
* Holds one of @ref power_source_level. Kept only for backward compatibility as
* @ref power_source_level were declared previously as enum. Can be removed in future releases.
*/
typedef zb_uint8_t zb_power_source_level_t;
/** @} */ /* af_common_constants */
/**
* @addtogroup af_data_service AF data service
* @{
*/
/**
Node power descriptor
*/
typedef ZB_PACKED_PRE struct zb_af_node_power_desc_s
{
/** Field name Bits
* Current power mode: 4@n
* Available power sources: 4@n
* Current power source: 4@n
* Current power source level: 4
*/
zb_uint16_t power_desc_flags;
} ZB_PACKED_STRUCT zb_af_node_power_desc_t;
/** @cond DOXYGEN_INTERNAL_DOC */
#define CAT5(a, b, c, d, e) a##b##c##d##e
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */
/** Generate simple descriptor type name */
#define ZB_AF_SIMPLE_DESC_TYPE(in_num, out_num) CAT5(zb_af_simple_desc_,in_num,_,out_num,_t)
/**
Declares Simple descriptor type
@param in_clusters_count - number of input clusters in descriptor
@param out_clusters_count - number of output clusters in descriptor
@b Example:
@code
ZB_DECLARE_SIMPLE_DESC(5, 5);
@endcode
*/
#if defined ZB_APS_ENCRYPTION_PER_CLUSTER
#define ZB_DECLARE_SIMPLE_DESC(in_clusters_count, out_clusters_count) \
typedef ZB_PACKED_PRE struct zb_af_simple_desc_ ## in_clusters_count ## _ ## out_clusters_count ## _s \
{ \
zb_uint8_t endpoint; /* Endpoint */ \
zb_uint16_t app_profile_id; /* Application profile identifier */ \
zb_uint16_t app_device_id; /* Application device identifier */ \
zb_bitfield_t app_device_version:4; /* Application device version */ \
zb_bitfield_t reserved:4; /* Reserved */ \
zb_uint8_t app_input_cluster_count; /* Application input cluster count */ \
zb_uint8_t app_output_cluster_count; /* Application output cluster count */ \
/* Application input and output cluster list */ \
zb_uint16_t app_cluster_list[(in_clusters_count) + (out_clusters_count)]; \
zb_uint8_t cluster_encryption[((in_clusters_count) + (out_clusters_count) + 7)/8]; \
} ZB_PACKED_STRUCT \
zb_af_simple_desc_ ## in_clusters_count ## _ ## out_clusters_count ## _t
#else /* ZB_APS_ENCRYPTION_PER_CLUSTER */
#define ZB_DECLARE_SIMPLE_DESC(in_clusters_count, out_clusters_count) \
typedef ZB_PACKED_PRE struct zb_af_simple_desc_ ## in_clusters_count ## _ ## out_clusters_count ## _s \
{ \
zb_uint8_t endpoint; /* Endpoint */ \
zb_uint16_t app_profile_id; /* Application profile identifier */ \
zb_uint16_t app_device_id; /* Application device identifier */ \
zb_bitfield_t app_device_version:4; /* Application device version */ \
zb_bitfield_t reserved:4; /* Reserved */ \
zb_uint8_t app_input_cluster_count; /* Application input cluster count */ \
zb_uint8_t app_output_cluster_count; /* Application output cluster count */ \
/* Application input and output cluster list */ \
zb_uint16_t app_cluster_list[(in_clusters_count) + (out_clusters_count)]; \
} ZB_PACKED_STRUCT \
zb_af_simple_desc_ ## in_clusters_count ## _ ## out_clusters_count ## _t
#endif /* ZB_APS_ENCRYPTION_PER_CLUSTER */
/** @} */ /* af_data_service */
/**
* @addtogroup af_management_service AF management service
* @{
*/
/** General descriptor type */
ZB_DECLARE_SIMPLE_DESC(1,1);
/** ZDO descriptor type */
ZB_DECLARE_SIMPLE_DESC(8,9);
/** @} */ /* af_management_service */
/**
* @addtogroup af_common_constants AF common constants
* @{
*/
/**
* @name Profile identifiers
* @anchor af_profile_id
*
* Note: These values were members of `enum zb_af_profile_id_e` type but were converted to a
* set of macros due to MISRA violations.
*/
/** @{ */
/** ZDO profile ID */
#define ZB_AF_ZDO_PROFILE_ID 0x0000U
/** Legacy profile */
#define ZB_AF_LEGACY_PROFILE1_ID 0x0101U
/** Legacy profile */
#define ZB_AF_LEGACY_PROFILE2_ID 0x0102U
/** Legacy profile */
#define ZB_AF_LEGACY_PROFILE3_ID 0x0103U
/** HA profile ID*/
#define ZB_AF_HA_PROFILE_ID 0x0104U
/** Legacy profile */
#define ZB_AF_LEGACY_PROFILE4_ID 0x0105U
/** Legacy profile */
#define ZB_AF_LEGACY_PROFILE5_ID 0x0106U
/** Legacy profile */
#define ZB_AF_LEGACY_PROFILE6_ID 0x0107U
/** Legacy profile */
#define ZB_AF_LEGACY_PROFILE7_ID 0x0108U
/** SE profile ID */
#define ZB_AF_SE_PROFILE_ID 0x0109U
/** ZLL profile identifier. */
#define ZB_AF_ZLL_PROFILE_ID 0xC05EU
/** Wildcard profile identifier. */
#define ZB_AF_WILDCARD_PROFILE_ID 0xFFFFU
/** GreenPower profile ID */
#define ZB_AF_GP_PROFILE_ID 0xA1E0U
#ifdef ZB_CONTROL4_NETWORK_SUPPORT
/** Control4 profile identifier. */
#define ZB_AF_CONTROL4_PROFILE_ID 0xC25DU
#endif
/** @} */
/** @} */ /* af_common_constants */
/** @cond DOXYGEN_INTERNAL_DOC */
#if !(defined ZB_ZCL_DISABLE_REPORTING) || defined(DOXYGEN)
struct zb_zcl_reporting_info_s; /* Forward declaration */
#endif
struct zb_zcl_cluster_desc_s; /* Forward declaration */
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */
/**
* @addtogroup af_management_service AF management service
* @{
*/
/**
* Device command handler
*
* @param param - index of buffer with ZCL command
* @return status (see @ref zb_bool_t)
*/
typedef zb_uint8_t (*zb_device_handler_t)(zb_uint8_t param);
/** @} */ /* af_management_service */
/**
* @addtogroup af_data_service AF data service
* @{
*/
/** Endpoint description for user applications. */
/*! @brief Endpoint descriptor. */
typedef ZB_PACKED_PRE struct zb_af_endpoint_desc_s
{
zb_uint8_t ep_id; /*!< Endpoint ID */
zb_uint16_t profile_id; /*!< Application profile, which implemented on endpoint */
zb_device_handler_t device_handler; /*!< Device specific callback, handles all commands */
/*! @brief Identify notification callback
If set, will be called on identification start and stop indicating start
event with a non-zero argument
@deprecated will be removed after June 2023. Use @ref ZB_ZCL_REGISTER_DEVICE_CB
with @ref ZB_ZCL_SET_ATTR_VALUE_CB_ID instead of it.
*/
zb_callback_t identify_handler;
zb_uint8_t reserved_size; /*!< Unused parameter (reserved for future use) */
void* reserved_ptr; /*!< Unused parameter (reserved for future use) */
zb_uint8_t cluster_count; /*!< Number of supported clusters */
struct zb_zcl_cluster_desc_s *cluster_desc_list; /*!< Supported clusters list */
zb_af_simple_desc_1_1_t *simple_desc; /*!< Simple descriptor */
#if defined ZB_ENABLE_ZLL || defined DOXYGEN
zb_uint8_t group_id_count;
#endif /* defined ZB_ENABLE_ZLL || defined DOXYGEN */
/* Moved here from device descriptor */
zb_uint8_t rep_info_count; /*!< Number of reporting info slots */
/* Reporting info structure should be better stored in ZCL main,
* moved here to allow compile-time memory allocating for
* reporting_info array, see ZB_AF_DECLARE_DEVICE_CTX() */
struct zb_zcl_reporting_info_s *reporting_info; /*!< Attributes reporting information */
zb_uint8_t cvc_alarm_count; /*!< Number of continuous value change alarm slots */
struct zb_zcl_cvc_alarm_variables_s *cvc_alarm_info;
}ZB_PACKED_STRUCT
zb_af_endpoint_desc_t;
/** @} */ /* af_data_service */
/**
* @addtogroup af_management_service AF management service
* @{
*/
/**
* @brief Search for endpoint (device) descriptor by endpoint ID.
* @param ep_id - identifier of the endpoint.
* @returns NULL if no endpoint found, or pointer to the endpoint descriptor.
*/
zb_af_endpoint_desc_t* zb_af_get_endpoint_desc(zb_uint8_t ep_id);
/**
* @brief Check endpoint registration in ZCL.
* @param _ep - identifier of the endpoint under consideration.
* @returns ZB_TRUE if endpoint is registered, ZB_FALSE otherwise.
*/
#define ZB_AF_IS_EP_REGISTERED( _ep ) ((zb_af_get_endpoint_desc( _ep ) != NULL)?(ZB_TRUE):(ZB_FALSE))
/** @} */ /* af_management_service */
/** @cond DOXYGEN_INTERNAL_DOC */
/**
AF device context, contains a list of registered endpoints
*/
typedef ZB_PACKED_PRE struct zb_af_device_ctx_s
{
zb_uint8_t ep_count; /*!< Number of endpoints on device */
zb_af_endpoint_desc_t **ep_desc_list; /*!< Endpoint list */
}ZB_PACKED_STRUCT
zb_af_device_ctx_t;
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */
/**
* @addtogroup af_management_service AF management service
* @{
*/
/**
General macro to declare endpoint description list
@param ep_list_name - name of ep list structure
*/
#define ZB_AF_START_DECLARE_ENDPOINT_LIST(ep_list_name) \
zb_af_endpoint_desc_t *ep_list_name[] = {
#if defined ZB_ENABLE_ZLL
#define ZB_AF_SET_ENDPOINT_DESC_ZLL( \
ep_id, \
profile_id, \
reserved_length, \
reserved_ptr, \
cluster_number, \
cluster_list, \
simple_desc, \
group_id_count, \
rep_count, \
rep_ctx, \
lev_ctrl_count, \
lev_ctrl_ctx) \
{ \
ep_id, \
profile_id, \
NULL, \
NULL, \
reserved_length, \
reserved_ptr, \
cluster_number, \
cluster_list, \
simple_desc, \
group_id_count, \
rep_count, \
rep_ctx, \
lev_ctrl_count, \
lev_ctrl_ctx \
}
/**
* @brief Initialize endpoint descriptor
*
* @param ep_name - endpoint name
* @param ep_id - endpoint ID
* @param profile_id - ID of profile deployed on this endpoint
* @param reserved_length - unused parameter
* @param reserved_ptr - unused parameter
* @param cluster_number - number of clusters deployed on endpoint
* @param cluster_list - pointer to cluster list structure
* @param simple_desc - pointer to simple descriptor structure
* @param rep_count - number of reporting info slots
* @param rep_ctx - pointer to attributes reporting information
* @param lev_ctrl_count - number of continuous value change alarm slots
* @param lev_ctrl_ctx - pointer to CVC context
*/
#define ZB_AF_DECLARE_ENDPOINT_DESC( \
ep_name, \
ep_id, \
profile_id, \
reserved_length, \
reserved_ptr, \
cluster_number, \
cluster_list, \
simple_desc, \
rep_count, \
rep_ctx, \
lev_ctrl_count, \
lev_ctrl_ctx) \
zb_af_endpoint_desc_t ep_name = \
ZB_AF_SET_ENDPOINT_DESC_ZLL( \
ep_id, \
profile_id, \
reserved_length, \
(void*)reserved_ptr, \
cluster_number, \
cluster_list, \
simple_desc, \
0, \
rep_count, \
rep_ctx, \
lev_ctrl_count, \
lev_ctrl_ctx)
#else /* defined ZB_ENABLE_ZLL */
/**
@brief Initialize endpoint descriptor
@param ep_name - endpoint name
@param ep_id - endpoint ID
@param profile_id - ID of profile deployed on this endpoint
@param reserved_length - unused parameter
@param reserved_ptr - unused parameter
@param cluster_number - number of clusters deployed on endpoint
@param cluster_list - pointer to cluster list
@param simple_desc - pointer to simple descriptor
@param rep_count - maximum number of attributes that are
being reported on a device
@param rep_ctx - reporting context variable name (NULL if no reporting context)
@param lev_ctrl_count - number of level control attributes
@param lev_ctrl_ctx - level control context variable name (NULL if no level control context)
*/
#define ZB_AF_DECLARE_ENDPOINT_DESC( \
ep_name, \
ep_id, \
profile_id, \
reserved_length, \
reserved_ptr, \
cluster_number, \
cluster_list, \
simple_desc, \
rep_count, \
rep_ctx, \
lev_ctrl_count, \
lev_ctrl_ctx) \
zb_af_endpoint_desc_t ep_name = \
{ \
ep_id, \
profile_id, \
NULL, \
NULL, \
reserved_length, \
(void*)reserved_ptr, \
cluster_number, \
cluster_list, \
simple_desc, \
rep_count, \
rep_ctx, \
lev_ctrl_count, \
lev_ctrl_ctx \
}
#endif /* defined ZB_ENABLE_ZLL */
/** Finishes endpoint list declaration */
#define ZB_AF_FINISH_DECLARE_ENDPOINT_LIST }
/**
* @brief Allows application to register cluster commands handler for a specific endpoint
* @param endpoint - Endpoint number
* @param handler - Pointer to a function, function type zb_device_handler_t
* @attention Endpoint should be registered. ZB_AF_SET_ENDPOINT_HANDLER() should be called after
* device context is registered, using call to ZB_AF_REGISTER_DEVICE_CTX()
*
* @cond DOXYGEN_INTERNAL_DOC
* TODO: add snippet
* @endcond
*/
#define ZB_AF_SET_ENDPOINT_HANDLER(endpoint, handler) \
(zb_af_get_endpoint_desc((endpoint))->device_handler = (handler))
/*! @brief Sets identify notification handler for endpoint
Utilized by ZCL Identify cluster
@param endpoint number
@param handler to set
@attention Assumes that endpoint already registered
*
* @cond DOXYGEN_INTERNAL_DOC
* TODO: add snippet
* @endcond
*/
#define ZB_AF_SET_IDENTIFY_NOTIFICATION_HANDLER(endpoint, handler) \
(zb_af_get_endpoint_desc((endpoint))->identify_handler = (handler))
#define ZB_ZCL_CLUSTER_DESC(cluster_id, attr_count, attr_desc_list, cluster_role_mask, manuf_code) \
{ \
(cluster_id), \
(attr_count), \
(attr_desc_list), \
(cluster_role_mask), \
(manuf_code), \
(((cluster_role_mask) == ZB_ZCL_CLUSTER_SERVER_ROLE) ? cluster_id##_SERVER_ROLE_INIT : \
(((cluster_role_mask) == ZB_ZCL_CLUSTER_CLIENT_ROLE) ? cluster_id##_CLIENT_ROLE_INIT : NULL)) \
}
/** WARNING: This API is deprecated, use ZBOSS_DECLARE_DEVICE_CTX instead. */
#define ZB_AF_DECLARE_DEVICE_CTX(device_ctx_name, ep_list_name, ep_count, reporting_attr_count) \
zb_zcl_reporting_info_t reporting_info## device_ctx_name[reporting_attr_count]; \
zb_af_device_ctx_t device_ctx_name = \
{ \
ep_count, \
ep_list_name, \
reporting_attr_count, \
reporting_info## device_ctx_name, \
0, \
NULL \
}
/** WARNING: This API is deprecated, use ZBOSS_DECLARE_DEVICE_CTX instead. */
#define ZB_AF_DECLARE_DEVICE_CTX_NO_REP(device_ctx_name, ep_list_name, ep_count) \
zb_af_device_ctx_t device_ctx_name = \
{ \
ep_count, \
ep_list_name, \
0, \
NULL, \
0, \
NULL \
}
/**
Declare device reporting context
@param rep_ctx - reporting context variable name
@param rep_count - number of reporting attributes
*/
#define ZBOSS_DEVICE_DECLARE_REPORTING_CTX(rep_ctx, rep_count) \
zb_zcl_reporting_info_t rep_ctx[rep_count]
/**
Declare device level control context
@param lev_ctrl_ctx - level control context variable name
@param lev_ctrl_count - number of level control attributes
*/
#define ZBOSS_DEVICE_DECLARE_LEVEL_CONTROL_CTX(lev_ctrl_ctx, lev_ctrl_count) \
zb_zcl_cvc_alarm_variables_t lev_ctrl_ctx[lev_ctrl_count]
/**
Declare application's device context
@param device_ctx_name - device context variable name
@param ep_list_name - name of endpoint list
@param ep_count - number of supported endpoints
*/
#define ZBOSS_DECLARE_DEVICE_CTX(device_ctx_name, ep_list_name, ep_count) \
zb_af_device_ctx_t device_ctx_name = \
{ \
ep_count, \
ep_list_name, \
}
/**
Declare application's device context for single-endpoint device
@note Device has an additional Green Power endpoint if it is ZC or ZR
and GPPB feature is enabled (Mandatory for Zigbee 3.0 ZC/ZR).
@param device_ctx_name - device context variable name
@param ep_name - variable holding endpoint context
*/
#define ZBOSS_DECLARE_DEVICE_CTX_1_EP(device_ctx_name, ep_name) \
ZB_AF_START_DECLARE_ENDPOINT_LIST(ep_list_##device_ctx_name) \
&ep_name, \
ZB_AF_FINISH_DECLARE_ENDPOINT_LIST; \
ZBOSS_DECLARE_DEVICE_CTX(device_ctx_name, ep_list_##device_ctx_name, \
(ZB_ZCL_ARRAY_SIZE(ep_list_##device_ctx_name, zb_af_endpoint_desc_t*)))
/**
Declare application's device context for two-endpoint device
@note Device has an additional Green Power endpoint if it is ZC or ZR
and GPPB feature (Mandatory for Zigbee 3.0 ZC/ZR) is enabled.
@param device_ctx_name - device context variable name
@param ep1_name - variable holding context for endpoint 1
@param ep2_name - variable holding context for endpoint 2
*/
#define ZBOSS_DECLARE_DEVICE_CTX_2_EP(device_ctx_name, ep1_name, ep2_name) \
ZB_AF_START_DECLARE_ENDPOINT_LIST(ep_list_##device_ctx_name) \
&ep1_name, \
&ep2_name, \
ZB_AF_FINISH_DECLARE_ENDPOINT_LIST; \
ZBOSS_DECLARE_DEVICE_CTX(device_ctx_name, ep_list_##device_ctx_name, \
(ZB_ZCL_ARRAY_SIZE(ep_list_##device_ctx_name, zb_af_endpoint_desc_t*)))
/**
Declare application's device context for three-endpoint device
@note Device has an additional Green Power endpoint if it is ZC or ZR
and GPPB feature (Mandatory for Zigbee 3.0 ZC/ZR) is enabled.
@param device_ctx_name - device context variable name
@param ep1_name - variable holding context for endpoint 1
@param ep2_name - variable holding context for endpoint 2
@param ep3_name - variable holding context for endpoint 3
*/
#define ZBOSS_DECLARE_DEVICE_CTX_3_EP(device_ctx_name, ep1_name, ep2_name, ep3_name) \
ZB_AF_START_DECLARE_ENDPOINT_LIST(ep_list_##device_ctx_name) \
&ep1_name, \
&ep2_name, \
&ep3_name, \
ZB_AF_FINISH_DECLARE_ENDPOINT_LIST; \
ZBOSS_DECLARE_DEVICE_CTX(device_ctx_name, ep_list_##device_ctx_name, \
(ZB_ZCL_ARRAY_SIZE(ep_list_##device_ctx_name, zb_af_endpoint_desc_t*)))
/**
Declare application's device context for for-endpoint device
@note Device has an additional Green Power endpoint if it is ZC or ZR
and GPPB feature (Mandatory for Zigbee 3.0 ZC/ZR) is enabled.
@param device_ctx_name - device context variable name
@param ep1_name - variable holding context for endpoint 1
@param ep2_name - variable holding context for endpoint 2
@param ep3_name - variable holding context for endpoint 3
@param ep4_name - variable holding context for endpoint 4
*/
#define ZBOSS_DECLARE_DEVICE_CTX_4_EP(device_ctx_name, ep1_name, ep2_name, ep3_name, ep4_name) \
ZB_AF_START_DECLARE_ENDPOINT_LIST(ep_list_##device_ctx_name) \
&ep1_name, \
&ep2_name, \
&ep3_name, \
&ep4_name, \
ZB_AF_FINISH_DECLARE_ENDPOINT_LIST; \
ZBOSS_DECLARE_DEVICE_CTX(device_ctx_name, ep_list_##device_ctx_name, \
(ZB_ZCL_ARRAY_SIZE(ep_list_##device_ctx_name, zb_af_endpoint_desc_t*)))
/** @cond DOXYGEN_INTERNAL_DOC */
#if defined ZB_ENABLE_ZCL && !defined ZB_ZCL_DISABLE_REPORTING
void zb_zcl_init_reporting_ctx(void);
void zb_zcl_reset_reporting_ctx(void);
#endif /* ZB_ENABLE_ZCL && !ZB_ZCL_DISABLE_REPORTING */
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */
/* TODO: extend this ifdef*/
#if defined ZB_ENABLE_ZCL || DOXYGEN
/** @cond DOXYGEN_INTERNAL_DOC */
/**
Register device context.
@param device_ctx - pointer to device context
*/
void zb_af_register_device_ctx(zb_af_device_ctx_t *device_ctx);
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */
/**
Register device context.
@param _device_ctx - Pointer to the device context
@b Example:
@snippet onoff_server/on_off_output_zc.c af_register_device_context
*/
#define ZB_AF_REGISTER_DEVICE_CTX(_device_ctx) zb_af_register_device_ctx(_device_ctx)
#endif /* defined ZB_ENABLE_ZCL */
/**
* @brief Set Device user application callback.
* The macro sets a callback being called upon to need inform User App about change device attribute or
* need to execute H/W command
* @param func_ptr - a callback to set (of type @ref zb_callback_t).
* @hideinitializer
*
* @b Example:
* @snippet onoff_server/on_off_output_zc.c zcl_register_device_cb_example_cb
* @par Register callback:
* @snippet onoff_server/on_off_output_zc.c zcl_register_device_cb
*/
#define ZB_ZCL_REGISTER_DEVICE_CB(func_ptr) ZCL_CTX().device_cb = (func_ptr)
/**
Callback for notifying user about status of ZCL/ZDO command transmission
*/
typedef void (*zb_af_transmission_res_cb_t) (zb_uint8_t status);
/**
Continue inconimg packet proicessing after ZG->zdo.af_data_cb returned TRUE
@param param - incoming packet. Be sure it was initially passed to ZG->zdo.af_data_cb.
*/
void zb_apsde_data_indication_cont(zb_uint8_t param);
/** @} */ /* af_management_service */
/*! @} */
#endif /* ZBOSS_API_AF_H */