/************************************************************************************************** Filename: zcl.h Revised: $Date: 2011-12-19 12:28:26 -0800 (Mon, 19 Dec 2011) $ Revision: $Revision: 28712 $ Description: This file contains the Zigbee Cluster Library Foundation definitions. Copyright 2006-2011 Texas Instruments Incorporated. All rights reserved. IMPORTANT: Your use of this Software is limited to those specific rights granted under the terms of a software license agreement between the user who downloaded the software, his/her employer (which must be your employer) and Texas Instruments Incorporated (the "License"). You may not use this Software unless you agree to abide by the terms of the License. The License limits your use, and you acknowledge, that the Software may not be modified, copied or distributed unless embedded on a Texas Instruments microcontroller or used solely and exclusively in conjunction with a Texas Instruments radio frequency transceiver, which is integrated into your product. Other than for the foregoing purpose, you may not use, reproduce, copy, prepare derivative works of, modify, distribute, perform, display or sell this Software and/or its documentation for any purpose. YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. Should you have any questions regarding your right to use this Software, contact Texas Instruments Incorporated at www.TI.com. **************************************************************************************************/ #ifndef ZCL_H #define ZCL_H #ifdef __cplusplus extern "C" { #endif /********************************************************************* * INCLUDES */ #include "AF.h" #include "aps_groups.h" /********************************************************************* * CONSTANTS */ // General Clusters #define ZCL_CLUSTER_ID_GEN_BASIC 0x0000 #define ZCL_CLUSTER_ID_GEN_POWER_CFG 0x0001 #define ZCL_CLUSTER_ID_GEN_DEVICE_TEMP_CONFIG 0x0002 #define ZCL_CLUSTER_ID_GEN_IDENTIFY 0x0003 #define ZCL_CLUSTER_ID_GEN_GROUPS 0x0004 #define ZCL_CLUSTER_ID_GEN_SCENES 0x0005 #define ZCL_CLUSTER_ID_GEN_ON_OFF 0x0006 #define ZCL_CLUSTER_ID_GEN_ON_OFF_SWITCH_CONFIG 0x0007 #define ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL 0x0008 #define ZCL_CLUSTER_ID_GEN_ALARMS 0x0009 #define ZCL_CLUSTER_ID_GEN_TIME 0x000A #define ZCL_CLUSTER_ID_GEN_LOCATION 0x000B #define ZCL_CLUSTER_ID_GEN_ANALOG_INPUT_BASIC 0x000C #define ZCL_CLUSTER_ID_GEN_ANALOG_OUTPUT_BASIC 0x000D #define ZCL_CLUSTER_ID_GEN_ANALOG_VALUE_BASIC 0x000E #define ZCL_CLUSTER_ID_GEN_BINARY_INPUT_BASIC 0x000F #define ZCL_CLUSTER_ID_GEN_BINARY_OUTPUT_BASIC 0x0010 #define ZCL_CLUSTER_ID_GEN_BINARY_VALUE_BASIC 0x0011 #define ZCL_CLUSTER_ID_GEN_MULTISTATE_INPUT_BASIC 0x0012 #define ZCL_CLUSTER_ID_GEN_MULTISTATE_OUTPUT_BASIC 0x0013 #define ZCL_CLUSTER_ID_GEN_MULTISTATE_VALUE_BASIC 0x0014 #define ZCL_CLUSTER_ID_GEN_COMMISSIONING 0x0015 #define ZCL_CLUSTER_ID_OTA 0x0019 #define ZCL_CLUSTER_ID_GREEN_POWER_PROXY 0x001A // Closures Clusters #define ZCL_CLUSTER_ID_CLOSURES_SHADE_CONFIG 0x0100 #define ZCL_CLUSTER_ID_CLOSURES_DOOR_LOCK 0x0101 #define ZCL_CLUSTER_ID_CLOSURES_WINDOW_COVERING 0x0102 // HVAC Clusters #define ZCL_CLUSTER_ID_HVAC_PUMP_CONFIG_CONTROL 0x0200 #define ZCL_CLUSTER_ID_HAVC_THERMOSTAT 0x0201 #define ZCL_CLUSTER_ID_HAVC_FAN_CONTROL 0x0202 #define ZCL_CLUSTER_ID_HAVC_DIHUMIDIFICATION_CONTROL 0x0203 #define ZCL_CLUSTER_ID_HAVC_USER_INTERFACE_CONFIG 0x0204 // Lighting Clusters #define ZCL_CLUSTER_ID_LIGHTING_COLOR_CONTROL 0x0300 #define ZCL_CLUSTER_ID_LIGHTING_BALLAST_CONFIG 0x0301 // Measurement and Sensing Clusters #define ZCL_CLUSTER_ID_MS_ILLUMINANCE_MEASUREMENT 0x0400 #define ZCL_CLUSTER_ID_MS_ILLUMINANCE_LEVEL_SENSING_CONFIG 0x0401 #define ZCL_CLUSTER_ID_MS_TEMPERATURE_MEASUREMENT 0x0402 #define ZCL_CLUSTER_ID_MS_PRESSURE_MEASUREMENT 0x0403 #define ZCL_CLUSTER_ID_MS_FLOW_MEASUREMENT 0x0404 #define ZCL_CLUSTER_ID_MS_RELATIVE_HUMIDITY 0x0405 #define ZCL_CLUSTER_ID_MS_OCCUPANCY_SENSING 0x0406 // Security and Safety (SS) Clusters #define ZCL_CLUSTER_ID_SS_IAS_ZONE 0x0500 #define ZCL_CLUSTER_ID_SS_IAS_ACE 0x0501 #define ZCL_CLUSTER_ID_SS_IAS_WD 0x0502 // Protocol Interfaces #define ZCL_CLUSTER_ID_PI_GENERIC_TUNNEL 0x0600 #define ZCL_CLUSTER_ID_PI_BACNET_PROTOCOL_TUNNEL 0x0601 #define ZCL_CLUSTER_ID_PI_ANALOG_INPUT_BACNET_REG 0x0602 #define ZCL_CLUSTER_ID_PI_ANALOG_INPUT_BACNET_EXT 0x0603 #define ZCL_CLUSTER_ID_PI_ANALOG_OUTPUT_BACNET_REG 0x0604 #define ZCL_CLUSTER_ID_PI_ANALOG_OUTPUT_BACNET_EXT 0x0605 #define ZCL_CLUSTER_ID_PI_ANALOG_VALUE_BACNET_REG 0x0606 #define ZCL_CLUSTER_ID_PI_ANALOG_VALUE_BACNET_EXT 0x0607 #define ZCL_CLUSTER_ID_PI_BINARY_INPUT_BACNET_REG 0x0608 #define ZCL_CLUSTER_ID_PI_BINARY_INPUT_BACNET_EXT 0x0609 #define ZCL_CLUSTER_ID_PI_BINARY_OUTPUT_BACNET_REG 0x060A #define ZCL_CLUSTER_ID_PI_BINARY_OUTPUT_BACNET_EXT 0x060B #define ZCL_CLUSTER_ID_PI_BINARY_VALUE_BACNET_REG 0x060C #define ZCL_CLUSTER_ID_PI_BINARY_VALUE_BACNET_EXT 0x060D #define ZCL_CLUSTER_ID_PI_MULTISTATE_INPUT_BACNET_REG 0x060E #define ZCL_CLUSTER_ID_PI_MULTISTATE_INPUT_BACNET_EXT 0x060F #define ZCL_CLUSTER_ID_PI_MULTISTATE_OUTPUT_BACNET_REG 0x0610 #define ZCL_CLUSTER_ID_PI_MULTISTATE_OUTPUT_BACNET_EXT 0x0611 #define ZCL_CLUSTER_ID_PI_MULTISTATE_VALUE_BACNET_REG 0x0612 #define ZCL_CLUSTER_ID_PI_MULTISTATE_VALUE_BACNET_EXT 0x0613 #define ZCL_CLUSTER_ID_PI_11073_PROTOCOL_TUNNEL 0x0614 // Advanced Metering Initiative (SE) Clusters #define ZCL_CLUSTER_ID_SE_PRICING 0x0700 #define ZCL_CLUSTER_ID_SE_LOAD_CONTROL 0x0701 #define ZCL_CLUSTER_ID_SE_SIMPLE_METERING 0x0702 #define ZCL_CLUSTER_ID_SE_MESSAGE 0x0703 #define ZCL_CLUSTER_ID_SE_SE_TUNNELING 0x0704 #define ZCL_CLUSTER_ID_SE_PREPAYMENT 0x0705 #ifdef SE_UK_EXT #define ZCL_CLUSTER_ID_SE_TOU_CALENDAR 0x0706 #define ZCL_CLUSTER_ID_SE_DEVICE_MGMT 0x0707 #endif // SE_UK_EXT #define ZCL_CLUSTER_ID_GEN_KEY_ESTABLISHMENT 0x0800 // Smart Light cluster #define ZCL_CLUSTER_ID_SMART_LIGHT 0x1000 /*** Frame Control bit mask ***/ #define ZCL_FRAME_CONTROL_TYPE 0x03 #define ZCL_FRAME_CONTROL_MANU_SPECIFIC 0x04 #define ZCL_FRAME_CONTROL_DIRECTION 0x08 #define ZCL_FRAME_CONTROL_DISABLE_DEFAULT_RSP 0x10 /*** Frame Types ***/ #define ZCL_FRAME_TYPE_PROFILE_CMD 0x00 #define ZCL_FRAME_TYPE_SPECIFIC_CMD 0x01 /*** Frame Client/Server Directions ***/ #define ZCL_FRAME_CLIENT_SERVER_DIR 0x00 #define ZCL_FRAME_SERVER_CLIENT_DIR 0x01 /*** Chipcon Manufacturer Code ***/ #define CC_MANUFACTURER_CODE 0x1001 /*** Foundation Command IDs ***/ #define ZCL_CMD_READ 0x00 #define ZCL_CMD_READ_RSP 0x01 #define ZCL_CMD_WRITE 0x02 #define ZCL_CMD_WRITE_UNDIVIDED 0x03 #define ZCL_CMD_WRITE_RSP 0x04 #define ZCL_CMD_WRITE_NO_RSP 0x05 #define ZCL_CMD_CONFIG_REPORT 0x06 #define ZCL_CMD_CONFIG_REPORT_RSP 0x07 #define ZCL_CMD_READ_REPORT_CFG 0x08 #define ZCL_CMD_READ_REPORT_CFG_RSP 0x09 #define ZCL_CMD_REPORT 0x0a #define ZCL_CMD_DEFAULT_RSP 0x0b #define ZCL_CMD_DISCOVER 0x0c #define ZCL_CMD_DISCOVER_RSP 0x0d #define ZCL_CMD_MAX ZCL_CMD_DISCOVER_RSP /*** Data Types ***/ #define ZCL_DATATYPE_NO_DATA 0x00 #define ZCL_DATATYPE_DATA8 0x08 #define ZCL_DATATYPE_DATA16 0x09 #define ZCL_DATATYPE_DATA24 0x0a #define ZCL_DATATYPE_DATA32 0x0b #define ZCL_DATATYPE_DATA40 0x0c #define ZCL_DATATYPE_DATA48 0x0d #define ZCL_DATATYPE_DATA56 0x0e #define ZCL_DATATYPE_DATA64 0x0f #define ZCL_DATATYPE_BOOLEAN 0x10 #define ZCL_DATATYPE_BITMAP8 0x18 #define ZCL_DATATYPE_BITMAP16 0x19 #define ZCL_DATATYPE_BITMAP24 0x1a #define ZCL_DATATYPE_BITMAP32 0x1b #define ZCL_DATATYPE_BITMAP40 0x1c #define ZCL_DATATYPE_BITMAP48 0x1d #define ZCL_DATATYPE_BITMAP56 0x1e #define ZCL_DATATYPE_BITMAP64 0x1f #define ZCL_DATATYPE_UINT8 0x20 #define ZCL_DATATYPE_UINT16 0x21 #define ZCL_DATATYPE_UINT24 0x22 #define ZCL_DATATYPE_UINT32 0x23 #define ZCL_DATATYPE_UINT40 0x24 #define ZCL_DATATYPE_UINT48 0x25 #define ZCL_DATATYPE_UINT56 0x26 #define ZCL_DATATYPE_UINT64 0x27 #define ZCL_DATATYPE_INT8 0x28 #define ZCL_DATATYPE_INT16 0x29 #define ZCL_DATATYPE_INT24 0x2a #define ZCL_DATATYPE_INT32 0x2b #define ZCL_DATATYPE_INT40 0x2c #define ZCL_DATATYPE_INT48 0x2d #define ZCL_DATATYPE_INT56 0x2e #define ZCL_DATATYPE_INT64 0x2f #define ZCL_DATATYPE_ENUM8 0x30 #define ZCL_DATATYPE_ENUM16 0x31 #define ZCL_DATATYPE_SEMI_PREC 0x38 #define ZCL_DATATYPE_SINGLE_PREC 0x39 #define ZCL_DATATYPE_DOUBLE_PREC 0x3a #define ZCL_DATATYPE_OCTET_STR 0x41 #define ZCL_DATATYPE_CHAR_STR 0x42 #define ZCL_DATATYPE_LONG_OCTET_STR 0x43 #define ZCL_DATATYPE_LONG_CHAR_STR 0x44 #define ZCL_DATATYPE_ARRAY 0x48 #define ZCL_DATATYPE_STRUCT 0x4c #define ZCL_DATATYPE_SET 0x50 #define ZCL_DATATYPE_BAG 0x51 #define ZCL_DATATYPE_TOD 0xe0 #define ZCL_DATATYPE_DATE 0xe1 #define ZCL_DATATYPE_UTC 0xe2 #define ZCL_DATATYPE_CLUSTER_ID 0xe8 #define ZCL_DATATYPE_ATTR_ID 0xe9 #define ZCL_DATATYPE_BAC_OID 0xea #define ZCL_DATATYPE_IEEE_ADDR 0xf0 #define ZCL_DATATYPE_128_BIT_SEC_KEY 0xf1 #define ZCL_DATATYPE_UNKNOWN 0xff /*** Error Status Codes ***/ #define ZCL_STATUS_SUCCESS 0x00 #define ZCL_STATUS_FAILURE 0x01 // 0x02-0x7D are reserved. #define ZCL_STATUS_NOT_AUTHORIZED 0x7E #define ZCL_STATUS_MALFORMED_COMMAND 0x80 #define ZCL_STATUS_UNSUP_CLUSTER_COMMAND 0x81 #define ZCL_STATUS_UNSUP_GENERAL_COMMAND 0x82 #define ZCL_STATUS_UNSUP_MANU_CLUSTER_COMMAND 0x83 #define ZCL_STATUS_UNSUP_MANU_GENERAL_COMMAND 0x84 #define ZCL_STATUS_INVALID_FIELD 0x85 #define ZCL_STATUS_UNSUPPORTED_ATTRIBUTE 0x86 #define ZCL_STATUS_INVALID_VALUE 0x87 #define ZCL_STATUS_READ_ONLY 0x88 #define ZCL_STATUS_INSUFFICIENT_SPACE 0x89 #define ZCL_STATUS_DUPLICATE_EXISTS 0x8a #define ZCL_STATUS_NOT_FOUND 0x8b #define ZCL_STATUS_UNREPORTABLE_ATTRIBUTE 0x8c #define ZCL_STATUS_INVALID_DATA_TYPE 0x8d #define ZCL_STATUS_INVALID_SELECTOR 0x8e #define ZCL_STATUS_WRITE_ONLY 0x8f #define ZCL_STATUS_INCONSISTENT_STARTUP_STATE 0x90 #define ZCL_STATUS_DEFINED_OUT_OF_BAND 0x91 #define ZCL_STATUS_INCONSISTENT 0x92 #define ZCL_STATUS_ACTION_DENIED 0x93 #define ZCL_STATUS_TIMEOUT 0x94 #define ZCL_STATUS_ABORT 0x95 #define ZCL_STATUS_INVALID_IMAGE 0x96 #define ZCL_STATUS_WAIT_FOR_DATA 0x97 #define ZCL_STATUS_NO_IMAGE_AVAILABLE 0x98 #define ZCL_STATUS_REQUIRE_MORE_IMAGE 0x99 // 0xbd-bf are reserved. #define ZCL_STATUS_HARDWARE_FAILURE 0xc0 #define ZCL_STATUS_SOFTWARE_FAILURE 0xc1 #define ZCL_STATUS_CALIBRATION_ERROR 0xc2 // 0xc3-0xff are reserved. #define ZCL_STATUS_CMD_HAS_RSP 0xFF // Non-standard status (used for Default Rsp) /*** Attribute Access Control - bit masks ***/ #define ACCESS_CONTROL_READ 0x01 #define ACCESS_CONTROL_WRITE 0x02 #define ACCESS_CONTROL_COMMAND 0x04 #define ACCESS_CONTROL_AUTH_READ 0x10 #define ACCESS_CONTROL_AUTH_WRITE 0x20 #define ZCL_ATTR_ID_MAX 0xFFFF // Used by Configure Reporting Command #define ZCL_SEND_ATTR_REPORTS 0x00 #define ZCL_EXPECT_ATTR_REPORTS 0x01 // Predefined Maximum String Length #define MAX_UTF8_STRING_LEN 50 // Used by zclReadWriteCB_t callback function #define ZCL_OPER_LEN 0x00 // Get length of attribute value to be read #define ZCL_OPER_READ 0x01 // Read attribute value #define ZCL_OPER_WRITE 0x02 // Write new attribute value /********************************************************************* * MACROS */ #define zcl_ProfileCmd( a ) ( (a) == ZCL_FRAME_TYPE_PROFILE_CMD ) #define zcl_ClusterCmd( a ) ( (a) == ZCL_FRAME_TYPE_SPECIFIC_CMD ) #define zcl_ServerCmd( a ) ( (a) == ZCL_FRAME_CLIENT_SERVER_DIR ) #define zcl_ClientCmd( a ) ( (a) == ZCL_FRAME_SERVER_CLIENT_DIR ) #define UNICAST_MSG( msg ) ( (msg)->wasBroadcast == false && (msg)->groupId == 0 ) // Padding needed if buffer has odd number of octects in length #define PADDING_NEEDED( bufLen ) ( (bufLen) % 2 ) // Check for Cluster IDs #define ZCL_CLUSTER_ID_GEN( id ) ( /* (id) >= ZCL_CLUSTER_ID_GEN_BASIC &&*/ \ (id) <= ZCL_CLUSTER_ID_GEN_COMMISSIONING ) #define ZCL_CLUSTER_ID_CLOSURES( id ) ( (id) >= ZCL_CLUSTER_ID_CLOSURES_SHADE_CONFIG && \ (id) <= ZCL_CLUSTER_ID_CLOSURES_WINDOW_COVERING ) #define ZCL_CLUSTER_ID_HVAC( id ) ( (id) >= ZCL_CLUSTER_ID_HVAC_PUMP_CONFIG_CONTROL && \ (id) <= ZCL_CLUSTER_ID_HAVC_USER_INTERFACE_CONFIG ) #define ZCL_CLUSTER_ID_LIGHTING( id ) ( (id) >= ZCL_CLUSTER_ID_LIGHTING_COLOR_CONTROL && \ (id) <= ZCL_CLUSTER_ID_LIGHTING_BALLAST_CONFIG ) #define ZCL_CLUSTER_ID_MS( id ) ( (id) >= ZCL_CLUSTER_ID_MS_ILLUMINANCE_MEASUREMENT && \ (id) <= ZCL_CLUSTER_ID_MS_OCCUPANCY_SENSING ) #define ZCL_CLUSTER_ID_SS( id ) ( (id) >= ZCL_CLUSTER_ID_SS_IAS_ZONE && \ (id) <= ZCL_CLUSTER_ID_SS_IAS_WD ) #define ZCL_CLUSTER_ID_KEY( id ) ( (id) == ZCL_CLUSTER_ID_GEN_KEY_ESTABLISHMENT ) #ifdef SE_UK_EXT #define ZCL_CLUSTER_ID_SE( id ) ( (id) >= ZCL_CLUSTER_ID_SE_PRICING && \ (id) <= ZCL_CLUSTER_ID_SE_DEVICE_MGMT ) #else #define ZCL_CLUSTER_ID_SE( id ) ( (id) >= ZCL_CLUSTER_ID_SE_PRICING && \ (id) <= ZCL_CLUSTER_ID_SE_PREPAYMENT ) #endif // SE_UK_EXT #define ZCL_CLUSTER_ID_PI( id ) ( (id) >= ZCL_CLUSTER_ID_PI_GENERIC_TUNNEL && \ (id) <= ZCL_CLUSTER_ID_PI_11073_PROTOCOL_TUNNEL ) #define ZCL_CLUSTER_ID_SL( id ) ( (id) == ZCL_CLUSTER_ID_SMART_LIGHT ) /********************************************************************* * TYPEDEFS */ // ZCL header - frame control field typedef struct { unsigned int type:2; unsigned int manuSpecific:1; unsigned int direction:1; unsigned int disableDefaultRsp:1; unsigned int reserved:3; } zclFrameControl_t; // ZCL header typedef struct { zclFrameControl_t fc; uint16 manuCode; uint8 transSeqNum; uint8 commandID; } zclFrameHdr_t; #ifdef ZCL_READ // Read Attribute Command format typedef struct { uint8 numAttr; // number of attributes in the list uint16 attrID[]; // supported attributes list - this structure should // be allocated with the appropriate number of attributes. } zclReadCmd_t; // Read Attribute Response Status record typedef struct { uint16 attrID; // attribute ID uint8 status; // should be ZCL_STATUS_SUCCESS or error uint8 dataType; // attribute data type uint8 *data; // this structure is allocated, so the data is HERE // - the size depends on the attribute data type } zclReadRspStatus_t; // Read Attribute Response Command format typedef struct { uint8 numAttr; // number of attributes in the list zclReadRspStatus_t attrList[]; // attribute status list } zclReadRspCmd_t; #endif // ZCL_READ // Write Attribute record typedef struct { uint16 attrID; // attribute ID uint8 dataType; // attribute data type uint8 *attrData; // this structure is allocated, so the data is HERE // - the size depends on the attribute data type } zclWriteRec_t; // Write Attribute Command format typedef struct { uint8 numAttr; // number of attribute records in the list zclWriteRec_t attrList[]; // attribute records } zclWriteCmd_t; // Write Attribute Status record typedef struct { uint8 status; // should be ZCL_STATUS_SUCCESS or error uint16 attrID; // attribute ID } zclWriteRspStatus_t; // Write Attribute Response Command format typedef struct { uint8 numAttr; // number of attribute status in the list zclWriteRspStatus_t attrList[]; // attribute status records } zclWriteRspCmd_t; // Configure Reporting Command format typedef struct { uint8 direction; // to send or receive reports of the attribute uint16 attrID; // attribute ID uint8 dataType; // attribute data type uint16 minReportInt; // minimum reporting interval uint16 maxReportInt; // maximum reporting interval uint16 timeoutPeriod; // timeout period uint8 *reportableChange; // reportable change (only applicable to analog data type) // - the size depends on the attribute data type } zclCfgReportRec_t; typedef struct { uint8 numAttr; // number of attribute IDs in the list zclCfgReportRec_t attrList[]; // attribute ID list } zclCfgReportCmd_t; // Attribute Status record typedef struct { uint8 status; // should be ZCL_STATUS_SUCCESS or error uint8 direction; // whether attributes are reported or reports of attributes are received uint16 attrID; // attribute ID } zclCfgReportStatus_t; // Configure Reporting Response Command format typedef struct { uint8 numAttr; // number of attribute status in the list zclCfgReportStatus_t attrList[]; // attribute status records } zclCfgReportRspCmd_t; // Read Reporting Configuration Command format typedef struct { uint8 direction; // to send or receive reports of the attribute uint16 attrID; // attribute ID } zclReadReportCfgRec_t; typedef struct { uint8 numAttr; // number of attributes in the list zclReadReportCfgRec_t attrList[]; // attribute ID list } zclReadReportCfgCmd_t; // Attribute Reporting Configuration record typedef struct { uint8 status; // status field uint8 direction; // to send or receive reports of the attribute uint16 attrID; // attribute ID uint8 dataType; // attribute data type uint16 minReportInt; // minimum reporting interval uint16 maxReportInt; // maximum reporting interval uint16 timeoutPeriod; // timeout period uint8 *reportableChange; // reportable change (only applicable to analog data type) // - the size depends on the attribute data type } zclReportCfgRspRec_t; // Read Reporting Configuration Response Command format typedef struct { uint8 numAttr; // number of records in the list zclReportCfgRspRec_t attrList[]; // attribute reporting configuration list } zclReadReportCfgRspCmd_t; // Attribute Report typedef struct { uint16 attrID; // atrribute ID uint8 dataType; // attribute data type uint8 *attrData; // this structure is allocated, so the data is HERE // - the size depends on the data type of attrID } zclReport_t; // Report Attributes Command format typedef struct { uint8 numAttr; // number of reports in the list zclReport_t attrList[]; // attribute report list } zclReportCmd_t; // Default Response Command format typedef struct { uint8 commandID; uint8 statusCode; } zclDefaultRspCmd_t; // Discover Attributes Command format typedef struct { uint16 startAttr; // specifies the minimum value of the identifier // to begin attribute discovery. uint8 maxAttrIDs; // maximum number of attribute IDs that are to be // returned in the resulting response command. } zclDiscoverCmd_t; // Attribute Report info typedef struct { uint16 attrID; // attribute ID uint8 dataType; // attribute data type (see Table 17 in Spec) } zclDiscoverInfo_t; // Discover Attributes Response Command format typedef struct { uint8 discComplete; // whether or not there're more attributes to be discovered uint8 numAttr; // number of attributes in the list zclDiscoverInfo_t attrList[]; // supported attributes list } zclDiscoverRspCmd_t; // String Data Type typedef struct { uint8 strLen; uint8 *pStr; } UTF8String_t; /********************************************************************* * Plugins */ // Incoming ZCL message, this buffer will be allocated, cmd will point to the // the command record. typedef struct { afIncomingMSGPacket_t *msg; // incoming message zclFrameHdr_t hdr; // ZCL header parsed uint8 *pData; // pointer to data after header uint16 pDataLen; // length of remaining data void *attrCmd; // pointer to the parsed attribute or command } zclIncoming_t; // Outgoing ZCL Cluster Specific Commands typedef struct { zclFrameHdr_t hdr; uint16 realClusterID; uint16 attrID; void *cmdStruct; uint8 cmdLen; uint8 *cmdData; } zclOutgoingCmd_t; // Incoming ZCL message passed to the Application. This buffer will be // allocated and attrCmd will point to the command record. // // NOTE - the Application must deallocate the message plus attrCmd buffer. // typedef struct { osal_event_hdr_t hdr; // OSAL header zclFrameHdr_t zclHdr; // ZCL header parsed uint16 clusterId; // Cluster ID afAddrType_t srcAddr; // Sender's address uint8 endPoint; // destination endpoint void *attrCmd; // pointer to the parsed attribute or command; must be freed by Application } zclIncomingMsg_t; // Function pointer type to handle incoming messages. // msg - incoming message // logicalClusterID - logical cluster ID typedef ZStatus_t (*zclInHdlr_t)( zclIncoming_t *pInHdlrMsg ); // Function pointer type to handle incoming write commands. // msg - incoming message // logicalClusterID - logical cluster ID // writeRec - received data to be written typedef ZStatus_t (*zclInWrtHdlr_t)( zclIncoming_t *msg, uint16 logicalClusterID, zclWriteRec_t *writeRec ); // Attribute record typedef struct { uint16 attrId; // Attribute ID uint8 dataType; // Data Type - defined in AF.h uint8 accessControl; // Read/write - bit field void *dataPtr; // Pointer to data field } zclAttribute_t; typedef struct { uint16 clusterID; // Real cluster ID zclAttribute_t attr; } zclAttrRec_t; // Function pointer type to validate attribute data. // // pAttr - where data to be written // pAttrInfo - pointer to attribute info // // return TRUE if data valid. FALSE, otherwise. typedef uint8 (*zclValidateAttrData_t)( zclAttrRec_t *pAttr, zclWriteRec_t *pAttrInfo ); // Function pointer type to read/write attribute data. // // clusterId - cluster that attribute belongs to // attrId - attribute to be read or written // oper - ZCL_OPER_LEN, ZCL_OPER_READ, or ZCL_OPER_WRITE // pValue - pointer to attribute (length) value // pLen - length of attribute value read // // return ZCL_STATUS_SUCCESS: Operation successful // ZCL Error Status: Operation not successful typedef ZStatus_t (*zclReadWriteCB_t)( uint16 clusterId, uint16 attrId, uint8 oper, uint8 *pValue, uint16 *pLen ); // Callback function prototype to authorize a Read or Write operation // on a given attribute. // // srcAddr - source Address // pAttr - pointer to attribute // oper - ZCL_OPER_READ, or ZCL_OPER_WRITE // // return ZCL_STATUS_SUCCESS: Operation authorized // ZCL_STATUS_NOT_AUTHORIZED: Operation not authorized typedef ZStatus_t (*zclAuthorizeCB_t)( afAddrType_t *srcAddr, zclAttrRec_t *pAttr, uint8 oper ); typedef struct { uint16 clusterID; // Real cluster ID uint8 option; } zclOptionRec_t; // Parse received command typedef struct { uint8 endpoint; uint16 dataLen; uint8 *pData; } zclParseCmd_t; /********************************************************************* * GLOBAL VARIABLES */ extern uint8 zcl_TaskID; extern uint8 zcl_SeqNum; /********************************************************************* * FUNCTION MACROS */ #ifdef ZCL_WRITE /* * Send a Write Command - ZCL_CMD_WRITE * Use like: * ZStatus_t zcl_SendWrite( uint8 srcEP, afAddrType_t *dstAddr, uint16 realClusterID, zclWriteCmd_t *writeCmd, uint8 direction, uint8 disableDefaultRsp, uint8 seqNum ); */ #define zcl_SendWrite(a,b,c,d,e,f,g) (zcl_SendWriteRequest( (a), (b), (c), (d), ZCL_CMD_WRITE, (e), (f), (g) )) /* * Send a Write Undivided Command - ZCL_CMD_WRITE_UNDIVIDED * Use like: * ZStatus_t zcl_SendWriteUndivided( uint8 srcEP, afAddrType_t *dstAddr, uint16 realClusterID, zclWriteCmd_t *writeCmd, uint8 direction, uint8 disableDefaultRsp, uint8 seqNum ); */ #define zcl_SendWriteUndivided(a,b,c,d,e,f,g) (zcl_SendWriteRequest( (a), (b), (c), (d), ZCL_CMD_WRITE_UNDIVIDED, (e), (f), (g) )) /* * Send a Write No Response Command - ZCL_CMD_WRITE_NO_RSP * Use like: * ZStatus_t zcl_SendWriteNoRsp( uint8 srcEP, afAddrType_t *dstAddr, uint16 realClusterID, zclWriteCmd_t *writeCmd, uint8 direction, uint8 disableDefaultRsp, uint8 seqNum ); */ #define zcl_SendWriteNoRsp(a,b,c,d,e,f,g) (zcl_SendWriteRequest( (a), (b), (c), (d), ZCL_CMD_WRITE_NO_RSP, (e), (f), (g) )) #endif // ZCL_WRITE /********************************************************************* * FUNCTIONS */ /* * Initialization for the task */ extern void zcl_Init( byte task_id ); /* * Event Process for the task */ extern UINT16 zcl_event_loop( byte task_id, UINT16 events ); /* * Function for Plugins' to register for incoming messages */ extern ZStatus_t zcl_registerPlugin( uint16 startLogCluster, uint16 endLogCluster, zclInHdlr_t pfnIncomingHdlr ); /* * Register Application's Attribute table */ extern ZStatus_t zcl_registerAttrList( uint8 endpoint, uint8 numAttr, CONST zclAttrRec_t attrList[] ); /* * Register Application's Cluster Option table */ extern ZStatus_t zcl_registerClusterOptionList( uint8 endpoint, uint8 numOption, zclOptionRec_t optionList[] ); /* * Register Application's attribute data validation callback routine */ extern ZStatus_t zcl_registerValidateAttrData( zclValidateAttrData_t pfnValidateAttrData ); /* * Register the application's callback function to read/write attribute data. */ extern ZStatus_t zcl_registerReadWriteCB( uint8 endpoint, zclReadWriteCB_t pfnReadWriteCB, zclAuthorizeCB_t pfnAuthorizeCB ); /* * Register the Application to receive the unprocessed Foundation command/response messages */ extern uint8 zcl_registerForMsg( uint8 taskId ); /* * Function for Sending a Command */ extern ZStatus_t zcl_SendCommand( uint8 srcEP, afAddrType_t *dstAddr, uint16 clusterID, uint8 cmd, uint8 specific, uint8 direction, uint8 disableDefaultRsp, uint16 manuCode, uint8 seqNum, uint16 cmdFormatLen, uint8 *cmdFormat ); #ifdef ZCL_READ /* * Function for Reading an Attribute */ extern ZStatus_t zcl_SendRead( uint8 srcEP, afAddrType_t *dstAddr, uint16 realClusterID, zclReadCmd_t *readCmd, uint8 direction, uint8 disableDefaultRsp, uint8 seqNum ); /* * Function for sending a Read response command */ extern ZStatus_t zcl_SendReadRsp( uint8 srcEP, afAddrType_t *dstAddr, uint16 realClusterID, zclReadRspCmd_t *readRspCmd, uint8 direction, uint8 disableDefaultRsp, uint8 seqNum ); #endif // ZCL_READ #ifdef ZCL_WRITE /* * Function for Writing an Attribute */ extern ZStatus_t zcl_SendWriteRequest( uint8 srcEP, afAddrType_t *dstAddr, uint16 realClusterID, zclWriteCmd_t *writeCmd, uint8 cmd, uint8 direction, uint8 disableDefaultRsp, uint8 seqNum ); /* * Function for sending a Write response command */ extern ZStatus_t zcl_SendWriteRsp( uint8 srcEP, afAddrType_t *dstAddr, uint16 realClusterID, zclWriteRspCmd_t *writeRspCmd, uint8 direction, uint8 disableDefaultRsp, uint8 seqNum ); #endif // ZCL_WRITE #ifdef ZCL_REPORT /* * Function for Configuring the Reporting mechanism for one or more attributes */ extern ZStatus_t zcl_SendConfigReportCmd( uint8 srcEP, afAddrType_t *dstAddr, uint16 realClusterID, zclCfgReportCmd_t *cfgReportCmd, uint8 direction, uint8 disableDefaultRsp, uint8 seqNum ); /* * Function for sending a Configure Reporting Response Command */ extern ZStatus_t zcl_SendConfigReportRspCmd( uint8 srcEP, afAddrType_t *dstAddr, uint16 realClusterID, zclCfgReportRspCmd_t *cfgReportRspCmd, uint8 direction, uint8 disableDefaultRsp, uint8 seqNum ); /* * Function for Reading the configuration details of the Reporting mechanism */ extern ZStatus_t zcl_SendReadReportCfgCmd( uint8 srcEP, afAddrType_t *dstAddr, uint16 realClusterID, zclReadReportCfgCmd_t *readReportCfgCmd, uint8 direction, uint8 disableDefaultRsp, uint8 seqNum ); /* * Function for sending a Read Reporting Configuration Response command */ extern ZStatus_t zcl_SendReadReportCfgRspCmd( uint8 srcEP, afAddrType_t *dstAddr, uint16 realClusterID, zclReadReportCfgRspCmd_t *readReportCfgRspCmd, uint8 direction, uint8 disableDefaultRsp, uint8 seqNum ); /* * Function for Reporting the value of one or more attributes */ extern ZStatus_t zcl_SendReportCmd( uint8 srcEP, afAddrType_t *dstAddr, uint16 realClusterID, zclReportCmd_t *reportCmd, uint8 direction, uint8 disableDefaultRsp, uint8 seqNum ); #endif // ZCL_REPORT /* * Function for sending the Default Response command */ extern ZStatus_t zcl_SendDefaultRspCmd( uint8 srcEP, afAddrType_t *dstAddr, uint16 realClusterID, zclDefaultRspCmd_t *defaultRspCmd, uint8 direction, uint8 disableDefaultRsp, uint16 manuCode, uint8 seqNum ); #ifdef ZCL_DISCOVER /* * Function to Discover the ID and Types of the Attributes on a remote device */ extern ZStatus_t zcl_SendDiscoverCmd( uint8 srcEP, afAddrType_t *dstAddr, uint16 realClusterID, zclDiscoverCmd_t *discoverCmd, uint8 direction, uint8 disableDefaultRsp, uint8 seqNum ); /* * Function for sending the Discover Attributes Response command */ extern ZStatus_t zcl_SendDiscoverRspCmd( uint8 srcEP, afAddrType_t *dstAddr, uint16 realClusterID, zclDiscoverRspCmd_t *discoverRspCmd, uint8 direction, uint8 disableDefaultRsp, uint8 seqNum ); #endif // ZCL_DISCOVER #ifdef ZCL_READ /* * Function to parse the "Profile" Read Commands */ extern void *zclParseInReadCmd( zclParseCmd_t *pCmd ); #endif // ZCL_READ #ifdef ZCL_WRITE /* * Function to parse the "Profile" Write, Write Undivided and Write No Response * Commands */ extern void *zclParseInWriteCmd( zclParseCmd_t *pCmd ); #endif // ZCL_WRITE #ifdef ZCL_REPORT /* * Function to parse the "Profile" Configure Reporting Command */ extern void *zclParseInConfigReportCmd( zclParseCmd_t *pCmd ); /* * Function to parse the "Profile" Read Reporting Configuration Command */ extern void *zclParseInReadReportCfgCmd( zclParseCmd_t *pCmd ); /* * Function to parse the "Profile" Report attribute Command */ extern void *zclParseInReportCmd( zclParseCmd_t *pCmd ); /* * Function to check to see if Data Type is Analog */ extern uint8 zclAnalogDataType( uint8 dataType ); #endif // ZCL_REPORT #ifdef ZCL_DISCOVER /* * Function to parse the "Profile" Discover Commands */ extern void *zclParseInDiscCmd( zclParseCmd_t *pCmd ); #endif // ZCL_DISCOVER /* * Function to parse header of the ZCL format */ extern uint8 *zclParseHdr( zclFrameHdr_t *hdr, uint8 *pData ); /* * Function to find the attribute record that matchs the parameters */ extern uint8 zclFindAttrRec( uint8 endpoint, uint16 realClusterID, uint16 attrId, zclAttrRec_t *pAttr ); /* * Function to read the attribute's current value */ extern uint8 zclReadAttrData( uint8 *pAttrData, zclAttrRec_t *pAttr, uint16 *pDataLen ); /* * Function to return the length of the datatype in length. */ extern uint8 zclGetDataTypeLength( uint8 dataType ); /* * Function to serialize attribute data. */ extern uint8 *zclSerializeData( uint8 dataType, void *attrData, uint8 *buf ); /* * Function to return the length of the attribute. */ extern uint16 zclGetAttrDataLength( uint8 dataType, uint8 *pData); /* * Call to get original unprocessed AF message (not parsed by ZCL). * * NOTE: This function can only be called during a ZCL callback function * and the calling function must NOT change any data in the message. * * returns a pointer to original AF message, NULL if not processing * AF message. */ extern afIncomingMSGPacket_t *zcl_getRawAFMsg( void ); /********************************************************************* *********************************************************************/ #ifdef __cplusplus } #endif #endif /* ZCL_H */