From b24866225a6301d3a663f874725e83c012dc25d3 Mon Sep 17 00:00:00 2001 From: Florent Duchon Date: Wed, 26 Dec 2012 17:36:00 +0100 Subject: digital/beacon: add bitcloud stack into common directory digital/zigbit --- .../bitcloud/stack/Components/ZCL/include/caps.h | 90 ++ .../stack/Components/ZCL/include/clusters.h | 186 ++++ .../bitcloud/stack/Components/ZCL/include/eccAux.h | 11 + .../stack/Components/ZCL/include/genericEcc.h | 90 ++ .../stack/Components/ZCL/include/private/zclDbg.h | 137 +++ .../bitcloud/stack/Components/ZCL/include/zcl.h | 1120 ++++++++++++++++++++ .../ZCL/include/zclBACnetProtocolTunnelCluster.h | 105 ++ .../stack/Components/ZCL/include/zclBasicCluster.h | 259 +++++ .../ZCL/include/zclDemandResponseCluster.h | 351 ++++++ .../ZCL/include/zclGenericTunnelCluster.h | 176 +++ .../Components/ZCL/include/zclGroupsCluster.h | 361 +++++++ .../ZCL/include/zclHumidityMeasurementCluster.h | 122 +++ .../Components/ZCL/include/zclIdentifyCluster.h | 178 ++++ .../bitcloud/stack/Components/ZCL/include/zclInt.h | 46 + .../ZCL/include/zclKeyEstablishmentCluster.h | 529 +++++++++ .../ZCL/include/zclLevelControlCluster.h | 286 +++++ .../bitcloud/stack/Components/ZCL/include/zclMem.h | 62 ++ .../Components/ZCL/include/zclMemoryManager.h | 90 ++ .../Components/ZCL/include/zclMessagingCluster.h | 185 ++++ .../stack/Components/ZCL/include/zclOTAUCluster.h | 564 ++++++++++ .../ZCL/include/zclOccupancySensingCluster.h | 155 +++ .../stack/Components/ZCL/include/zclOnOffCluster.h | 200 ++++ .../include/zclOnOffSwitchConfigurationCluster.h | 150 +++ .../Components/ZCL/include/zclOtauDiscovery.h | 100 ++ .../stack/Components/ZCL/include/zclOtauManager.h | 180 ++++ .../stack/Components/ZCL/include/zclParser.h | 445 ++++++++ .../ZCL/include/zclPowerConfigurationCluster.h | 107 ++ .../stack/Components/ZCL/include/zclPriceCluster.h | 267 +++++ .../Components/ZCL/include/zclScenesCluster.h | 487 +++++++++ .../Components/ZCL/include/zclSecurityManager.h | 190 ++++ .../ZCL/include/zclSimpleMeteringCluster.h | 175 +++ .../stack/Components/ZCL/include/zclTaskManager.h | 71 ++ .../ZCL/include/zclTemperatureMeasurementCluster.h | 121 +++ .../Components/ZCL/include/zclThermostatCluster.h | 214 ++++ .../stack/Components/ZCL/include/zclTimeCluster.h | 220 ++++ .../bitcloud/stack/Components/ZCL/include/zclZll.h | 155 +++ .../Components/ZCL/include/zclZllBasicCluster.h | 308 ++++++ .../ZCL/include/zclZllColorControlCluster.h | 1004 ++++++++++++++++++ .../ZCL/include/zclZllCommissioningCluster.h | 228 ++++ .../Components/ZCL/include/zclZllFrameFormat.h | 265 +++++ .../Components/ZCL/include/zclZllGroupsCluster.h | 363 +++++++ .../stack/Components/ZCL/include/zclZllIB.h | 171 +++ .../Components/ZCL/include/zclZllIdentifyCluster.h | 215 ++++ .../stack/Components/ZCL/include/zclZllInterPan.h | 71 ++ .../ZCL/include/zclZllLevelControlCluster.h | 297 ++++++ .../stack/Components/ZCL/include/zclZllMisc.h | 95 ++ .../stack/Components/ZCL/include/zclZllNetwork.h | 114 ++ .../Components/ZCL/include/zclZllOnOffCluster.h | 281 +++++ .../stack/Components/ZCL/include/zclZllScan.h | 109 ++ .../Components/ZCL/include/zclZllScenesCluster.h | 648 +++++++++++ .../stack/Components/ZCL/include/zclZllSecurity.h | 63 ++ 51 files changed, 12417 insertions(+) create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/caps.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/clusters.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/eccAux.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/genericEcc.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/private/zclDbg.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zcl.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclBACnetProtocolTunnelCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclBasicCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclDemandResponseCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclGenericTunnelCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclGroupsCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclHumidityMeasurementCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclIdentifyCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclInt.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclKeyEstablishmentCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclLevelControlCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclMem.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclMemoryManager.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclMessagingCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclOTAUCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclOccupancySensingCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclOnOffCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclOnOffSwitchConfigurationCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclOtauDiscovery.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclOtauManager.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclParser.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclPowerConfigurationCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclPriceCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclScenesCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclSecurityManager.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclSimpleMeteringCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclTaskManager.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclTemperatureMeasurementCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclThermostatCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclTimeCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZll.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllBasicCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllColorControlCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllCommissioningCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllFrameFormat.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllGroupsCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllIB.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllIdentifyCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllInterPan.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllLevelControlCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllMisc.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllNetwork.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllOnOffCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllScan.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllScenesCluster.h create mode 100644 digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllSecurity.h (limited to 'digital/zigbit/bitcloud/stack/Components/ZCL') diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/caps.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/caps.h new file mode 100644 index 00000000..a37b19ff --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/caps.h @@ -0,0 +1,90 @@ +/************************************************************************//** + \file caps.h + + \brief + The header file describes the CAPS interface + + The file describes the interface and types of CAPS + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 27.11.08 A. Potashov - Created. +******************************************************************************/ + +#ifndef _CAPS_H +#define _CAPS_H + +/****************************************************************************** + Includes section +******************************************************************************/ +#include +#include +#include +#include +//#include + +/****************************************************************************** + Define(s) section +******************************************************************************/ +#define CAPS_SERIAL_CHANNEL UART_CHANNEL_1 +#ifdef _ZCL_SECURITY_ + #define CAPS_DO_NOT_USE_APS_SECURITY false +#else /* _ZCL_SECURITY_ */ + #define CAPS_DO_NOT_USE_APS_SECURITY true +#endif /* _ZCL_SECURITY_ */ + +/****************************************************************************** + Types section +******************************************************************************/ + + +/***************************************************************************** + Special CAPS data types definition +*****************************************************************************/ +typedef enum +{ + CAPS_SERIAL_NONE = 0x00, + CAPS_SERIAL_UART = 0x01 +} CAPS_Serial_t; + + +/****************************************************************************** + Constants section +******************************************************************************/ + +/****************************************************************************** + External variables section +******************************************************************************/ + +/****************************************************************************** + Prototypes section +******************************************************************************/ + + +/***************************************************************************** + CAPS API Prototypes +*****************************************************************************/ + +/**************************************************************************//** + \brief CAPS Data Request interface. + + APS_DataConf field in APS_DataReq must be an actual confirm handler pointer. + + \param[in] req The APS_DataReq_t primitive pointer. + \param[in] serial The serial flag for redirection to the serial interface. CAPS_Serial_t must be used. + \param[in] noApsSecurity If true APS security is switched off. + \return None. +*****************************************************************************/ +extern void CAPS_DataReq(APS_DataReq_t *req, uint8_t serial, bool noApsSecurity); + +#endif //#ifndef _CAPS_H + + +//eof caps.h diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/clusters.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/clusters.h new file mode 100644 index 00000000..42bcd00c --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/clusters.h @@ -0,0 +1,186 @@ +/************************************************************************//** + \file clusters.h + + \brief + The header file describes the ZCLclusters + + The file describes the ZCL clusters + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 01.12.08 I. Fedina & A. Potashov - Created. +******************************************************************************/ + +#ifndef _CLUSTERS_H +#define _CLUSTERS_H + +#include +#include + +/****************************************************************************** + Define(s) section +******************************************************************************/ +#define DEFINE_ATTRIBUTE(name, props, aid, atype) \ + .name = {.id = aid, .type = atype, .properties = props} + +#define DEFINE_REPORTABLE_ATTRIBUTE(name, props, aid, atype, min, max) \ + .name = {.id = aid, .type = atype, .properties = ZCL_REPORTABLE_ATTRIBUTE | (props), .minReportInterval = min, .maxReportInterval = max} + +#define COMMAND_OPTIONS(cldirection, clwaitingResponse, clackRequest) \ + {.direction = ZCL_FRAME_CONTROL_DIRECTION_##cldirection, .waitingResponse = clwaitingResponse, \ + .ackRequest = clackRequest} + +#define DEFINE_COMMAND(cname, cid, coptions, cind) \ + .cname = {.id = cid, .options = coptions, cind} + +/***************************************************************************//** +\brief The type describes possible parts of a ZCL cluster. + +A cluster is a related collection of commands and attributes, which together define +an interface to specific functionality. Typically, the entity that stores the attributes +of a cluster is referred to as the server of that cluster and an entity that affects or +manipulates those attributes is referred to as the client of that cluster. However, if +required, attributes may also be present on the client of a cluster. +Commands that allow devices to manipulate attributes, e.g. the read attribute or +write attribute commands, are (typically) sent from a client device and received +by the server device. Any response to those commands, e.g. the read attribute response +or the write attribute response commands, are sent from the server device and +received by the client device. +*******************************************************************************/ +/*ZCL command ack request field*/ +#define ZCL_COMMAND_NO_ACK 0 +#define ZCL_COMMAND_ACK 1 + +#define ZCL_SERVER_CLUSTER_TYPE 0 //!< server part of a cluster +#define ZCL_CLIENT_CLUSTER_TYPE 1 //!< client part of a cluster + +/*ZCL Header Direction sub-field value*/ +#define ZCL_FRAME_CONTROL_DIRECTION_CLIENT_TO_SERVER 0x00 +#define ZCL_FRAME_CONTROL_DIRECTION_SERVER_TO_CLIENT 0x01 + +/*ZCL cluster side possible values*/ +#define ZCL_CLUSTER_SIDE_SERVER ZCL_FRAME_CONTROL_DIRECTION_CLIENT_TO_SERVER +#define ZCL_CLUSTER_SIDE_CLIENT ZCL_FRAME_CONTROL_DIRECTION_SERVER_TO_CLIENT + +/*! A value to disable default response for a cluster's command*/ +#define ZCL_FRAME_CONTROL_DISABLE_DEFAULT_RESPONSE 0x01 +/*! A value to enable default response for a cluster's command*/ +#define ZCL_FRAME_CONTROL_ENABLE_DEFAULT_RESPONSE 0x00 + +/* There is other relevant response specified for the command or not */ +#define ZCL_THERE_IS_RELEVANT_RESPONSE 0x01 +#define ZCL_THERE_IS_NO_RELEVANT_RESPONSE 0x00 + +#define ZCL_NETWORK_KEY_CLUSTER_SECURITY 0 +#define ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY 1 + + +/* Bits for declaring properties bitmask of attribute */ +#define ZCL_READWRITE_ATTRIBUTE 0U +#define ZCL_REPORTABLE_ATTRIBUTE 1U +#define ZCL_READONLY_ATTRIBUTE 2U + +#ifdef _ZCL_SECURITY_ + #define ZCL_DEFAULT_CLUSTER_SECURITY ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY +#else + #define ZCL_DEFAULT_CLUSTER_SECURITY ZCL_NETWORK_KEY_CLUSTER_SECURITY +#endif + +/*************************************************************************//** + \brief Clusters Id definition +*****************************************************************************/ +enum +{ + /* General clusters defined by ZCL Specification */ + BASIC_CLUSTER_ID = CCPU_TO_LE16(0x0000), //! + +/****************************************************************************** + Define(s) section +******************************************************************************/ +#if defined _SYS_ASSERT_ON_ + +#define ZCL_SET_STATE(state, newState) (state) = (newState) +#define ZCL_CHECK_STATE(state, checkState, nameOfAssert) \ + assert((checkState) == (state), nameOfAssert) + +#else /* _SYS_ASSERT_ON_ */ + +#define ZCL_SET_STATE(state, newState) +#define ZCL_CHECK_STATE(state, waitState, nameOfAssert) +#if defined assert +#undef assert +#endif /* assert */ +#define assert(condition, dbgCode) (void)0 + +#endif /* _SYS_ASSERT_ON_ */ + +/****************************************************************************** + Types section +******************************************************************************/ + +/****************************************************************************** + Constants section +******************************************************************************/ +typedef enum +{ + /*********************************** + ZCL section. Range 0x8000 - 0x8fff + ************************************/ + + //ZCL Task Manager Id (0x8000 - 0x80ff) + ZCLTASKMANAGER_TASKHANDLER_0 = 0x8000, + //ZCL CAPS Id (0x8100 - 0x81ff) + + //ZCL ZCL Id (0x8200 - 0x82ff) + ZCLGETCLUSTER_0 = 0x8200, + PARSEDATAIND_0 = 0x8201, + ZCLREPORTIND_0 = 0x8202, + DBG_ZCL_GET_TRUST_CENTER_ADDRESS = 0x8203, + ZCL_UNDEFINED_CLUSTER_IN_REQUEST = 0x8204, + ZCL_UNEXPECTED_ASDU_LENGTH = 0x8205, + UNKNOWN_DAT_TYPE_DESCR = 0x8206, + //ZCL Memory Manager (0x8300 - 0x83ff) + ZCL_DATAIND_0 = 0x8300, + ZCL_THERE_ARE_NO_BUFFERS = 0x8301, + //OTAU (0x8400 - 0x84ff) + ZCL_OTAU_NULL_POINTER_TO_INIT_STRUCTURE = 0x8400, + ZCL_OTAU_DOUBLE_START = 0x8401, + ZCL_OTAU_UNEXPECTED_SERVER_DISCOVERY = 0x8402, + ZCL_UNKNOWN_CUSTOM_MESSAGE = 0x8403, + ZCL_OTAU_UNKNOWN_SERVER_TRANSACTUION_ID = 0x8404, + ZCL_UNKNOWN_ISD_MESSAGE = 0x8405, + // KE + KE_WRONG_STATE_0 = 0x8500, + KE_WRONG_STATE_1 = 0x8501, + KE_WRONG_STATE_2 = 0x8502, + KE_WRONG_STATE_3 = 0x8503, + KE_WRONG_STATE_4 = 0x8504, + KE_WRONG_STATE_5 = 0x8505, + + ZCL_MEMORY_CORRUPTION_0 = 0x8600, + ZCL_MEMORY_CORRUPTION_1 = 0x8601, + ZCL_MEMORY_CORRUPTION_2 = 0x8602, + ZCL_MEMORY_CORRUPTION_3 = 0x8603 +} ZclDbgCodeId_t; + +typedef enum +{ + OTAU_STOPPED_STATE, + OTAU_STARTED_STATE, + OTAU_OFD_INITIALIZATION_STATE, + OTAU_BROADCAST_MATCH_DESC_REQ, + OTAU_UNICAST_MATCH_DESC_REQ, + OTAU_SHORT_ADDR_REQ, + OTAU_EXT_ADDR_REQ, + OTAU_GET_TRUST_CENTRE_ADDR, + OTAU_GET_LINK_KEY, + OTAU_QUERY_NEXT_IMAGE_TRANSAC, + OTAU_WAITING_FOR_SERVER_DISCOVERY, + OTAU_ERASE_IMAGE, + OTAU_IMAGE_BLOCK_TRANSAC, + OTAU_IMAGE_PAGE_TRANSAC, + OTAU_WRITE_DATA_TO_FLASH, + OTAU_FLUSH_DATA_TO_FLASH, + OTAU_UPGRADE_END_TRANSAC, + OTAU_WAITING_FOR_UPGRADE_TIMEOUT, + OTAU_WAITING_FOR_UPGRADE_UNLIMITED, + OTAU_SWITCH_IMAGE +} ZclOtauStateMachine_t; + +/****************************************************************************** + External variables section +******************************************************************************/ + +/****************************************************************************** + Prototypes section +******************************************************************************/ + +/****************************************************************************** + Inline static functions section +******************************************************************************/ + + +#endif //#ifndef _ZCLDBG_H + +//eof zclDbg.h diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zcl.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zcl.h new file mode 100644 index 00000000..0731a417 --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zcl.h @@ -0,0 +1,1120 @@ +/************************************************************************//** + \file zcl.h + + \brief + The header file describes the public ZCL interface + + The file describes the public interface and types of ZCL + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 01.12.08 I. Fedina & A. Potashov - Created. +******************************************************************************/ + +#ifndef _ZCL_H +#define _ZCL_H + +/****************************************************************************** + Includes section +******************************************************************************/ +#include +#include +#include + +/****************************************************************************** + Definitions section +******************************************************************************/ +#define PROFILE_ID_SMART_ENERGY CCPU_TO_LE16(0x0109) +#define PROFILE_ID_CBA CCPU_TO_LE16(0x0105) +#define PROFILE_ID_HOME_AUTOMATION CCPU_TO_LE16(0x0104) +#define PROFILE_ID_SMART_LIGHTING CCPU_TO_LE16(0xc05e) + +#define ZCL_MAX_ASDU_SIZE 75 //it is temporary hack to prevent fragmentation for ZCL packets. It should be fixed with correct calculation of payload size. + +// Macros defines the maximum size allocated for a value of type OCTET_STRING +#define OCTET_STRING_MAX_SIZE 255 +/****************************************************************************** + Types section +******************************************************************************/ +typedef uint8_t ZCL_ClusterType_t; +typedef uint16_t ZCL_AttributeId_t; //ZCL_Response field is called. + + Common uses of the function include sending the following commands (the command's + ID listed below should be assigned to the \c req->id field): + \li ::ZCL_READ_ATTRIBUTES_COMMAND_ID - reading remote attributes (obtaining values) + \li ::ZCL_WRITE_ATTRIBUTES_COMMAND_ID - writing remote attributes (assigning new values) + \li ::ZCL_REPORT_ATTRIBUTES_COMMAND_ID - reporting local attributes to remote devices + (sending current attributes' values) + \li ::ZCL_DISCOVER_ATTRIBUTES_COMMAND_ID - discovering attributes of a remote device (obtaining + data types and IDs of attributes supported by a particular cluster) + + \param[in] req - command parameters +*****************************************************************************/ +void ZCL_AttributeReq(ZCL_Request_t *req); + +/*********************************************************************************//** + \brief Sends a cluster command + + The function sends a general cluster specific command. The command's type is + recognized according to the \c req->id field. Commands' IDs are defined in clusters' + definition files, which also contain all definition related to a particular cluster. + + In addition to addressing information and command's ID, eesential fields of + the request parameters include the payload and the payload length. The payload + for each command is defined as a structure in the cluster's definition file. + The pointer to a properly configured instance of the command's payload shall be \ + assigned to the \c req->requestPayload field. + + The callback function specified in the \c req->ZCL_Response field is called to + indicate the status of the command's delivery (not a specific response for the + command). If acknowledgment of the command's delivery is received the success + status is reported in the callback. + + A specific response to the command is processed by a special indication function + registered for the command. If a command does not imply a specific response + the default response may be requested (to indicate that the command has been + executed). To request the default response set the \c req->defaultResponse field + to ::ZCL_FRAME_CONTROL_ENABLE_DEFAULT_RESPONSE and assign the callback function + that should be called upon default response reception to the \c req->ZCL_DefaultResponse + field. To disable default response set \c req->defaultResponse to + ::ZCL_FRAME_CONTROL_DISABLE_DEFAULT_RESPONSE and \c req->ZCL_DefaultResponse to \c NULL. + + \param[in] req - contains request descriptor +************************************************************************************/ +void ZCL_CommandReq(ZCL_Request_t *req); + +/*********************************************************************************//** +\brief Specific command indication handler + +\param[in] ind - contains indication descriptor +************************************************************************************/ +//void ZCL_CommandInd(ZCL_CommandInd_t *ind); + +/*************************************************************************//** + \brief ZCL event notification handler + + \param[in] event - contains event descriptor +*****************************************************************************/ +void ZCL_EventNtfy(ZCL_EventNtfy_t *event); + +/*************************************************************************//** + \brief This function returns bytes amount of a type by type id. + + \param[in] typeId - type id + \param[in] value - pointer to variable of typeId, NULL means maximum possible + size. +*****************************************************************************/ +uint16_t ZCL_GetAttributeLength(uint8_t typeId, const uint8_t *value); + +/*************************************************************************//** + \brief Adds an element to the outgoing command payload + + This function is used to simplify forming a correst payload for general + commands (read/write attributes etc.). A single command may involve actions on + several attributes, and so the overall payload should contain pieces + corresponding to each attribute. + + The general idea is to provide a buffer for the payload and some content. The + function writes the content in a correct way to the buffer and calculate the + overall payload length. The buffer and the payload length are then passed as + parameters to the ZCL_AttributeReq() function. + + See the following example: + +\code +ZCL_NextElement_t element; +ZCL_ReadAttributeReq_t readAttrReqElement; +ZCL_Request_t readAttrReq; +uint8_t buffer[BUFFER_SIZE]; + +element.payloadLength = 0; +element.payload = buffer; +element.id = ZCL_READ_ATTRIBUTES_COMMAND_ID; +element.content = &readAttrReqElement; + +readAttrReqElement = ATTRIBUTE_ID1; //Set to the ID of the first attribute +ZCL_PutNextElement(&element); + +readAttrReqElement = ATTRIBUTE_ID2; //Set to the ID of the second attribute +ZCL_PutNextElement(&element); + +readAttrReq.requestLength = element.payloadLength; +readAttrReq.requestPayload = element.payload; +... +\endcode + + Note, however, that the usage may differ depending on a command's type. + + \param[in] element - information about payload and element + \param[out] status of the operation +*****************************************************************************/ +ZCL_Status_t ZCL_PutNextElement(ZCL_NextElement_t *element); + +/*************************************************************************//** + \brief Gets an element from the incoming command's payload + + The function is used to simplify processing of responses fo general + attributes related commands. Such command may return information concerning + several attributes in a single frame. This function reads the next portion + of information from the response payload. + + To use the function configure an instance of ZCL_NextElement type. + The \c element->payload field should be set to the response payload, + the \c element->payloadLength to the reponse payload's length, and + the \c element->id field to the ID of the response. After calling this + function, the \c element->content field may be casted to the appropriate + response type (depending on the command's type); for example, for + read attributes response it is ZCL_ReadAttributeResp_t. + + \param[in] element - information about payload and element + \param[out] status of the operation +*****************************************************************************/ +ZCL_Status_t ZCL_GetNextElement(ZCL_NextElement_t *element); + +/***************************************************************************//** +\brief Checks whether ZCL is busy or not. + +\return true - if ZCL is busy, false - otherwise. +******************************************************************************/ +bool ZCL_IsBusy(void); + +/*************************************************************************//** + \brief ZCL Data Type Descriptor get by Type Id function. + Fills the ZCL Data Type Descriptor dased on ZCL Data Type Id + \param Id - ZCL Data Type Id (unsigned 8-bit integer) + \param value - pointer to variable of typeId, NULL means maximum possible + size. + \param descriptor - ZCL Data Type Descriptor being filled. + \return None. + \sa ZCL_DataTypeDescriptor_t + \sa ZCL_GetAttributeLength() +*****************************************************************************/ +void ZCL_GetDataTypeDescriptor(uint8_t typeId, const uint8_t *value, ZCL_DataTypeDescriptor_t *descriptor); + +#endif //_ZCL_H + diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclBACnetProtocolTunnelCluster.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclBACnetProtocolTunnelCluster.h new file mode 100644 index 00000000..da679d3e --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclBACnetProtocolTunnelCluster.h @@ -0,0 +1,105 @@ +/***************************************************************************//** + \file zclBACnetProtocolTunnelCluster.h + + \brief + The header file describes the ZCL BACnet Protocol Tunnel Cluster and its interface + + The file describes the types and interface of the ZCL BACnet Protocol Tunnel Cluster + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 20.10.09 D. Kasyanov - Created. +*******************************************************************************/ + +#ifndef _ZCLBACNETPROTOCOLTUNNELCLUSTER_H +#define _ZCLBACNETPROTOCOLTUNNELCLUSTER_H + +/*! +Attributes and commands for determining basic information about a device, +setting user device information such as location, enabling a device and resetting it +to factory defaults. +*/ +/******************************************************************************* + Includes section +*******************************************************************************/ +#include +#include +/******************************************************************************* + Define(s) section +*******************************************************************************/ +/***************************************************************************//** + \brief ZCL BACnet Protocol Tunnel Cluster server side attributes amount +*******************************************************************************/ +#define ZCL_BACNET_PRTOCOL_TUNNEL_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 0 +/***************************************************************************//** + \brief ZCL BACnet Protocol Tunnel client side attributes amount +*******************************************************************************/ +#define ZCL_BACNET_PRTOCOL_TUNNEL_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 +//There are no any attributes at the client side +/***************************************************************************//** + \brief ZCL BACnet Protocol Tunnel Cluster derver side commands amount +*******************************************************************************/ +#define ZCL_BACNET_PROTOCOL_TUNNEL_COMMANDS_AMOUNT 1 +/** + * \brief Generic tunnel client side commands identifiers. +*/ +#define ZCL_BACNET_PROTOCOL_TRANSFER_NPDU_COMMAND_ID 0x00 + +#define ZCL_DEFINE_BACNET_PROTOCOL_CLUSTER_TUNNEL_CLUSTER_COMMANDS(transferNPDUCommandInd) \ + DEFINE_COMMAND(transferNPDUCommand, ZCL_BACNET_PROTOCOL_TRANSFER_NPDU_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), transferNPDUCommandInd) + +#define BACNET_PROTOCOL_TUNNEL_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = BACNET_PROTOCOL_TUNNEL_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_BACNET_PRTOCOL_TUNNEL_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_BACNET_PROTOCOL_TUNNEL_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define BACNET_PROTOCOL_TUNNEL_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = BACNET_PROTOCOL_TUNNEL_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_BACNET_PRTOCOL_TUNNEL_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_BACNET_PROTOCOL_TUNNEL_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define DEFINE_BACNET_PROTOCOL_TUNNEL_CLUSTER(cltype, clattributes, clcommands) BACNET_PROTOCOL_TUNNEL_CLUSTER##cltype(clattributes, clcommands) +/******************************************************************************* + Types section +*******************************************************************************/ +BEGIN_PACK +/** + * \brief Transfer NPDU Command Payload format. +*/ +typedef struct PACK +{ + uint8_t npdu[1]; //! +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ + +/***************************************************************************//** + \brief ZCL Basic Cluster server side commands amount +*******************************************************************************/ +#define ZCL_BASIC_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 2 +//The ZCLVersion and PowerSource attributes + +/***************************************************************************//** + \brief ZCL Basic Cluster derver side commands amount +*******************************************************************************/ +#define ZCL_BASIC_CLUSTER_SERVER_COMMANDS_AMOUNT 0 +//There are no any commands at the server side + +/***************************************************************************//** + \brief ZCL Basic Cluster client side commands amount +*******************************************************************************/ +#define ZCL_BASIC_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 +//There are no any attributes at the client side + +/***************************************************************************//** + \brief ZCL Basic Cluster derver side commands amount +*******************************************************************************/ +#define ZCL_BASIC_CLUSTER_CLIENT_COMMANDS_AMOUNT 0 +//There are no any commands at the client side + + +//Atribute Ids of Basic Device Information Attribute Set at the server side +//!ZCL Basic Cluster server side ZCLVersion attribute id +#define ZCL_BASIC_CLUSTER_SERVER_ZCL_VERSION_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) +//!ZCL Basic Cluster server side ApplicationVersion attribute id +#define ZCL_BASIC_CLUSTER_SERVER_APPLICATION_VERSION_ATTRIBUTE_ID CCPU_TO_LE16(0x0001) +//!ZCL Basic Cluster server side StackVersion attribute id +#define ZCL_BASIC_CLUSTER_SERVER_STACK_VERSION_ATTRIBUTE_ID CCPU_TO_LE16(0x0002) +//!ZCL Basic Cluster server side HWVersion attribute id +#define ZCL_BASIC_CLUSTER_SERVER_HW_VERSION_ATTRIBUTE_ID CCPU_TO_LE16(0x0003) +//!ZCL Basic Cluster server side ManufacturerName attribute id +#define ZCL_BASIC_CLUSTER_SERVER_MANUFACTURER_NAME_ATTRIBUTE_ID CCPU_TO_LE16(0x0004) +//!ZCL Basic Cluster server side ModelIdentifier attribute id +#define ZCL_BASIC_CLUSTER_SERVER_MODEL_IDENTIFIER_ATTRIBUTE_ID CCPU_TO_LE16(0x0005) +//!ZCL Basic Cluster server side DateCode attribute id +#define ZCL_BASIC_CLUSTER_SERVER_DATE_CODE_ATTRIBUTE_ID CCPU_TO_LE16(0x0006) +//!ZCL Basic Cluster server side PowerSource attribute id +#define ZCL_BASIC_CLUSTER_SERVER_POWER_SOURCE_ATTRIBUTE_ID CCPU_TO_LE16(0x0007) + +//Atribute Ids of Basic Device Settings Attribute Set at the server side +//!ZCL Basic Cluster server side LocationDescription attribute id +#define ZCL_BASIC_CLUSTER_SERVER_LOCATION_DESCRIPTION_ATTRIBUTE_ID CCPU_TO_LE16(0x0010) +//!ZCL Basic Cluster server side PhysicalEnvironment attribute id +#define ZCL_BASIC_CLUSTER_SERVER_PHYSICAL_ENVIRONMENT_ATTRIBUTE_ID CCPU_TO_LE16(0x0011) +//!ZCL Basic Cluster server side DeviceEnabled attribute id +#define ZCL_BASIC_CLUSTER_SERVER_DEVICE_ENABLED_ATTRIBUTE_ID CCPU_TO_LE16(0x0012) +//!ZCL Basic Cluster server side AlarmMask attribute id +#define ZCL_BASIC_CLUSTER_SERVER_ALARM_MASK_ATTRIBUTE_ID CCPU_TO_LE16(0x0013) + +//!ZCL Basic Cluster server side ResetToFactoryDeafaults commabd id +#define ZCL_BASIC_CLUSTER_SERVER_RESET_TO_FACTORY_DEFAULTS_COMMAND_ID 0x00 + +/******************************************************************************* + Types section +*******************************************************************************/ + +/***************************************************************************//** + \brief ZCL Basic Cluster server side attributes defining macros + + This macros should be used for ZCL Basic Cluster server side attributes defining. + + \return None + + \internal + //The typical usage is: + //Basic Cluster server side related attributes + ZCL_BasicClusterServerAttributes_t basicClusterAttributes = ZCL_DEFINE_BASIC_CLUSTER_SERVER_ATTRIBUTES(); +*******************************************************************************/ +#define ZCL_DEFINE_BASIC_CLUSTER_SERVER_ATTRIBUTES() \ + DEFINE_ATTRIBUTE(zclVersion, ZCL_READONLY_ATTRIBUTE, ZCL_BASIC_CLUSTER_SERVER_ZCL_VERSION_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(powerSource, ZCL_READONLY_ATTRIBUTE, ZCL_BASIC_CLUSTER_SERVER_POWER_SOURCE_ATTRIBUTE_ID, ZCL_8BIT_ENUM_DATA_TYPE_ID) + + +/***************************************************************************//** + \brief ZCL Basic Cluster server side defining macros + + This macros should be used with #ZCL_DEFINE_BASIC_CLUSTER_SERVER_ATTRIBUTES for + ZCL Basic Cluster server side defining in application. + + \param attributes - pointer to cluster server attributes (ZCL_BasicClusterServerAttributes_t) + + \return None + + \internal + //The typical code is: + //Basic Cluster server side related attributes + ZCL_BasicClusterServerAttributes_t basicClusterServerAttributes = DEFINE_ZCL_BASIC_CLUSTER_SERVER_ATTRIBUTES(); + ZCL_Cluster_t myClusters[] = + { + ZCL_DEFINE_BASIC_CLUSTER_SERVER(&basicClusterServerAttributes), + //... Any other cluster defining ... + } +*******************************************************************************/ +#define ZCL_DEFINE_BASIC_CLUSTER_SERVER(clattributes) \ + { \ + .id = BASIC_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_BASIC_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *) clattributes, \ + .commandsAmount = ZCL_BASIC_CLUSTER_SERVER_COMMANDS_AMOUNT, \ + .commands = NULL \ + } + +/***************************************************************************//** + \brief ZCL Basic Cluster client side defining macros + + This macros should be used for ZCL Basic Cluster client side defining in application. + + \return None + + \internal + //The typical code is: + ZCL_Cluster_t myClusters[] = + { + ZCL_DEFINE_BASIC_CLUSTER_CLIENT(), + //... Any other cluster defining ... + } +*******************************************************************************/ +#define ZCL_DEFINE_BASIC_CLUSTER_CLIENT() \ + { \ + .id = BASIC_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_BASIC_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = NULL, \ + .commandsAmount = ZCL_BASIC_CLUSTER_CLIENT_COMMANDS_AMOUNT, \ + .commands = NULL \ + } + + +BEGIN_PACK +/***************************************************************************//** + \brief + ZCL Basic Cluster server side attributes +*******************************************************************************/ +typedef struct PACK +{ + //!Basic Device Information attribute set (Id == 0x00) + + /*!ZCL Version attribute (Read only, M) + The ZCLVersion attribute is 8-bits in length and specifies the version number of + the ZigBee Cluster Library that all clusters on this endpoint conform to. For the + initial version of the ZCL, this attribute shall be set to 0x01. + */ + struct PACK + { + ZCL_AttributeId_t id; //! +#include + +/****************************************************************************** + Defines section +******************************************************************************/ +/** + * \brief Demand Response Server Cluster attributes amount. +*/ +#define DRLC_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 0 + +/** + * \brief Demand Response Client Cluster attributes amount. +*/ +#define DRLC_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 4 + +/** + * \brief Demand Response Cluster commands amount. +*/ +#define DRLC_CLUSTER_COMMANDS_AMOUNT 5 + +/** + * \brief Demand Response Server Cluster commands identifiers. +*/ +#define LOAD_CONTROL_EVENT_COMMAND_ID 0x00 +#define CANCEL_LOAD_CONTROL_EVENT_COMMAND_ID 0x01 +#define CANCEL_ALL_LOAD_CONTROL_EVENTS_COMMAND_ID 0x02 + +/** + * \brief Demand Response Client Cluster commands identifiers. +*/ +#define REPORT_EVENT_STATUS_COMMAND_ID 0x00 +#define GET_SCHEDULED_EVENTS_COMMAND_ID 0x01 + +/** + * \brief Report event status identifiers + */ +#define REPORT_EVENT_STATUS_COMMAND_RECEIVED 0x01 +#define REPORT_EVENT_STATUS_EVENT_STARTED 0x02 +#define REPORT_EVENT_STATUS_EVENT_COMPLETED 0x03 +#define REPORT_EVENT_STATUS_EVENT_CANCELED 0x06 +#define REPORT_EVENT_STATUS_INVALID_CANCEL_COMMAND_DEFAULT 0xF8 + +#define DEFINE_DRLC_CLUSTER_COMMANDS(clLoadControlEventInd, \ + clCancelLoadControlEventInd, \ + clCancelAllLoadControlEventsInd, \ + clReportEventStatusInd, \ + clGetScheduledEventsInd) \ + DEFINE_COMMAND(loadControlEventCommand, 0x00, COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), clLoadControlEventInd), \ + DEFINE_COMMAND(cancelLoadControlEventCommand, 0x01, COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), clCancelLoadControlEventInd), \ + DEFINE_COMMAND(cancelAllLoadControlEventsCommand, 0x02, COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), clCancelAllLoadControlEventsInd), \ + DEFINE_COMMAND(reportEventStatusCommand, 0x00, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), clReportEventStatusInd), \ + DEFINE_COMMAND(getScheduledEventsCommand, 0x01, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), clGetScheduledEventsInd) + + + + +#define DEFINE_DRLC_CLUSTER_CLIENT_ATTRIBUTES() \ + DEFINE_ATTRIBUTE(utilityEnrolmentGroupAttr, ZCL_READWRITE_ATTRIBUTE, CCPU_TO_LE16(0x0000), ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(startRandomizeMinutesAttr, ZCL_READWRITE_ATTRIBUTE, CCPU_TO_LE16(0x0001), ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(endRandomizeMinutesAttr, ZCL_READWRITE_ATTRIBUTE, CCPU_TO_LE16(0x0002), ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(deviceClassValueAttr, ZCL_READONLY_ATTRIBUTE, CCPU_TO_LE16(0x0003), ZCL_16BIT_BITMAP_DATA_TYPE_ID) + +#define DRLC_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = DEMAND_RESPONSE_AND_LOAD_CONTROL_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = DRLC_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = NULL, \ + .commandsAmount = DRLC_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *) clcommands \ + } + +#define DRLC_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = DEMAND_RESPONSE_AND_LOAD_CONTROL_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = DRLC_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *) clattributes, \ + .commandsAmount = DRLC_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *) clcommands \ + } + +#define DEFINE_DRLC_CLUSTER(cltype, clattributes, clcommands) \ + DRLC_CLUSTER_##cltype(clattributes, clcommands) + +//! Signature type. AMI r15 profile spec., D.2.3.3.1.1. +#define ZCL_ECDSA_SIGNATURE_TYPE 0x01 +//! Signature length. AMI r15 profile spec., D.2.3.3.1.1. +#define REPORT_EVENT_STATUS_SIGNATURE_LENGTH 42 + +/****************************************************************************** + Types section +******************************************************************************/ + +BEGIN_PACK + +/** + * \brief Device Class type. +*/ +typedef struct PACK +{ + LITTLE_ENDIAN_OCTET(8,( + uint16_t hvacCompressor : 1, + uint16_t stripHeaters : 1, + uint16_t waterHeater : 1, + uint16_t poolPump : 1, + uint16_t smartAppliances : 1, + uint16_t irrigationPump : 1, + uint16_t managedCommercAndIndustrLoads : 1, + uint16_t simpleMiscLoads : 1 + )) + LITTLE_ENDIAN_OCTET(5,( + uint16_t exteriorLighting : 1, + uint16_t interiorLighting : 1, + uint16_t electricalVehicle : 1, + uint16_t generationSystem : 1, + uint16_t reserved : 4 + )) +} ZCL_DeviceClass_t; + +/** + * \brief Device Class type. +*/ +typedef struct PACK +{ + LITTLE_ENDIAN_OCTET(3,( + uint8_t randStartTime : 1, + uint8_t randEndTime : 1, + uint8_t reserved : 6 + )) +} ZCL_EventControl_t; + +/** + * \brief The Load Control Event Command Payload. +*/ +typedef struct PACK +{ + uint32_t issuerEventId; + ZCL_DeviceClass_t deviceClass; + uint8_t utilityEnrolmentGroup; + uint32_t startTime; + uint16_t durationInMinutes; + uint8_t criticalityLevel; + uint8_t coolingTemperatureOffset; + uint8_t heatingTemperatureOffset; + uint16_t coolingTemperatureSetPoint; + uint16_t heatingTemperatureSetPoint; + int8_t avrgLoadAdjstPercentage; + uint8_t dutyCycle; + ZCL_EventControl_t eventControl; +} ZCL_LoadControlEvent_t; + +/** + * \brief The Cancel Control type. +*/ +typedef struct PACK +{ + LITTLE_ENDIAN_OCTET(2,( + uint8_t randomizeEnd : 1, + uint8_t reserved : 7 + )) +} ZCL_CancelControl_t; + +/** + * \brief The Cancel Load Control Event Command Payload. +*/ +typedef struct PACK +{ + uint32_t issuerEventId; + ZCL_DeviceClass_t deviceClass; + uint8_t utilityEnrolmentGroup; + ZCL_CancelControl_t cancelControl; + ZCL_UTCTime_t effectiveTime; +} ZCL_CancelLoadControlEvent_t; + +typedef struct PACK +{ + ZCL_CancelControl_t cancelControl; // ZCL_U8BIT_BITMAP_TYPE_ID +} ZCL_CancelAllLoadControlEvents_t; + +typedef struct PACK +{ + //! Utility Enrolment Group Attribute descriptor + struct PACK + { + ZCL_AttributeId_t id; //! +#include +/******************************************************************************* + Define(s) section +*******************************************************************************/ +/***************************************************************************//** + \brief ZCL Generic Tunnel Cluster server side attributes amount +*******************************************************************************/ +#define ZCL_GENERIC_TUNNEL_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 3 +/***************************************************************************//** + \brief ZCL Generic Tunnel Cluster client side attributes amount +*******************************************************************************/ +#define ZCL_GENERIC_TUNNEL_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 +//There are no any attributes at the client side +/***************************************************************************//** + \brief ZCL Generic Tunnel Cluster derver side commands amount +*******************************************************************************/ +#define ZCL_GENERIC_TUNNEL_COMMANDS_AMOUNT 3 +/** + * \brief Generic tunnel server side attributes identifiers. +*/ +//!ZCL Generic tunnel server side MaximumIncomingTransferSize attribute id +#define ZCL_GENERIC_TUNNEL_CLUSTER_SERVER_MITS_ATTRIBUTE_ID CCPU_TO_LE16(0x0001) +//!ZCL Generic tunnel server side MaximumOutgoingTransferSize attribute id +#define ZCL_GENERIC_TUNNEL_CLUSTER_SERVER_MOTS_ATTRIBUTE_ID CCPU_TO_LE16(0x0002) +//!ZCL Generic tunnel server side ProtocolAddress attribute id +#define ZCL_GENERIC_TUNNEL_CLUSTER_SERVER_PROTOCOL_ADDR_ATTRIBUTE_ID CCPU_TO_LE16(0x0003) +/** + * \brief Generic tunnel server side commands identifiers. +*/ +#define ZCL_GENERIC_TUNNEL_MATCH_PROTOCOL_ADDRESS_RESPONSE_COMMAND_ID 0x00 +#define ZCL_GENERIC_TUNNEL_ADVERTISE_PROTOCOL_ADDRESS_COMMAND_ID 0x01 +/** + * \brief Generic tunnel client side commands identifiers. +*/ +#define ZCL_GENERIC_TUNNEL_MATCH_PROTOCOL_ADDRESS_COMMAND_ID 0x00 + +#define ZCL_DEFINE_GENERIC_TUNNEL_CLUSTER_SERVER_ATTRIBUTES() \ + DEFINE_ATTRIBUTE(maximumIncomingTransferSize, ZCL_READONLY_ATTRIBUTE, ZCL_GENERIC_TUNNEL_CLUSTER_SERVER_MITS_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(maximumOutgoingTransferSize, ZCL_READONLY_ATTRIBUTE, ZCL_GENERIC_TUNNEL_CLUSTER_SERVER_MOTS_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(protocolAddress, ZCL_READWRITE_ATTRIBUTE, ZCL_GENERIC_TUNNEL_CLUSTER_SERVER_PROTOCOL_ADDR_ATTRIBUTE_ID, ZCL_OCTET_STRING_DATA_TYPE_ID) + +#define ZCL_DEFINE_GENERIC_TUNNEL_CLUSTER_COMMANDS(matchProtocolAddressCommandInd, matchProtocolAddressResponseCommandInd, advertiseProtocolAddressInd) \ + DEFINE_COMMAND(matchProtocolAddressCommand, ZCL_GENERIC_TUNNEL_MATCH_PROTOCOL_ADDRESS_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), matchProtocolAddressCommandInd), \ + DEFINE_COMMAND(matchProtocolAddressResponseCommand, ZCL_GENERIC_TUNNEL_MATCH_PROTOCOL_ADDRESS_RESPONSE_COMMAND_ID, COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), matchProtocolAddressResponseCommandInd), \ + DEFINE_COMMAND(advertiseProtocolAddress, ZCL_GENERIC_TUNNEL_ADVERTISE_PROTOCOL_ADDRESS_COMMAND_ID, COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), advertiseProtocolAddressInd) + +#define GENERIC_TUNNEL_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = GENERIC_TUNNEL_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_GENERIC_TUNNEL_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_GENERIC_TUNNEL_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define GENERIC_TUNNEL_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = GENERIC_TUNNEL_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_GENERIC_TUNNEL_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_GENERIC_TUNNEL_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define DEFINE_GENERIC_TUNNEL_CLUSTER(cltype, clattributes, clcommands) GENERIC_TUNNEL_CLUSTER##cltype(clattributes, clcommands) +/******************************************************************************* + Types section +*******************************************************************************/ +BEGIN_PACK +/** + * \brief Match Protocol Address Command Payload format. +*/ +typedef struct PACK +{ + uint8_t address[1]; //!
+#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ + +/** + * \brief Groups Cluster group name support bit +*/ + +#define GROUP_NAME_SUPPORT_FLAG 0x80 + +/** + * \brief Groups Cluster server attributes amount +*/ + +#define ZCL_GROUPS_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 1 + +/** + * \brief Groups Cluster client attributes amount. Clinet doesn't have attributes. +*/ + +#define ZCL_GROUPS_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 + +/** + * \brief Groups Cluster commands amount +*/ + +#define ZCL_GROUPS_CLUSTER_COMMANDS_AMOUNT 10 + +/** + * \brief Groups Cluster server's attributes identifiers +*/ + +#define ZCL_GROUPS_CLUSTER_NAME_SUPPORT_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) + +/** + * \brief Groups Cluster client's command identifiers +*/ + +#define ZCL_GROUPS_CLUSTER_ADD_GROUP_COMMAND_ID 0x00 +#define ZCL_GROUPS_CLUSTER_VIEW_GROUP_COMMAND_ID 0x01 +#define ZCL_GROUPS_CLUSTER_GET_GROUP_MEMBERSHIP_COMMAND_ID 0x02 +#define ZCL_GROUPS_CLUSTER_REMOVE_GROUP_COMMAND_ID 0x03 +#define ZCL_GROUPS_CLUSTER_REMOVE_ALL_GROUPS_COMMAND_ID 0x04 +#define ZCL_GROUPS_CLUSTER_ADD_GROUP_IF_IDENTIFYING_COMMAND_ID 0x05 + +/** + * \brief Groups Cluster servers's command identifiers +*/ + +#define ZCL_GROUPS_CLUSTER_ADD_GROUP_RESPONSE_COMMAND_ID 0x00 +#define ZCL_GROUPS_CLUSTER_VIEW_GROUP_RESPONSE_COMMAND_ID 0x01 +#define ZCL_GROUPS_CLUSTER_GET_GROUP_MEMBERSHIP_RESPONSE_COMMAND_ID 0x02 +#define ZCL_GROUPS_CLUSTER_REMOVE_GROUP_RESPONSE_COMMAND_ID 0x03 + +/** + * \brief Groups Cluster server define attributes macros +*/ + +#define ZCL_DEFINE_GROUPS_CLUSTER_SERVER_ATTRIBUTES() \ + DEFINE_ATTRIBUTE(nameSupport, ZCL_READONLY_ATTRIBUTE, ZCL_GROUPS_CLUSTER_NAME_SUPPORT_SERVER_ATTRIBUTE_ID, ZCL_8BIT_BITMAP_DATA_TYPE_ID) + +/** + * \brief On/Off Cluster define commands macros +*/ + +#define ZCL_DEFINE_GROUPS_CLUSTER_COMMANDS(addGroupCommandInd, viewGroupCommandInd, getGroupMembershipCommandInd, \ + removeGroupCommandInd, removeAllGroupsCommandInd, addGroupIfIdentifyingCommandInd, \ + addGroupResponseCommandInd, viewGroupResponseCommandInd, getGroupMembershipResponseCommandInd, \ + removeGroupResponseCommandInd) \ + DEFINE_COMMAND(addGroupCommand, ZCL_GROUPS_CLUSTER_ADD_GROUP_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + addGroupCommandInd), \ + DEFINE_COMMAND(viewGroupCommand, ZCL_GROUPS_CLUSTER_VIEW_GROUP_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + viewGroupCommandInd), \ + DEFINE_COMMAND(getGroupMembershipCommand, ZCL_GROUPS_CLUSTER_GET_GROUP_MEMBERSHIP_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + getGroupMembershipCommandInd), \ + DEFINE_COMMAND(removeGroupCommand, ZCL_GROUPS_CLUSTER_REMOVE_GROUP_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + removeGroupCommandInd), \ + DEFINE_COMMAND(removeAllGroupsCommand, ZCL_GROUPS_CLUSTER_REMOVE_ALL_GROUPS_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + removeAllGroupsCommandInd), \ + DEFINE_COMMAND(addGroupIfIdentifyingCommand, ZCL_GROUPS_CLUSTER_ADD_GROUP_IF_IDENTIFYING_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + addGroupIfIdentifyingCommandInd), \ + DEFINE_COMMAND(addGroupResponseCommand, ZCL_GROUPS_CLUSTER_ADD_GROUP_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + addGroupResponseCommandInd), \ + DEFINE_COMMAND(viewGroupResponseCommand, ZCL_GROUPS_CLUSTER_VIEW_GROUP_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + viewGroupResponseCommandInd), \ + DEFINE_COMMAND(getGroupMembershipResponseCommand, ZCL_GROUPS_CLUSTER_GET_GROUP_MEMBERSHIP_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + getGroupMembershipResponseCommandInd), \ + DEFINE_COMMAND(removeGroupResponseCommand, ZCL_GROUPS_CLUSTER_REMOVE_GROUP_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + removeGroupResponseCommandInd) + +/** + * \brief On/Off Cluster definition macros +*/ + +#define GROUPS_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = GROUPS_CLUSTER_ID, \ + .options = { \ + .type = ZCL_CLIENT_CLUSTER_TYPE, \ + .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY, \ + }, \ + .attributesAmount = ZCL_GROUPS_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_GROUPS_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define GROUPS_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = GROUPS_CLUSTER_ID, \ + .options = { \ + .type = ZCL_SERVER_CLUSTER_TYPE, \ + .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY, \ + }, \ + .attributesAmount = ZCL_GROUPS_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_GROUPS_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define DEFINE_GROUPS_CLUSTER(cltype, clattributes, clcommands) \ + GROUPS_CLUSTER_##cltype(clattributes, clcommands) + +/****************************************************************************** + Types section + ******************************************************************************/ +BEGIN_PACK + +/** + * \brief Add Group Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; + uint8_t groupName[2]; +} ZCL_AddGroup_t; + +/** + * \brief View Group Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; +} ZCL_ViewGroup_t; + +/** + * \brief Get Group Membership Command Payload format. + */ + +typedef struct PACK +{ + uint8_t groupCount; + uint16_t groupList[1]; +} ZCL_GetGroupMembership_t; + +/** + * \brief Remove Group Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; +} ZCL_RemoveGroup_t; + +/** + * \brief Add Group if identifying Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; + uint8_t groupName[2]; +} ZCL_AddGroupIfIdentifying_t; + +/** + * \brief Add Group Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; +} ZCL_AddGroupResponse_t; + +/** + * \brief View Group Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; + uint8_t groupName[2]; +} ZCL_ViewGroupResponse_t; + +/** + * \brief Get Group Membership Response Payload format. + */ + +typedef struct PACK +{ + uint8_t capacity; + uint8_t groupCount; + uint16_t groupList[1]; +} ZCL_GetGroupMembershipResponse_t; + +/** + * \brief Remove Group Command Response Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; +} ZCL_RemoveGroupResponse_t; + +/** + * \brief Groups Cluster server's attributes + */ + +typedef struct PACK +{ + + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } nameSupport; +} ZCL_GroupsClusterServerAttributes_t; + +END_PACK + +/** + * \brief Groups Cluster commands. + */ + +typedef struct +{ + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*addGroupCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_AddGroup_t * payload); + } addGroupCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*viewGroupCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_ViewGroup_t * payload); + } viewGroupCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*getGroupMembershipCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_GetGroupMembership_t * payload); + } getGroupMembershipCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*removeGroupCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_RemoveGroup_t * payload); + } removeGroupCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*removeAllGroupsCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, void * payload); + } removeAllGroupsCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*addGroupIfIdentifyingCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_AddGroupIfIdentifying_t * payload); + } addGroupIfIdentifyingCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*addGroupResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_AddGroupResponse_t * payload); + } addGroupResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*viewGroupResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_ViewGroupResponse_t * payload); + } viewGroupResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*getGroupMembershipResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_GetGroupMembershipResponse_t * payload); + } getGroupMembershipResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*removeGroupResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_RemoveGroupResponse_t * payload); + } removeGroupResponseCommand; +} ZCL_GroupsClusterCommands_t; + +#endif /* _ZCLGROUPSCLUSTER_H */ + diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclHumidityMeasurementCluster.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclHumidityMeasurementCluster.h new file mode 100644 index 00000000..afcc9f94 --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclHumidityMeasurementCluster.h @@ -0,0 +1,122 @@ +/***************************************************************************** + \file zclHumidityMeasurement.h + + \brief + The file describes the types and interface of the + Relative Humidity Measurement cluster. + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 18.01.2010 I.Vagulin - Created +******************************************************************************/ + + +#ifndef _ZCLHUMIDITYMEASUREMENT_H_ +#define _ZCLHUMIDITYMEASUREMENT_H_ + +/******************************************************************************* + Includes section +*******************************************************************************/ +#include +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ +/** +* \brief server attributes amount +*/ +#define ZCL_HUMIDITY_MEASUREMENT_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 3 + +/** +* \brief server commands amount +*/ +#define ZCL_HUMIDITY_MEASUREMENT_CLUSTER_SERVER_COMMANDS_AMOUNT 0 + +/** +* \brief client attributes amount +*/ +#define ZCL_HUMIDITY_MEASUREMENT_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 + +/** +* \brief client commands amount +*/ +#define ZCL_HUMIDITY_MEASUREMENT_CLUSTER_CLIENT_COMMANDS_AMOUNT 0 + +/** +* \brief Supported attribue id +*/ +#define ZCL_HUMIDITY_MEASUREMENT_CLUSTER_SERVER_MEASURED_VALUE_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) +#define ZCL_HUMIDITY_MEASUREMENT_CLUSTER_SERVER_MIN_MEASURED_VALUE_ATTRIBUTE_ID CCPU_TO_LE16(0x0001) +#define ZCL_HUMIDITY_MEASUREMENT_CLUSTER_SERVER_MAX_MEASURED_VALUE_ATTRIBUTE_ID CCPU_TO_LE16(0x0002) + +/** + * \brief server define attributes macros +*/ +#define ZCL_DEFINE_HUMIDITY_MEASUREMENT_CLUSTER_SERVER_ATTRIBUTES(reportMin, reportMax) \ + DEFINE_REPORTABLE_ATTRIBUTE(measuredValue, ZCL_READONLY_ATTRIBUTE, ZCL_HUMIDITY_MEASUREMENT_CLUSTER_SERVER_MEASURED_VALUE_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID, reportMin, reportMax), \ + DEFINE_ATTRIBUTE(minMeasuredValue, ZCL_READONLY_ATTRIBUTE, ZCL_HUMIDITY_MEASUREMENT_CLUSTER_SERVER_MIN_MEASURED_VALUE_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(maxMeasuredValue, ZCL_READONLY_ATTRIBUTE, ZCL_HUMIDITY_MEASUREMENT_CLUSTER_SERVER_MAX_MEASURED_VALUE_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID) + +#define ZCL_DEFINE_HUMIDITY_MEASUREMENT_CLUSTER_SERVER(clattributes) \ + { \ + .id = HUMIDITY_MEASUREMENT_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_HUMIDITY_MEASUREMENT_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *) (clattributes), \ + .commandsAmount = ZCL_HUMIDITY_MEASUREMENT_CLUSTER_SERVER_COMMANDS_AMOUNT, \ + .commands = NULL \ + } + +#define ZCL_DEFINE_HUMIDITY_MEASUREMENT_CLUSTER_CLIENT() \ + { \ + .id = HUMIDITY_MEASUREMENT_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_HUMIDITY_MEASUREMENT_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = NULL, \ + .commandsAmount = ZCL_HUMIDITY_MEASUREMENT_CLUSTER_CLIENT_COMMANDS_AMOUNT, \ + .commands = NULL \ + } + +/****************************************************************************** + Types section +******************************************************************************/ +BEGIN_PACK +typedef struct PACK { + struct PACK { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + ZCL_ReportTime_t reportCounter; //! +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ + +/** + * \brief Identify Server Cluster attributes amount. +*/ + +#define ZCL_IDENTIFY_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 1 + +/** + * \brief Identify Client Cluster attributes amount. +*/ + +#define ZCL_IDENTIFY_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 + +/** + * \brief Identify Client Cluster commands amount. +*/ + +#define ZCL_IDENTIFY_CLUSTER_COMMANDS_AMOUNT 3 + +/** + * \brief Identify Server Cluster attributes identifiers. +*/ + +#define ZCL_IDENTIFY_CLUSTER_IDENTIFY_TIME_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) + +/** + * \brief Identify Server Cluster commands identifiers. +*/ + +#define ZCL_IDENTIFY_CLUSTER_IDENTIFY_QUERY_RESPONSE_COMMAND_ID 0x00 + +/** + * \brief Identify Client Cluster commands identifiers. +*/ + +#define ZCL_IDENTIFY_CLUSTER_IDENTIFY_COMMAND_ID 0x00 +#define ZCL_IDENTIFY_CLUSTER_IDENTIFY_QUERY_COMMAND_ID 0x01 + +/* + *\brief ZCL Idetify Cluster server side attributes defining macros + */ + +#define ZCL_DEFINE_IDENTIFY_CLUSTER_SERVER_ATTRIBUTES() \ + DEFINE_ATTRIBUTE(identifyTime, ZCL_READWRITE_ATTRIBUTE, ZCL_IDENTIFY_CLUSTER_IDENTIFY_TIME_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID) + +/* + * \brief ZCL Identify Cluster commands defining macros + */ + +#define IDENTIFY_CLUSTER_COMMANDS(identifyCommandInd, identifyQueryCommandInd, identifyQueryResponseCommandInd) \ + DEFINE_COMMAND(identifyCommand, 0x00, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), identifyCommandInd), \ + DEFINE_COMMAND(identifyQueryCommand, 0x01, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), identifyQueryCommandInd), \ + DEFINE_COMMAND(identifyQueryResponseCommand, 0x00, COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), identifyQueryResponseCommandInd) + +#define IDENTIFY_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = IDENTIFY_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_IDENTIFY_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_IDENTIFY_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ + } + +#define IDENTIFY_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = IDENTIFY_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_IDENTIFY_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_IDENTIFY_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ + } + +#define DEFINE_IDENTIFY_CLUSTER(cltype, clattributes, clcommands) IDENTIFY_CLUSTER_##cltype(clattributes, clcommands) + +/****************************************************************************** + Types section +******************************************************************************/ + +BEGIN_PACK + +/** + * \brief Identify Command Payload format. +*/ +typedef struct PACK +{ + uint16_t identifyTime; +} ZCL_Identify_t; + +/** + * \brief Identify Query Response Payload format. +*/ + +typedef struct PACK +{ + uint16_t timeout; +} ZCL_IdentifyQueryResponse_t; + +typedef struct PACK +{ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } identifyTime; +} ZCL_IdentifyClusterAttributes_t; + +END_PACK + +typedef struct +{ + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t (*identifyCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_Identify_t *payload); + } identifyCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t (*identifyQueryCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, uint8_t *payload); + } identifyQueryCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t (*identifyQueryResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_IdentifyQueryResponse_t *payload); + } identifyQueryResponseCommand; +} ZCL_IdentifyClusterCommands_t; + + +#endif + diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclInt.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclInt.h new file mode 100644 index 00000000..d984f38f --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclInt.h @@ -0,0 +1,46 @@ +/************************************************************************//** + \file zcl.h + + \brief + The header file describes internal ZCL interface + + The header file describes internal ZCL interface and types + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 09.12.08 I. Fedina - Created. +******************************************************************************/ + +#ifndef _ZCLINT_H +#define _ZCLINT_H + +#include +#include + +BEGIN_PACK +typedef struct PACK +{ + uint8_t status; + ZCL_AttributeId_t id; + uint8_t type; + uint8_t value[1]; +} ZclReadAttributeResp_t; + +typedef struct PACK +{ + uint8_t status; + ZCL_AttributeId_t id; +} ZclWriteAttributeResp_t; +END_PACK + +uint8_t zclGetSequenceNumber(Endpoint_t endpointId); +ZclAttribute_t *zclGetNextAttribute(Endpoint_t endpoint, ClusterId_t clusterId, uint8_t direction, ZclAttribute_t *currentAttribute); + +#endif // _ZCL_INT_H diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclKeyEstablishmentCluster.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclKeyEstablishmentCluster.h new file mode 100644 index 00000000..4c9f843f --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclKeyEstablishmentCluster.h @@ -0,0 +1,529 @@ +/***************************************************************************//** + \file zclKeyEstablishmentCluster.h + + \brief + The header file describes the ZCL Key Establishment Cluster and its interface + + The file describes the types and interface of the ZCL Key Establishment Cluster + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 10.03.09 A. Potashov - Created. +*******************************************************************************/ + +#ifndef _ZCLKEYESTABLISHMENTCLUSTER_H +#define _ZCLKEYESTABLISHMENTCLUSTER_H + +/*! +Attributes and commands necessary for managing secure communication between +ZigBee devices. +*/ + +#ifdef _ZCL_SECURITY_ +#ifdef _CERTICOM_SECURITY_ + +/******************************************************************************* + Includes section +*******************************************************************************/ + +#include +#include +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ + +#define ZCL_KE_INVALID_ENDPOINT APS_ZDO_ENDPOINT +#define ZCL_KE_INVALID_SHORT_ADDRESS 0xffff +#define ZCL_KE_INVALID_EXT_ADDRESS 0xffffffffffffffffLL + + +//KE Cluster timeout settings +#ifndef ZCL_KE_EPHEMERAL_DATA_GENERATE_TIME +#define ZCL_KE_EPHEMERAL_DATA_GENERATE_TIME 0x10 +#endif + +#ifndef ZCL_KE_CONFIRM_KEY_GENERATE_TIME +#define ZCL_KE_CONFIRM_KEY_GENERATE_TIME 0x10 +#endif + +//!This timeout (seconds) will be sent in Terminate KE Command +#ifndef ZCL_KE_TERMINATE_KE_TIMEOUT +#define ZCL_KE_TERMINATE_KE_TIMEOUT 50 +#endif + +//!This timeout (seconds) will be applied for commands receive wating with unspecified timeouts +#ifndef ZCL_KE_TIMEOUT +#define ZCL_KE_TIMEOUT 50 +#endif + + + + + + +/***************************************************************************//** + \brief ZCL Key Establishment Cluster server side attributes amount +*******************************************************************************/ +#define ZCL_KE_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 1 + +/***************************************************************************//** + \brief ZCL Key Establishment Cluster client side attributes amount +*******************************************************************************/ +#define ZCL_KE_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 1 + +/***************************************************************************//** + \brief ZCL Key Establishment Cluster commands amount +*******************************************************************************/ +#define ZCL_KE_CLUSTER_COMMANDS_AMOUNT 8 + +//!Key Establishment Suite Attribute +#define ZCL_KE_CLUSTER_SERVER_KEY_ESTABLISHMENT_SUITE_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) + +//!Key Establishment Suite Attribute +#define ZCL_KE_CLUSTER_CLIENT_KEY_ESTABLISHMENT_SUITE_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) + + +#define ZCL_KE_INITIATE_KEY_ESTABLISHMENT_REQUEST_COMMAND_ID 0x00 +#define ZCL_KE_EPHEMERAL_DATA_REQUEST_COMMAND_ID 0x01 +#define ZCL_KE_CONFIRM_KEY_DATA_REQUEST_COMMAND_ID 0x02 +#define ZCL_KE_TERMINATE_KEY_ESTABLISHMENT_COMMAND_ID 0x03 + +#define ZCL_KE_INITIATE_KEY_ESTABLISHMENT_RESPONSE_COMMAND_ID 0x00 +#define ZCL_KE_EPHEMERAL_DATA_RESPONSE_COMMAND_ID 0x01 +#define ZCL_KE_CONFIRM_KEY_DATA_RESPONSE_COMMAND_ID 0x02 + + +#define ZCL_KE_CBKE_ECMQV_KEY_ESTABLISHMENT_SUITE_ID 0x0001 + + +/******************************************************************************* + Types section +*******************************************************************************/ + +/***************************************************************************//** + \brief ZCL Key Establishment Cluster server side attributes defining macros + + This macros should be used for ZCL Key Establishment Cluster server side attributes defining. + + \return None + + \internal + //The typical usage is: + //Key Establishment Cluster server side related attributes + ZCL_EKClusterServerAttributes_t ekClusterServerAttributes = ZCL_DEFINE_EK_CLUSTER_SERVER_ATTRIBUTES(); +*******************************************************************************/ +#define ZCL_DEFINE_EK_CLUSTER_SERVER_ATTRIBUTES() \ + {DEFINE_ATTRIBUTE(keyEstablishmentSuite, ZCL_READONLY_ATTRIBUTE, ZCL_KE_CLUSTER_SERVER_KEY_ESTABLISHMENT_SUITE_ATTRIBUTE_ID, ZCL_16BIT_ENUM_DATA_TYPE_ID)} + + +/***************************************************************************//** + \brief ZCL Key Establishment Cluster client side attributes defining macros + + This macros should be used for ZCL Key Establishment Cluster client side attributes defining. + + \return None + + \internal + //The typical usage is: + //Key Establishment Cluster client side related attributes + ZCL_EKClusterClientAttributes_t ekClusterClientAttributes = ZCL_DEFINE_EK_CLUSTER_CLIENT_ATTRIBUTES(); +*******************************************************************************/ +#define ZCL_DEFINE_EK_CLUSTER_CLIENT_ATTRIBUTES() \ + {DEFINE_ATTRIBUTE(keyEstablishmentSuite, ZCL_READONLY_ATTRIBUTE, ZCL_KE_CLUSTER_CLIENT_KEY_ESTABLISHMENT_SUITE_ATTRIBUTE_ID, ZCL_16BIT_ENUM_DATA_TYPE_ID)} + +#define DEFINE_INITIATE_KEY_ESTABLISHMENT_REQUEST(initiateKeyEstablishmentReqInd) \ + DEFINE_COMMAND(initiateKeyEstablishmentReq, ZCL_KE_INITIATE_KEY_ESTABLISHMENT_REQUEST_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + initiateKeyEstablishmentReqInd) + +#define DEFINE_INITIATE_KEY_ESTABLISHMENT_RESPONSE(initiateKeyEstablishmentRespInd) \ + DEFINE_COMMAND(initiateKeyEstablishmentResp, ZCL_KE_INITIATE_KEY_ESTABLISHMENT_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + initiateKeyEstablishmentRespInd) + +#define DEFINE_EPHEMERAL_DATA_REQUEST(ephemeralDataReqInd) \ + DEFINE_COMMAND(ephemeralDataReq, ZCL_KE_EPHEMERAL_DATA_REQUEST_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + ephemeralDataReqInd) + +#define DEFINE_EPHEMERAL_DATA_RESPONSE(ephemeralDataRespInd) \ + DEFINE_COMMAND(ephemeralDataResp, ZCL_KE_EPHEMERAL_DATA_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + ephemeralDataRespInd) + +#define DEFINE_CONFIRM_KEY_DATA_REQUEST(confirmKeyDataReqInd) \ + DEFINE_COMMAND(confirmKeyDataReq, ZCL_KE_CONFIRM_KEY_DATA_REQUEST_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + confirmKeyDataReqInd) + +#define DEFINE_CONFIRM_KEY_DATA_RESPONSE(confirmKeyDataRespInd) \ + DEFINE_COMMAND(confirmKeyDataResp, ZCL_KE_CONFIRM_KEY_DATA_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + confirmKeyDataRespInd) + +#define DEFINE_TERMINATE_KEY_ESTABLISHMENT_SERVER_PART(terminateKeyEstablishmentReqIndServerPart) \ + DEFINE_COMMAND(terminateKeyEstablishmentReqServerPart, ZCL_KE_TERMINATE_KEY_ESTABLISHMENT_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + terminateKeyEstablishmentReqIndServerPart) + +#define DEFINE_TERMINATE_KEY_ESTABLISHMENT_CLIENT_PART(terminateKeyEstablishmentReqIndClientPart) \ + DEFINE_COMMAND(terminateKeyEstablishmentReqClientPart, ZCL_KE_TERMINATE_KEY_ESTABLISHMENT_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + terminateKeyEstablishmentReqIndClientPart) + +#define KE_CLUSTER_COMMANDS(initiateKeyEstablishmentReqInd, initiateKeyEstablishmentRespInd, \ + ephemeralDataReqInd, ephemeralDataRespInd, confirmKeyDataReqInd, confirmKeyDataRespInd, \ + terminateKeyEstablishmentReqIndServerPart, terminateKeyEstablishmentReqIndClientPart) \ + DEFINE_INITIATE_KEY_ESTABLISHMENT_REQUEST(initiateKeyEstablishmentReqInd), \ + DEFINE_INITIATE_KEY_ESTABLISHMENT_RESPONSE(initiateKeyEstablishmentRespInd), \ + DEFINE_EPHEMERAL_DATA_REQUEST(ephemeralDataReqInd), \ + DEFINE_EPHEMERAL_DATA_RESPONSE(ephemeralDataRespInd), \ + DEFINE_CONFIRM_KEY_DATA_REQUEST(confirmKeyDataReqInd), \ + DEFINE_CONFIRM_KEY_DATA_RESPONSE(confirmKeyDataRespInd), \ + DEFINE_TERMINATE_KEY_ESTABLISHMENT_SERVER_PART(terminateKeyEstablishmentReqIndServerPart), \ + DEFINE_TERMINATE_KEY_ESTABLISHMENT_CLIENT_PART(terminateKeyEstablishmentReqIndClientPart) \ + +/***************************************************************************//** + \brief ZCL Key Establishment Cluster server side defining macros + + This macros should be used with #ZCL_DEFINE_EK_CLUSTER_SERVER_ATTRIBUTES and + #ZCL_DEFINE_EK_CLUSTER_SERVER_COMMANDS for ZCL Key Establishment Cluster server + side defining. + + \param attributes - pointer to cluster server attributes (ZCL_KEClusterServerAttributes_t) + \param commands - pointer to cluster server commands (ZCL_KEServerCommands_t) + + \return None + + \internal + //The typical code is: + //Key Establishment Cluster server side related attributes and commands + ZCL_KEClusterServerAttributes_t keClusterServerAttributes = ZCL_DEFINE_EK_CLUSTER_SERVER_ATTRIBUTES(); + ZCL_KEClusterServerCommands_t keClusterServerCommands = ZCL_DEFINE_EK_CLUSTER_SERVER_COMMANDS(handler1, handler2, handler3, handlerv); + ZCL_Cluster_t ekClusterServer = ZCL_DEFINE_KE_CLUSTER_SERVER(&keClusterServerAttributes, &keClusterServerCommands); +*******************************************************************************/ +#define ZCL_DEFINE_KE_CLUSTER_SERVER(clattributes, clcommands) \ + { \ + .id = ZCL_KEY_ESTABLISHMENT_CLUSTER_ID, \ + .options = \ + { \ + .type = ZCL_SERVER_CLUSTER_TYPE, \ + .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY, \ + .reserved = 0, \ + }, \ + .attributesAmount = ZCL_KE_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *) clattributes, \ + .commandsAmount = ZCL_KE_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *) clcommands \ + } + + + +/***************************************************************************//** + \brief ZCL Key Establishment Cluster client side defining macros + + This macros should be used with #ZCL_DEFINE_EK_CLUSTER_CLIENT_ATTRIBUTES and + #ZCL_DEFINE_EK_CLUSTER_CLIENT_COMMANDS for ZCL Key Establishment Cluster client + side defining. + + \param attributes - pointer to cluster client attributes (ZCL_KEClusterClientAttributes_t) + \param commands - pointer to cluster client commands (ZCL_KEClientCommands_t) + + \return None + + \internal + //The typical code is: + //Key Establishment Cluster client side related attributes and commands + ZCL_KEClusterClientAttributes_t keClusterClientAttributes = ZCL_DEFINE_EK_CLUSTER_CLIENT_ATTRIBUTES(); + ZCL_KEClusterClientCommands_t keClusterClientCommands = ZCL_DEFINE_EK_CLUSTER_CLIENT_COMMANDS(handler1, handler2, handler3, handlerv); + ZCL_Cluster_t ekClusterClient = ZCL_DEFINE_KE_CLUSTER_Client(&keClusterClientAttributes, &keClusterClientCommands); +*******************************************************************************/ +#define ZCL_DEFINE_KE_CLUSTER_CLIENT(clattributes, clcommands) \ + { \ + .id = ZCL_KEY_ESTABLISHMENT_CLUSTER_ID, \ + .options = \ + { \ + .type = ZCL_CLIENT_CLUSTER_TYPE, \ + .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY, \ + .reserved = 0, \ + }, \ + .attributesAmount = ZCL_KE_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *) clattributes, \ + .commandsAmount = ZCL_KE_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *) clcommands \ + } + +BEGIN_PACK +/***************************************************************************//** + \brief + ZCL Key Establishment Cluster server side attributes +*******************************************************************************/ +typedef struct PACK +{ + //!Information attribute set (Id == 0x00) + + /*!KeyEstablishmentSuite attribute (Read only, M) + The KeyEstablishmentSuite attribute is 16-bits in length and specifies all the + cryptographic schemes for key establishment on the device. A device shall set the + corresponding bit to 1 for every cryptographic scheme that is supports. All other + cryptographic schemes and reserved bits shall be set to 0. + + */ + struct PACK + { + ZCL_AttributeId_t id; //! +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ + +/** + * \brief Amount of Level Control cluster server's attributes +*/ +#define ZCL_LEVEL_CONTROL_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 1 + +/** + * \brief Client doesn't have attributes. +*/ +#define ZCL_LEVEL_CONTROL_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 + +/** + * \brief Level Control Cluster commands amount +*/ + +#define ZCL_LEVEL_CONTROL_CLUSTER_COMMANDS_AMOUNT 8 + +/** + * \brief Level Control Cluster server's attributes identifiers +*/ + +#define ZCL_LEVEL_CONTROL_CLUSTER_CURRENT_LEVEL_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) +#define ZCL_LEVEL_CONTROL_CLUSTER_REMAINING_TIME_ATTRIBUTE_ID CCPU_TO_LE16(0x0001) +#define ZCL_LEVEL_CONTROL_CLUSTER_ON_OFF_TRANSITION_TIME_ATTRIBUTE_ID CCPU_TO_LE16(0x0010) +#define ZCL_LEVEL_CONTROL_CLUSTER_ON_LEVEL_ATTRIBUTE_ID CCPU_TO_LE16(0x0011) + +/** + * \brief On/Off Cluster client's command identifiers +*/ + +#define ZCL_LEVEL_CONTROL_CLUSTER_MOVE_TO_LEVEL_COMMAND_ID 0x00 +#define ZCL_LEVEL_CONTROL_CLUSTER_MOVE_COMMAND_ID 0x01 +#define ZCL_LEVEL_CONTROL_CLUSTER_STEP_COMMAND_ID 0x02 +#define ZCL_LEVEL_CONTROL_CLUSTER_STOP_COMMAND_ID 0x03 +#define ZCL_LEVEL_CONTROL_CLUSTER_MOVE_TO_LEVEL_W_ONOFF_COMMAND_ID 0x04 +#define ZCL_LEVEL_CONTROL_CLUSTER_MOVE_W_ONOFF_COMMAND_ID 0x05 +#define ZCL_LEVEL_CONTROL_CLUSTER_STEP_W_ONOFF_COMMAND_ID 0x06 +#define ZCL_LEVEL_CONTROL_CLUSTER_STOP_W_ONOFF_COMMAND_ID 0x07 + +/** + * \brief Level Control Cluster server define attributes macros +*/ + +#define ZCL_DEFINE_LEVEL_CONTROL_CLUSTER_SERVER_MANDATORY_ATTRIBUTES(min, max) \ + DEFINE_REPORTABLE_ATTRIBUTE(currentLevel, ZCL_READONLY_ATTRIBUTE, ZCL_LEVEL_CONTROL_CLUSTER_CURRENT_LEVEL_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID, min, max) + +#define ZCL_DEFINE_LEVEL_CONTROL_CLUSTER_SERVER_OPTIONAL_ATTRIBUTES() \ + DEFINE_ATTRIBUTE(remainingTime, ZCL_READONLY_ATTRIBUTE, ZCL_LEVEL_CONTROL_CLUSTER_REMAINING_TIME_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(onOffTransitionTime, ZCL_READWRITE_ATTRIBUTE, ZCL_LEVEL_CONTROL_CLUSTER_ON_OFF_TRANSITION_TIME_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(onLevel, ZCL_READWRITE_ATTRIBUTE, ZCL_LEVEL_CONTROL_CLUSTER_ON_LEVEL_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID) + + +/** + * \brief Level Control Cluster define commands macros +*/ + +#define ZCL_DEFINE_LEVEL_CONTROL_CLUSTER_COMMANDS(moveToLevelCommandInd,\ + moveCommandInd,\ + stepCommandInd,\ + stopCommandInd,\ + moveToLevelWOnOffCommandInd,\ + moveWOnOffCommandInd,\ + stepWOnOffCommandInd,\ + stopWOnOffCommandInd)\ + DEFINE_COMMAND(moveToLevelCommand, ZCL_LEVEL_CONTROL_CLUSTER_MOVE_TO_LEVEL_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + moveToLevelCommandInd), \ + DEFINE_COMMAND(moveCommand, ZCL_LEVEL_CONTROL_CLUSTER_MOVE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + moveCommandInd), \ + DEFINE_COMMAND(stepCommand, ZCL_LEVEL_CONTROL_CLUSTER_STEP_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + stepCommandInd), \ + DEFINE_COMMAND(stopCommand, ZCL_LEVEL_CONTROL_CLUSTER_STOP_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + stopCommandInd), \ + DEFINE_COMMAND(moveToLevelWOnOffCommand, ZCL_LEVEL_CONTROL_CLUSTER_MOVE_TO_LEVEL_W_ONOFF_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + moveToLevelWOnOffCommandInd), \ + DEFINE_COMMAND(moveWOnOffCommand, ZCL_LEVEL_CONTROL_CLUSTER_MOVE_W_ONOFF_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + moveWOnOffCommandInd), \ + DEFINE_COMMAND(stepWOnOffCommand, ZCL_LEVEL_CONTROL_CLUSTER_STEP_W_ONOFF_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + stepWOnOffCommandInd), \ + DEFINE_COMMAND(stopWOnOffCommand, ZCL_LEVEL_CONTROL_CLUSTER_STOP_W_ONOFF_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + stopWOnOffCommandInd) + +/** + * \brief Level Control Cluster definition macros +*/ + +#define LEVEL_CONTROL_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = LEVEL_CONTROL_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_LEVEL_CONTROL_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_LEVEL_CONTROL_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define LEVEL_CONTROL_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = LEVEL_CONTROL_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_LEVEL_CONTROL_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_LEVEL_CONTROL_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define DEFINE_LEVEL_CONTROL_CLUSTER(cltype, clattributes, clcommands) \ + LEVEL_CONTROL_CLUSTER_##cltype(clattributes, clcommands) + +#define DEFINE_LEVEL_CONTROL_CLUSTER_EXTENSION_FIELD_SET(value) \ + .clusterId = LEVEL_CONTROL_CLUSTER_ID, \ + .length = sizeof(uint8_t), \ + .currentLevel = value + +/****************************************************************************** + Types section +******************************************************************************/ +BEGIN_PACK + +/** + * \brief Move To Level Command Payload format. + */ +typedef struct PACK +{ + uint8_t level; + uint16_t transitionTime; +} ZCL_MoveToLevel_t; + +/** + * \brief Move Command Payload format. + */ +typedef struct PACK +{ + uint8_t moveMode; + uint8_t rate; +} ZCL_Move_t; + +/** + * \brief Step Command Payload format. + */ +typedef struct PACK +{ + uint8_t stepMode; + uint8_t stepSize; + uint16_t transitionTime; +} ZCL_Step_t; + +/** + * \brief Level Control Cluster server's attributes +*/ +typedef struct PACK +{ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + ZCL_ReportTime_t reportCounter; //! +#include + +typedef enum +{ + ZCL_IDLE_STATE, + ZCL_REQUEST_STATE, + ZCL_WAITING_FOR_CONFIRM_STATE, + ZCL_WAITING_FOR_RESPONSE_STATE, + ZCL_CONFIRM_STATE, +} ZclState_t; + + +/* + * Describes ZCL memory structure + * */ +typedef struct +{ + ZclState_t state; + QueueDescriptor_t requestQueue; + uint8_t *request; + HAL_AppTimer_t waitTimer; + HAL_AppTimer_t reportTimer; +} ZclMem_t; + +/* + * ZCL memory global object + * */ +extern ZclMem_t zclMem; + +/* + * Function returns point to ZCL memory object + * */ +static inline ZclMem_t * zclMemReq() +{ + return ((ZclMem_t *)&zclMem); +} + +#endif // _ZCLMEM_H diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclMemoryManager.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclMemoryManager.h new file mode 100644 index 00000000..46017dc4 --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclMemoryManager.h @@ -0,0 +1,90 @@ +/************************************************************************//** + \file zclMemoryManager.h + + \brief + The header file describes the ZCL Memory Manager interface + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 27.11.08 A. Potashov - Created. +******************************************************************************/ + +#ifndef _ZCLMEMORYMANAGER_H +#define _ZCLMEMORYMANAGER_H + +/****************************************************************************** + Includes section +******************************************************************************/ +#include +#include +#include +#include +#include +#include + +/****************************************************************************** + Types section +******************************************************************************/ +typedef union +{ + APS_DataReq_t apsDataReq; + APS_DataInd_t apsDataInd; +} ZclMmPrimitive_t; + +typedef struct +{ + TOP_GUARD + uint8_t header[APS_ASDU_OFFSET]; // Auxiliary header (required by stack) + uint8_t asdu[ZCL_MAX_ASDU_SIZE]; // ASDU content +#if (APS_AFFIX_LENGTH - APS_ASDU_OFFSET) + uint8_t footer[APS_AFFIX_LENGTH - APS_ASDU_OFFSET]; //Auxiliary footer (required by stack) +#endif + BOTTOM_GUARD +} ZclMmFrame_t; + +typedef enum +{ + ZCL_MM_BUFFER_FREE = 0x00, + ZCL_MM_BUFFER_BUSY = 0x01 +} ZclMmBufferBusy_t; + +typedef struct +{ + ZclMmPrimitive_t primitive; + ZclMmFrame_t frame; +} ZclMmBuffer_t; + +typedef struct +{ + uint8_t busy; //ZclMmBufferBusy_t should be used + ZclMmBuffer_t buf; +} ZclMmBufferDescriptor_t; + +/****************************************************************************** + Prototypes section +******************************************************************************/ +/*************************************************************************//** +\brief Looks for and return free zcl memory buffer + +\return pointer to memory buffer or NULL if there is no free buffer. +*****************************************************************************/ +ZclMmBuffer_t *zclMmGetMem(void); + +/*************************************************************************//** +\brief Makes free zcl busy buffer + +\param[in] mem - pointer to used zcl buffer +*****************************************************************************/ +void zclMmFreeMem(ZclMmBuffer_t *mem); + +#endif //#ifndef _ZCLMEMORYMANAGER_H + + +//eof zclMemoryManager.h diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclMessagingCluster.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclMessagingCluster.h new file mode 100644 index 00000000..4e0e11cb --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclMessagingCluster.h @@ -0,0 +1,185 @@ +/************************************************************************//** + \file zclMessageingCluster.h + + \brief + The header file describes the ZCL Message Cluster + + The header file describes the ZCL Message Cluster + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 27.11.08 A. Potashov - Created. +******************************************************************************/ + +#ifndef _MESSAGINGCLUSTER_H +#define _MESSAGINGCLUSTER_H + +#include +#include +/******************************************************************************* + Defines section + ******************************************************************************/ +/***************************************************************************//** +\brief Macros defines duration value of Display Message command, + * which means 'until change'. + * According to ZB AMI Spec r15, D.5.2.3.1.1.1, page 203. +*******************************************************************************/ +#define DISPLAY_MESSAGE_DURATION_UNTIL_CHANGED 0xFFFF + +/*************************************************************************//** + \brief Message Cluster attributes amount +*****************************************************************************/ +#define MESSAGE_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 +#define MESSAGE_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 0 + +/*************************************************************************//** + \brief Message Cluster commands amount +*****************************************************************************/ +#define MESSAGE_CLUSTER_COMMANDS_AMOUNT 4 + +#define DISPLAY_MESSAGE_COMMAND_ID 0x00 +#define CANCEL_MESSAGE_COMMAND_ID 0x01 +#define GET_LAST_MESSAGE_COMMAND_ID 0x00 +#define CONFIRM_MESSAGE_COMMAND_ID 0x01 + +#define DEFINE_MESSAGING_CLUSTER_COMMANDS(clDisplayMessageInd, clCancelMessageInd, clGetLastMessageInd, clMessageConfirmationInd) \ + DEFINE_COMMAND(displayMessageCommand, 0x00, COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), clDisplayMessageInd), \ + DEFINE_COMMAND(cancelMessageCommand, 0x01, COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), clCancelMessageInd), \ + DEFINE_COMMAND(getLastMessageCommand, 0x00, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), clGetLastMessageInd), \ + DEFINE_COMMAND(messageConfirmationCommand, 0x01, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), clMessageConfirmationInd) + +#define MESSAGING_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = MESSAGE_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = MESSAGE_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = MESSAGE_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ + } + +#define MESSAGING_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = MESSAGE_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = MESSAGE_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = MESSAGE_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ + } +#define DEFINE_MESSAGING_CLUSTER(cltype, clattributes, clcommands) MESSAGING_CLUSTER_##cltype(clattributes, clcommands) + +BEGIN_PACK + +typedef struct PACK +{ + LITTLE_ENDIAN_OCTET(4,( + uint8_t transmissionType : 2, + uint8_t importanceLevel : 2, + uint8_t reserved : 3, + uint8_t messageConfirmation : 1 + )) +} MessageControl_t; + +/***************************************************************************//** + \brief + ZCL Messaging Cluster Display Message Command payload format +*******************************************************************************/ +typedef struct PACK +{ + uint32_t messageId; //! +#include +#include + +/****************************************************************************** + Defines section +******************************************************************************/ +//#define _OTAU_DEBUG_ + +/***************************************************************************//** + \brief ZCL OTAU Cluster atrebutes +*******************************************************************************/ +#define ZCL_OTAU_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 0 +#define ZCL_OTAU_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 2 + +/***************************************************************************//** + \brief ZCL OTAU Cluster commands amount +*******************************************************************************/ +#define ZCL_OTAU_CLUSTER_COMMANDS_AMOUNT 7 + +//!ZCL OTAU Cluster client side attributes id +#define ZCL_OTAU_CLUSTER_CLIENT_UPGRADE_SERVER_ID 0x0000 +#define ZCL_OTAU_CLUSTER_CLIENT_IMAGE_UPGRADE_STATUS_ID 0x0006 + +#define DEFINE_OTAU_CLIENT_ATTRIBUTES \ + DEFINE_ATTRIBUTE(upgradeServerIEEEAddr, ZCL_READONLY_ATTRIBUTE, ZCL_OTAU_CLUSTER_CLIENT_UPGRADE_SERVER_ID, ZCL_IEEE_ADDRESS_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(imageUpgradeStatus, ZCL_READONLY_ATTRIBUTE, ZCL_OTAU_CLUSTER_CLIENT_IMAGE_UPGRADE_STATUS_ID, ZCL_8BIT_ENUM_DATA_TYPE_ID) + +#define OTAU_HEADER_STRING_SIZE 32 + +// OTAU commands +// list of commands id +#define QUERY_NEXT_IMAGE_REQUEST_ID 0x01 +#define QUERY_NEXT_IMAGE_RESPONSE_ID 0x02 +#define IMAGE_BLOCK_REQUEST_ID 0x03 +#define IMAGE_PAGE_REQUEST_ID 0x04 +#define IMAGE_BLOCK_RESPONSE_ID 0x05 +#define UPGRADE_END_REQUEST_ID 0x06 +#define UPGRADE_END_RESPONSE_ID 0x07 + +#define DEFINE_QUERY_NEXT_IMAGE_REQUEST(queryNextImageReqInd) \ + DEFINE_COMMAND(queryNextImageReq, QUERY_NEXT_IMAGE_REQUEST_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + queryNextImageReqInd) + +#define DEFINE_QUERY_NEXT_IMAGE_RESPONSE(queryNextImageRespInd) \ + DEFINE_COMMAND(queryNextImageResp, QUERY_NEXT_IMAGE_RESPONSE_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + queryNextImageRespInd) + +#define DEFINE_IMAGE_BLOCK_REQUEST(imageBlockReqInd) \ + DEFINE_COMMAND(imageBlockReq, IMAGE_BLOCK_REQUEST_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + imageBlockReqInd) + +#define DEFINE_IMAGE_PAGE_REQUEST(imagePageReqInd) \ + DEFINE_COMMAND(imagePageReq, IMAGE_PAGE_REQUEST_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + imagePageReqInd) + +#define DEFINE_IMAGE_BLOCK_RESPONSE(imageBlockRespInd) \ + DEFINE_COMMAND(imageBlockResp, IMAGE_BLOCK_RESPONSE_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + imageBlockRespInd) + +#define DEFINE_UPGRADE_END_REQUEST(upgradeEndReqInd) \ + DEFINE_COMMAND(upgradeEndReq, UPGRADE_END_REQUEST_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + upgradeEndReqInd) + +#define DEFINE_UPGRADE_END_RESPONSE(upgradeEndRespInd) \ + DEFINE_COMMAND(upgradeEndResp, UPGRADE_END_RESPONSE_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + upgradeEndRespInd) + +#define OTAU_COMMANDS(queryNextImageReqInd, queryNextImageRespInd, imageBlockReqInd, imagePageReqInd, \ + imageBlockRespInd, upgradeEndReqInd, upgradeEndRespInd) \ + DEFINE_QUERY_NEXT_IMAGE_REQUEST(queryNextImageReqInd), \ + DEFINE_QUERY_NEXT_IMAGE_RESPONSE(queryNextImageRespInd), \ + DEFINE_IMAGE_BLOCK_REQUEST(imageBlockReqInd), \ + DEFINE_IMAGE_PAGE_REQUEST(imagePageReqInd), \ + DEFINE_IMAGE_BLOCK_RESPONSE(imageBlockRespInd), \ + DEFINE_UPGRADE_END_REQUEST(upgradeEndReqInd), \ + DEFINE_UPGRADE_END_RESPONSE(upgradeEndRespInd) + +/***************************************************************************//** + \brief ZCL OTAU Cluster server side defining macros + + \param attributes - pointer to cluster server attributes (ZCL_OtauClusterClientAttributes_t) + or NULL if there are no attributes + \param clcommands - pointer to cluster server commands + or NULL if there are no commands + + \return None +*******************************************************************************/ +#define OTAU_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = OTAU_CLUSTER_ID, \ + .options = { \ + .type = ZCL_SERVER_CLUSTER_TYPE, \ + .security = ZCL_DEFAULT_CLUSTER_SECURITY, \ + .reserved = 0}, \ + .attributesAmount = ZCL_OTAU_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *) clattributes, \ + .commandsAmount = ZCL_OTAU_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *) clcommands \ + } + +/***************************************************************************//** + \brief ZCL OTAU Cluster client side defining macros + + \param attributes - pointer to cluster client attributes (ZCL_OtauClusterClientAttributes_t) + or NULL if there are no attributes + \param clcommands - pointer to cluster client commands + or NULL if there are no commands + + \return None +*******************************************************************************/ +#define OTAU_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = OTAU_CLUSTER_ID, \ + .options = { \ + .type = ZCL_CLIENT_CLUSTER_TYPE, \ + .security = ZCL_DEFAULT_CLUSTER_SECURITY, \ + .reserved = 0}, \ + .attributesAmount = ZCL_OTAU_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *) clattributes, \ + .commandsAmount = ZCL_OTAU_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *) clcommands \ + } + +#define DEFINE_OTAU_CLUSTER(cltype, clattributes, clcommands) OTAU_CLUSTER_##cltype(clattributes, clcommands) +/******************************************************************************* + Types section +*******************************************************************************/ +typedef uint8_t OtauHeaderString_t[OTAU_HEADER_STRING_SIZE]; + +typedef enum PACK +{ + OTAU_SERVER_HAS_BEEN_FOUND, + OTAU_SERVER_HAS_NOT_BEEN_FOUND, + OTAU_SERVER_HAS_BEEN_LOST, + OTAU_OFD_DRIVER_ERROR, + OTAU_SERVER_RECEIVED_MALFORMED_COMMAND, + OTAU_SERVER_NO_IMAGE_AVAILABLE, + OTAU_SERVER_RECEIVED_UNSUPPORTED_COMMAND, + OTAU_SERVER_RECEIVED_UNKNOWN_STATUS, + OTAU_SERVER_IS_NOT_AUTHORIZED_TO_UPDATE, + OTAU_DOWNLOAD_STARTED, + OTAU_DOWNLOAD_ABORTED, + OTAU_DOWNLOAD_FINISHED, + OTAU_DEVICE_SHALL_CHANGE_IMAGE, + OTAU_ISD_IMAGE_CACHE_IS_FOUND, + OTAU_ISD_HARDWARE_FAULT, + OTAU_ISD_COMMUNICATION_LOST, + OTAU_MAX_MESSAGE_NUMBER +} ZCL_OtauAction_t; + +typedef void (* ZCL_OtauStatInd_t)(ZCL_OtauAction_t action); + +typedef enum +{ + OTAU_ZB_STACK_VERSION_2006 = 0x0000, + OTAU_ZB_STACK_VERSION_2007 = 0x0001, + OTAU_ZB_STACK_VERSION_PRO = 0x0002, + OTAU_ZB_STACK_VERSION_IP = 0x0003, + OTAU_FAKE_VERSION = 0xFFFF +} ZCL_OtauZigbeeStackVersion_t; + +typedef enum +{ + OTAU_SPECIFIC_IMAGE_TYPE = 0x0000, + OTAU_SECURITY_CREDENTIAL_TYPE = 0xFFC0, + OTAU_CONFIGURATION_TYPE = 0xFFC1, + OTAU_LOG_TYPE = 0xFFC2, + OTAU_WILD_CARD_TYPE = 0xFFFF +} ZCL_OtauImageType_t; + +typedef enum +{ + OTAU_UPGRADE_IMAGE = 0x0000, + OTAU_ECDSA_SIGNATURE = 0x0001, + OTAU_ECDSA_SIGNING_CERTIFICATE = 0x0002, + OTAU_FAKE_NUMBER = 0xFFFF +} ZCL_OtauTagID_t; + +BEGIN_PACK +typedef enum PACK +{ + OTAU_NORMAL, + OTAU_DOWNLOAD_IN_PROGRESS, + OTAU_DOWNLOAD_COMPLETE, + OTAU_WAITING_TO_UPGRADE, + OTAU_COUNT_DOWN, + OTAU_WAIT_FOR_MORE +} ZCL_ImageUpdateStatus_t; + +typedef union PACK +{ + uint16_t memAlloc; + struct PACK + { + uint16_t securityCredentialVersionPresent : 1; + uint16_t deviceSpecificFile : 1; + uint16_t hardwareVersionPresent : 1; + uint16_t reserved : 13; + }; +} ZCL_OtauHeaderFieldControl_t; + +typedef struct PACK +{ + ZCL_OtauTagID_t tagID; + uint32_t lengthField; +} ZCL_OtauSubElementHeader_t; + +typedef union PACK +{ + uint32_t memAlloc; + struct PACK + { + uint8_t appRelease; + uint8_t appBuild; + uint8_t stackRelease; + uint8_t stackBuild; + }; +} ZCL_OtauFirmwareVersion_t; + +/***************************************************************************//** + \brief + ZCL OTAU upgrade image header +*******************************************************************************/ +typedef struct PACK +{ + uint32_t magicNumber; + uint16_t headerVersion; + uint16_t headerLength; + ZCL_OtauHeaderFieldControl_t fieldControl; + uint16_t manufacturerId; + uint16_t imageType; + ZCL_OtauFirmwareVersion_t firmwareVersion; + ZCL_OtauZigbeeStackVersion_t zigbeeStackVersion; + OtauHeaderString_t headerString; + uint32_t totalImageSize; +} ZCL_OtauUpgradeImageHeader_t; + +/***************************************************************************//** + \brief + ZCL OTAU Cluster attributes. + Currently, all attributes are client side attributes (only stored on the client). +*******************************************************************************/ +typedef struct PACK +{ + /*! + \brief The attribute is used to store the IEEE address of the upgrade server + resulted from the discovery of the upgrade server's identity. If the value is set + to a non-zero value and corresponds to an IEEE address of a device that is no longer + accessible, a device may choose to discover a new Upgrade Server depending on its own + security policies. The attribute is mandatory because it serves as a placeholder in a case + where the client is programmed, during manufacturing time, its upgrade server ID. + In addition, the attribute is used to identify the current upgrade server the client is using + in a case where there are multiple upgrade servers in the network. The attribute is also helpful + in a case when a client has temporarily lost connection to the network (for example, via a reset + or a rejoin), it shall try to rediscover the upgrade server via network address discovery using + the IEEE address stored in the attribute. By default the value is 0xffffffffffffffff, which is + an invalid IEEE address. The attribute is a client-side attribute and stored on the client. + */ + struct PACK + { + ZCL_AttributeId_t id; //! +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ +/** + * \brief Occupancy Sensing cluster attributes values +*/ + +#define OCCUPANCY_ATTRIBUTE_VALUE_OCCUPIED 1 +#define OCCUPANCY_ATTRIBUTE_VALUE_UNOCCUPIED 0 + +#define OCCUPANYC_SENSOR_TYPE_ATTRIBUTE_VALUE_PIR 0x00 +#define OCCUPANYC_SENSOR_TYPE_ATTRIBUTE_VALUE_ULTRASONIC 0x01 +#define OCCUPANYC_SENSOR_TYPE__ATTRIBITE_VALUE_PIR_AND_ULTRASONIC 0x02 + +/** + * \brief Occupancy Sensing Cluster server attributes amount +*/ + +#define ZCL_OCCUPANCY_SENSING_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 2 + +/** + * \brief Occupancy Sensing Cluster client attributes amount. Clinet doesn't have attributes. +*/ + +#define ZCL_OCCUPANCY_SENSING_CLUSTER_CLIENT_ATTRIBTUES_AMOUNT 0 + +/** + * \brief On/Off Switch Configuration Cluster commands amount +*/ + +#define ZCL_OCCUPANCY_SENSING_CLUSTER_COMMANDS_AMOUNT 0 + +/** + * \brief Occupancy Sensing Cluster server's attributes identifiers +*/ + +#define ZCL_OCCUPANCY_SENSING_CLUSTER_OCCUPANCY_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) +#define ZCL_OCCUPANCY_SENSING_CLUSTER_OCCUPANCY_SENSOR_TYPE_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0001) + +/** + * \brief Occupancy Sensing Cluster server define attributes macros +*/ + +#define ZCL_DEFINE_OCCUPANCY_SENSING_CLUSTER_SERVER_ATTRIBUTES(min, max) \ + DEFINE_REPORTABLE_ATTRIBUTE(occupancy, ZCL_READONLY_ATTRIBUTE, ZCL_OCCUPANCY_SENSING_CLUSTER_OCCUPANCY_SERVER_ATTRIBUTE_ID, ZCL_8BIT_BITMAP_DATA_TYPE_ID, min, max), \ + DEFINE_ATTRIBUTE(occupancySensorType, ZCL_READONLY_ATTRIBUTE, ZCL_OCCUPANCY_SENSING_CLUSTER_OCCUPANCY_SENSOR_TYPE_SERVER_ATTRIBUTE_ID, ZCL_8BIT_ENUM_DATA_TYPE_ID) + +/** + * \brief Occupancy Sensing Cluster definition macros +*/ + +#define OCCUPANCY_SENSING_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = OCCUPANCY_SENSING_CLUSTER_ID, \ + .options = { \ + .type = ZCL_CLIENT_CLUSTER_TYPE, \ + .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY, \ + }, \ + .attributesAmount = ZCL_OCCUPANCY_SENSING_CLUSTER_CLIENT_ATTRIBTUES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_OCCUPANCY_SENSING_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define OCCUPANCY_SENSING_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = OCCUPANCY_SENSING_CLUSTER_ID, \ + .options = { \ + .type = ZCL_SERVER_CLUSTER_TYPE, \ + .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY, \ + }, \ + .attributesAmount = ZCL_OCCUPANCY_SENSING_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_OCCUPANCY_SENSING_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define DEFINE_OCCUPANCY_SENSING_CLUSTER(cltype, clattributes, clcommands) \ + OCCUPANCY_SENSING_CLUSTER_##cltype(clattributes, clcommands) + +/****************************************************************************** + Types section +******************************************************************************/ + +BEGIN_PACK + +/** + * \brief On/Off Switch Configuration Cluster server's attributes +*/ + +typedef struct PACK +{ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + ZCL_ReportTime_t reportCounter; //! +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ + +/** + * \brief On/Off Cluster server attributes amount +*/ + +#define ZCL_ONOFF_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 1 + +/** + * \brief On/Off Cluster client attributes amount. Clinet doesn't have attributes. +*/ + +#define ZCL_ONOFF_CLUSTER_CLIENT_ATTRIBTUES_AMOUNT 0 + +/** + * \brief On/Off Cluster commands amount +*/ + +#define ZCL_ONOFF_CLUSTER_COMMANDS_AMOUNT 3 + +/** + * \brief On/Off Cluster server's attributes identifiers +*/ + +#define ZCL_ONOFF_CLUSTER_ONOFF_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) + +/** + * \brief On/Off Cluster client's command identifiers +*/ + +#define ZCL_ONOFF_CLUSTER_OFF_COMMAND_ID 0x00 +#define ZCL_ONOFF_CLUSTER_ON_COMMAND_ID 0x01 +#define ZCL_ONOFF_CLUSTER_TOGGLE_COMMAND_ID 0x02 + +/** + * \brief On/Off Cluster server define attributes macros +*/ + +#define ZCL_DEFINE_ONOFF_CLUSTER_SERVER_ATTRIBUTES(min, max) \ + DEFINE_REPORTABLE_ATTRIBUTE(onOff, ZCL_READONLY_ATTRIBUTE, ZCL_ONOFF_CLUSTER_ONOFF_SERVER_ATTRIBUTE_ID, ZCL_BOOLEAN_DATA_TYPE_ID, min, max) + +/** + * \brief On/Off Cluster define commands macros +*/ + +#define ZCL_DEFINE_ONOFF_CLUSTER_COMMANDS(onCommandInd, offCommandInd, toggleCommandInd) \ + DEFINE_COMMAND(onCommand, ZCL_ONOFF_CLUSTER_ON_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + onCommandInd), \ + DEFINE_COMMAND(offCommand, ZCL_ONOFF_CLUSTER_OFF_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + offCommandInd), \ + DEFINE_COMMAND(toggleCommand, ZCL_ONOFF_CLUSTER_TOGGLE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + toggleCommandInd) + +/** + * \brief On/Off Cluster definition macros +*/ + +#define ONOFF_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = ONOFF_CLUSTER_ID, \ + .options = { \ + .type = ZCL_CLIENT_CLUSTER_TYPE, \ + .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY, \ + }, \ + .attributesAmount = ZCL_ONOFF_CLUSTER_CLIENT_ATTRIBTUES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_ONOFF_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define ONOFF_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = ONOFF_CLUSTER_ID, \ + .options = { \ + .type = ZCL_SERVER_CLUSTER_TYPE, \ + .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY, \ + }, \ + .attributesAmount = ZCL_ONOFF_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_ONOFF_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define DEFINE_ONOFF_CLUSTER(cltype, clattributes, clcommands) \ + ONOFF_CLUSTER_##cltype(clattributes, clcommands) + +/****************************************************************************** + Types section +******************************************************************************/ + +BEGIN_PACK + +/** + * \brief On/Off Cluster server's attributes +*/ + +typedef struct PACK +{ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + bool value; + ZCL_ReportTime_t reportCounter; //! +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ +/** + * \brief On/Off Switch Configuration attributes values +*/ + +#define SWITCH_TYPE_ATTRIBUTE_VALUE_TOGGLE 0x00 +#define SWITCH_TYPE_ATTRIBUTE_VALUE_MOMENTARY 0x01 + +#define SWITCH_ACTIONS_ATTRIBUTE_VALUE_ON_OFF 0x00 +#define SWITCH_ACTIONS_ATTRIBUTE_VALUE_OFF_ON 0x01 +#define SWITCH_ACTIONS_ATTRIBITE_VALUE_TOGGLE_TOGGLE 0x02 + +/** + * \brief On/Off Switch Configuration Cluster server attributes amount +*/ + +#define ZCL_ONOFF_SWITCH_CONFIGURATION_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 2 + +/** + * \brief On/Off Switch Configuration Cluster client attributes amount. Clinet doesn't have attributes. +*/ + +#define ZCL_ONOFF_SWITCH_CONFIGURATION_CLUSTER_CLIENT_ATTRIBTUES_AMOUNT 0 + +/** + * \brief On/Off Switch Configuration Cluster commands amount +*/ + +#define ZCL_ONOFF_SWITCH_CONFIGURATION_CLUSTER_COMMANDS_AMOUNT 0 + +/** + * \brief On/Off Switch Configuration Cluster server's attributes identifiers +*/ + +#define ZCL_ONOFF_SWITCH_CONFIGURATION_CLUSTER_SWITCH_TYPE_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) +#define ZCL_ONOFF_SWITCH_CONFIGURATION_CLUSTER_SWITCH_ACTIONS_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0010) + +/** + * \brief On/Off Switch Configuration Cluster server define attributes macros +*/ + +#define ZCL_DEFINE_ONOFF_SWITCH_CONFIGURATION_CLUSTER_SERVER_ATTRIBUTES() \ + DEFINE_ATTRIBUTE(switchType, ZCL_READONLY_ATTRIBUTE, ZCL_ONOFF_SWITCH_CONFIGURATION_CLUSTER_SWITCH_TYPE_SERVER_ATTRIBUTE_ID, ZCL_8BIT_ENUM_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(switchActions, ZCL_READWRITE_ATTRIBUTE, ZCL_ONOFF_SWITCH_CONFIGURATION_CLUSTER_SWITCH_ACTIONS_SERVER_ATTRIBUTE_ID, ZCL_8BIT_ENUM_DATA_TYPE_ID) + + +/** + * \brief On/Off Switch Configuration Cluster definition macros +*/ + +#define ONOFF_SWITCH_CONFIGURATION_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = ONOFF_SWITCH_CONFIGURATION_CLUSTER_ID, \ + .options = { \ + .type = ZCL_CLIENT_CLUSTER_TYPE, \ + .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY, \ + }, \ + .attributesAmount = ZCL_ONOFF_SWITCH_CONFIGURATION_CLUSTER_CLIENT_ATTRIBTUES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_ONOFF_SWITCH_CONFIGURATION_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define ONOFF_SWITCH_CONFIGURATION_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = ONOFF_SWITCH_CONFIGURATION_CLUSTER_ID, \ + .options = { \ + .type = ZCL_SERVER_CLUSTER_TYPE, \ + .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY, \ + }, \ + .attributesAmount = ZCL_ONOFF_SWITCH_CONFIGURATION_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_ONOFF_SWITCH_CONFIGURATION_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define DEFINE_ONOFF_SWITCH_CONFIGURATION_CLUSTER(cltype, clattributes, clcommands) \ + ONOFF_SWITCH_CONFIGURATION_CLUSTER_##cltype(clattributes, clcommands) + +/****************************************************************************** + Types section +******************************************************************************/ + +BEGIN_PACK + +/** + * \brief On/Off Switch Configuration Cluster server's attributes + */ + +typedef struct PACK +{ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } switchType; + + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } switchActions; +} ZCL_OnOffSwitchConfigurationClusterServerAttributes_t; + +END_PACK + +#endif /* _ZCLONOFFSWITCHCONFIGURATIONCLUSTER_H */ + diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclOtauDiscovery.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclOtauDiscovery.h new file mode 100644 index 00000000..54365690 --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclOtauDiscovery.h @@ -0,0 +1,100 @@ +/**************************************************************************//** + \file zclOTAUCluster.h + + \brief Declaration of the private OTAU interface + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 13.05.10 A. Khromykh - Created. +*******************************************************************************/ +#ifndef _ZCLOTAUDISCOVERY_H +#define _ZCLOTAUDISCOVERY_H + +/****************************************************************************** + Includes section +******************************************************************************/ +#include +#include +#include + +/****************************************************************************** + Types section +******************************************************************************/ +typedef union +{ + ZDO_ZdpReq_t zdpOtauReq; +#ifdef _ZCL_SECURITY_ + APS_RequestKeyReq_t apsKeyReq; +#endif // _ZCL_SECURITY_ + ZCL_Request_t zclCommandReq; +} OtauReqMemory_t; + +typedef union +{ + ZCL_OtauQueryNextImageReq_t uQueryNextImageReq; + ZCL_OtauImageBlockReq_t uImageBlockReq; + ZCL_OtauImagePageReq_t uImagePageReq; + ZCL_OtauUpgradeEndReq_t uUpgradeEndReq; +} OtauZclReqMemory_t; + +typedef struct +{ + uint32_t imageInternalLength; + uint8_t internalAddressStatus; + uint32_t currentFileOffset; + uint8_t currentDataSize; + uint32_t imageRemainder; + uint32_t imagePageOffset; +} OtauImageAuxVar_t; + +/***************************************************************************//** + \brief + ZCL OTAU Cluster parametres. +*******************************************************************************/ +typedef struct +{ + uint32_t imageSize; + uint8_t imageBlockData[OFD_BLOCK_SIZE]; + uint8_t *imagePageData; + +} ZclOtauClientImageBuffer_t; + +/****************************************************************************** + Prototypes section +******************************************************************************/ +/***************************************************************************//** +\brief Restart poll timer + +\param[in] period - timer fired time +\param[in] cb - pointer to fired method +******************************************************************************/ +void otauStartGenericTimer(uint32_t period, void (* cb)(void)); + +/***************************************************************************//** +\brief Restart discovery service with context gap +******************************************************************************/ +void otauStartPollDiscovery(void); + +/***************************************************************************//** +\brief Entry point to client process +******************************************************************************/ +void otauClientEntryPoint(void); + +/***************************************************************************//** +\brief Start discovery of upgrade server +******************************************************************************/ +void ZCL_OtauUpgradeServerDiscovery(void); + +/***************************************************************************//** +\brief Server IEEE addresses request +******************************************************************************/ +void otauServerExtAddrReq(void); + +#endif /* _ZCLOTAUDISCOVERY_H */ diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclOtauManager.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclOtauManager.h new file mode 100644 index 00000000..ad091491 --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclOtauManager.h @@ -0,0 +1,180 @@ +/**************************************************************************//** + \file zclOTAUManager.h + + \brief Declaration of the OTAU manager interface + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 16.05.11 A. Khromykh - Created. +*******************************************************************************/ +#ifndef _ZCLOTAUMANAGER_H +#define _ZCLOTAUMANAGER_H + +/****************************************************************************** + Types section +******************************************************************************/ +typedef struct +{ /* memory for storage of server discovery result */ + struct + { + void *next; + } service; + + bool busy; + Endpoint_t serverEndpoint; + ShortAddr_t serverShortAddress; + ExtAddr_t serverExtAddress; +} ZclOtauDiscoveryResult_t; + +typedef struct +{ + struct + { + void *next; + } service; + + bool busy; + uint8_t id; + ZCL_Addressing_t addressing; + ZCL_Request_t zclCommandReq; + + union + { + ZCL_OtauQueryNextImageReq_t queryNextImageReq; + ZCL_OtauQueryNextImageResp_t queryNextImageResp; + ZCL_OtauImageBlockReq_t imageBlockReq; + ZCL_OtauImageBlockResp_t imageBlockResp; + ZCL_OtauUpgradeEndReq_t upgradeEndReq; + ZCL_OtauUpgradeEndResp_t upgradeEndResp; + }; + ZCL_OtauImagePageReq_t imagePageReq; +} ZclOtauServerTransac_t; + +typedef struct +{ + uint32_t fileOffset; + uint16_t size; +} ZclOtauMissedBlockResponses_t; + +typedef struct +{ + uint8_t quantity; + uint8_t internalBlockOffset; + bool blockGetting; + ZclOtauMissedBlockResponses_t *missedBlockResponses; +} otauMissedBlocksBuffer_t; + +typedef struct +{ + OtauReqMemory_t reqMem; + OtauZclReqMemory_t zclReqMem; + HAL_AppTimer_t genericTimer; + HAL_AppTimer_t pageRequestTimer; + ZclOtauClientImageBuffer_t otauParam; + OtauImageAuxVar_t imageAuxParam; + OFD_MemoryAccessParam_t memParam; + ZCL_OtauFirmwareVersion_t newFirmwareVersion; + + uint8_t discoveredServerAmount; + ZclOtauDiscoveryResult_t *discoveredServerMem; + + uint16_t pageReminderSize; + otauMissedBlocksBuffer_t missedBlocks; +} ZCL_OtauClientMem_t; + +typedef struct +{ + ZCL_Request_t unsolicitedReq; + ZCL_OtauUpgradeEndResp_t unsolicitedUpgradeEndResp; + + uint8_t transacAmount; + ZclOtauServerTransac_t *serverTransac; + uint16_t pageReminderSize; +} ZCL_OtauServerMem_t; + +typedef struct +{ + ZCL_OtauStatInd_t otauInd; + ZCL_OtauInitParams_t initParam; + union + { + ZCL_OtauClientMem_t clientMem; + ZCL_OtauServerMem_t serverMem; + }; +} ZclOtauMem_t; + +/****************************************************************************** + External variables section +******************************************************************************/ +/** zclOtauMem is defined in zclOtauManager.c */ +extern ZclOtauMem_t zclOtauMem; +extern bool isOtauBusy; + +/****************************************************************************** + Inline functions section +******************************************************************************/ +INLINE ZclOtauMem_t* zclGetOtauMem(void) +{ + return &zclOtauMem; +} + +INLINE ZCL_OtauClientMem_t* zclGetOtauClientMem(void) +{ + return &zclOtauMem.clientMem; +} + +INLINE ZCL_OtauServerMem_t* zclGetOtauServerMem(void) +{ + return &zclOtauMem.serverMem; +} + +/****************************************************************************** + Prototypes section +******************************************************************************/ +/***************************************************************************//** +\brief Lift otau cluster action for customer. + +\param[in] action - the OTAU action for a customer. +******************************************************************************/ +void zclRaiseCustomMessage (const ZCL_OtauAction_t action); + +/***************************************************************************//** +\brief Start otau client service +******************************************************************************/ +void zclStartOtauClient(void); + +/***************************************************************************//** +\brief Start otau server service +******************************************************************************/ +void zclStartOtauServer(void); + +/***************************************************************************//** +\brief Stop otau server service +******************************************************************************/ +void zclStopOtauServer(void); + +/***************************************************************************//** +\brief Clear otau server memory. +******************************************************************************/ +void zclClearOtauServerMemory(void); + +/***************************************************************************//** +\brief Clear otau client memory. +******************************************************************************/ +void zclClearOtauClientMemory(void); + +/***************************************************************************//** +\brief Find empty cell in memory pool. + +\return pointer to empty cell. +******************************************************************************/ +ZclOtauServerTransac_t * zclFindEmptyCell(void); + +#endif /* _ZCLOTAUMANAGER_H */ diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclParser.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclParser.h new file mode 100644 index 00000000..141d5b1f --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclParser.h @@ -0,0 +1,445 @@ +/************************************************************************//** + \file zclParser.h + + \brief + The header file describes the ZCL Parser interface + + The file describes the interface and types of ZCL Parser + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 02.12.08 A. Potashov - Created. +******************************************************************************/ + +#ifndef _ZCLPARSER_H +#define _ZCLPARSER_H + +/****************************************************************************** + Includes section +******************************************************************************/ +#include +//#include +#include +#include +#include + +/****************************************************************************** + Define(s) section +******************************************************************************/ +/*ZCL Header Frame Type sub-field value*/ +#define ZCL_FRAME_CONTROL_FRAME_TYPE_UNIVERSAL_COMMAND 0x00 +#define ZCL_FRAME_CONTROL_FRAME_TYPE_SPECIFIC_COMMAND 0x01 + +/*ZCL Header Manufacturer Specific sub-field value*/ +#define ZCL_FRAME_CONTROL_MANUFACTURER_NONSPECIFIC 0x00 +#define ZCL_FRAME_CONTROL_MANUFACTURER_SPECIFIC 0x01 + +#define ZCL_FRAME_SIMPLE_HEADER_LENGTH 3 +#define ZCL_FRAME_HEADER_MANUFACTURER_CODE_LENGTH 2 +#define ZCL_FRAME_HEADER_WITH_MANUFACTURER_CODE_LENGTH \ + (ZCL_FRAME_SIMPLE_HEADER_LENGTH + ZCL_FRAME_HEADER_MANUFACTURER_CODE_LENGTH) + +#ifndef ZCL_STANDARD_REQ_TYPE +#define ZCL_STANDARD_REQ_TYPE ZCL_FRAME_CONTROL_FRAME_TYPE_UNIVERSAL_COMMAND +#endif +#ifndef ZCL_SPECIAL_REQ_TYPE +#define ZCL_SPECIAL_REQ_TYPE ZCL_FRAME_CONTROL_FRAME_TYPE_SPECIFIC_COMMAND +#endif + +#ifndef ZCL_MAX_STANDARD_DATA_TYPE_SIZE +#define ZCL_MAX_STANDARD_DATA_TYPE_SIZE 8 +#endif + +/*************************************************************************//** + \brief Defines the Descrete Kind of ZCL Data Type (used in #ZCL_DataTypeDescriptor_t) +*****************************************************************************/ +#ifndef ZCL_DATA_TYPE_DESCRETE_KIND +#define ZCL_DATA_TYPE_DESCRETE_KIND 0x00 +#endif + +/*************************************************************************//** + \brief Defines the Analog Kind of ZCL Data Type (used in #ZCL_DataTypeDescriptor_t) +*****************************************************************************/ +#ifndef ZCL_DATA_TYPE_ANALOG_KIND +#define ZCL_DATA_TYPE_ANALOG_KIND 0x01 +#endif + +/****************************************************************************** + Types section +******************************************************************************/ + +typedef enum +{ + ZCL_PARSER_IDLE_STATE, + ZCL_PARSER_RECEIVED_PACKET_STATE, + ZCL_PARSER_SENDING_RESPONSE_STATE, +} ZclParserState_t; + +typedef struct +{ + //ZclParserState_t state; + uint8_t dataIndAmount; + QueueDescriptor_t dataIndQueue; +} ZclParserMem_t; + +BEGIN_PACK +typedef struct PACK +{ + union PACK + { + struct PACK + { + LITTLE_ENDIAN_OCTET(5,( + uint8_t frameType :2, //Frame type sub-field + uint8_t manufacturerSpecific :1, //Manufacturer specific sub-field + uint8_t direction :1, //Direction sub-field + uint8_t defaultResponse :1, //Disable default response sub-field + uint8_t reserved :3 //Reserved bits. Must have a zero value + )) + }; + uint8_t uint8; + }; +} ZclFrameControlField_t; + +typedef struct PACK +{ + ZclFrameControlField_t frameControl; + uint16_t manufacturerCode; + uint8_t sequenceNumber; + uint8_t commandId; +} ZclFrameHeader_t; + +typedef struct PACK +{ + ZclFrameHeader_t header; + uint8_t payload[1]; +} ZclFrame_t; + +/****************************************************************************** + Read Attributes commands +******************************************************************************/ +/** \brief ZCL read attributes command record */ +typedef struct PACK +{ + uint16_t attributeId; +} ZclReadAttributesRecord_t; + +/** \brief ZCL Read attributes command payload */ +typedef struct PACK +{ + ZclReadAttributesRecord_t records[1]; +} ZclReadAttributesCommand_t; + +typedef struct PACK +{ + uint8_t elementType; + uint16_t elementsAmount; + struct PACK + { + uint8_t value[1]; + } elements[1]; +} ZclReadAttributesResponseArraySetBagValue_t; + +typedef struct PACK +{ + uint16_t elementsAmount; + struct PACK + { + uint8_t elementType; + uint8_t value[1]; + } elements [1]; +} ZclReadAttributesResponseStructValue_t; + +/** \brief ZCL read attributes response command record */ +typedef struct PACK +{ + ZCL_AttributeId_t attributeId; + uint8_t status; + uint8_t type; + union PACK + { + uint8_t simpleValue[1]; + ZclReadAttributesResponseArraySetBagValue_t arraySetBagValue; + ZclReadAttributesResponseStructValue_t structValue; + }; +} ZclReadAttributesResponseRecord_t; + +/** \brief ZCL read attributes response command payload */ +typedef struct PACK +{ + ZclReadAttributesResponseRecord_t records[1]; +} ZclReadAttributesResponseCommand_t; + +/****************************************************************************** + Write Attributes commands +******************************************************************************/ +/** \brief ZCL write attributes command record */ +typedef struct PACK +{ + ZCL_AttributeId_t attributeId; + uint8_t type; + uint8_t value[1]; +} ZclWriteAttributesRecord_t; + +/** \brief ZCL Wrire attributes command payload */ +typedef struct PACK +{ + ZclWriteAttributesRecord_t records[1]; +} ZclWriteAttributesCommand_t; + +/** \brief ZCL Wrire attributes undivided command payload */ +typedef ZclWriteAttributesCommand_t ZclWriteAttributesUndividedCommand_t; + +/** \brief ZCL Wrire attributes no response command payload */ +typedef ZclWriteAttributesCommand_t ZclWriteAttributesNoResponseCommand_t; + +/** \brief ZCL write attributes response command record */ +typedef struct PACK +{ + uint8_t status; + uint16_t attributeId; +} ZclWriteAttributesResponseRecord_t; + +/** \brief ZCL Wrire attributes response command payload */ +typedef struct PACK +{ + ZclWriteAttributesResponseRecord_t records[1]; +} ZclWriteAttributesResponseCommand_t; + +/****************************************************************************** + Configure reporting command +******************************************************************************/ +/** \brief ZCL configure reporting command record */ +typedef struct PACK +{ + uint8_t direction; + uint16_t attributeId; + uint16_t minimumReportingInterval; + uint16_t maximumReportingInterval; + uint8_t reportableChange[1]; + uint16_t timeoutPeriod; +} ZclConfigureReportingRecord_t; + +/** \brief ZCL configure reporting command payload */ +typedef struct PACK +{ + ZclConfigureReportingRecord_t records[1]; +} ZclConfigureReportingCommand_t; + +/** \brief ZCL configure reporting response command record */ +typedef struct PACK +{ + uint8_t status; + uint8_t direction; + uint16_t attributeId; +} ZclConfigureReportingResponseRecord_t; + +/** \brief ZCL configure reporting response command payload */ +typedef struct PACK +{ + ZclConfigureReportingResponseRecord_t records[1]; +} ZclConfigureReportingResponseCommand_t; + +END_PACK + +typedef struct +{ + ZCL_GeneralCommandId_t commandId; + void *primitive; +} ZclBuffer_t; + +typedef enum +{ + ZCL_PARSER_SUCCESS_STATUS = 0, + ZCL_PARSER_UNKNOWN_COMMAND_STATUS = 1, + ZCL_PARSER_BAD_FORMAT_STATUS = 2, + ZCL_PARSER_INVALID_PARAMETER_STATUS = 3 +} ZclParserStatus_t; + +typedef enum +{ + ZCL_REQUEST_TYPE, + ZCL_RESPONSE_TYPE, + ZCL_EVENT_TYPE, + ZCL_UNSPECIFIED_COMMAND_TYPE +} ZCL_CommandType_t; + +typedef struct +{ + uint8_t headerLength; + uint8_t payloadLength; + uint8_t frameType; + uint8_t direction; + uint8_t defaultResponse; + uint8_t manufacturerSpecific; + uint16_t manufacturerCode; + uint8_t sequenceNumber; + uint8_t commandId; + uint8_t *header; + uint8_t *payload; +} ZclFrameDescriptor_t; + +typedef struct +{ + ZclFrameDescriptor_t *frameDescriptor; + APS_DataInd_t *ind; + ZCL_Status_t commandStatus; + bool noApsSecurity; + bool relevantResponse; +} ZclAuxParseData_t; + +/****************************************************************************** + Constants section +******************************************************************************/ + +/****************************************************************************** + External variables section +******************************************************************************/ +/**************************************************************************//** +\brief ZCL memory global object +******************************************************************************/ +extern ZclParserMem_t zclParserMem; + +/****************************************************************************** + Prototypes section +******************************************************************************/ +/*************************************************************************//** + \brief Reset parser queue and clear memory. +*****************************************************************************/ +void zclParserInit(void); + +/**************************************************************************//** +\brief Form zcl header. + +\param[in] - dataReq - pointer to data request; +\param[in] - reqType - type of the request; +\param[in] - direction - cluster\server side; +\param[in] - commandId - zcl command identification; +\param[in] - defaultResponse - presence or absence of the default responde; +\param[in] - manufacSpecCode - manufacturer specific code; +\return header length +******************************************************************************/ +uint8_t zclFormRequest(APS_DataReq_t *dataReq, uint8_t reqType, uint8_t direction, uint8_t commandId, uint8_t defaultResponse, uint16_t manufacSpecCode); + +/*************************************************************************//** + \brief Response has been received. + + \param[in] auxData - pointer to structure with command payload and + descriptor of received command frame. +*****************************************************************************/ +void zclResponseInd(ZclAuxParseData_t *auxData); + +/*************************************************************************//** +\brief Routine of Read Reporting Configuration Command. + +\param[in] apsDataInd - pointer to aps payload +\param[in] frameDescriptor - pointer to parsed data structure from payload +*****************************************************************************/ +void zclReadReportingConfigurationHandler(APS_DataInd_t *apsDataInd, ZclFrameDescriptor_t *frameDescriptor); + +/*************************************************************************//** +\brief Routine of Configure Reporting Command. + +\param[in] apsDataInd - pointer to aps payload +\param[in] frameDescriptor - pointer to parsed data structure from payload +*****************************************************************************/ +void zclConfigureReportingHandler(APS_DataInd_t *apsDataInd, ZclFrameDescriptor_t *frameDescriptor); + +/*************************************************************************//** + \brief Report has been received. + + \param[in] apsData - report payload + \param[in] frameDesc - descriptor of received report frame +*****************************************************************************/ +void zclReportInd(APS_DataInd_t *apsData, ZclFrameDescriptor_t *frameDescriptor); + +/*************************************************************************//** + \brief Special cluster command has been received. + + \param[in] auxData - pointer to structure with command payload and + descriptor of received command frame. +*****************************************************************************/ +void zclCommandInd(ZclAuxParseData_t *auxData); + +/*************************************************************************//** + \brief The attribute has been read or written. + + \param[in] apsDataInd - attribute payload + \param[in] direction - direction + \param[in] event - event type + \param[in] attributeId - attribute identifier +*****************************************************************************/ +void zclAttributeEventInd(APS_DataInd_t *apsDataInd, uint8_t direction, ZCL_AttributeEvent_t event, ZCL_AttributeId_t attributeId); + +/*************************************************************************//** + \brief Configuration has been received. + + \param[in] apsData - configuration payload + \param[in] frameDesc - descriptor of received report frame +*****************************************************************************/ +void zclConfigurationInd(APS_DataInd_t *apsData, ZclFrameDescriptor_t *frameDesc); + +/*************************************************************************//** + \brief Indication from CAPS. + + \param[in] ind - buffer for data indication. +*****************************************************************************/ +void zclDataInd(APS_DataInd_t *ind); + +/*************************************************************************//** + \brief Security Type get by Cluster Id function and by endpointId, on which + was registered cluster. + Returns Security Type should be used with ClusterId specified + \param[in] clusterId - cluster identifier + \param[in] endpointId - end point identifier + \return ZCL_NETWORK_KEY_CLUSTER_SECURITY - NWK Key Security should be used + ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY - APS Link Key Security + shoud be used. + If cluster is unknown, security key will be determined by security mode, + i.e. ZCL_NETWORK_KEY_CLUSTER_SECURITY for Standard Security, + ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY for High Security. +*****************************************************************************/ +uint8_t zclGetSecurityTypeByClusterId(ClusterId_t clusterId, Endpoint_t endpointId); + +/**************************************************************************//** + \brief Get next registered ZCL endpoint descriptor by previous. + + \param[in] prev - previous ZCL endpoint descriptor pointer.It is must be non NULL + sequential access required if. And it is must be NULL the + first descriptor as registered endpoints queue head element + access required if. + + \return Valid ZCL endpoint descriptor pointer descriptor found if, + NULL - other case. + ******************************************************************************/ +ZCL_DeviceEndpoint_t* zclNextEndpoint(ZCL_DeviceEndpoint_t *prev); + +/*************************************************************************//** + \brief Find endpoint descriptor by endpoint id. + + \param[in] endpointId - endpoint unique identifier. + \return endpoint descriptor if found, NULL otherwise. +*****************************************************************************/ +ZCL_DeviceEndpoint_t *zclGetEndpoint(Endpoint_t endpointId); + +/****************************************************************************** + Inline static functions section +******************************************************************************/ +/****************************************************************************** +\brief Function returns point to ZCL memory object +******************************************************************************/ +static inline ZclParserMem_t *zclParserMemReq(void) +{ + return ((ZclParserMem_t *)&zclParserMem); +} + +#endif //#ifndef _ZCLPARSER_H + +//eof zclParser.h diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclPowerConfigurationCluster.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclPowerConfigurationCluster.h new file mode 100644 index 00000000..eccbb372 --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclPowerConfigurationCluster.h @@ -0,0 +1,107 @@ +/***************************************************************************** + \file zclPowerConfigurationCluster.h + + \brief + The file describes the types and interface of the Power Configuration cluster + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 18.01.2010 I.Vagulin - Created +******************************************************************************/ + + +#ifndef _ZCLPOWERCONFIGURATIONCLUSTER_H_ +#define _ZCLPOWERCONFIGURATIONCLUSTER_H_ + +/******************************************************************************* + Includes section +*******************************************************************************/ +#include +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ +/** +* \brief server attributes amount +*/ +#define ZCL_POWER_CONFIGURATION_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 2 + +/** +* \brief server commands amount +*/ +#define ZCL_POWER_CONFIGURATION_CLUSTER_SERVER_COMMANDS_AMOUNT 0 + +/** +* \brief client attributes amount +*/ +#define ZCL_POWER_CONFIGURATION_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 + +/** +* \brief client commands amount +*/ +#define ZCL_POWER_CONFIGURATION_CLUSTER_CLIENT_COMMANDS_AMOUNT 0 + + +/** +* \brief Supported attribue id +*/ +#define ZCL_POWER_CONFIGURATION_CLUSTER_SERVER_MAINS_VOLTAGE_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) +#define ZCL_POWER_CONFIGURATION_CLUSTER_SERVER_MAINS_FREQUENCY_ATTRIBUTE_ID CCPU_TO_LE16(0x0001) + +/** + * \brief server define attributes macros +*/ +#define ZCL_DEFINE_POWER_CONFIGURATION_CLUSTER_SERVER_ATTRIBUTES() \ + DEFINE_ATTRIBUTE(mainsVoltage, ZCL_READONLY_ATTRIBUTE, ZCL_POWER_CONFIGURATION_CLUSTER_SERVER_MAINS_VOLTAGE_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(mainsFrequency, ZCL_READONLY_ATTRIBUTE, ZCL_POWER_CONFIGURATION_CLUSTER_SERVER_MAINS_FREQUENCY_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID) + +#define ZCL_DEFINE_POWER_CONFIGURATION_CLUSTER_SERVER(clattributes) \ + { \ + .id = POWER_CONFIGURATION_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_POWER_CONFIGURATION_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *) (clattributes), \ + .commandsAmount = ZCL_POWER_CONFIGURATION_CLUSTER_SERVER_COMMANDS_AMOUNT, \ + .commands = NULL \ + } + +#define ZCL_DEFINE_POWER_CONFIGURATION_CLUSTER_CLIENT() \ + { \ + .id = POWER_CONFIGURATION_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_POWER_CONFIGURATION_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = NULL, \ + .commandsAmount = ZCL_POWER_CONFIGURATION_CLUSTER_CLIENT_COMMANDS_AMOUNT, \ + .commands = NULL \ + } + +/****************************************************************************** + Types section +******************************************************************************/ +BEGIN_PACK +typedef struct PACK { + struct PACK { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } mainsVoltage ; + + struct PACK { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } mainsFrequency ; +} ZCL_PowerConfigurationClusterAttributes_t ; +END_PACK + +#endif /* _ZCLPOWERCONFIGURATIONCLUSTER_H_ */ diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclPriceCluster.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclPriceCluster.h new file mode 100644 index 00000000..0769596b --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclPriceCluster.h @@ -0,0 +1,267 @@ +/************************************************************************//** + \file zclPriceCluster.h + + \brief + The header file describes the Price Cluster. + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 05.02.09 A. Mandychev - Changed. +******************************************************************************/ + +#ifndef _ZCLPRICECLUSTER_H +#define _ZCLPRICECLUSTER_H + +/****************************************************************************** + Includes section +******************************************************************************/ +#include +#include + +/****************************************************************************** + Defines section +******************************************************************************/ +/** +\brief Macros defines duration of Publish Price command, + * which means 'until change'. + * According to ZB AMI Spec r15, D.4.2.4.1.1, page 197. +*/ +#define PUBLISH_PRICE_DURATION_UNTIL_CHANGED (0xFFFF) + +/** +\brief Macros defines start time of Publish Price command, + * which means 'now'. + * According to ZB AMI Spec r15, D.4.2.4.1.1, page 197. +*/ +#define PUBLISH_PRICE_START_TIME_NOW (0x0000) + +/** +\brief Macros defines Price Ratio field special value, + * which means 'not used'. + * According to ZB AMI Spec r15, D.4.2.4.1.1, page 198. +*/ +#define PUBLISH_PRICE_PRICE_RATIO_IS_NOT_USED (0xFF) + +/** +\brief Macros defines Generation Price Ratio field special value, + * which means 'not used'. + * According to ZB AMI Spec r15, D.4.2.4.1.1, page 198. +*/ +#define PUBLISH_PRICE_GENERATION_PRICE_RATIO_IS_NOT_USED (0xFF) + +/** +\brief Macros defines Generation Price field special value, + * which means 'not used'. + * According to ZB AMI Spec r15, D.4.2.4.1.1, page 198. +*/ +#define PUBLISH_PRICE_GENERATION_PRICE_IS_NOT_USED (0xFFFFFFFF) + +/** +\brief Macros defines Number Of Block Thresholds field special value, + * which means 'not used'. + * According to ZigBee-095310r23ZB, page 65. +*/ +#define PUBLISH_NUMBER_OF_BLOCK_THRESHOLDS_IS_NOT_USED (0xFF) + +/** +\brief Macros defines Price Control field special value, + * which means 'not used'. + * According to ZigBee-095310r23ZB, page 65. +*/ +#define PUBLISH_PRICE_CONTROL_IS_NOT_USED (0x00) + +/** +\brief Macros defines Standing Charge field special value, + * which means 'not used'. + * According to ZigBee-095310r23ZB, page 65. +*/ +#define PUBLISH_STANDING_CHARGE_IS_NOT_USED (0xFFFFFFFF) + +/** + * \brief Price Server Cluster attributes amount. +*/ +#define PRICE_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 0 + +/** + * \brief Price Client Cluster attributes amount. +*/ +#define PRICE_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 + +/** + * \brief Price Client Cluster commands amount. +*/ +#define PRICE_CLUSTER_COMMANDS_AMOUNT 3 + +/** + * \brief Price Server Cluster commands identifiers. +*/ +#define PUBLISH_PRICE_COMMAND_ID 0x00 + +/** + * \brief Price Client Cluster commands identifiers. +*/ +#define GET_CURRENT_PRICE_COMMAND_ID 0x00 +#define GET_SCHEDULED_PRICES_COMMAND_ID 0x01 + +#define RATE_LABEL_MAX_LEN 12 + +/* +#define DEMAND_RESPONSE_CLUSTER_SERVER_COMMANDS(publishPriceInd) \ + DEFINE_COMMAND(publishPriceCommand, 0x00, COMMAND_OPTIONS(SERVER_TO_CLIENT), publishPriceInd) + + +#define DEMAND_RESPONSE_CLUSTER_CLIENT_COMMANDS(getCurrentPriceInd) \ + DEFINE_COMMAND(getCurrentPriceCommand, 0x00, COMMAND_OPTIONS(CLIENT_TO_SERVER), getCurrentPriceInd) +*/ + +#define PRICE_CLUSTER_COMMANDS(getCurrentPriceInd, publishPriceInd, getScheduledPricesInd) \ + DEFINE_COMMAND(getCurrentPriceCommand, 0x00, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), getCurrentPriceInd), \ + DEFINE_COMMAND(publishPriceCommand, 0x00, COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), publishPriceInd), \ + DEFINE_COMMAND(getScheduledPricesCommand, GET_SCHEDULED_PRICES_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), getScheduledPricesInd) + +#define PRICE_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = PRICE_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = PRICE_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = PRICE_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ + } + +#define PRICE_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = PRICE_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = PRICE_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = PRICE_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ + } +#define DEFINE_PRICE_CLUSTER(cltype, clattributes, clcommands) PRICE_CLUSTER_##cltype(clattributes, clcommands) + +/****************************************************************************** + Types section +******************************************************************************/ +BEGIN_PACK +/** + * \brief Publish Price Command Payload format. +*/ +typedef struct PACK +{ + uint32_t providerId; + uint8_t rateLabelLength; + uint8_t rateLabel[RATE_LABEL_MAX_LEN]; + uint32_t issuerEventId; + ZCL_UTCTime_t currentTime; + uint8_t unitOfMeasure; + uint16_t currency; + struct PACK + { + LITTLE_ENDIAN_OCTET(2,( + uint8_t priceTrailDigit : 4, + uint8_t priceTier : 4 + )) + } priceTrailDigitPriceTier; + struct PACK + { + LITTLE_ENDIAN_OCTET(2,( + uint8_t numberOfPriceTiers : 4, + uint8_t registerTier : 4 + )) + } numberOfPriceTiersRegisterTier; + ZCL_UTCTime_t startTime; + uint16_t durationInMinutes; + uint32_t price; + uint8_t priceRatio; + uint32_t generationPrice; + uint8_t generationPriceRatio; + uint32_t alternateCostDelivered; + uint8_t alternateCostUnit; + uint8_t alternateCostTrailingDigit; + uint8_t numberOfBlockThresholds; + uint8_t priceControl; + uint32_t standingCharge; +} ZCL_PublishPrice_t; + +/** + * \brief Get Current Price Command Payload format. +*/ +typedef struct PACK +{ + LITTLE_ENDIAN_OCTET(2,( + uint8_t requestorRxOnWhenIdle :1, //! +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ + +/** + * \brief Scenes Cluster scene name support bit +*/ + +#define SCENE_NAME_SUPPORT_FLAG 0x80 + +/** + * \brief Scenes Cluster server attributes amount +*/ + +#define ZCL_SCENES_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 5 + +/** + * \brief Scenes Cluster client attributes amount. Clinet doesn't have attributes. +*/ + +#define ZCL_SCENES_CLUSTER_CLIENT_ATTRIBTUES_AMOUNT 0 + +/** + * \brief Scenes Cluster commands amount +*/ + +#define ZCL_SCENES_CLUSTER_COMMANDS_AMOUNT 13 + +/** + * \brief Scenes Cluster server's attributes identifiers +*/ + +#define ZCL_SCENES_CLUSTER_SCENE_COUNT_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) +#define ZCL_SCENES_CLUSTER_CURRENT_SCENE_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0001) +#define ZCL_SCENES_CLUSTER_CURRENT_GROUP_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0002) +#define ZCL_SCENES_CLUSTER_SCENE_VALID_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0003) +#define ZCL_SCENES_CLUSTER_NAME_SUPPORT_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0004) + +/** + * \brief Scenes Cluster client's command identifiers +*/ + +#define ZCL_SCENES_CLUSTER_ADD_SCENE_COMMAND_ID 0x00 +#define ZCL_SCENES_CLUSTER_VIEW_SCENE_COMMAND_ID 0x01 +#define ZCL_SCENES_CLUSTER_REMOVE_SCENE_COMMAND_ID 0x02 +#define ZCL_SCENES_CLUSTER_REMOVE_ALL_SCENES_COMMAND_ID 0x03 +#define ZCL_SCENES_CLUSTER_STORE_SCENE_COMMAND_ID 0x04 +#define ZCL_SCENES_CLUSTER_RECALL_SCENE_COMMAND_ID 0x05 +#define ZCL_SCENES_CLUSTER_GET_SCENE_MEMBERSHIP_COMMAND_ID 0x06 + +/** + * \brief Scenes Cluster servers's command identifiers +*/ + +#define ZCL_SCENES_CLUSTER_ADD_SCENE_RESPONSE_COMMAND_ID 0x00 +#define ZCL_SCENES_CLUSTER_VIEW_SCENE_RESPONSE_COMMAND_ID 0x01 +#define ZCL_SCENES_CLUSTER_REMOVE_SCENE_RESPONSE_COMMAND_ID 0x02 +#define ZCL_SCENES_CLUSTER_REMOVE_ALL_SCENES_RESPONSE_COMMAND_ID 0x03 +#define ZCL_SCENES_CLUSTER_STORE_SCENE_RESPONSE_COMMAND_ID 0x04 +#define ZCL_SCENES_CLUSTER_GET_SCENE_MEMBERSHIP_RESPONSE_COMMAND_ID 0x06 + + +/** + * \brief Scenes Cluster server define attributes macros +*/ + +#define ZCL_DEFINE_SCENES_CLUSTER_SERVER_ATTRIBUTES() \ + DEFINE_ATTRIBUTE(sceneCount, ZCL_READONLY_ATTRIBUTE, ZCL_SCENES_CLUSTER_SCENE_COUNT_SERVER_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(currentScene, ZCL_READONLY_ATTRIBUTE, ZCL_SCENES_CLUSTER_CURRENT_SCENE_SERVER_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(currentGroup, ZCL_READONLY_ATTRIBUTE, ZCL_SCENES_CLUSTER_CURRENT_GROUP_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(sceneValid, ZCL_READONLY_ATTRIBUTE, ZCL_SCENES_CLUSTER_SCENE_VALID_SERVER_ATTRIBUTE_ID, ZCL_BOOLEAN_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(nameSupport, ZCL_READONLY_ATTRIBUTE, ZCL_SCENES_CLUSTER_NAME_SUPPORT_SERVER_ATTRIBUTE_ID, ZCL_8BIT_BITMAP_DATA_TYPE_ID) + + +/** + * \brief On/Off Cluster define commands macros +*/ + +#define ZCL_DEFINE_SCENES_CLUSTER_COMMANDS(addSceneCommandInd, viewSceneCommandInd, removeSceneCommandInd, \ + removeAllScenesCommandInd, storeSceneCommandInd, recallSceneCommandInd, \ + getSceneMembershipCommandInd, addSceneResponseCommandInd, viewSceneResponseCommandInd, \ + removeSceneResponseCommandInd, removeAllScenesResponseCommandInd, storeSceneResponseCommandInd, \ + getSceneMembershipResponseInd) \ + DEFINE_COMMAND(addSceneCommand, ZCL_SCENES_CLUSTER_ADD_SCENE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + addSceneCommandInd), \ + DEFINE_COMMAND(viewSceneCommand, ZCL_SCENES_CLUSTER_VIEW_SCENE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + viewSceneCommandInd), \ + DEFINE_COMMAND(removeSceneCommand, ZCL_SCENES_CLUSTER_REMOVE_SCENE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + removeSceneCommandInd), \ + DEFINE_COMMAND(removeAllScenesCommand, ZCL_SCENES_CLUSTER_REMOVE_ALL_SCENES_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + removeAllScenesCommandInd), \ + DEFINE_COMMAND(storeSceneCommand, ZCL_SCENES_CLUSTER_STORE_SCENE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + storeSceneCommandInd), \ + DEFINE_COMMAND(recallSceneCommand, ZCL_SCENES_CLUSTER_RECALL_SCENE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + recallSceneCommandInd), \ + DEFINE_COMMAND(getSceneMembershipCommand, ZCL_SCENES_CLUSTER_GET_SCENE_MEMBERSHIP_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + getSceneMembershipCommandInd), \ + DEFINE_COMMAND(addSceneResponseCommand, ZCL_SCENES_CLUSTER_ADD_SCENE_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + addSceneResponseCommandInd), \ + DEFINE_COMMAND(viewSceneResponseCommand, ZCL_SCENES_CLUSTER_VIEW_SCENE_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + viewSceneResponseCommandInd), \ + DEFINE_COMMAND(removeSceneResponseCommand, ZCL_SCENES_CLUSTER_REMOVE_SCENE_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + removeSceneResponseCommandInd), \ + DEFINE_COMMAND(removeAllScenesResponseCommand, ZCL_SCENES_CLUSTER_REMOVE_ALL_SCENES_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + removeAllScenesResponseCommandInd), \ + DEFINE_COMMAND(storeSceneResponseCommand, ZCL_SCENES_CLUSTER_STORE_SCENE_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + storeSceneResponseCommandInd), \ + DEFINE_COMMAND(getSceneMembershipResponse, ZCL_SCENES_CLUSTER_GET_SCENE_MEMBERSHIP_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + getSceneMembershipResponseInd) + + +/** + * \brief Scene Cluster definition macros +*/ + +#define SCENES_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = SCENES_CLUSTER_ID, \ + .options = { \ + .type = ZCL_CLIENT_CLUSTER_TYPE, \ + .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY, \ + }, \ + .attributesAmount = ZCL_SCENES_CLUSTER_CLIENT_ATTRIBTUES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_SCENES_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define SCENES_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = SCENES_CLUSTER_ID, \ + .options = { \ + .type = ZCL_SERVER_CLUSTER_TYPE, \ + .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY, \ + }, \ + .attributesAmount = ZCL_SCENES_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_SCENES_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define DEFINE_SCENES_CLUSTER(cltype, clattributes, clcommands) \ + SCENES_CLUSTER_##cltype(clattributes, clcommands) + +/****************************************************************************** + Types section +******************************************************************************/ +BEGIN_PACK + +/** + * \brief Add Scene Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; + uint8_t sceneId; + uint16_t transitionTime; + uint8_t sceneNameAndExtField[1]; +} ZCL_AddScene_t; + +/** + * \brief View Scene Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; + uint8_t sceneId; +} ZCL_ViewScene_t; + +/** + * \brief Remove Scene Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; + uint8_t sceneId; +} ZCL_RemoveScene_t; + +/** + * \brief Remove All Scenes Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; +} ZCL_RemoveAllScenes_t; + +/** + * \brief Store Scene Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; + uint8_t sceneId; +} ZCL_StoreScene_t; + +/** + * \brief Recall Scene Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; + uint8_t sceneId; +} ZCL_RecallScene_t; + +/** + * \brief Get Scene Membership Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; +} ZCL_GetSceneMembership_t; + +/** + * \brief Add Scene Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; + uint8_t sceneId; +} ZCL_AddSceneResponse_t; + +/** + * \brief View Scene Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; + uint8_t sceneId; + uint16_t transitionTime; + uint8_t nameAndExtField[1]; // string sceneName, extension field. +} ZCL_ViewSceneResponse_t; + +/** + * \brief Remove Scene Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; + uint8_t sceneId; +} ZCL_RemoveSceneResponse_t; + +/** + * \brief Remove All Scenes Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; +} ZCL_RemoveAllScenesResponse_t; + +/** + * \brief Store Scene Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; + uint8_t sceneId; +} ZCL_StoreSceneResponse_t; + +/** + * \brief Get Scene Membership Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint8_t capacity; + uint16_t groupId; + uint8_t sceneCount; + uint8_t sceneList[1]; +} ZCL_GetSceneMembershipResponse_t; + +/** + * \brief Scene Cluster server's attributes + */ + +typedef struct PACK +{ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } sceneCount; + + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } currentScene; + + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } currentGroup; + + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + bool value; + } sceneValid; + + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } nameSupport; +} ZCL_SceneClusterServerAttributes_t; + +END_PACK + +/** + * \brief Scene Cluster commands. + */ + +typedef struct +{ + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*addSceneCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_AddScene_t * payload); + } addSceneCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*viewSceneCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_ViewScene_t * payload); + } viewSceneCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*removeSceneCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_RemoveScene_t * payload); + } removeSceneCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*removeAllScenesCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_RemoveAllScenes_t * payload); + } removeAllScenesCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*storeSceneCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_StoreScene_t * payload); + } storeSceneCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*recallSceneCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_RecallScene_t * payload); + } recallSceneCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*getSceneMembershipCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_GetSceneMembership_t * payload); + } getSceneMembershipCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*addSceneResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_AddSceneResponse_t * payload); + } addSceneResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*viewSceneResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_ViewSceneResponse_t * payload); + } viewSceneResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*removeSceneResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_RemoveSceneResponse_t * payload); + } removeSceneResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*removeAllScenesResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_RemoveAllScenesResponse_t * payload); + } removeAllScenesResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*storeSceneResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_StoreSceneResponse_t * payload); + } storeSceneResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*getSceneMembershipResponse)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_GetSceneMembershipResponse_t * payload); + } getSceneMembershipResponse; +} ZCL_ScenesClusterCommands_t; + + +#endif /* _ZCLSCENESCLUSTER_H */ + diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclSecurityManager.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclSecurityManager.h new file mode 100644 index 00000000..e91cd669 --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclSecurityManager.h @@ -0,0 +1,190 @@ +/***************************************************************************//** + \file zclSecurityManager.h + + \brief + The header file describes the ZCL Security Manager and its interface + + The file describes the types and interface of the ZCL Security Manager + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 17.03.09 A. Potashov - Created. +*******************************************************************************/ + +#ifndef _ZCLSECURITYMANAGER_H +#define _ZCLSECURITYMANAGER_H + +#ifdef _ZCL_SECURITY_ +#include +#include +#include + +typedef enum +{ + ZCL_SECURITY_STATUS_SUCCESS = 0x00, +#ifdef _CERTICOM_SECURITY_ + ZCL_SECURITY_STATUS_DISCOVERY_FAIL = 0x01, + ZCL_SECURITY_STATUS_APS_BINDING_FAIL = 0x02, + ZCL_SECURITY_STATUS_TIMEOUT = 0x03, + ZCL_SECURITY_STATUS_TERMINATED = 0x04, + ZCL_SECURITY_STATUS_SEND_COMMAND_FAIL = 0x05, + ZCL_SECURITY_STATUS_INVALID_SETTINGS = 0x06, +#endif //#ifdef _CERTICOM_SECURITY_ +} ZCL_SecurityStatus_t; + + +/*************************************************************************//** + Status of ZCL operation + \brief + Used to return status of ZCL operation. +*****************************************************************************/ +/* +typedef enum +{ + ZCL_SUCCESS_STATUS = 0x00, + ZCL_UNSUPPORTED_ATTRIBUTE_STATUS = 0x01, + ZCL_INVALID_ATTRIBUTE_VALUE_STATUS = 0x02, + ZCL_TC_PERMISSION_TABLE_ERROR_STATUS = 0x03, + ZCL_APS_LINK_KEY_ERROR_STATUS = 0x04 +} ZCL_Status_t; +*/ + +BEGIN_PACK + +typedef struct PACK +{ + ExtAddr_t addr; //! +#include + +#define CURRENT_SUMMATION_DELIVERED_ATTRIBUTE_ID 0x00 + +/*************************************************************************//** + \brief Simple Metering Cluster attributes amount +*****************************************************************************/ +#define SIMPLE_METERING_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 +#define SIMPLE_METERING_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 5 + +/*************************************************************************//** + \brief Simple Metering Cluster commands amount +*****************************************************************************/ +#define SIMPLE_METERING_CLUSTER_CLIENT_COMMANDS_AMOUNT 0 +#define SIMPLE_METERING_CLUSTER_SERVER_COMMANDS_AMOUNT 0 + +#define DEFINE_SIMPLE_METERING_SERVER_ATTRIBUTES(min, max) \ + DEFINE_REPORTABLE_ATTRIBUTE(currentSummationDelivered, ZCL_READONLY_ATTRIBUTE, CCPU_TO_LE16(0x0000), ZCL_U48BIT_DATA_TYPE_ID, min, max), \ + DEFINE_ATTRIBUTE(meterStatus, ZCL_READONLY_ATTRIBUTE, CCPU_TO_LE16(0x0200), ZCL_8BIT_BITMAP_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(unitofMeasure, ZCL_READONLY_ATTRIBUTE, CCPU_TO_LE16(0x0300), ZCL_8BIT_ENUM_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(summationFormatting, ZCL_READONLY_ATTRIBUTE, CCPU_TO_LE16(0x0303), ZCL_8BIT_BITMAP_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(meteringDeviceType, ZCL_READONLY_ATTRIBUTE, CCPU_TO_LE16(0x0306), ZCL_8BIT_ENUM_DATA_TYPE_ID) + +#define SIMPLE_METERING_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = SIMPLE_METERING_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = SIMPLE_METERING_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = SIMPLE_METERING_CLUSTER_CLIENT_COMMANDS_AMOUNT, \ + .commands = NULL \ + } + +#define SIMPLE_METERING_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = SIMPLE_METERING_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = SIMPLE_METERING_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = SIMPLE_METERING_CLUSTER_SERVER_COMMANDS_AMOUNT, \ + .commands = NULL \ + } + +#define DEFINE_SIMPLE_METERING_CLUSTER(cltype, clattributes, clcommands) SIMPLE_METERING_CLUSTER_##cltype(clattributes, clcommands) + +BEGIN_PACK + +/*************************************************************************//** + \brief ZCL Simple Metering Cluster Descriptor + + For internal use +*****************************************************************************/ +typedef struct PACK +{ + //!Reading information attribute set (Id = 0x00) + //!Current Summation Delivered Attribute descriptor + struct PACK + { + ZCL_AttributeId_t id; //! +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ +/** +* \brief server attributes amount +*/ +#define ZCL_TEMPERATURE_MEASUREMENT_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 3 + +/** +* \brief server commands amount +*/ +#define ZCL_TEMPERATURE_MEASUREMENT_CLUSTER_SERVER_COMMANDS_AMOUNT 0 + +/** +* \brief client attributes amount +*/ +#define ZCL_TEMPERATURE_MEASUREMENT_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 + +/** +* \brief client commands amount +*/ +#define ZCL_TEMPERATURE_MEASUREMENT_CLUSTER_CLIENT_COMMANDS_AMOUNT 0 + +/** +* \brief Supported attribue id +*/ +#define ZCL_TEMPERATURE_MEASUREMENT_CLUSTER_SERVER_MEASURED_VALUE_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) +#define ZCL_TEMPERATURE_MEASUREMENT_CLUSTER_SERVER_MIN_MEASURED_VALUE_ATTRIBUTE_ID CCPU_TO_LE16(0x0001) +#define ZCL_TEMPERATURE_MEASUREMENT_CLUSTER_SERVER_MAX_MEASURED_VALUE_ATTRIBUTE_ID CCPU_TO_LE16(0x0002) + +/** + * \brief server define attributes macros +*/ +#define ZCL_DEFINE_TEMPERATURE_MEASUREMENT_CLUSTER_SERVER_ATTRIBUTES(reportMin, reportMax) \ + DEFINE_REPORTABLE_ATTRIBUTE(measuredValue, ZCL_READONLY_ATTRIBUTE, ZCL_TEMPERATURE_MEASUREMENT_CLUSTER_SERVER_MEASURED_VALUE_ATTRIBUTE_ID, ZCL_S16BIT_DATA_TYPE_ID, reportMin, reportMax), \ + DEFINE_ATTRIBUTE(minMeasuredValue, ZCL_READONLY_ATTRIBUTE, ZCL_TEMPERATURE_MEASUREMENT_CLUSTER_SERVER_MIN_MEASURED_VALUE_ATTRIBUTE_ID, ZCL_S16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(maxMeasuredValue, ZCL_READONLY_ATTRIBUTE, ZCL_TEMPERATURE_MEASUREMENT_CLUSTER_SERVER_MAX_MEASURED_VALUE_ATTRIBUTE_ID, ZCL_S16BIT_DATA_TYPE_ID) + +#define ZCL_DEFINE_TEMPERATURE_MEASUREMENT_CLUSTER_SERVER(clattributes) \ + { \ + .id = TEMPERATURE_MEASUREMENT_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_TEMPERATURE_MEASUREMENT_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *) (clattributes), \ + .commandsAmount = ZCL_TEMPERATURE_MEASUREMENT_CLUSTER_SERVER_COMMANDS_AMOUNT, \ + .commands = NULL \ + } + +#define ZCL_DEFINE_TEMPERATURE_MEASUREMENT_CLUSTER_CLIENT() \ + { \ + .id = TEMPERATURE_MEASUREMENT_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_TEMPERATURE_MEASUREMENT_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = NULL, \ + .commandsAmount = ZCL_TEMPERATURE_MEASUREMENT_CLUSTER_CLIENT_COMMANDS_AMOUNT, \ + .commands = NULL \ + } + +/****************************************************************************** + Types section +******************************************************************************/ +BEGIN_PACK +typedef struct PACK { + struct PACK { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + int16_t value; + ZCL_ReportTime_t reportCounter; //! +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ + +/***************************************************************************//** +\brief Thermostat Cluster server attributes amount +*******************************************************************************/ + +#define ZCL_THERMOSTAT_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 5 + +/***************************************************************************//** +\brief Thermostat Cluster client attributes amount. Clinet doesn't have attributes +*******************************************************************************/ + +#define ZCL_THERMOSTAT_CLUSTER_CLIENT_ATTRIBTUES_AMOUNT 0 + +/***************************************************************************//** +\brief Thermostat Cluster commands amount +*******************************************************************************/ + +#define ZCL_THERMOSTAT_CLUSTER_COMMANDS_AMOUNT 1 + +/***************************************************************************//** +\brief Thermostat Cluster server's attributes identifiers +*******************************************************************************/ + +#define ZCL_THERMOSTAT_CLUSTER_LOCAL_TEMPERATURE_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) +#define ZCL_THERMOSTAT_CLUSTER_OCCUPIED_COOLING_SETPOINT_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0011) +#define ZCL_THERMOSTAT_CLUSTER_OCCUPIED_HEATING_SETPOINT_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0012) +#define ZCL_THERMOSTAT_CLUSTER_CONTROL_SEQUENCE_OF_OPERATION_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x001b) +#define ZCL_THERMOSTAT_CLUSTER_SYSTEM_MODE_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x001c) + +/***************************************************************************//** +\brief Thermostat Cluster client's command identifiers +*******************************************************************************/ + +#define ZCL_THERMOSTAT_CLUSTER_SETPOINT_RAISE_LOWER_COMMAND_ID 0x00 + +/***************************************************************************//** +\brief Thermostat Cluster server define attributes macros +*******************************************************************************/ + +#define ZCL_DEFINE_THERMOSTAT_CLUSTER_SERVER_ATTRIBUTES(min, max) \ + DEFINE_REPORTABLE_ATTRIBUTE(localTemperature, ZCL_READONLY_ATTRIBUTE, ZCL_THERMOSTAT_CLUSTER_LOCAL_TEMPERATURE_SERVER_ATTRIBUTE_ID, ZCL_S16BIT_DATA_TYPE_ID, min, max),\ + DEFINE_ATTRIBUTE(occupiedCoolingSetpoint, ZCL_READWRITE_ATTRIBUTE, ZCL_THERMOSTAT_CLUSTER_OCCUPIED_COOLING_SETPOINT_SERVER_ATTRIBUTE_ID, ZCL_S16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(occupiedHeatingSetpoint, ZCL_READWRITE_ATTRIBUTE, ZCL_THERMOSTAT_CLUSTER_OCCUPIED_HEATING_SETPOINT_SERVER_ATTRIBUTE_ID, ZCL_S16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(controlSequenceofOperation, ZCL_READWRITE_ATTRIBUTE, ZCL_THERMOSTAT_CLUSTER_CONTROL_SEQUENCE_OF_OPERATION_SERVER_ATTRIBUTE_ID, ZCL_8BIT_ENUM_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(systemMode, ZCL_READWRITE_ATTRIBUTE, ZCL_THERMOSTAT_CLUSTER_SYSTEM_MODE_SERVER_ATTRIBUTE_ID, ZCL_8BIT_ENUM_DATA_TYPE_ID) + + +/***************************************************************************//** +\brief Thermostat Cluster define commands macros +*******************************************************************************/ + +#define ZCL_DEFINE_THERMOSTAT_CLUSTER_COMMANDS(setpointCommandInd) \ + DEFINE_COMMAND(setpointCommand, ZCL_THERMOSTAT_CLUSTER_SETPOINT_RAISE_LOWER_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + setpointCommandInd) + + +/***************************************************************************//** +\brief Thermostat Cluster definition macros +*******************************************************************************/ + +#define THERMOSTAT_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = THERMOSTAT_CLUSTER_ID, \ + .options = { \ + .type = ZCL_CLIENT_CLUSTER_TYPE, \ + .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY, \ + }, \ + .attributesAmount = ZCL_THERMOSTAT_CLUSTER_CLIENT_ATTRIBTUES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_THERMOSTAT_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define THERMOSTAT_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = THERMOSTAT_CLUSTER_ID, \ + .options = { \ + .type = ZCL_SERVER_CLUSTER_TYPE, \ + .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY, \ + }, \ + .attributesAmount = ZCL_THERMOSTAT_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_THERMOSTAT_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define DEFINE_THERMOSTAT_CLUSTER(cltype, clattributes, clcommands) \ + THERMOSTAT_CLUSTER_##cltype(clattributes, clcommands) + +/****************************************************************************** + Types section +******************************************************************************/ +BEGIN_PACK + +/***************************************************************************//** +\brief Setpoint Raise/Lower Command Payload format +*******************************************************************************/ +typedef struct PACK +{ + int8_t mode; + int8_t amount; +} ZCL_SetpointRaiseLower_t; + +/***************************************************************************//** +\brief Thermostat Cluster server's attributes +*******************************************************************************/ + +typedef struct PACK +{ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + int16_t value; + ZCL_ReportTime_t reportCounter; //! +#include + + +/******************************************************************************* + Define(s) section +*******************************************************************************/ + +/***************************************************************************//** + \brief ZCL Time Cluster server side commands amount +*******************************************************************************/ +#define ZCL_TIME_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 2 +//The Time and TimeStatus attributes + +/***************************************************************************//** + \brief ZCL Time Cluster client side commands amount +*******************************************************************************/ +#define ZCL_TIME_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 +//There is no any attributes at client cluster side + +/***************************************************************************//** + \brief ZCL Time Cluster commands amount +*******************************************************************************/ +#define ZCL_TIME_CLUSTER_COMMANDS_AMOUNT 0 +//There is no any commands at client cluster side + + +//!ZCL Time Cluster server side Time attribute id +#define ZCL_TIME_CLUSTER_SERVER_TIME_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) +//!ZCL Time Cluster server side TimeStatus attribute id +#define ZCL_TIME_CLUSTER_SERVER_TIME_STATUS_ATTRIBUTE_ID CCPU_TO_LE16(0x0001) +//!ZCL Time Cluster server side TimeZone attribute id +#define ZCL_TIME_CLUSTER_SERVER_TIME_ZONE_ATTRIBUTE_ID CCPU_TO_LE16(0x0002) +//!ZCL Time Cluster server side DstStart attribute id +#define ZCL_TIME_CLUSTER_SERVER_DST_START_ATTRIBUTE_ID CCPU_TO_LE16(0x0003) +//!ZCL Time Cluster server side DstEnd attribute id +#define ZCL_TIME_CLUSTER_SERVER_DST_END_ATRIBUTE_ID CCPU_TO_LE16(0x0004) +//!ZCL Time Cluster server side DstShift attribute id +#define ZCL_TIME_CLUSTER_SERVER_DST_SHIFT_ATTRIBUTE_ID CCPU_TO_LE16(0x0005) +//!ZCL Time Cluster server side StandardTime attribute id +#define ZCL_TIME_CLUSTER_SERVER_STANDARD_TIME_ATTRIBUTE_ID CCPU_TO_LE16(0x0006) +//!ZCL Time Cluster server side LocalTime attribute id +#define ZCL__TIME_CLUSTER_SERVER_LOCAL_TIME_ATTRIBUTE_ID CCPU_TO_LE16(0x0007) + + +/***************************************************************************//** + \brief ZCL Time Cluster server side attributes defining macros + + This macros should be used for ZCL Time Cluster server side attributes defining. + + \return None + + \internal + //The typical usage is: + //Time Cluster server side related attributes + ZCL_TimeClusterServerAttributes_t timeClusterAttributes = ZCL_DEFINE_TIME_CLUSTER_SERVER_ATTRIBUTES(); +*******************************************************************************/ +#define ZCL_DEFINE_TIME_CLUSTER_SERVER_ATTRIBUTES() \ + DEFINE_ATTRIBUTE(time, ZCL_READWRITE_ATTRIBUTE, ZCL_TIME_CLUSTER_SERVER_TIME_ATTRIBUTE_ID, ZCL_UTC_TIME_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(timeStatus, ZCL_READWRITE_ATTRIBUTE, ZCL_TIME_CLUSTER_SERVER_TIME_STATUS_ATTRIBUTE_ID, ZCL_8BIT_BITMAP_DATA_TYPE_ID) \ + +/***************************************************************************//** + \brief ZCL Time Cluster server side defining macros + + This macros should be used with #DEFINE_ZCL_TIME_CLUSTER_SERVER_ATTRIBUTES for + ZCL Time Cluster server side defining in application. + + \param attributes - pointer to cluster server attributes (ZCL_TimeClusterServerAttributes_t) + + \return None + + \internal + //The typical code is: + //Time Cluster server side related attributes + ZCL_TimeClusterServerAttributes_t timeClusterServerAttributes = DEFINE_ZCL_TIME_CLUSTER_SERVER_ATTRIBUTES(); + ZCL_Cluster_t myClusters[] = + { + ZCL_DEFINE_TIME_CLUSTER_SERVER(&timeClusterServerAttributes), + //... Any other cluster defining ... + } +*******************************************************************************/ +#define TIME_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = TIME_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_TIME_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *) clattributes, \ + .commandsAmount = ZCL_TIME_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *) clcommands \ + } + +/***************************************************************************//** + \brief ZCL Time Cluster client side defining macros + + This macros should be used for ZCL Time Cluster client side defining in application. + + \return None + + \internal + //The typical code is: + ZCL_Cluster_t myClusters[] = + { + ZCL_DEFINE_TIME_CLUSTER_CLIENT(), + //... Any other cluster defining ... + } +*******************************************************************************/ +#define TIME_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = TIME_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY }, \ + .attributesAmount = ZCL_TIME_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *) clattributes, \ + .commandsAmount = ZCL_TIME_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *) clcommands \ + } + +#define DEFINE_TIME_CLUSTER(cltype, clattributes, clcommands) TIME_CLUSTER_##cltype(clattributes, clcommands) + +/******************************************************************************* + Types section +*******************************************************************************/ + +BEGIN_PACK +/***************************************************************************//** + \brief + ZCL Time Cluster attributes +*******************************************************************************/ +typedef struct PACK +{ + /*! + \brief Time attribute (R/W, M) + + The Time attribute is 32-bits in length and holds the time value of a real time + clock. This attribute has data type UTCTime, but note that it may not actually be + synchronised to UTC - see discussion of the TimeStatus attribute below. + If the Master bit of the TimeStatus attribute has a value of 0, writing to this + attribute shall set the real time clock to the written value, otherwise it cannot be + written. The value 0xffffffff indicates an invalid time. + */ + struct PACK + { + ZCL_AttributeId_t id; //! +#include +#include +#include + +/****************************************************************************** + Definitions section +******************************************************************************/ +/* Default network parameters, for debug purpose */ +#define ZCL_ZLL_DEFAULT_WORKING_CHANNEL 0x0f + +/* ZLL Profile Constants */ +#define APLC_INTERPAN_TRANS_ID_LIFE_TIME 8000 // aplcInterPANTransIdLifeTime +#define APLC_MAX_PERMIT_JOIN_DURATION 60000 // aplcMaxPermitJoinDuration +#define APLC_MIN_STARTUP_DELAY_TIME 2000 // aplcMinStartupDelayTime +#define APLC_RX_WINDOW_DURATIO 5000 // aplcRxWindowDuration +#define APLC_SCAN_TIMEBASE_DURATION 250 // aplcScanTimeBaseDuration + +/****************************************************************************** + Types section +******************************************************************************/ +typedef enum _ZCL_ZllStatus_t +{ + ZCL_ZLL_SUCCESS_STATUS = 0x00, + ZCL_ZLL_SCAN_RESULT_STATUS = 0xf0, + ZCL_ZLL_SCAN_FINISHED_STATUS = 0xf1, + ZCL_ZLL_SCAN_ABORTED_STATUS = 0xf2, + ZCL_ZLL_IDENTIFY_START_STATUS = 0xf3, + ZCL_ZLL_IDENTIFY_STOP_STATUS = 0xf4, + ZCL_ZLL_INVALID_SCENARIO_STATUS = 0xf5, +} ZCL_ZllStatus_t; + +/****************************************************************************** + Prototypes section +******************************************************************************/ + +/**************************************************************************//** +\brief Reset the ZLL layer + +This function should be called prior to using any ZLL features. The only +function called before ZLL reset is ZCL_ZllIbSetAppData(), which provides +memory that will be used to store application data. + +The function restores ZLL and stack parameters from EEPROM as well as +applicaiton data. +******************************************************************************/ +void ZCL_ZllReset(void); + +/**************************************************************************//** +\brief Get next output sequence number +\returns next output sequence number. +******************************************************************************/ +uint8_t ZCL_ZllGetSeq(void); + +/**************************************************************************//** +\brief Generate new Transaction Identifier and start transaction timer for it +******************************************************************************/ +void ZCL_ZllGenerateTransactionId(void); + +/**************************************************************************//** +\brief Get current Transaction Identifier +\returns Current Transaction Identifier. +******************************************************************************/ +uint32_t ZCL_ZllTransactionId(void); + +/**************************************************************************//** +\brief Generate new Response Identifier +******************************************************************************/ +void ZCL_ZllGenerateResponseId(void); + +/**************************************************************************//** +\brief Set Response Identifier to specified value +\param[in] rid - Response Identifier value to be set +******************************************************************************/ +void ZCL_ZllSetResponseId(uint32_t rid); + +/**************************************************************************//** +\brief Get current Response Identifier +\returns Current Response Identifier. +******************************************************************************/ +uint32_t ZCL_ZllResponseId(void); + +/**************************************************************************//** +\brief Get other device's address (after Scan Request has been received) +\returns Other device's extended address. +******************************************************************************/ +uint64_t ZCL_ZllOtherDeviceAddress(void); + +/**************************************************************************//** +\brief Check if Scan Response has already been received from the device +\returns true if Scan Response has already been received from the device. +******************************************************************************/ +bool ZCL_ZllDublicateRejection(ExtAddr_t ieee); + +/**************************************************************************//** +\brief Assign a new address from the range of free addresses +\returns Newly assigned address or 0 in case of an error. +******************************************************************************/ +ShortAddr_t ZCL_ZllAssignAddress(void); + +/**************************************************************************//** +\brief Assign a new group ID from the range of free group IDs +\returns Newly assigned group ID or 0 in case of an error. +******************************************************************************/ +uint16_t ZCL_ZllAssignGroupId(void); + +/**************************************************************************//** +\brief Check if the device is in the Factory New state + +A router in ZLL applications loses its factory new state after it receives the +ZLL start network request during commissioning. An end device becomes not a +factory new device after it commissions the first router, thus creating its own +network, or joins an existing network through another end device (this is called +touch link between end devices). + +The application may switch a device back to the factory new state by calling the +ZCL_ZllResetToFactoryNewRequest() function. + +\returns Factory New status: \c true if the device is in the Factory New state +******************************************************************************/ +bool ZCL_ZllIsFactoryNew(void); + +/**************************************************************************//** +\brief Get other device's address (after Scan Request has been received) +\param[in] header - pointer to the header to be filled +\param[in] commandId - command ID to be set in the header +******************************************************************************/ +void zclZllFillFrameHeader(ZclZllFrameHeader_t *header, ZclZllCommandId_t commandId); + +#endif // _ZCLZLL_H + +// eof zclZll.h diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllBasicCluster.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllBasicCluster.h new file mode 100644 index 00000000..1c74eddb --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllBasicCluster.h @@ -0,0 +1,308 @@ +/***************************************************************************//** + \file zclZllBasicCluster.h + + \brief + The header file describes the ZLL Basic Cluster and its interface + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 03.01.09 A. Potashov - Created. +*******************************************************************************/ + +#ifndef _ZCLZLLBASICCLUSTER_H +#define _ZCLZLLBASICCLUSTER_H + +/*! +Attributes and commands for determining basic information about a device, +setting user device information such as location, enabling a device and resetting it +to factory defaults. +*/ + +/******************************************************************************* + Includes section +*******************************************************************************/ + +#include +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ + +/***************************************************************************//** + \brief ZCL Basic Cluster server side commands amount +*******************************************************************************/ +#define ZCL_BASIC_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 9 +//The ZCLVersion and PowerSource attributes + +/***************************************************************************//** + \brief ZCL Basic Cluster derver side commands amount +*******************************************************************************/ +#define ZCL_BASIC_CLUSTER_SERVER_COMMANDS_AMOUNT 0 +//There are no any commands at the server side + +/***************************************************************************//** + \brief ZCL Basic Cluster client side commands amount +*******************************************************************************/ +#define ZCL_BASIC_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 +//There are no any attributes at the client side + +/***************************************************************************//** + \brief ZCL Basic Cluster derver side commands amount +*******************************************************************************/ +#define ZCL_BASIC_CLUSTER_CLIENT_COMMANDS_AMOUNT 0 +//There are no any commands at the client side + + +//Atribute Ids of Basic Device Information Attribute Set at the server side +//!ZCL Basic Cluster server side ZCLVersion attribute id +#define ZCL_BASIC_CLUSTER_SERVER_ZCL_VERSION_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) +//!ZCL Basic Cluster server side ApplicationVersion attribute id +#define ZCL_BASIC_CLUSTER_SERVER_APPLICATION_VERSION_ATTRIBUTE_ID CCPU_TO_LE16(0x0001) +//!ZCL Basic Cluster server side StackVersion attribute id +#define ZCL_BASIC_CLUSTER_SERVER_STACK_VERSION_ATTRIBUTE_ID CCPU_TO_LE16(0x0002) +//!ZCL Basic Cluster server side HWVersion attribute id +#define ZCL_BASIC_CLUSTER_SERVER_HW_VERSION_ATTRIBUTE_ID CCPU_TO_LE16(0x0003) +//!ZCL Basic Cluster server side ManufacturerName attribute id +#define ZCL_BASIC_CLUSTER_SERVER_MANUFACTURER_NAME_ATTRIBUTE_ID CCPU_TO_LE16(0x0004) +//!ZCL Basic Cluster server side ModelIdentifier attribute id +#define ZCL_BASIC_CLUSTER_SERVER_MODEL_IDENTIFIER_ATTRIBUTE_ID CCPU_TO_LE16(0x0005) +//!ZCL Basic Cluster server side DateCode attribute id +#define ZCL_BASIC_CLUSTER_SERVER_DATE_CODE_ATTRIBUTE_ID CCPU_TO_LE16(0x0006) +//!ZCL Basic Cluster server side PowerSource attribute id +#define ZCL_BASIC_CLUSTER_SERVER_POWER_SOURCE_ATTRIBUTE_ID CCPU_TO_LE16(0x0007) + +//Atribute Ids of Basic Device Settings Attribute Set at the server side +//!ZCL Basic Cluster server side LocationDescription attribute id +#define ZCL_BASIC_CLUSTER_SERVER_LOCATION_DESCRIPTION_ATTRIBUTE_ID CCPU_TO_LE16(0x0010) +//!ZCL Basic Cluster server side PhysicalEnvironment attribute id +#define ZCL_BASIC_CLUSTER_SERVER_PHYSICAL_ENVIRONMENT_ATTRIBUTE_ID CCPU_TO_LE16(0x0011) +//!ZCL Basic Cluster server side DeviceEnabled attribute id +#define ZCL_BASIC_CLUSTER_SERVER_DEVICE_ENABLED_ATTRIBUTE_ID CCPU_TO_LE16(0x0012) +//!ZCL Basic Cluster server side AlarmMask attribute id +#define ZCL_BASIC_CLUSTER_SERVER_ALARM_MASK_ATTRIBUTE_ID CCPU_TO_LE16(0x0013) + +//!ZLL Basic Cluster server side SWBuildID attribute id +#define ZCL_BASIC_CLUSTER_SERVER_SW_BUILD_ID_ATTRIBUTE_ID CCPU_TO_LE16(0x4000) + +//!ZCL Basic Cluster server side ResetToFactoryDeafaults commabd id +#define ZCL_BASIC_CLUSTER_SERVER_RESET_TO_FACTORY_DEFAULTS_COMMAND_ID 0x00 + +/******************************************************************************* + Types section +*******************************************************************************/ + +/***************************************************************************//** + \brief ZCL Basic Cluster server side attributes defining macros + + This macros should be used for ZCL Basic Cluster server side attributes defining. + + \return None + + \internal + //The typical usage is: + //Basic Cluster server side related attributes + ZCL_BasicClusterServerAttributes_t basicClusterAttributes = ZCL_DEFINE_BASIC_CLUSTER_SERVER_ATTRIBUTES(); +*******************************************************************************/ +#define ZCL_DEFINE_BASIC_CLUSTER_SERVER_ATTRIBUTES() \ + DEFINE_ATTRIBUTE(zclVersion, ZCL_READONLY_ATTRIBUTE, ZCL_BASIC_CLUSTER_SERVER_ZCL_VERSION_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID),\ + DEFINE_ATTRIBUTE(applicationVersion, ZCL_READONLY_ATTRIBUTE, ZCL_BASIC_CLUSTER_SERVER_APPLICATION_VERSION_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(stackVersion, ZCL_READONLY_ATTRIBUTE, ZCL_BASIC_CLUSTER_SERVER_STACK_VERSION_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(hwVersion, ZCL_READONLY_ATTRIBUTE, ZCL_BASIC_CLUSTER_SERVER_HW_VERSION_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(manufacturerName, ZCL_READONLY_ATTRIBUTE, ZCL_BASIC_CLUSTER_SERVER_MANUFACTURER_NAME_ATTRIBUTE_ID, ZCL_OCTET_STRING_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(modelIdentifier, ZCL_READONLY_ATTRIBUTE, ZCL_BASIC_CLUSTER_SERVER_MODEL_IDENTIFIER_ATTRIBUTE_ID, ZCL_OCTET_STRING_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(dateCode, ZCL_READONLY_ATTRIBUTE, ZCL_BASIC_CLUSTER_SERVER_DATE_CODE_ATTRIBUTE_ID, ZCL_OCTET_STRING_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(powerSource, ZCL_READONLY_ATTRIBUTE, ZCL_BASIC_CLUSTER_SERVER_POWER_SOURCE_ATTRIBUTE_ID, ZCL_8BIT_ENUM_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(swBuildId, ZCL_READONLY_ATTRIBUTE, ZCL_BASIC_CLUSTER_SERVER_SW_BUILD_ID_ATTRIBUTE_ID, ZCL_OCTET_STRING_DATA_TYPE_ID) + +/***************************************************************************//** + \brief ZCL Basic Cluster server side defining macros + + This macros should be used with #ZCL_DEFINE_BASIC_CLUSTER_SERVER_ATTRIBUTES for + ZCL Basic Cluster server side defining in application. + + \param attributes - pointer to cluster server attributes (ZCL_BasicClusterServerAttributes_t) + + \return None + + \internal + //The typical code is: + //Basic Cluster server side related attributes + ZCL_BasicClusterServerAttributes_t basicClusterServerAttributes = DEFINE_ZCL_BASIC_CLUSTER_SERVER_ATTRIBUTES(); + ZCL_Cluster_t myClusters[] = + { + ZCL_DEFINE_BASIC_CLUSTER_SERVER(&basicClusterServerAttributes), + //... Any other cluster defining ... + } +*******************************************************************************/ +#define ZCL_DEFINE_BASIC_CLUSTER_SERVER(clattributes) \ + { \ + .id = BASIC_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_BASIC_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *) clattributes, \ + .commandsAmount = ZCL_BASIC_CLUSTER_SERVER_COMMANDS_AMOUNT, \ + .commands = NULL \ + } + +/***************************************************************************//** + \brief ZCL Basic Cluster client side defining macros + + This macros should be used for ZCL Basic Cluster client side defining in application. + + \return None + + \internal + //The typical code is: + ZCL_Cluster_t myClusters[] = + { + ZCL_DEFINE_BASIC_CLUSTER_CLIENT(), + //... Any other cluster defining ... + } +*******************************************************************************/ +#define ZCL_DEFINE_BASIC_CLUSTER_CLIENT() \ + { \ + .id = BASIC_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY, .ackRequest = 1}, \ + .attributesAmount = ZCL_BASIC_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = NULL, \ + .commandsAmount = ZCL_BASIC_CLUSTER_CLIENT_COMMANDS_AMOUNT, \ + .commands = NULL \ + } + + +BEGIN_PACK +/***************************************************************************//** + \brief + ZCL Basic Cluster server side attributes +*******************************************************************************/ +typedef struct PACK +{ + //!Basic Device Information attribute set (Id == 0x00) + + /*!ZCL Version attribute (Read only, M) + The ZCLVersion attribute is 8-bits in length and specifies the version number of + the ZigBee Cluster Library that all clusters on this endpoint conform to. For the + initial version of the ZCL, this attribute shall be set to 0x01. + */ + struct PACK + { + ZCL_AttributeId_t id; //! +#include + +/****************************************************************************** + Defines section +******************************************************************************/ + +/** + * \brief ZLL Server Cluster attributes amount. +*/ +#define ZCL_COLOR_CONTROL_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 32 + +/** + * \brief ZLL Client Cluster attributes amount. +*/ +#define ZCL_COLOR_CONTROL_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 + +/** + * \brief ZLL Cluster server's attributes identifiers +*/ + +#define ZCL_ZLL_CLUSTER_CURRENT_HUE_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) +#define ZCL_ZLL_CLUSTER_CURRENT_SATURATION_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0001) +#define ZCL_ZLL_CLUSTER_REMAINING_TIME_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0002) +#define ZCL_ZLL_CLUSTER_CURRENT_X_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0003) +#define ZCL_ZLL_CLUSTER_CURRENT_Y_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0004) +#define ZCL_ZLL_CLUSTER_COLOR_MODE_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0008) +#define ZCL_ZLL_CLUSTER_NUMBER_OF_PRIMARIES_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0010) +#define ZCL_ZLL_CLUSTER_PRIMARY_1_X_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0011) +#define ZCL_ZLL_CLUSTER_PRIMARY_1_Y_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0012) +#define ZCL_ZLL_CLUSTER_PRIMARY_1_INTENSITY_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0013) +#define ZCL_ZLL_CLUSTER_PRIMARY_2_X_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0015) +#define ZCL_ZLL_CLUSTER_PRIMARY_2_Y_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0016) +#define ZCL_ZLL_CLUSTER_PRIMARY_2_INTENSITY_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0017) +#define ZCL_ZLL_CLUSTER_PRIMARY_3_X_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0019) +#define ZCL_ZLL_CLUSTER_PRIMARY_3_Y_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x001A) +#define ZCL_ZLL_CLUSTER_PRIMARY_3_INTENSITY_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x001B) +#define ZCL_ZLL_CLUSTER_PRIMARY_4_X_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0020) +#define ZCL_ZLL_CLUSTER_PRIMARY_4_Y_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0021) +#define ZCL_ZLL_CLUSTER_PRIMARY_4_INTENSITY_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0022) +#define ZCL_ZLL_CLUSTER_PRIMARY_5_X_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0024) +#define ZCL_ZLL_CLUSTER_PRIMARY_5_Y_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0025) +#define ZCL_ZLL_CLUSTER_PRIMARY_5_INTENSITY_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0026) +#define ZCL_ZLL_CLUSTER_PRIMARY_6_X_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0028) +#define ZCL_ZLL_CLUSTER_PRIMARY_6_Y_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0029) +#define ZCL_ZLL_CLUSTER_PRIMARY_6_INTENSITY_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x002A) +/* Additional attributes */ +#define ZCL_ZLL_CLUSTER_ENHANCED_CURRENT_HUE_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x4000) +#define ZCL_ZLL_CLUSTER_ENHANCED_COLOR_MODE_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x4001) +#define ZCL_ZLL_CLUSTER_COLOR_LOOP_ACTIVE_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x4002) +#define ZCL_ZLL_CLUSTER_COLOR_LOOP_DIRECTION_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x4003) +#define ZCL_ZLL_CLUSTER_COLOR_LOOP_TIME_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x4004) +#define ZCL_ZLL_CLUSTER_COLOR_LOOP_START_ENHANCED_HUE_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x4005) +#define ZCL_ZLL_CLUSTER_COLOR_LOOP_STOP_ENHANCED_HUE_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x4006) + +#define DEFINE_COLOR_CONTROL_CLUSTER_ATTRIBUTES() \ + DEFINE_ATTRIBUTE(currentHue, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_CURRENT_HUE_SERVER_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(currentSaturation, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_CURRENT_SATURATION_SERVER_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(remainingTime, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_REMAINING_TIME_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(currentX, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_CURRENT_X_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(currentY, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_CURRENT_Y_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(colorMode, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_COLOR_MODE_SERVER_ATTRIBUTE_ID, ZCL_8BIT_ENUM_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(numberOfPrimaries, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_NUMBER_OF_PRIMARIES_SERVER_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary1X, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_1_X_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary1Y, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_1_Y_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary1XIntensity, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_1_INTENSITY_SERVER_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary2X, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_2_X_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary2Y, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_2_Y_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary2XIntensity, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_2_INTENSITY_SERVER_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary3X, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_3_X_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary3Y, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_3_Y_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary3XIntensity, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_3_INTENSITY_SERVER_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary4X, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_4_X_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary4Y, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_4_Y_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary4XIntensity, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_4_INTENSITY_SERVER_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary5X, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_5_X_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary5Y, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_5_Y_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary5XIntensity, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_5_INTENSITY_SERVER_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary6X, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_6_X_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary6Y, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_6_Y_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(primary6XIntensity, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_PRIMARY_6_INTENSITY_SERVER_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(enhancedCurrentHue, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_ENHANCED_CURRENT_HUE_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(enhancedColorMode, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_ENHANCED_COLOR_MODE_SERVER_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(colorLoopActive, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_COLOR_LOOP_ACTIVE_SERVER_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(colorLoopDirection, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_COLOR_LOOP_DIRECTION_SERVER_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(colorLoopTime, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_COLOR_LOOP_TIME_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(colorLoopStartEnhancedHue, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_COLOR_LOOP_START_ENHANCED_HUE_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(colorLoopStopEnhancedHue, ZCL_READONLY_ATTRIBUTE, ZCL_ZLL_CLUSTER_COLOR_LOOP_STOP_ENHANCED_HUE_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID) + +/** + * \brief ZLL Client Cluster commands amount. +*/ +#define ZCL_COLOR_CONTROL_CLUSTER_COMMANDS_AMOUNT 16 + +/** + * \brief ZLL Client Cluster commands identifiers. +*/ +#define MOVE_TO_HUE_COMMAND_ID 0x00 +#define MOVE_HUE_COMMAND_ID 0x01 +#define STEP_HUE_COMMAND_ID 0x02 +#define MOVE_TO_SATURATION_COMMAND_ID 0x03 +#define MOVE_SATURATION_COMMAND_ID 0x04 +#define STEP_SATURATION_COMMAND_ID 0x05 +#define MOVE_TO_HUE_AND_SATURATION_COMMAND_ID 0x06 +#define MOVE_TO_COLOR_COMMAND_ID 0x07 +#define MOVE_COLOR_COMMAND_ID 0x08 +#define STEP_COLOR_COMMAND_ID 0x09 +/* Additional commands */ +#define ENHANCED_MOVE_TO_HUE_COMMAND_ID 0x40 +#define ENHANCED_MOVE_HUE_COMMAND_ID 0x41 +#define ENHANCED_STEP_HUE_COMMAND_ID 0x42 +#define ENHANCED_MOVE_TO_HUE_AND_SATURATION_COMMAND_ID 0x43 +#define COLOR_LOOP_SET_COMMAND_ID 0x44 +#define STOP_MOVE_STEP_COMMAND_ID 0x47 + + +#define ZCL_COLOR_CONTROL_CLUSTER_COMMANDS(moveToHueInd, \ + moveHueInd, \ + stepHueInd, \ + moveToSaturationInd, \ + moveSaturationInd, \ + stepSaturationInd, \ + moveToHueAndSaturationInd, \ + moveToColorInd, \ + moveColorInd, \ + stepColorInd, \ + enhancedMoveToHueInd, \ + enhancedMoveHueInd, \ + enhancedStepHueInd, \ + enhancedMoveToHueAndSaturationInd, \ + colorLoopSetInd, \ + stopMoveStepInd) \ + DEFINE_COMMAND(moveToHueCommand, MOVE_TO_HUE_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), moveToHueInd), \ + DEFINE_COMMAND(moveHueCommand, MOVE_HUE_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), moveHueInd), \ + DEFINE_COMMAND(stepHueCommand, STEP_HUE_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), stepHueInd), \ + DEFINE_COMMAND(moveToSaturationCommand, MOVE_TO_SATURATION_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), moveToSaturationInd), \ + DEFINE_COMMAND(moveSaturationCommand, MOVE_SATURATION_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), moveSaturationInd), \ + DEFINE_COMMAND(stepSaturationCommand, STEP_SATURATION_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), stepSaturationInd), \ + DEFINE_COMMAND(moveToHueAndSaturationCommand, MOVE_TO_HUE_AND_SATURATION_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), moveToHueAndSaturationInd), \ + DEFINE_COMMAND(moveToColorCommand, MOVE_TO_COLOR_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), moveToColorInd), \ + DEFINE_COMMAND(moveColorCommand, MOVE_COLOR_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), moveColorInd), \ + DEFINE_COMMAND(stepColorCommand, STEP_COLOR_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), stepColorInd), \ + DEFINE_COMMAND(enhancedMoveToHueCommand, ENHANCED_MOVE_TO_HUE_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), enhancedMoveToHueInd), \ + DEFINE_COMMAND(enhancedMoveHueCommand, ENHANCED_MOVE_HUE_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), enhancedMoveHueInd), \ + DEFINE_COMMAND(enhancedStepHueCommand, ENHANCED_STEP_HUE_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), enhancedStepHueInd), \ + DEFINE_COMMAND(enhancedMoveToHueAndSaturationCommand, ENHANCED_MOVE_TO_HUE_AND_SATURATION_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), enhancedMoveToHueAndSaturationInd), \ + DEFINE_COMMAND(colorLoopSetCommand, COLOR_LOOP_SET_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), colorLoopSetInd), \ + DEFINE_COMMAND(stopMoveStepCommand, STOP_MOVE_STEP_COMMAND_ID, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), stopMoveStepInd) + +#define ZLL_COLOR_CONTROL_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = COLOR_CONTROL_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_COLOR_CONTROL_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_COLOR_CONTROL_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ + } + +#define ZLL_COLOR_CONTROL_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = COLOR_CONTROL_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_COLOR_CONTROL_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_COLOR_CONTROL_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ + } +#define DEFINE_COLOR_CONTROL_CLUSTER(cltype, clattributes, clcommands) ZLL_COLOR_CONTROL_CLUSTER_##cltype(clattributes, clcommands) + +/****************************************************************************** + Types section +******************************************************************************/ + +BEGIN_PACK +/***************************************************************************//** + \brief + ZCL Color Control Cluster server side attributes +*******************************************************************************/ +typedef struct PACK +{ + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } currentHue; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } currentSaturation; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } remainingTime; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } currentX; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } currentY; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } colorMode; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } numberOfPrimaries; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } primary1X; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } primary1Y; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } primary1XIntensity; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } primary2X; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } primary2Y; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } primary2XIntensity; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } primary3X; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } primary3Y; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } primary3XIntensity; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } primary4X; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } primary4Y; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } primary4XIntensity; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } primary5X; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } primary5Y; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } primary5XIntensity; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } primary6X; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } primary6Y; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } primary6XIntensity; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } enhancedCurrentHue; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } enhancedColorMode; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } colorLoopActive; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } colorLoopDirection; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } colorLoopTime; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } colorLoopStartEnhancedHue; + + /*!TBD + */ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } colorLoopStopEnhancedHue; + +} ZCL_ColorControlClusterServerAttributes_t; + +END_PACK + +/** + * \brief MoveToHue command direction values +*/ +typedef enum _ZCL_ZllMoveToHueDirection_t +{ + ZCL_ZLL_MOVE_TO_HUE_DIRECTION_SHORTEST_DISTANCE = 0x00, + ZCL_ZLL_MOVE_TO_HUE_DIRECTION_LONGEST_DISTANCE = 0x01, + ZCL_ZLL_MOVE_TO_HUE_DIRECTION_UP = 0x02, + ZCL_ZLL_MOVE_TO_HUE_DIRECTION_DOWN = 0x03, +} ZCL_ZllMoveToHueDirection_t; + +/** + * \brief MoveHue command moveMode values +*/ +typedef enum _ZCL_ZllMoveHueMoveMode_t +{ + ZCL_ZLL_MOVE_HUE_MOVE_MODE_STOP = 0x00, + ZCL_ZLL_MOVE_HUE_MOVE_MODE_UP = 0x01, + ZCL_ZLL_MOVE_HUE_MOVE_MODE_DOWN = 0x03, +} ZCL_ZllMoveHueMoveMode_t; + +/** + * \brief StepHue command stepMode values +*/ +typedef enum _ZCL_ZllStepHueStepMode_t +{ + ZCL_ZLL_STEP_HUE_STEP_MODE_UP = 0x01, + ZCL_ZLL_STEP_HUE_STEP_MODE_DOWN = 0x03, +} ZCL_ZllStepHueStepMode_t; + +/** + * \brief MoveSaturation command moveMode values +*/ +typedef enum _ZCL_ZllMoveSaturationMoveMode_t +{ + ZCL_ZLL_MOVE_SATURATION_MOVE_MODE_STOP = 0x00, + ZCL_ZLL_MOVE_SATURATION_MOVE_MODE_UP = 0x01, + ZCL_ZLL_MOVE_SATURATION_MOVE_MODE_DOWN = 0x03, +} ZCL_ZllMoveSaturationMoveMode_t; + +/** + * \brief StepSaturation command stepMode values +*/ +typedef enum _ZCL_ZllStepSaturationStepMode_t +{ + ZCL_ZLL_STEP_SATURATION_STEP_MODE_UP = 0x01, + ZCL_ZLL_STEP_SATURATION_STEP_MODE_DOWN = 0x03, +} ZCL_ZllStepSaturationStepMode_t; + +/** + * \brief ColorLoopSet command action values +*/ +typedef enum _ZCL_ZllColorLoopSetAction_t +{ + ZCL_ZLL_COLOR_LOOP_SET_ACTION_DEACTIVATE = 0x00, + ZCL_ZLL_COLOR_LOOP_SET_ACTION_ACTIVATE = 0x01, + ZCL_ZLL_COLOR_LOOP_SET_ACTION_ACTIVATE_ENHANCED = 0x02, +} ZCL_ZllColorLoopSetAction_t; + +/** + * \brief ColorLoopSet command direction values +*/ +typedef enum _ZCL_ZllColorLoopSetDirection_t +{ + ZCL_ZLL_COLOR_LOOP_SET_DIRECTION_DECREMENT_HUE = 0x00, + ZCL_ZLL_COLOR_LOOP_SET_DIRECTION_INCREMENT_HUE = 0x01, +} ZCL_ZllColorLoopSetDirection_t; + +/** + * \brief EnhancedColorMode values +*/ +typedef enum _ZCL_ZllEnhancedColorMode_t +{ + ZCL_ZLL_CURRENT_HUE_AND_CURRENT_SATURATION = 0x00, + ZCL_ZLL_CURRENT_X_AND_CURRENT_Y = 0x01, + ZCL_ZLL_COLOR_TEMPERATURE = 0x02, + ZCL_ZLL_ENHANCED_CURRENT_HUE_AND_CURRENT_SATURATION = 0x03, +} ZCL_ZllEnhancedColorMode_t; + +BEGIN_PACK +/** + * \brief MoveToHue command payload format +*/ +typedef struct PACK _ZCL_ZllMoveToHueCommand_t +{ + uint8_t hue; + uint8_t direction; + uint16_t transitionTime; +} ZCL_ZllMoveToHueCommand_t; + +/** + * \brief MoveHue command payload format +*/ +typedef struct PACK _ZCL_ZllMoveHueCommand_t +{ + uint8_t moveMode; + uint8_t rate; +} ZCL_ZllMoveHueCommand_t; + +/** + * \brief StepHue command payload format +*/ +typedef struct PACK _ZCL_ZllStepHueCommand_t +{ + uint8_t stepMode; + uint8_t stepSize; + uint8_t transitionTime; /* uint16_t ? */ +} ZCL_ZllStepHueCommand_t; + +/** + * \brief MoveToSaturation command payload format +*/ +typedef struct PACK _ZCL_ZllMoveToSaturationCommand_t +{ + uint8_t saturation; + uint16_t transitionTime; +} ZCL_ZllMoveToSaturationCommand_t; + +/** + * \brief MoveSaturation command payload format +*/ +typedef struct PACK _ZCL_ZllMoveSaturationCommand_t +{ + uint8_t moveMode; + uint8_t rate; +} ZCL_ZllMoveSaturationCommand_t; + +/** + * \brief StepSaturation command payload format +*/ +typedef struct PACK _ZCL_ZllStepSaturationCommand_t +{ + uint8_t stepMode; + uint8_t stepSize; + uint8_t transitionTime; /* uint16_t ? */ +} ZCL_ZllStepSaturationCommand_t; + +/** + * \brief MoveToHueAndSaturation command payload format +*/ +typedef struct PACK _ZCL_ZllMoveToHueAndSaturationCommand_t +{ + uint8_t hue; + uint8_t saturation; + uint16_t transitionTime; +} ZCL_ZllMoveToHueAndSaturationCommand_t; + +/** + * \brief MoveToColor command payload format +*/ +typedef struct PACK _ZCL_ZllMoveToColorCommand_t +{ + uint16_t colorX; + uint16_t colorY; + uint16_t transitionTime; +} ZCL_ZllMoveToColorCommand_t; + +/** + * \brief MoveColor command payload format +*/ +typedef struct PACK _ZCL_ZllMoveColorCommand_t +{ + int16_t rateX; + int16_t rateY; +} ZCL_ZllMoveColorCommand_t; + +/** + * \brief StepColor command payload format +*/ +typedef struct PACK _ZCL_ZllStepColorCommand_t +{ + int16_t stepX; + int16_t stepY; + uint16_t transitionTime; +} ZCL_ZllStepColorCommand_t; + +/** + * \brief EnhancedMoveToHue command payload format +*/ +typedef struct PACK _ZCL_ZllEnhancedMoveToHueCommand_t +{ + uint16_t enhancedHue; + uint8_t direction; + uint16_t transitionTime; +} ZCL_ZllEnhancedMoveToHueCommand_t; + +/** + * \brief EnhancedMoveHue command payload format +*/ +typedef struct PACK _ZCL_ZllEnhancedMoveHueCommand_t +{ + uint8_t moveMode; + uint16_t rate; +} ZCL_ZllEnhancedMoveHueCommand_t; + +/** + * \brief EnhancedStepHue command payload format +*/ +typedef struct PACK _ZCL_ZllEnhancedStepHueCommand_t +{ + uint8_t stepMode; + uint16_t stepSize; + uint16_t transitionTime; +} ZCL_ZllEnhancedStepHueCommand_t; + +/** + * \brief EnhancedMoveToHueAndSaturation command payload format +*/ +typedef struct PACK _ZCL_ZllEnhancedMoveToHueAndSaturationCommand_t +{ + uint16_t enhancedHue; + uint8_t saturation; + uint16_t transitionTime; +} ZCL_ZllEnhancedMoveToHueAndSaturationCommand_t; + +/** + * \brief ColorLoopSet command payload format +*/ +typedef struct PACK _ZCL_ZllColorLoopSetCommand_t +{ + uint8_t updateFlags; + uint8_t action; + uint8_t direction; + uint16_t time; + uint16_t startHue; +} ZCL_ZllColorLoopSetCommand_t; + +/** + * \brief Color Control Cluster extension field set + */ +typedef struct PACK +{ + uint16_t clusterId; + uint8_t length; + uint16_t currentX; + uint16_t currentY; + uint16_t enhancedCurrentHue; + uint16_t currentSaturation; +} ZCL_ColorControlClusterExtensionFieldSet_t; + +END_PACK + +/** + * \brief Color Control cluster commands + */ +typedef struct _ZCL_ZllColorControlClusterCommands_t +{ + //! MoveToHue command descriptor + struct + { + ZCL_CommandId_t id; //! +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ + +/** + * \brief Commissioning Server Cluster attributes amount. +*/ + +#define ZCL_COMMISSIONING_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 0 + +/** + * \brief Commissioning Client Cluster attributes amount. +*/ + +#define ZCL_COMMISSIONING_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 + +/** + * \brief Commissioning Client Cluster commands amount. +*/ + +#define ZCL_COMMISSIONING_CLUSTER_COMMANDS_AMOUNT 5 + +/** + * \brief Commissioning Server Cluster commands identifiers. +*/ + +#define ZCL_COMMISSIONING_CLUSTER_ENDPOINT_INFORMATION_COMMAND_ID 0x40 +#define ZCL_COMMISSIONING_CLUSTER_GET_GROUP_IDENTIFIERS_RESPONSE_COMMAND_ID 0x41 +#define ZCL_COMMISSIONING_CLUSTER_GET_ENDPOINT_LIST_RESPONSE_COMMAND_ID 0x42 + +/** + * \brief Commissioning Client Cluster commands identifiers. +*/ + +#define ZCL_COMMISSIONING_CLUSTER_GET_GROUP_IDENTIFIERS_COMMAND_ID 0x41 +#define ZCL_COMMISSIONING_CLUSTER_GET_ENDPOINT_LIST_COMMAND_ID 0x42 + +/* + * \brief ZCL Commissioning Cluster commands defining macros + */ + +#define ZCL_DEFINE_COMMISSIONING_CLUSTER_COMMANDS(getGroupIdentifiersInd, getEndpointListInd, \ + endpointInformationResponseInd, getGroupIdentifiersResponseInd, getEndpointListResponseInd) \ + DEFINE_COMMAND(getGroupIdentifiersCommand, 0x41, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), getGroupIdentifiersInd), \ + DEFINE_COMMAND(getEndpointListCommand, 0x42, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), getEndpointListInd), \ + DEFINE_COMMAND(endpointInformationResponseCommand, 0x40, COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), endpointInformationResponseInd), \ + DEFINE_COMMAND(getGroupIdentifiersResponseCommand, 0x41, COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), getGroupIdentifiersResponseInd), \ + DEFINE_COMMAND(getEndpointListResponseCommand, 0x42, COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), getEndpointListResponseInd) + + +#define COMMISSIONING_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = ZLL_COMMISSIONING_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_COMMISSIONING_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_COMMISSIONING_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ + } + +#define COMMISSIONING_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = ZLL_COMMISSIONING_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_COMMISSIONING_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_COMMISSIONING_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ + } + +#define DEFINE_COMMISSIONING_CLUSTER(cltype, clattributes, clcommands) COMMISSIONING_CLUSTER_##cltype(clattributes, clcommands) + +/****************************************************************************** + Types section +******************************************************************************/ + +BEGIN_PACK + +/** + * \brief Get Group Identifiers command format +*/ +typedef struct PACK +{ + uint8_t startIndex; +} ZCL_GetGroupIdentifiers_t; + +/** + * \brief Get Endpoint List command format +*/ +typedef struct PACK +{ + uint8_t startIndex; +} ZCL_GetEndpointList_t; + +/** + * \brief Endpoint Information Response command format +*/ +typedef struct PACK +{ + uint64_t ieeeAddress; + uint16_t networkAddress; + uint8_t endpointId; + uint16_t profileId; + uint16_t deviceId; + uint8_t version; +} ZCL_EndpointInformationResponse_t; + +/** + * \brief Group Information Record format +*/ +typedef struct PACK +{ + uint16_t groupId; + uint8_t groupType; +} ZCL_GroupInformationRecord_t; + +/** + * \brief Endpoint Information Record format +*/ +typedef struct PACK +{ + uint16_t networkAddress; + uint8_t endpointId; + uint16_t profileId; + uint16_t deviceId; + uint8_t version; +} ZCL_EndpointInformationRecord_t; + +/** + * \brief Get Group Identifiers Response command format +*/ +typedef struct PACK +{ + uint8_t total; + uint8_t startIndex; + uint8_t count; + ZCL_GroupInformationRecord_t recordList[5]; +} ZCL_GetGroupIdentifiersResponse_t; + +/** + * \brief Get Endpoint List Response command format +*/ +typedef struct PACK +{ + uint8_t total; + uint8_t startIndex; + uint8_t count; + ZCL_EndpointInformationRecord_t recordList[1]; +} ZCL_GetEndpointListResponse_t; + +END_PACK + +typedef struct +{ + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t (*getGroupIdentifiersCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_GetGroupIdentifiers_t *payload); + } getGroupIdentifiersCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t (*getEndpointListCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_GetEndpointList_t *payload); + } getEndpointListCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t (*endpointInformationResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_EndpointInformationResponse_t *payload); + } endpointInformationResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t (*getGroupIdentifiersResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_GetGroupIdentifiersResponse_t *payload); + } getGroupIdentifiersResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t (*getEndpointListResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_GetEndpointListResponse_t *payload); + } getEndpointListResponseCommand; +} ZCL_CommissioningClusterCommands_t; + + +#endif // _ZCLZLLCOMISSIONINGCLUSTER_H + +// eof zclZllCommissioningCluster.h diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllFrameFormat.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllFrameFormat.h new file mode 100644 index 00000000..e09d3023 --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllFrameFormat.h @@ -0,0 +1,265 @@ +/**************************************************************************//** + \file zclZllFrameFormat.h + + \brief + Inter-PAN commands frame formats for ZLL. + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 16.03.10 A. Taradov - Created. +******************************************************************************/ +#ifndef _ZCLZLLFRAMEFORMAT_H +#define _ZCLZLLFRAMEFORMAT_H + +/****************************************************************************** + Includes section +******************************************************************************/ +#include +#include + +/****************************************************************************** + Definitions section +******************************************************************************/ +#define MAX_DEVICE_INFO_ENTRIES_NUMBER 1 + +/****************************************************************************** + Types section +******************************************************************************/ +typedef enum _ZclZllCommandId_t +{ + ZCL_ZLL_SCAN_REQUEST_COMMAND_ID = 0x00, + ZCL_ZLL_SCAN_RESPONSE_COMMAND_ID = 0x01, + ZCL_ZLL_DEVICE_INFO_REQUEST_COMMAND_ID = 0x02, + ZCL_ZLL_DEVICE_INFO_RESPONSE_COMMAND_ID = 0x03, + ZCL_ZLL_IDENTIFY_REQUEST_COMMAND_ID = 0x06, + ZCL_ZLL_RESET_TO_FACTORY_NEW_REQUEST_COMMAND_ID = 0x07, + ZCL_ZLL_NETWORK_START_REQUEST_COMMAND_ID = 0x10, + ZCL_ZLL_NETWORK_START_RESPONSE_COMMAND_ID = 0x11, + ZCL_ZLL_NETWORK_JOIN_ROUTER_REQUEST_COMMAND_ID = 0x12, + ZCL_ZLL_NETWORK_JOIN_ROUTER_RESPONSE_COMMAND_ID = 0x13, + ZCL_ZLL_NETWORK_JOIN_ENDDEVICE_REQUEST_COMMAND_ID = 0x14, + ZCL_ZLL_NETWORK_JOIN_ENDDEVICE_RESPONSE_COMMAND_ID = 0x15, + ZCL_ZLL_NETWORK_UPDATE_REQUEST_COMMAND_ID = 0x16, +} ZclZllCommandId_t; + +BEGIN_PACK +typedef struct PACK +{ + struct + { + uint8_t frameType : 2; /*! Frame type sub-field */ + uint8_t manufacturerSpecific : 1; /*! Manufacturer specific sub-field */ + uint8_t direction : 1; /*! Direction sub-field */ + uint8_t defaultResponse : 1; /*! Disable default response sub-field */ + uint8_t reserved : 3; /*! Reserved bits. Must have a zero value */ + } frameControl; + uint8_t seq; + uint8_t commandId; +} ZclZllFrameHeader_t; + +typedef struct PACK +{ + uint8_t logicalType : 2; + uint8_t rxOnWhenIdle : 1; + uint8_t reserved : 5; +} ZclZllZigBeeInfo_t; + +typedef struct PACK +{ + uint8_t factoryNew : 1; + uint8_t addressAssignment : 1; + uint8_t compoundDevice : 1; + uint8_t relayedScanRequest : 1; + uint8_t touchLinkInitiator : 1; + uint8_t touchLinkTimeWindow : 1; /*! This field is reserved in Scan Request frame */ + uint8_t reserved : 2; +} ZclZllInfo_t; + +typedef struct PACK +{ + uint64_t ieeeAddress; + uint8_t endpoint; + uint16_t profileId; + uint16_t deviceId; + uint8_t version; + uint8_t groupIds; + uint8_t sort; +} ZclZllDeviceInfoEntry_t; + +typedef struct PACK +{ + ZclZllFrameHeader_t header; + uint32_t transactionId; + ZclZllZigBeeInfo_t zigBeeInfo; + ZclZllInfo_t zllInfo; +} ZclZllScanRequestFrame_t; + +typedef struct PACK +{ + ZclZllFrameHeader_t header; + uint32_t transactionId; + uint8_t rssiCorrection; + ZclZllZigBeeInfo_t zigBeeInfo; + ZclZllInfo_t zllInfo; + uint16_t keyBitMask; + uint32_t responseId; + uint64_t extPanId; + uint8_t nwkUpdateId; + uint8_t channel; + uint16_t panId; + uint16_t networkAddress; + uint8_t numberSubDevices; + uint8_t totalGroupIds; + // next fields are present only if numberSubDevices == 1 + union + { + struct + { + uint8_t endpoint; + uint16_t profileId; + uint16_t deviceId; + uint8_t version; + uint8_t groupIds; + }; + uint64_t ieeeRelayerScanRequest1; + }; + /*! This field is present only if zllInfo.relayedScanRequest == 1 */ + uint64_t ieeeRelayerScanRequest2; +} ZclZllScanResponseFrame_t; + +typedef struct PACK +{ + ZclZllFrameHeader_t header; + uint32_t transactionId; + uint8_t startIndex; +} ZclZllDeviceInfoRequestFrame_t; + +typedef struct PACK +{ + ZclZllFrameHeader_t header; + uint32_t transactionId; + uint8_t numberSubDevices; + uint8_t startIndex; + uint8_t count; + ZclZllDeviceInfoEntry_t entries[MAX_DEVICE_INFO_ENTRIES_NUMBER]; +} ZclZllDeviceInfoResponseFrame_t; + +typedef struct PACK +{ + ZclZllFrameHeader_t header; + uint32_t transactionId; + uint16_t identifyTime; +} ZclZllIdentifyRequestFrame_t; + +typedef struct PACK +{ + ZclZllFrameHeader_t header; + uint32_t transactionId; +} ZclZllResetToFactoryNewRequestFrame_t; + +typedef struct PACK +{ + ZclZllFrameHeader_t header; + uint32_t transactionId; + uint64_t extendedPanId; + uint8_t keyIndex; + uint8_t encryptedNwkKey[SECURITY_KEY_SIZE]; + uint8_t channel; + uint16_t panId; + uint16_t nwkAddress; + uint16_t groupIdsBegin; + uint16_t groupIdsEnd; + uint16_t freeNwkAddressRangeBegin; + uint16_t freeNwkAddressRangeEnd; + uint16_t freeGroupIdRangeBegin; + uint16_t freeGroupIdRangeEnd; + uint64_t edIeeeAddress; + uint16_t edNwkAddress; +} ZclZllNetworkStartRequestFrame_t; + +typedef struct PACK +{ + ZclZllFrameHeader_t header; + uint32_t transactionId; + uint8_t status; + uint64_t extendedPanId; + uint8_t nwkUpdateId; + uint8_t channel; + uint16_t panId; +} ZclZllNetworkStartResponseFrame_t; + +typedef struct PACK +{ + ZclZllFrameHeader_t header; + uint32_t transactionId; + uint64_t extendedPanId; + uint8_t keyIndex; + uint8_t encryptedNwkKey[SECURITY_KEY_SIZE]; + uint8_t nwkUpdateId; + uint8_t channel; + uint16_t panId; + uint16_t nwkAddress; + uint16_t groupIdsBegin; + uint16_t groupIdsEnd; + uint16_t freeNwkAddressRangeBegin; + uint16_t freeNwkAddressRangeEnd; + uint16_t freeGroupIdRangeBegin; + uint16_t freeGroupIdRangeEnd; +} ZclZllNetworkJoinRouterRequestFrame_t; + +typedef struct PACK +{ + ZclZllFrameHeader_t header; + uint32_t transactionId; + uint8_t status; +} ZclZllNetworkJoinRouterResponseFrame_t; + +typedef struct PACK +{ + ZclZllFrameHeader_t header; + uint32_t transactionId; + uint64_t extendedPanId; + uint8_t keyIndex; + uint8_t encryptedNwkKey[SECURITY_KEY_SIZE]; + uint8_t nwkUpdateId; + uint8_t channel; + uint16_t panId; + uint16_t nwkAddress; + uint16_t groupIdsBegin; + uint16_t groupIdsEnd; + uint16_t freeNwkAddressRangeBegin; + uint16_t freeNwkAddressRangeEnd; + uint16_t freeGroupIdRangeBegin; + uint16_t freeGroupIdRangeEnd; +} ZclZllNetworkJoinEndDeviceRequestFrame_t; + +typedef struct PACK +{ + ZclZllFrameHeader_t header; + uint32_t transactionId; + uint8_t status; +} ZclZllNetworkJoinEndDeviceResponseFrame_t; + +typedef struct PACK +{ + ZclZllFrameHeader_t header; + uint32_t transactionId; + uint64_t extendedPanId; + uint8_t nwkUpdateId; + uint8_t channel; + uint16_t panId; + uint16_t nwkAddress; +} ZclZllNetworkUpdateRequestFrame_t; + +END_PACK + +#endif // _ZCLZLLFRAMEFORMAT_H + +// eof zclZllFrameFormat.h diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllGroupsCluster.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllGroupsCluster.h new file mode 100644 index 00000000..b265c49b --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllGroupsCluster.h @@ -0,0 +1,363 @@ +/***************************************************************************//** + \file zclZllGroupsCluster.h + + \brief + The header file describes the ZCL ZLL Groups Cluster and its interface + + The file describes the types and interface of the ZCL Groups Cluster + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 12.02.09 D. Kasyanov - Created. +*******************************************************************************/ + +#ifndef _ZCLZLLGROUPSCLUSTER_H +#define _ZCLZLLGROUPSCLUSTER_H + +/*! +Attributes and commands for determining basic information about a device, +setting user device information such as location, enabling a device and resetting it +to factory defaults. +*/ + +/******************************************************************************* + Includes section +*******************************************************************************/ + +#include +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ + +#define MAX_GROUPS_IN_GROUP_MEMBERSHIP_RESPONSE 5 + +/** + * \brief Groups Cluster group name support bit +*/ + +#define GROUP_NAME_SUPPORT_FLAG 0x80 + +/** + * \brief Groups Cluster server attributes amount +*/ + +#define ZCL_GROUPS_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 1 + +/** + * \brief Groups Cluster client attributes amount. Clinet doesn't have attributes. +*/ + +#define ZCL_GROUPS_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 + +/** + * \brief Groups Cluster commands amount +*/ + +#define ZCL_GROUPS_CLUSTER_COMMANDS_AMOUNT 10 + +/** + * \brief Groups Cluster server's attributes identifiers +*/ + +#define ZCL_GROUPS_CLUSTER_NAME_SUPPORT_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) + +/** + * \brief Groups Cluster client's command identifiers +*/ + +#define ZCL_GROUPS_CLUSTER_ADD_GROUP_COMMAND_ID 0x00 +#define ZCL_GROUPS_CLUSTER_VIEW_GROUP_COMMAND_ID 0x01 +#define ZCL_GROUPS_CLUSTER_GET_GROUP_MEMBERSHIP_COMMAND_ID 0x02 +#define ZCL_GROUPS_CLUSTER_REMOVE_GROUP_COMMAND_ID 0x03 +#define ZCL_GROUPS_CLUSTER_REMOVE_ALL_GROUPS_COMMAND_ID 0x04 +#define ZCL_GROUPS_CLUSTER_ADD_GROUP_IF_IDENTIFYING_COMMAND_ID 0x05 + +/** + * \brief Groups Cluster servers's command identifiers +*/ + +#define ZCL_GROUPS_CLUSTER_ADD_GROUP_RESPONSE_COMMAND_ID 0x00 +#define ZCL_GROUPS_CLUSTER_VIEW_GROUP_RESPONSE_COMMAND_ID 0x01 +#define ZCL_GROUPS_CLUSTER_GET_GROUP_MEMBERSHIP_RESPONSE_COMMAND_ID 0x02 +#define ZCL_GROUPS_CLUSTER_REMOVE_GROUP_RESPONSE_COMMAND_ID 0x03 + +/** + * \brief Groups Cluster server define attributes macros +*/ + +#define ZCL_DEFINE_GROUPS_CLUSTER_SERVER_ATTRIBUTES() \ + DEFINE_ATTRIBUTE(nameSupport, ZCL_READONLY_ATTRIBUTE, ZCL_GROUPS_CLUSTER_NAME_SUPPORT_SERVER_ATTRIBUTE_ID, ZCL_8BIT_BITMAP_DATA_TYPE_ID) + +/** + * \brief On/Off Cluster define commands macros +*/ + +#define ZCL_DEFINE_GROUPS_CLUSTER_COMMANDS(addGroupCommandInd, viewGroupCommandInd, getGroupMembershipCommandInd, \ + removeGroupCommandInd, removeAllGroupsCommandInd, addGroupIfIdentifyingCommandInd, \ + addGroupResponseCommandInd, viewGroupResponseCommandInd, getGroupMembershipResponseCommandInd, \ + removeGroupResponseCommandInd) \ + DEFINE_COMMAND(addGroupCommand, ZCL_GROUPS_CLUSTER_ADD_GROUP_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + addGroupCommandInd), \ + DEFINE_COMMAND(viewGroupCommand, ZCL_GROUPS_CLUSTER_VIEW_GROUP_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + viewGroupCommandInd), \ + DEFINE_COMMAND(getGroupMembershipCommand, ZCL_GROUPS_CLUSTER_GET_GROUP_MEMBERSHIP_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + getGroupMembershipCommandInd), \ + DEFINE_COMMAND(removeGroupCommand, ZCL_GROUPS_CLUSTER_REMOVE_GROUP_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + removeGroupCommandInd), \ + DEFINE_COMMAND(removeAllGroupsCommand, ZCL_GROUPS_CLUSTER_REMOVE_ALL_GROUPS_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + removeAllGroupsCommandInd), \ + DEFINE_COMMAND(addGroupIfIdentifyingCommand, ZCL_GROUPS_CLUSTER_ADD_GROUP_IF_IDENTIFYING_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + addGroupIfIdentifyingCommandInd), \ + DEFINE_COMMAND(addGroupResponseCommand, ZCL_GROUPS_CLUSTER_ADD_GROUP_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + addGroupResponseCommandInd), \ + DEFINE_COMMAND(viewGroupResponseCommand, ZCL_GROUPS_CLUSTER_VIEW_GROUP_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + viewGroupResponseCommandInd), \ + DEFINE_COMMAND(getGroupMembershipResponseCommand, ZCL_GROUPS_CLUSTER_GET_GROUP_MEMBERSHIP_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + getGroupMembershipResponseCommandInd), \ + DEFINE_COMMAND(removeGroupResponseCommand, ZCL_GROUPS_CLUSTER_REMOVE_GROUP_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + removeGroupResponseCommandInd) + +/** + * \brief On/Off Cluster definition macros +*/ + +#define GROUPS_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = GROUPS_CLUSTER_ID, \ + .options = { \ + .type = ZCL_CLIENT_CLUSTER_TYPE, \ + .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY, \ + }, \ + .attributesAmount = ZCL_GROUPS_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_GROUPS_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define GROUPS_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = GROUPS_CLUSTER_ID, \ + .options = { \ + .type = ZCL_SERVER_CLUSTER_TYPE, \ + .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY, \ + }, \ + .attributesAmount = ZCL_GROUPS_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_GROUPS_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define DEFINE_GROUPS_CLUSTER(cltype, clattributes, clcommands) \ + GROUPS_CLUSTER_##cltype(clattributes, clcommands) + +/****************************************************************************** + Types section + ******************************************************************************/ +BEGIN_PACK + +/** + * \brief Add Group Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; + uint8_t groupName[1]; +} ZCL_AddGroup_t; + +/** + * \brief View Group Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; +} ZCL_ViewGroup_t; + +/** + * \brief Get Group Membership Command Payload format. + */ + +typedef struct PACK +{ + uint8_t groupCount; + uint16_t groupList[1]; +} ZCL_GetGroupMembership_t; + +/** + * \brief Remove Group Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; +} ZCL_RemoveGroup_t; + +/** + * \brief Add Group if identifying Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; + uint8_t groupName[1]; +} ZCL_AddGroupIfIdentifying_t; + +/** + * \brief Add Group Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; +} ZCL_AddGroupResponse_t; + +/** + * \brief View Group Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; + uint8_t groupName[1]; +} ZCL_ViewGroupResponse_t; + +/** + * \brief Get Group Membership Response Payload format. + */ + +typedef struct PACK +{ + uint8_t capacity; + uint8_t groupCount; + uint16_t groupList[MAX_GROUPS_IN_GROUP_MEMBERSHIP_RESPONSE]; +} ZCL_GetGroupMembershipResponse_t; + +/** + * \brief Remove Group Command Response Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; +} ZCL_RemoveGroupResponse_t; + +/** + * \brief Groups Cluster server's attributes + */ + +typedef struct PACK +{ + + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } nameSupport; +} ZCL_GroupsClusterServerAttributes_t; + +END_PACK + +/** + * \brief Groups Cluster commands. + */ + +typedef struct +{ + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*addGroupCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_AddGroup_t * payload); + } addGroupCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*viewGroupCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_ViewGroup_t * payload); + } viewGroupCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*getGroupMembershipCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_GetGroupMembership_t * payload); + } getGroupMembershipCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*removeGroupCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_RemoveGroup_t * payload); + } removeGroupCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*removeAllGroupsCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, void * payload); + } removeAllGroupsCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*addGroupIfIdentifyingCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_AddGroupIfIdentifying_t * payload); + } addGroupIfIdentifyingCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*addGroupResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_AddGroupResponse_t * payload); + } addGroupResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*viewGroupResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_ViewGroupResponse_t * payload); + } viewGroupResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*getGroupMembershipResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_GetGroupMembershipResponse_t * payload); + } getGroupMembershipResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*removeGroupResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_RemoveGroupResponse_t * payload); + } removeGroupResponseCommand; +} ZCL_GroupsClusterCommands_t; + +#endif /* _ZCLZLLGROUPSCLUSTER_H */ + diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllIB.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllIB.h new file mode 100644 index 00000000..f3904c0e --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllIB.h @@ -0,0 +1,171 @@ +/**************************************************************************//** + \file zclZllIB.h + + \brief + ZLL Information Base interface. + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 18.03.10 A. Taradov - Created. +******************************************************************************/ +#ifndef _ZCLZLLIB_H +#define _ZCLZLLIB_H + +/****************************************************************************** + Includes section +******************************************************************************/ +#include +#include +#include +#include + +/****************************************************************************** + Definitions section +******************************************************************************/ + +/****************************************************************************** + Types section +******************************************************************************/ + +// Device Information Table entry +typedef struct _DitEntry_t +{ + uint64_t ieee; + uint8_t ep; + uint16_t profileId; + uint16_t deviceId; + uint8_t version; + uint8_t groupIds; + uint8_t sort; +} ZCL_ZllDitEntry_t; + +typedef struct _ZCL_ZllDevice_t +{ + uint8_t factoryNew; + uint8_t channel; + PanId_t panId; + ExtPanId_t extPanId; + ShortAddr_t nwkAddr; + ExtAddr_t extAddr; + ShortAddr_t freeNwkAddressRangeBegin; + ShortAddr_t freeNwkAddressRangeEnd; + uint16_t freeGroupIdRangeBegin; + uint16_t freeGroupIdRangeEnd; + uint16_t groupIdsBegin; + uint16_t groupIdsEnd; + uint8_t nwkKey[SECURITY_KEY_SIZE]; +} ZCL_ZllDevice_t; + +typedef struct _ZCL_ZllIb_t +{ + ZCL_ZllDevice_t device; + ZclZllZigBeeInfo_t zigBeeInfo; + ZclZllInfo_t zllInfo; + ZCL_ZllDitEntry_t *dit; + uint8_t ditSize; + uint8_t numberSubDevices; + uint8_t totalGroupIds; + MAC_CapabilityInf_t capabilityInf; + uint8_t *appData; + uint16_t appDataSize; +} ZCL_ZllIb_t; + +/****************************************************************************** + Global variables +******************************************************************************/ +extern ZCL_ZllIb_t zclZllIB; + +/****************************************************************************** + Prototypes section +******************************************************************************/ + +/**************************************************************************//** +\brief Initialize Information Base and restore ZLL parameters and +application data + +This function is invoked by the ZCL_ZllReset() function and therefore should +not be called by the user directly. + +The function restores ZLL parameters and application data from EEPROM and sets +the restored network and stack parameters in Configuration Server as well. +******************************************************************************/ +void ZCL_ZllIbReset(void); + +/**************************************************************************//** +\brief Set application data that should be saved and restored + +This function specifies the memory which is used to store and restore +application data. The data will be saved in EEPROM when the ZCL_ZllIbSave() +function is called, and restored when ZCL_ZllIbReset() or ZCL_ZllReset() +functions are called (ZCL_ZllReset() invokes ZCL_ZllIbReset()). + +This function should be called before ZCL_ZllIbReset() or ZCL_ZllReset() to +specify the memory to which application data will be restored. + +Application data may be any abstract data. However, keeping network and +stack parameters in application data is unnecunnecessary, because they are +maintained by ZLL. + +\param[in] data - application data +\param[in] button - button number +******************************************************************************/ +void ZCL_ZllIbSetAppData(uint8_t *data, uint16_t size); + +/**************************************************************************//** +\brief Save ZLL parameters and application data in EEPROM + +The functions saves ZLL parameters and application data in EEPROM so that +they can be restored after device is reset. ZLL parameters are stored inside +the stack in the instance of the ZCL_ZllDevice_t type. This function should +be called each time after the application data is modofied. +******************************************************************************/ +void ZCL_ZllIbSave(void); + +/**************************************************************************//** +\brief Reset ZLL parameters to factory new settings and store them into EEPROM +******************************************************************************/ +void ZCL_ZllIbResetToFactoryNew(void); + +/**************************************************************************//** +\brief Set Device Information Table + +Device Information Table contains entries desribing logical device type +implemented on the device. However, most frequently the table has only one entry. +Since the table stores static information about application functionality, it is +not writtern into EEPROM, but is typically configured each time the application +starts. + +The following example shows how to fill a table with a single entry: + +\code +\\Global definition of the Device Information table +ZCL_ZllDitEntry_t deviceInfoTable[DEVICE_INFO_TABLE_ENTRIES]; +... +CS_ReadParameter(CS_UID_ID, &deviceInfoTable[0].ieee); //Read extended address from the Configuration Server +deviceInfoTable[0].ep = APP_ENDPOINT_COLOR_SCENE_REMOTE; +deviceInfoTable[0].profileId = APP_PROFILE_ID; +deviceInfoTable[0].deviceId = APP_DEVICE_ID; +deviceInfoTable[0].version = APP_VERSION; +deviceInfoTable[0].groupIds = APP_GROUP_IDS; //The number of group IDs +deviceInfoTable[0].sort = 0; +ZCL_ZllIbSetDeviceInfoTable(deviceInfoTable, 1); +\endcode + +Note that all constants starting with APP_ should be defined by the +application. + +\param[in] dit - pointer to the Device Information table +\param[in] size - number of entries in the table +******************************************************************************/ +void ZCL_ZllIbSetDeviceInfoTable(ZCL_ZllDitEntry_t dit[], uint8_t size); + +#endif // _ZCLZLLIB_H + +// eof zclZllIB.h diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllIdentifyCluster.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllIdentifyCluster.h new file mode 100644 index 00000000..ad27466e --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllIdentifyCluster.h @@ -0,0 +1,215 @@ +/***************************************************************************//** + \file zclZllIdentifyCluster.h + + \brief + The header file describes the ZLL Identify Cluster and its interface + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 04.07.11 A. Taradov - Created. +*******************************************************************************/ + +#ifndef _ZCLZLLIDENTIFYCLUSTER_H +#define _ZCLZLLIDENTIFYCLUSTER_H + +/*! +Attributes and commands for determining basic information about a device, +setting user device information such as location, enabling a device and resetting it +to factory defaults. +*/ + +/******************************************************************************* + Includes section +*******************************************************************************/ + +#include +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ + +/** + * \brief Identify Server Cluster attributes amount. +*/ + +#define ZCL_IDENTIFY_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 1 + +/** + * \brief Identify Client Cluster attributes amount. +*/ + +#define ZCL_IDENTIFY_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 + +/** + * \brief Identify Client Cluster commands amount. +*/ + +#define ZCL_IDENTIFY_CLUSTER_COMMANDS_AMOUNT 4 + +/** + * \brief Identify Server Cluster attributes identifiers. +*/ + +#define ZCL_IDENTIFY_CLUSTER_IDENTIFY_TIME_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) + +/** + * \brief Identify Server Cluster commands identifiers. +*/ + +#define ZCL_IDENTIFY_CLUSTER_IDENTIFY_QUERY_RESPONSE_COMMAND_ID 0x00 + +/** + * \brief Identify Client Cluster commands identifiers. +*/ + +#define ZCL_IDENTIFY_CLUSTER_IDENTIFY_COMMAND_ID 0x00 +#define ZCL_IDENTIFY_CLUSTER_IDENTIFY_QUERY_COMMAND_ID 0x01 +#define ZCL_IDENTIFY_CLUSTER_TRIGGER_EFFECT_COMMAND_ID 0x40 + +/* + *\brief ZCL Idetify Cluster server side attributes defining macros + */ + +#define ZCL_DEFINE_IDENTIFY_CLUSTER_SERVER_ATTRIBUTES() \ + DEFINE_ATTRIBUTE(identifyTime, ZCL_READWRITE_ATTRIBUTE, ZCL_IDENTIFY_CLUSTER_IDENTIFY_TIME_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID) + +/* + * \brief ZCL Identify Cluster commands defining macros + */ + +#define IDENTIFY_CLUSTER_COMMANDS(identifyCommandInd, identifyQueryCommandInd, triggerEffectCommandInd, identifyQueryResponseCommandInd) \ + DEFINE_COMMAND(identifyCommand, 0x00, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), identifyCommandInd), \ + DEFINE_COMMAND(identifyQueryCommand, 0x01, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), identifyQueryCommandInd), \ + DEFINE_COMMAND(triggerEffectCommand, 0x40, COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), triggerEffectCommandInd), \ + DEFINE_COMMAND(identifyQueryResponseCommand, 0x00, COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), identifyQueryResponseCommandInd) + +#define IDENTIFY_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = IDENTIFY_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_IDENTIFY_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_IDENTIFY_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ + } + +#define IDENTIFY_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ + { \ + .id = IDENTIFY_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_IDENTIFY_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_IDENTIFY_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ + } + +#define DEFINE_IDENTIFY_CLUSTER(cltype, clattributes, clcommands) IDENTIFY_CLUSTER_##cltype(clattributes, clcommands) + +/****************************************************************************** + Types section +******************************************************************************/ + +/** + * \brief Possible values for the Effect Identifier field. +*/ +enum +{ + ZCL_EFFECT_IDENTIFIER_BLINK = 0x00, + ZCL_EFFECT_IDENTIFIER_BREATHE = 0x01, + ZCL_EFFECT_IDENTIFIER_OKAY = 0x02, + ZCL_EFFECT_IDENTIFIER_CHANNEL_CHANGE = 0x0b, + ZCL_EFFECT_IDENTIFIER_FINISH_EFFECT = 0xfe, + ZCL_EFFECT_IDENTIFIER_STOP_EFFECT = 0xff, +}; + +/** + * \brief Possible values for the Effect Variant field. +*/ +enum +{ + ZCL_EFFECT_VARIANT_DEFAULT = 0x00, +}; + +BEGIN_PACK + +/** + * \brief Identify Command Payload format. +*/ +typedef struct PACK +{ + uint16_t identifyTime; +} ZCL_Identify_t; + +/** + * \brief Trigger Effect Command Payload format. +*/ +typedef struct PACK +{ + uint8_t effectIdentifier; + uint8_t effectVariant; +} ZCL_TriggerEffect_t; + +/** + * \brief Identify Query Response Payload format. +*/ +typedef struct PACK +{ + uint16_t timeout; +} ZCL_IdentifyQueryResponse_t; + +typedef struct PACK +{ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } identifyTime; +} ZCL_IdentifyClusterAttributes_t; + +END_PACK + +typedef struct +{ + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t (*identifyCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_Identify_t *payload); + } identifyCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t (*identifyQueryCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, uint8_t *payload); + } identifyQueryCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t (*triggerEffectCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_TriggerEffect_t *payload); + } triggerEffectCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t (*identifyQueryResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_IdentifyQueryResponse_t *payload); + } identifyQueryResponseCommand; +} ZCL_IdentifyClusterCommands_t; + + +#endif // _ZCLZLLIDENTIFYCLUSTER_H + +// eof zclZllIdentifyCluster.h diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllInterPan.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllInterPan.h new file mode 100644 index 00000000..471f8a48 --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllInterPan.h @@ -0,0 +1,71 @@ +/**************************************************************************//** + \file zclZllInterPan.h + + \brief + ZLL Inter-PAN operation interface. + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 17.03.10 A. Taradov - Created. +******************************************************************************/ +#ifndef _ZCLZLLINTERPAN_H +#define _ZCLZLLINTERPAN_H + +/****************************************************************************** + Includes section +******************************************************************************/ +#include + +/****************************************************************************** + Definitions section +******************************************************************************/ + +/****************************************************************************** + Types section +******************************************************************************/ +typedef struct _ZCL_ZllInterPanStartConf_t +{ + ZCL_ZllStatus_t status; +} ZCL_ZllInterPanStartConf_t; + +typedef struct _ZCL_ZllInterPanStartReq_t +{ + ZCL_ZllInterPanStartConf_t confirm; + void (*ZCL_ZllInterPanStartConf)(ZCL_ZllInterPanStartConf_t *conf); +} ZCL_ZllInterPanStartReq_t; + +/****************************************************************************** + Prototypes section +******************************************************************************/ + +/**************************************************************************//** +\brief Reset ZLL Inter-PAN module +******************************************************************************/ +void ZCL_ZllInterPanReset(void); + +/**************************************************************************//** +\brief Prepare stack for Inter-PAN operation + +The function prepares the device for Inter-PAN communication. It is required +for starting network scan (invoked by the ZCL_ZllScanReq() function). + +The function is executed asynchronously. Invocation of the callback function +provided in the \c req->ZCL_ZllInterPanStartConf field indicates request +completion. If the request has been successful (the reported status equals +::ZCL_ZLL_SUCCESS_STATUS) ZigBee network features become unavailable. + +To restore normal stack operation, when Inter-PAN data exchange has finished, +call the ZDO_ResetNetworkReq() function. +******************************************************************************/ +void ZCL_ZllInterPanStartReq(ZCL_ZllInterPanStartReq_t *req); + +#endif // _ZCLZLLINTERPAN_H + +// eof zclZllInterPan.h diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllLevelControlCluster.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllLevelControlCluster.h new file mode 100644 index 00000000..0bd8caa2 --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllLevelControlCluster.h @@ -0,0 +1,297 @@ +/***************************************************************************//** + \file zclZllLevelControlCluster.h + + \brief + Interface and types of Level Control Cluster + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 22.06.10 D.Loskutnikov - Created. +*******************************************************************************/ + +#ifndef _ZCLZLLLEVELCONTROLCLUSTER_H +#define _ZCLZLLLEVELCONTROLCLUSTER_H + +/*! +Attributes and commands for determining basic information about a device, +setting user device information such as location, enabling a device and resetting it +to factory defaults. +*/ + +/******************************************************************************* + Includes section +*******************************************************************************/ + +#include +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ + +#define ZLL_LEVEL_CONTROL_UP_DIRECTION 0x00 +#define ZLL_LEVEL_CONTROL_DOWN_DIRECTION 0x01 + +/** + * \brief Amount of Level Control cluster server's attributes +*/ +#define ZCL_LEVEL_CONTROL_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 1 + +/** + * \brief Client doesn't have attributes. +*/ +#define ZCL_LEVEL_CONTROL_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT 0 + +/** + * \brief Level Control Cluster commands amount +*/ + +#define ZCL_LEVEL_CONTROL_CLUSTER_COMMANDS_AMOUNT 8 + +/** + * \brief Level Control Cluster server's attributes identifiers +*/ + +#define ZCL_LEVEL_CONTROL_CLUSTER_CURRENT_LEVEL_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) +#define ZCL_LEVEL_CONTROL_CLUSTER_REMAINING_TIME_ATTRIBUTE_ID CCPU_TO_LE16(0x0001) +#define ZCL_LEVEL_CONTROL_CLUSTER_ON_OFF_TRANSITION_TIME_ATTRIBUTE_ID CCPU_TO_LE16(0x0010) +#define ZCL_LEVEL_CONTROL_CLUSTER_ON_LEVEL_ATTRIBUTE_ID CCPU_TO_LE16(0x0011) + +/** + * \brief On/Off Cluster client's command identifiers +*/ + +#define ZCL_LEVEL_CONTROL_CLUSTER_MOVE_TO_LEVEL_COMMAND_ID 0x00 +#define ZCL_LEVEL_CONTROL_CLUSTER_MOVE_COMMAND_ID 0x01 +#define ZCL_LEVEL_CONTROL_CLUSTER_STEP_COMMAND_ID 0x02 +#define ZCL_LEVEL_CONTROL_CLUSTER_STOP_COMMAND_ID 0x03 +#define ZCL_LEVEL_CONTROL_CLUSTER_MOVE_TO_LEVEL_W_ONOFF_COMMAND_ID 0x04 +#define ZCL_LEVEL_CONTROL_CLUSTER_MOVE_W_ONOFF_COMMAND_ID 0x05 +#define ZCL_LEVEL_CONTROL_CLUSTER_STEP_W_ONOFF_COMMAND_ID 0x06 +#define ZCL_LEVEL_CONTROL_CLUSTER_STOP_W_ONOFF_COMMAND_ID 0x07 + +/** + * \brief Level Control Cluster server define attributes macros +*/ + +#define ZCL_DEFINE_LEVEL_CONTROL_CLUSTER_SERVER_MANDATORY_ATTRIBUTES(min, max) \ + DEFINE_REPORTABLE_ATTRIBUTE(currentLevel, ZCL_READONLY_ATTRIBUTE, ZCL_LEVEL_CONTROL_CLUSTER_CURRENT_LEVEL_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID, min, max), \ + DEFINE_ATTRIBUTE(remainingTime, ZCL_READONLY_ATTRIBUTE, ZCL_LEVEL_CONTROL_CLUSTER_REMAINING_TIME_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID) + +#define ZCL_DEFINE_LEVEL_CONTROL_CLUSTER_SERVER_OPTIONAL_ATTRIBUTES() \ + DEFINE_ATTRIBUTE(onOffTransitionTime, ZCL_LEVEL_CONTROL_CLUSTER_ON_OFF_TRANSITION_TIME_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(onLevel, ZCL_LEVEL_CONTROL_CLUSTER_ON_LEVEL_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID) + + +/** + * \brief Level Control Cluster define commands macros +*/ + +#define ZCL_DEFINE_LEVEL_CONTROL_CLUSTER_COMMANDS(moveToLevelCommandInd,\ + moveCommandInd,\ + stepCommandInd,\ + stopCommandInd,\ + moveToLevelWOnOffCommandInd,\ + moveWOnOffCommandInd,\ + stepWOnOffCommandInd,\ + stopWOnOffCommandInd)\ + DEFINE_COMMAND(moveToLevelCommand, ZCL_LEVEL_CONTROL_CLUSTER_MOVE_TO_LEVEL_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + moveToLevelCommandInd), \ + DEFINE_COMMAND(moveCommand, ZCL_LEVEL_CONTROL_CLUSTER_MOVE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + moveCommandInd), \ + DEFINE_COMMAND(stepCommand, ZCL_LEVEL_CONTROL_CLUSTER_STEP_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + stepCommandInd), \ + DEFINE_COMMAND(stopCommand, ZCL_LEVEL_CONTROL_CLUSTER_STOP_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + stopCommandInd), \ + DEFINE_COMMAND(moveToLevelWOnOffCommand, ZCL_LEVEL_CONTROL_CLUSTER_MOVE_TO_LEVEL_W_ONOFF_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + moveToLevelWOnOffCommandInd), \ + DEFINE_COMMAND(moveWOnOffCommand, ZCL_LEVEL_CONTROL_CLUSTER_MOVE_W_ONOFF_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + moveWOnOffCommandInd), \ + DEFINE_COMMAND(stepWOnOffCommand, ZCL_LEVEL_CONTROL_CLUSTER_STEP_W_ONOFF_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + stepWOnOffCommandInd), \ + DEFINE_COMMAND(stopWOnOffCommand, ZCL_LEVEL_CONTROL_CLUSTER_STOP_W_ONOFF_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + stopWOnOffCommandInd) + +/** + * \brief Level Control Cluster definition macros +*/ + +#define LEVEL_CONTROL_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = LEVEL_CONTROL_CLUSTER_ID, \ + .options = {.type = ZCL_SERVER_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_LEVEL_CONTROL_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_LEVEL_CONTROL_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define LEVEL_CONTROL_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = LEVEL_CONTROL_CLUSTER_ID, \ + .options = {.type = ZCL_CLIENT_CLUSTER_TYPE, .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY}, \ + .attributesAmount = ZCL_LEVEL_CONTROL_CLUSTER_CLIENT_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_LEVEL_CONTROL_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define DEFINE_LEVEL_CONTROL_CLUSTER(cltype, clattributes, clcommands) \ + LEVEL_CONTROL_CLUSTER_##cltype(clattributes, clcommands) + +#define DEFINE_LEVEL_CONTROL_CLUSTER_EXTENSION_FIELD_SET(value) \ + .clusterId = LEVEL_CONTROL_CLUSTER_ID, \ + .length = sizeof(uint8_t), \ + .currentLevel = value + +/****************************************************************************** + Types section +******************************************************************************/ +BEGIN_PACK + +/** + * \brief Move To Level Command Payload format. + */ +typedef struct PACK +{ + uint8_t level; + uint16_t transitionTime; +} ZCL_MoveToLevel_t; + +/** + * \brief Move Command Payload format. + */ +typedef struct PACK +{ + uint8_t moveMode; + uint8_t rate; +} ZCL_Move_t; + +/** + * \brief Step Command Payload format. + */ +typedef struct PACK +{ + uint8_t stepMode; + uint8_t stepSize; + uint16_t transitionTime; +} ZCL_Step_t; + +/** + * \brief Level Control Cluster server's attributes +*/ +typedef struct PACK +{ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + ZCL_ReportTime_t reportCounter; //! +#include +#include + +/****************************************************************************** + Definitions section +******************************************************************************/ +#define ZCL_ZLL_USE_DEFAULT_IDENTIFY_TIME 0xffff + +/****************************************************************************** + Types section +******************************************************************************/ + +/****************************************************************************** + Prototypes section +******************************************************************************/ + +/**************************************************************************//** +\brief Identify notification + +The function shall be implemented by the application. The ZLL component +calls this function when an indetify request is received (sent from a remote +device with the ZCL_ZllIdentifyRequest() function). + +Receiving this notification, a router is expected to somehow identify itself +for the user; for example, a lighting device may blink. + +\param[in] status - notification status +\param[in] time - identification time +******************************************************************************/ +extern void ZCL_ZllIdentifyInd(ZCL_ZllStatus_t status, uint16_t time); + +/**************************************************************************//** +\brief Reset ZLL miscellaneous module +******************************************************************************/ +void ZCL_ZllMiscReset(void); + +/**************************************************************************//** +\brief Send Identify Request command + +The function sends an identify request to the destination device specified +with its extended address. On the destination device ZCL_ZllIdentifyInd() is +called by the stack to indicate identify command reception. The device that +sends the request should first select the destination device, using the +ZCL_ZllSelectDeviceReq() function. + +The function is used during ZLL commissioning via touch link to allow the +application to drop the commissioning procedure if something goes wrong +(for example, the user discovers that wrong device has been selected). + +\param[in] addr - destination device extended address pointer +\param[in] identifyTime - time in 1/10ths of a seconds +\returns true if the command has been sent +******************************************************************************/ +bool ZCL_ZllIdentifyRequest(ExtAddr_t *addr, uint16_t identifyTime); + +/**************************************************************************//** +\brief Reset the device to Factory New state +\param[in] addr - destination short address +\returns true if command was sent. +******************************************************************************/ +bool ZCL_ZllResetToFactoryNewRequest(ShortAddr_t addr); + +/**************************************************************************//** +\brief INTRP-DATA.indication primitive +\param[in] ind - indication parameters +******************************************************************************/ +void ZCL_ZllMiscDataInd(INTRP_DataInd_t *ind); + +#endif // _ZCLZLLMISC_H + +// eof zclZllMisc.h diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllNetwork.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllNetwork.h new file mode 100644 index 00000000..adece9aa --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllNetwork.h @@ -0,0 +1,114 @@ +/**************************************************************************//** + \file zclZllNetwork.h + + \brief + ZLL network functionality interface. + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 22.03.10 A. Taradov - Created. +******************************************************************************/ +#ifndef _ZCLZLLNETWORK_H +#define _ZCLZLLNETWORK_H + +/****************************************************************************** + Includes section +******************************************************************************/ +#include +#include +#include +#include + +/****************************************************************************** + Definitions section +******************************************************************************/ + +/****************************************************************************** + Types section +******************************************************************************/ +typedef struct _ZCL_ZllStartNetworkConf_t +{ + ZCL_ZllStatus_t status; +} ZCL_ZllStartNetworkConf_t; + +typedef struct _ZCL_ZllStartNetworkReq_t +{ + ZCL_ZllStartNetworkConf_t confirm; + ZCL_ZllScanDeviceInfo_t *otherDevice; + void (*ZCL_ZllStartNetworkConf)(ZCL_ZllStartNetworkConf_t *conf); +} ZCL_ZllStartNetworkReq_t; + +/*! Select ZLL device confirm parameters */ +typedef struct _ZCL_SelectDeviceConf_t +{ + /* Operation status */ + ZCL_ZllStatus_t status; +} ZCL_SelectDeviceConf_t; + +/*! Select ZLL device request parameters */ +typedef struct _ZCL_ZllSelectDeviceReq_t +{ + /*! Selected device information */ + ZCL_ZllScanDeviceInfo_t *deviceInfo; + /*! MAC-SET.request primitive */ + MAC_SetReq_t macSetReq; + /*! Confirm callback pointer */ + void (*ZCL_ZllSelectDeviceConf)(ZCL_SelectDeviceConf_t *conf); + /*! Select ZLL device confirm info */ + ZCL_SelectDeviceConf_t confirm; +} ZCL_ZllSelectDeviceReq_t; + +/****************************************************************************** + Prototypes section +******************************************************************************/ + +/**************************************************************************//** +\brief Reset ZLL network module. +******************************************************************************/ +void ZCL_ZllNetworkReset(void); + +/**************************************************************************//** +\brief Send ZLL start network request. Should be called only by end devices. + +The function sends an Inter-PAN command containing network parameters to +the selected router. The router is notified about receiving network parameters +via ZCL_ZllStartInd() (this function should be implemented on the router). +Upon receiving such indication the router is expected to rejoin the nework, +using ZDO functions. The end device that has issued the request should also +rejoin the network to join the router. + +The device to which the ZLL start network request will be sent is set +with the ZCL_ZllSelectDeviceReq() function. + +\param req - request parameters +******************************************************************************/ +void ZCL_ZllStartNetworkReq(ZCL_ZllStartNetworkReq_t *req); + +/**************************************************************************//** +\brief INTRP-DATA.indication primitive +\param[in] ind - indication parameters +******************************************************************************/ +void ZCL_ZllNetworkDataInd(INTRP_DataInd_t *ind); + +/**************************************************************************//** +\brief Select a device discovered during scanning + +Using this function, the application specifies a device to which it will +send an identify request and a start network request. Information about the +device that should be provided for this function is received during network +scan (performed by ZCL_ZllScanReq()). + +\param[in] req - request parameters +******************************************************************************/ +void ZCL_ZllSelectDeviceReq(ZCL_ZllSelectDeviceReq_t *req); + +#endif // _ZCLZLLNETWORK_H + +// eof zclZllNetwork.h diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllOnOffCluster.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllOnOffCluster.h new file mode 100644 index 00000000..f16eaf1e --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllOnOffCluster.h @@ -0,0 +1,281 @@ +/***************************************************************************//** + \file zclZllOnOffCluster.h + + \brief + The header file describes the ZLL On/Off Cluster and its interface + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 21.03.11 A. Taradov - Created. +*******************************************************************************/ + +#ifndef _ZCLZLLONOFFCLUSTER_H +#define _ZCLZLLONOFFCLUSTER_H + +/*! +Attributes and commands for determining basic information about a device, +setting user device information such as location, enabling a device and resetting it +to factory defaults. +*/ + +/******************************************************************************* + Includes section +*******************************************************************************/ + +#include +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ + +#define ZCL_ON_OFF_CLUSTER_ACCEPT_ONLY_WHEN_ON 0x01 + +/** + * \brief On/Off Cluster server attributes amount +*/ + +#define ZCL_ONOFF_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 4 + +/** + * \brief On/Off Cluster client attributes amount. Clinet doesn't have attributes. +*/ + +#define ZCL_ONOFF_CLUSTER_CLIENT_ATTRIBTUES_AMOUNT 0 + +/** + * \brief On/Off Cluster commands amount +*/ + +#define ZCL_ONOFF_CLUSTER_COMMANDS_AMOUNT 6 + +/** + * \brief On/Off Cluster server's attributes identifiers +*/ + +#define ZCL_ONOFF_CLUSTER_ONOFF_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) +#define ZCL_ONOFF_CLUSTER_GLOBAL_SCENE_CONTROL_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x4000) +#define ZCL_ONOFF_CLUSTER_ON_TIME_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x4001) +#define ZCL_ONOFF_CLUSTER_OFF_WAIT_TIME_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x4002) + +/** + * \brief On/Off Cluster client's command identifiers +*/ + +#define ZCL_ONOFF_CLUSTER_OFF_COMMAND_ID 0x00 +#define ZCL_ONOFF_CLUSTER_ON_COMMAND_ID 0x01 +#define ZCL_ONOFF_CLUSTER_TOGGLE_COMMAND_ID 0x02 +#define ZCL_ONOFF_CLUSTER_OFF_WITH_EFFECT_COMMAND_ID 0x40 +#define ZCL_ONOFF_CLUSTER_ON_WITH_RECALL_GLOBAL_SCENE_COMMAND_ID 0x41 +#define ZCL_ONOFF_CLUSTER_ON_WITH_TIMED_OFF_COMMAND_ID 0x42 + +/** + * \brief On/Off Cluster server define attributes macros +*/ + +#define ZCL_DEFINE_ONOFF_CLUSTER_SERVER_ATTRIBUTES(min, max) \ + DEFINE_REPORTABLE_ATTRIBUTE(onOff, ZCL_READONLY_ATTRIBUTE, ZCL_ONOFF_CLUSTER_ONOFF_SERVER_ATTRIBUTE_ID, ZCL_BOOLEAN_DATA_TYPE_ID, min, max), \ + DEFINE_ATTRIBUTE(globalSceneControl, ZCL_READONLY_ATTRIBUTE, ZCL_ONOFF_CLUSTER_GLOBAL_SCENE_CONTROL_SERVER_ATTRIBUTE_ID, ZCL_BOOLEAN_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(onTime, ZCL_READONLY_ATTRIBUTE, ZCL_ONOFF_CLUSTER_ON_TIME_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(offWaitTime, ZCL_READONLY_ATTRIBUTE, ZCL_ONOFF_CLUSTER_OFF_WAIT_TIME_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID) + +/** + * \brief On/Off Cluster define commands macros +*/ + +#define ZCL_DEFINE_ONOFF_CLUSTER_COMMANDS(onCommandInd, offCommandInd, toggleCommandInd, offWithEffectInd, onWithRecallGlobalSceneInd, onWithTimedOffInd) \ + DEFINE_COMMAND(onCommand, ZCL_ONOFF_CLUSTER_ON_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_FRAME_CONTROL_DISABLE_DEFAULT_RESPONSE, ZCL_COMMAND_NO_ACK), \ + onCommandInd), \ + DEFINE_COMMAND(offCommand, ZCL_ONOFF_CLUSTER_OFF_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_FRAME_CONTROL_DISABLE_DEFAULT_RESPONSE, ZCL_COMMAND_NO_ACK), \ + offCommandInd), \ + DEFINE_COMMAND(toggleCommand, ZCL_ONOFF_CLUSTER_TOGGLE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_FRAME_CONTROL_DISABLE_DEFAULT_RESPONSE, ZCL_COMMAND_NO_ACK), \ + toggleCommandInd), \ + DEFINE_COMMAND(offWithEffectCommand, ZCL_ONOFF_CLUSTER_OFF_WITH_EFFECT_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_FRAME_CONTROL_DISABLE_DEFAULT_RESPONSE, ZCL_COMMAND_NO_ACK), \ + offWithEffectInd), \ + DEFINE_COMMAND(onWithRecallGlobalSceneCommand, ZCL_ONOFF_CLUSTER_ON_WITH_RECALL_GLOBAL_SCENE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_FRAME_CONTROL_DISABLE_DEFAULT_RESPONSE, ZCL_COMMAND_NO_ACK), \ + onWithRecallGlobalSceneInd), \ + DEFINE_COMMAND(onWithTimedOffCommand, ZCL_ONOFF_CLUSTER_ON_WITH_TIMED_OFF_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_FRAME_CONTROL_DISABLE_DEFAULT_RESPONSE, ZCL_COMMAND_NO_ACK), \ + onWithTimedOffInd) + +/** + * \brief On/Off Cluster definition macros +*/ + +#define ONOFF_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = ONOFF_CLUSTER_ID, \ + .options = \ + { \ + .type = ZCL_CLIENT_CLUSTER_TYPE, \ + .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY, \ + .reserved = 0, \ + }, \ + .attributesAmount = ZCL_ONOFF_CLUSTER_CLIENT_ATTRIBTUES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_ONOFF_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define ONOFF_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = ONOFF_CLUSTER_ID, \ + .options = \ + { \ + .type = ZCL_SERVER_CLUSTER_TYPE, \ + .security = ZCL_NETWORK_KEY_CLUSTER_SECURITY, \ + .reserved = 0, \ + }, \ + .attributesAmount = ZCL_ONOFF_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_ONOFF_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define DEFINE_ONOFF_CLUSTER(cltype, clattributes, clcommands) \ + ONOFF_CLUSTER_##cltype(clattributes, clcommands) + +/****************************************************************************** + Types section +******************************************************************************/ + +BEGIN_PACK + +/** + * \brief On/Off Cluster server's attributes +*/ + +typedef struct PACK +{ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + bool value; + ZCL_ReportTime_t reportCounter; //! +#include +#include + +/****************************************************************************** + Definitions section +******************************************************************************/ + +/****************************************************************************** + Types section +******************************************************************************/ + +typedef struct _ZCL_ZllScanDeviceInfo_t +{ + // Device Information Table entry + uint64_t ieee; + uint8_t ep; + uint16_t profileId; + uint16_t deviceId; + uint8_t version; + uint8_t groupIds; + uint8_t sort; + + // Common fields + uint8_t rssiCorrection; + ZclZllZigBeeInfo_t zigBeeInfo; + ZclZllInfo_t zllInfo; + uint16_t keyBitMask; + uint32_t responseId; + uint64_t extPanId; + uint8_t nwkUpdateId; + uint8_t channel; + uint16_t panId; + uint16_t networkAddress; + uint8_t numberSubDevices; + uint8_t totalGroupIds; + uint64_t ieeeRelayerScanRequest; + int8_t rssi; +} ZCL_ZllScanDeviceInfo_t; + +typedef struct _ZCL_ZllScanConf_t +{ + ZCL_ZllScanDeviceInfo_t info; + ZCL_ZllStatus_t status; + bool stopScan; +} ZCL_ZllScanConf_t; + +typedef struct _ZCL_ZllScanReq_t +{ + ZCL_ZllScanConf_t confirm; + void (*ZCL_ZllScanConf)(ZCL_ZllScanConf_t *conf); +} ZCL_ZllScanReq_t; + +/****************************************************************************** + Prototypes section +******************************************************************************/ + +/**************************************************************************//** +\brief Reset ZLL Scan. +******************************************************************************/ +void ZCL_ZllScanReset(void); + +/**************************************************************************//** +\brief ZLL Scan request. Should be called only by end devices. + +The function is called on end devices to discover other devices by scanning +supported radio channels. Before calling this function the device should be +prepared to handle Inter-PAN messages: call the ZCL_ZllInterPanStartReq() +function first. + +The callback function specified in the parameters is called once for +each discovered device. + +\param req - request parameters +******************************************************************************/ +void ZCL_ZllScanReq(ZCL_ZllScanReq_t *req); + +/**************************************************************************//** +\brief INTRP-DATA.indication primitive +\param[in] ind - indication parameters +******************************************************************************/ +void ZCL_ZllScanReqDataInd(INTRP_DataInd_t *ind); + +#endif // _ZCLZLLSCAN_H + +// eof zclZllScan.h diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllScenesCluster.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllScenesCluster.h new file mode 100644 index 00000000..2bf4b100 --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllScenesCluster.h @@ -0,0 +1,648 @@ +/***************************************************************************//** + \file zclScenesCluster.h + + \brief + The header file describes the ZCL Scenes Cluster and its interface + + The file describes the types and interface of the ZCL Scenes Cluster + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 12.02.09 D. Kasyanov - Created. +*******************************************************************************/ + +#ifndef _ZCLSCENESCLUSTER_H +#define _ZCLSCENESCLUSTER_H + +/*! +Attributes and commands for determining basic information about a device, +setting user device information such as location, enabling a device and resetting it +to factory defaults. +*/ + +/******************************************************************************* + Includes section +*******************************************************************************/ + +#include +#include +#include +#include +#include + +/******************************************************************************* + Define(s) section +*******************************************************************************/ + +/** + * \brief Scenes Cluster scene name support bit +*/ + +#define ZCL_SCENES_CLUSTER_NAME_SUPPORT_FLAG 0x80 + +#define ZCL_SCENES_CLUSTER_COPY_ALL_SCENES 0x01 + +/** + * \brief Scenes Cluster server attributes amount +*/ + +#define ZCL_SCENES_CLUSTER_SERVER_ATTRIBUTES_AMOUNT 5 + +/** + * \brief Scenes Cluster client attributes amount. Clinet doesn't have attributes. +*/ + +#define ZCL_SCENES_CLUSTER_CLIENT_ATTRIBTUES_AMOUNT 0 + +/** + * \brief Scenes Cluster commands amount +*/ + +#define ZCL_SCENES_CLUSTER_COMMANDS_AMOUNT 19 + +/** + * \brief Scenes Cluster server's attributes identifiers +*/ + +#define ZCL_SCENES_CLUSTER_SCENE_COUNT_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0000) +#define ZCL_SCENES_CLUSTER_CURRENT_SCENE_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0001) +#define ZCL_SCENES_CLUSTER_CURRENT_GROUP_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0002) +#define ZCL_SCENES_CLUSTER_SCENE_VALID_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0003) +#define ZCL_SCENES_CLUSTER_NAME_SUPPORT_SERVER_ATTRIBUTE_ID CCPU_TO_LE16(0x0004) + +/** + * \brief Scenes Cluster client's command identifiers +*/ + +#define ZCL_SCENES_CLUSTER_ADD_SCENE_COMMAND_ID 0x00 +#define ZCL_SCENES_CLUSTER_VIEW_SCENE_COMMAND_ID 0x01 +#define ZCL_SCENES_CLUSTER_REMOVE_SCENE_COMMAND_ID 0x02 +#define ZCL_SCENES_CLUSTER_REMOVE_ALL_SCENES_COMMAND_ID 0x03 +#define ZCL_SCENES_CLUSTER_STORE_SCENE_COMMAND_ID 0x04 +#define ZCL_SCENES_CLUSTER_RECALL_SCENE_COMMAND_ID 0x05 +#define ZCL_SCENES_CLUSTER_GET_SCENE_MEMBERSHIP_COMMAND_ID 0x06 +#define ZCL_SCENES_CLUSTER_ENHANCED_ADD_SCENE_COMMAND_ID 0x40 +#define ZCL_SCENES_CLUSTER_ENHANCED_VIEW_SCENE_COMMAND_ID 0x41 +#define ZCL_SCENES_CLUSTER_COPY_SCENE_COMMAND_ID 0x42 + +/** + * \brief Scenes Cluster servers's command identifiers +*/ + +#define ZCL_SCENES_CLUSTER_ADD_SCENE_RESPONSE_COMMAND_ID 0x00 +#define ZCL_SCENES_CLUSTER_VIEW_SCENE_RESPONSE_COMMAND_ID 0x01 +#define ZCL_SCENES_CLUSTER_REMOVE_SCENE_RESPONSE_COMMAND_ID 0x02 +#define ZCL_SCENES_CLUSTER_REMOVE_ALL_SCENES_RESPONSE_COMMAND_ID 0x03 +#define ZCL_SCENES_CLUSTER_STORE_SCENE_RESPONSE_COMMAND_ID 0x04 +#define ZCL_SCENES_CLUSTER_GET_SCENE_MEMBERSHIP_RESPONSE_COMMAND_ID 0x06 +#define ZCL_SCENES_CLUSTER_ENHANCED_ADD_SCENE_RESPONSE_COMMAND_ID 0x40 +#define ZCL_SCENES_CLUSTER_ENHANCED_VIEW_SCENE_RESPONSE_COMMAND_ID 0x41 +#define ZCL_SCENES_CLUSTER_COPY_SCENE_RESPONSE_COMMAND_ID 0x42 + +/** + * \brief Scenes Cluster server define attributes macros +*/ + +#define ZCL_DEFINE_SCENES_CLUSTER_SERVER_ATTRIBUTES() \ + DEFINE_ATTRIBUTE(sceneCount, ZCL_READONLY_ATTRIBUTE, ZCL_SCENES_CLUSTER_SCENE_COUNT_SERVER_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(currentScene, ZCL_READONLY_ATTRIBUTE, ZCL_SCENES_CLUSTER_CURRENT_SCENE_SERVER_ATTRIBUTE_ID, ZCL_U8BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(currentGroup, ZCL_READONLY_ATTRIBUTE, ZCL_SCENES_CLUSTER_CURRENT_GROUP_SERVER_ATTRIBUTE_ID, ZCL_U16BIT_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(sceneValid, ZCL_READONLY_ATTRIBUTE, ZCL_SCENES_CLUSTER_SCENE_VALID_SERVER_ATTRIBUTE_ID, ZCL_BOOLEAN_DATA_TYPE_ID), \ + DEFINE_ATTRIBUTE(nameSupport, ZCL_READONLY_ATTRIBUTE, ZCL_SCENES_CLUSTER_NAME_SUPPORT_SERVER_ATTRIBUTE_ID, ZCL_8BIT_BITMAP_DATA_TYPE_ID) + + +/** + * \brief On/Off Cluster define commands macros +*/ + +#define ZCL_DEFINE_SCENES_CLUSTER_SERVER_COMMANDS(addSceneCommandInd, viewSceneCommandInd, removeSceneCommandInd, \ + removeAllScenesCommandInd, storeSceneCommandInd, recallSceneCommandInd, \ + getSceneMembershipCommandInd, enhancedAddSceneCommandInd, enhancedViewSceneCommandInd, copySceneCommandInd) \ + DEFINE_COMMAND(addSceneCommand, ZCL_SCENES_CLUSTER_ADD_SCENE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + addSceneCommandInd), \ + DEFINE_COMMAND(viewSceneCommand, ZCL_SCENES_CLUSTER_VIEW_SCENE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + viewSceneCommandInd), \ + DEFINE_COMMAND(removeSceneCommand, ZCL_SCENES_CLUSTER_REMOVE_SCENE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + removeSceneCommandInd), \ + DEFINE_COMMAND(removeAllScenesCommand, ZCL_SCENES_CLUSTER_REMOVE_ALL_SCENES_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + removeAllScenesCommandInd), \ + DEFINE_COMMAND(storeSceneCommand, ZCL_SCENES_CLUSTER_STORE_SCENE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + storeSceneCommandInd), \ + DEFINE_COMMAND(recallSceneCommand, ZCL_SCENES_CLUSTER_RECALL_SCENE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + recallSceneCommandInd), \ + DEFINE_COMMAND(getSceneMembershipCommand, ZCL_SCENES_CLUSTER_GET_SCENE_MEMBERSHIP_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + getSceneMembershipCommandInd), \ + DEFINE_COMMAND(enhancedAddSceneCommand, ZCL_SCENES_CLUSTER_ENHANCED_ADD_SCENE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + enhancedAddSceneCommandInd), \ + DEFINE_COMMAND(enhancedViewSceneCommand, ZCL_SCENES_CLUSTER_ENHANCED_VIEW_SCENE_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + enhancedViewSceneCommandInd), \ + DEFINE_COMMAND(copySceneCommand, ZCL_SCENES_CLUSTER_GET_SCENE_MEMBERSHIP_COMMAND_ID, \ + COMMAND_OPTIONS(CLIENT_TO_SERVER, ZCL_THERE_IS_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + copySceneCommandInd) + +#define ZCL_DEFINE_SCENES_CLUSTER_CLIENT_COMMANDS(addSceneResponseCommandInd, viewSceneResponseCommandInd, \ + removeSceneResponseCommandInd, removeAllScenesResponseCommandInd, storeSceneResponseCommandInd, \ + getSceneMembershipResponseCommandInd, enhancedAddSceneResponseCommandInd, enhancedViewSceneResponseCommandInd, \ + copySceneResponseCommandInd) \ + DEFINE_COMMAND(addSceneResponseCommand, ZCL_SCENES_CLUSTER_ADD_SCENE_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + addSceneResponseCommandInd), \ + DEFINE_COMMAND(viewSceneResponseCommand, ZCL_SCENES_CLUSTER_VIEW_SCENE_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + viewSceneResponseCommandInd), \ + DEFINE_COMMAND(removeSceneResponseCommand, ZCL_SCENES_CLUSTER_REMOVE_SCENE_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + removeSceneResponseCommandInd), \ + DEFINE_COMMAND(removeAllScenesResponseCommand, ZCL_SCENES_CLUSTER_REMOVE_ALL_SCENES_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + removeAllScenesResponseCommandInd), \ + DEFINE_COMMAND(storeSceneResponseCommand, ZCL_SCENES_CLUSTER_STORE_SCENE_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + storeSceneResponseCommandInd), \ + DEFINE_COMMAND(getSceneMembershipResponseCommand, ZCL_SCENES_CLUSTER_GET_SCENE_MEMBERSHIP_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + getSceneMembershipResponseCommandInd), \ + DEFINE_COMMAND(enhancedAddSceneResponseCommand, ZCL_SCENES_CLUSTER_ENHANCED_ADD_SCENE_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + enhancedAddSceneResponseCommandInd), \ + DEFINE_COMMAND(enhancedViewSceneResponseCommand, ZCL_SCENES_CLUSTER_ENHANCED_VIEW_SCENE_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + enhancedViewSceneResponseCommandInd), \ + DEFINE_COMMAND(copySceneResponseCommand, ZCL_SCENES_CLUSTER_COPY_SCENE_RESPONSE_COMMAND_ID, \ + COMMAND_OPTIONS(SERVER_TO_CLIENT, ZCL_THERE_IS_NO_RELEVANT_RESPONSE, ZCL_COMMAND_ACK), \ + copySceneResponseCommandInd) + +/** + * \brief Scene Cluster definition macros +*/ + +#define SCENES_CLUSTER_ZCL_CLIENT_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = SCENES_CLUSTER_ID, \ + .options = { \ + .type = ZCL_CLIENT_CLUSTER_TYPE, \ + .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY, \ + }, \ + .attributesAmount = ZCL_SCENES_CLUSTER_CLIENT_ATTRIBTUES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_SCENES_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define SCENES_CLUSTER_ZCL_SERVER_CLUSTER_TYPE(clattributes, clcommands) \ +{ \ + .id = SCENES_CLUSTER_ID, \ + .options = { \ + .type = ZCL_SERVER_CLUSTER_TYPE, \ + .security = ZCL_APPLICATION_LINK_KEY_CLUSTER_SECURITY, \ + }, \ + .attributesAmount = ZCL_SCENES_CLUSTER_SERVER_ATTRIBUTES_AMOUNT, \ + .attributes = (uint8_t *)clattributes, \ + .commandsAmount = ZCL_SCENES_CLUSTER_COMMANDS_AMOUNT, \ + .commands = (uint8_t *)clcommands \ +} + +#define DEFINE_SCENES_CLUSTER(cltype, clattributes, clcommands) \ + SCENES_CLUSTER_##cltype(clattributes, clcommands) + +/****************************************************************************** + Types section +******************************************************************************/ +BEGIN_PACK + +/** + * \brief Add Scene Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; + uint8_t sceneId; + uint16_t transitionTime; + uint8_t name[1]; +} ZCL_AddScene_t; + +/** + * \brief View Scene Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; + uint8_t sceneId; +} ZCL_ViewScene_t; + +/** + * \brief Remove Scene Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; + uint8_t sceneId; +} ZCL_RemoveScene_t; + +/** + * \brief Remove All Scenes Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; +} ZCL_RemoveAllScenes_t; + +/** + * \brief Store Scene Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; + uint8_t sceneId; +} ZCL_StoreScene_t; + +/** + * \brief Recall Scene Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; + uint8_t sceneId; +} ZCL_RecallScene_t; + +/** + * \brief Get Scene Membership Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; +} ZCL_GetSceneMembership_t; + +/** + * \brief Enhanced Add Scene Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; + uint8_t sceneId; + uint16_t transitionTime; + uint8_t name[1]; + ZCL_OnOffClusterExtensionFieldSet_t onOffClusterExtFields; + ZCL_LevelControlClusterExtensionFieldSet_t levelControlClusterExtFields; + ZCL_ColorControlClusterExtensionFieldSet_t colorControlClusterExtFields; +} ZCL_EnhancedAddScene_t; + +/** + * \brief Enhanced View Scene Command Payload format. + */ + +typedef struct PACK +{ + uint16_t groupId; + uint8_t sceneId; +} ZCL_EnhancedViewScene_t; + +/** + * \brief Copy Scene Command Payload format. + */ + +typedef struct PACK +{ + uint8_t mode; + uint16_t groupIdFrom; + uint16_t sceneIdFrom; + uint16_t groupIdTo; + uint16_t sceneIdTo; +} ZCL_CopyScene_t; + +/** + * \brief Add Scene Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; + uint8_t sceneId; +} ZCL_AddSceneResponse_t; + +/** + * \brief View Scene Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; + uint8_t sceneId; + uint16_t transitionTime; + uint8_t nameAndExtField[1]; // string sceneName, extension field. +} ZCL_ViewSceneResponse_t; + +/** + * \brief Remove Scene Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; + uint8_t sceneId; +} ZCL_RemoveSceneResponse_t; + +/** + * \brief Remove All Scenes Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; +} ZCL_RemoveAllScenesResponse_t; + +/** + * \brief Store Scene Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; + uint8_t sceneId; +} ZCL_StoreSceneResponse_t; + +/** + * \brief Get Scene Membership Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint8_t capacity; + uint16_t groupId; + uint8_t sceneCount; + uint8_t sceneList[16]; +} ZCL_GetSceneMembershipResponse_t; + +/** + * \brief Enhanced Add Scene Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; + uint8_t sceneId; +} ZCL_EnhancedAddSceneResponse_t; + +/** + * \brief Enhanced View Scene Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupId; + uint8_t sceneId; + uint16_t transitionTime; + uint8_t name[1]; + ZCL_OnOffClusterExtensionFieldSet_t onOffClusterExtFields; + ZCL_LevelControlClusterExtensionFieldSet_t levelControlClusterExtFields; + ZCL_ColorControlClusterExtensionFieldSet_t colorControlClusterExtFields; +} ZCL_EnhancedViewSceneResponse_t; + +/** + * \brief Copy Scene Response Command Payload format. + */ + +typedef struct PACK +{ + uint8_t status; + uint16_t groupIdFrom; + uint16_t sceneIdFrom; + uint16_t groupIdTo; + uint16_t sceneIdTo; +} ZCL_CopySceneResponse_t; + +/** + * \brief Extension Fields Set format + */ + +typedef struct PACK +{ + uint16_t clusterId; + uint8_t length; +} ZCL_ExtensionFieldSets_t; + +/** + * \brief Scene Cluster server's attributes + */ + +typedef struct PACK +{ + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } sceneCount; + + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } currentScene; + + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint16_t value; + } currentGroup; + + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + bool value; + } sceneValid; + + struct PACK + { + ZCL_AttributeId_t id; + uint8_t type; + uint8_t properties; + uint8_t value; + } nameSupport; +} ZCL_SceneClusterServerAttributes_t; + +END_PACK + +/** + * \brief Scene Cluster commands. + */ + +typedef struct +{ + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*addSceneCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_AddScene_t * payload); + } addSceneCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*viewSceneCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_ViewScene_t * payload); + } viewSceneCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*removeSceneCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_RemoveScene_t * payload); + } removeSceneCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*removeAllScenesCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_RemoveAllScenes_t * payload); + } removeAllScenesCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*storeSceneCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_StoreScene_t * payload); + } storeSceneCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*recallSceneCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_RecallScene_t * payload); + } recallSceneCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*getSceneMembershipCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_GetSceneMembership_t * payload); + } getSceneMembershipCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*enhancedAddSceneCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_EnhancedAddScene_t * payload); + } enhancedAddSceneCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*enhancedViewSceneCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_EnhancedViewScene_t * payload); + } enhancedViewSceneCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*copySceneCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_CopyScene_t * payload); + } copySceneCommand; + + // responses + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*addSceneResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_AddSceneResponse_t * payload); + } addSceneResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*viewSceneResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_ViewSceneResponse_t * payload); + } viewSceneResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*removeSceneResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_RemoveSceneResponse_t * payload); + } removeSceneResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*removeAllScenesResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_RemoveAllScenesResponse_t * payload); + } removeAllScenesResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*storeSceneResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_StoreSceneResponse_t * payload); + } storeSceneResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*getSceneMembershipResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_GetSceneMembershipResponse_t * payload); + } getSceneMembershipResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*enhancedAddSceneResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_EnhancedAddSceneResponse_t * payload); + } enhancedAddSceneResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*enhancedViewSceneResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_EnhancedViewSceneResponse_t * payload); + } enhancedViewSceneResponseCommand; + + struct + { + ZCL_CommandId_t id; + ZclCommandOptions_t options; + ZCL_Status_t(*copySceneResponseCommand)(ZCL_Addressing_t *addressing, uint8_t payloadLength, ZCL_CopySceneResponse_t * payload); + } copySceneResponseCommand; +} ZCL_ScenesClusterCommands_t; + + +#endif /* _ZCLSCENESCLUSTER_H */ + diff --git a/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllSecurity.h b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllSecurity.h new file mode 100644 index 00000000..6dee63df --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/ZCL/include/zclZllSecurity.h @@ -0,0 +1,63 @@ +/**************************************************************************//** + \file zclZllSecurity.h + + \brief + Functions and constants used by the ZLL security module. + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 22.06.11 A. Taradov - Created. +******************************************************************************/ +#ifndef _ZCLZLLSECURITY_H +#define _ZCLZLLSECURITY_H + +/****************************************************************************** + Includes section +******************************************************************************/ +#include +#include + +/****************************************************************************** + Definitions section +******************************************************************************/ +#define ZCL_ZLL_DEVELOPMENT_KEY_INDEX 0 +#define ZCL_ZLL_MASTER_KEY_INDEX 4 +#define ZCL_ZLL_CERTIFICATION_KEY_INDEX 15 + +//#define ZCL_ZLL_SUPPORTED_KEY_INDEX ZCL_ZLL_CERTIFICATION_KEY_INDEX +//#define ZCL_ZLL_SUPPORTED_SECURITY_KEYS (1u << ZCL_ZLL_SUPPORTED_KEY_INDEX) + +#define ZCL_ZLL_SUPPORTED_KEY_INDEX ZCL_ZLL_DEVELOPMENT_KEY_INDEX +#define ZCL_ZLL_SUPPORTED_SECURITY_KEYS (1u << ZCL_ZLL_DEVELOPMENT_KEY_INDEX) + +/*! Certification key */ +#define ZCL_ZLL_SECURITY_KEY "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" + +/****************************************************************************** + Prototypes section +******************************************************************************/ + +/**************************************************************************//** +\brief Encrypt security key +\param[in] text - key to be encrypted +\param[in] callback - function to be called after encryption is finished +******************************************************************************/ +void zclZllEncryptKey(uint8_t text[SECURITY_BLOCK_SIZE], void (*callback)(void)); + +/**************************************************************************//** +\brief Decrypt security key +\param[in] text - key to be decrypted +\param[in] callback - function to be called after decryption is finished +******************************************************************************/ +void zclZllDecryptKey(uint8_t text[SECURITY_BLOCK_SIZE], void (*callback)(void)); + +#endif // _ZCLZLLSECURITY_H + +// eof zclZllSecurity.h -- cgit v1.2.3