123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605 |
- /**************************************************************************************************
- Filename: zcl_samplesw.c
- Revised: $Date: 2009-03-18 15:56:27 -0700 (Wed, 18 Mar 2009) $
- Revision: $Revision: 19453 $
- Description: Zigbee Cluster Library - sample device application.
- Copyright 2006-2009 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.
- **************************************************************************************************/
- /*********************************************************************
- This device will be like an On/Off Switch device. This application
- is not intended to be a On/Off Switch device, but will use the device
- description to implement this sample code.
- *********************************************************************/
- /*********************************************************************
- * INCLUDES
- */
- #include "ZComDef.h"
- #include "OSAL.h"
- #include "AF.h"
- #include "ZDApp.h"
- #include "ZDObject.h"
- #include "ZDProfile.h"
- #include "zcl.h"
- #include "zcl_general.h"
- #include "zcl_ha.h"
- #include "zcl_samplesw.h"
- #include "onboard.h"
- /* HAL */
- #include "hal_lcd.h"
- #include "hal_led.h"
- #include "hal_key.h"
- /*********************************************************************
- * MACROS
- */
- /*********************************************************************
- * CONSTANTS
- */
- /*********************************************************************
- * TYPEDEFS
- */
- /*********************************************************************
- * GLOBAL VARIABLES
- */
- byte zclSampleSw_TaskID;
- /*********************************************************************
- * GLOBAL FUNCTIONS
- */
- /*********************************************************************
- * LOCAL VARIABLES
- */
- static afAddrType_t zclSampleSw_DstAddr;
- #define ZCLSAMPLESW_BINDINGLIST 1
- static cId_t bindingOutClusters[ZCLSAMPLESW_BINDINGLIST] =
- {
- ZCL_CLUSTER_ID_GEN_ON_OFF
- };
- // Test Endpoint to allow SYS_APP_MSGs
- static endPointDesc_t sampleSw_TestEp =
- {
- 20, // Test endpoint
- &zclSampleSw_TaskID,
- (SimpleDescriptionFormat_t *)NULL, // No Simple description for this test endpoint
- (afNetworkLatencyReq_t)0 // No Network Latency req
- };
- /*********************************************************************
- * LOCAL FUNCTIONS
- */
- static void zclSampleSw_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg );
- static void zclSampleSw_HandleKeys( byte shift, byte keys );
- static void zclSampleSw_BasicResetCB( void );
- static void zclSampleSw_IdentifyCB( zclIdentify_t *pCmd );
- static void zclSampleSw_IdentifyQueryRspCB( zclIdentifyQueryRsp_t *pRsp );
- static void zclSampleSw_ProcessIdentifyTimeChange( void );
- // Functions to process ZCL Foundation incoming Command/Response messages
- static void zclSampleSw_ProcessIncomingMsg( zclIncomingMsg_t *msg );
- #ifdef ZCL_READ
- static uint8 zclSampleSw_ProcessInReadRspCmd( zclIncomingMsg_t *pInMsg );
- #endif
- #ifdef ZCL_WRITE
- static uint8 zclSampleSw_ProcessInWriteRspCmd( zclIncomingMsg_t *pInMsg );
- #endif
- static uint8 zclSampleSw_ProcessInDefaultRspCmd( zclIncomingMsg_t *pInMsg );
- #ifdef ZCL_DISCOVER
- static uint8 zclSampleSw_ProcessInDiscRspCmd( zclIncomingMsg_t *pInMsg );
- #endif
- /*********************************************************************
- * ZCL General Profile Callback table
- */
- static zclGeneral_AppCallbacks_t zclSampleSw_CmdCallbacks =
- {
- zclSampleSw_BasicResetCB, // Basic Cluster Reset command
- zclSampleSw_IdentifyCB, // Identify command
- zclSampleSw_IdentifyQueryRspCB, // Identify Query Response command
- NULL, // On / Off cluster command - not needed.
- NULL, // Level Control Move to Level command
- NULL, // Level Control Move command
- NULL, // Level Control Step command
- NULL, // Group Response commands
- NULL, // Scene Store Request command
- NULL, // Scene Recall Request command
- NULL, // Scene Response commands
- NULL, // Alarm (Response) commands
- NULL, // RSSI Location commands
- NULL, // RSSI Location Response commands
- };
- /*********************************************************************
- * @fn zclSampleSw_Init
- *
- * @brief Initialization function for the zclGeneral layer.
- *
- * @param none
- *
- * @return none
- */
- void zclSampleSw_Init( byte task_id )
- {
- zclSampleSw_TaskID = task_id;
- // Set destination address to indirect
- zclSampleSw_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;
- zclSampleSw_DstAddr.endPoint = 0;
- zclSampleSw_DstAddr.addr.shortAddr = 0;
- // This app is part of the Home Automation Profile
- zclHA_Init( &zclSampleSw_SimpleDesc );
- // Register the ZCL General Cluster Library callback functions
- zclGeneral_RegisterCmdCallbacks( SAMPLESW_ENDPOINT, &zclSampleSw_CmdCallbacks );
- // Register the application's attribute list
- zcl_registerAttrList( SAMPLESW_ENDPOINT, SAMPLESW_MAX_ATTRIBUTES, zclSampleSw_Attrs );
- // Register the Application to receive the unprocessed Foundation command/response messages
- zcl_registerForMsg( zclSampleSw_TaskID );
- // Register for all key events - This app will handle all key events
- RegisterForKeys( zclSampleSw_TaskID );
- // Register for a test endpoint
- afRegister( &sampleSw_TestEp );
- ZDO_RegisterForZDOMsg( zclSampleSw_TaskID, End_Device_Bind_rsp );
- ZDO_RegisterForZDOMsg( zclSampleSw_TaskID, Match_Desc_rsp );
- }
- /*********************************************************************
- * @fn zclSample_event_loop
- *
- * @brief Event Loop Processor for zclGeneral.
- *
- * @param none
- *
- * @return none
- */
- uint16 zclSampleSw_event_loop( uint8 task_id, uint16 events )
- {
- afIncomingMSGPacket_t *MSGpkt;
- (void)task_id; // Intentionally unreferenced parameter
- if ( events & SYS_EVENT_MSG )
- {
- while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( zclSampleSw_TaskID )) )
- {
- switch ( MSGpkt->hdr.event )
- {
- case ZCL_INCOMING_MSG:
- // Incoming ZCL Foundation command/response messages
- zclSampleSw_ProcessIncomingMsg( (zclIncomingMsg_t *)MSGpkt );
- break;
- case ZDO_CB_MSG:
- zclSampleSw_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );
- break;
- case KEY_CHANGE:
- zclSampleSw_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
- break;
- default:
- break;
- }
- // Release the memory
- osal_msg_deallocate( (uint8 *)MSGpkt );
- }
- // return unprocessed events
- return (events ^ SYS_EVENT_MSG);
- }
- if ( events & SAMPLESW_IDENTIFY_TIMEOUT_EVT )
- {
- zclSampleSw_IdentifyTime = 10;
- zclSampleSw_ProcessIdentifyTimeChange();
- return ( events ^ SAMPLESW_IDENTIFY_TIMEOUT_EVT );
- }
- // Discard unknown events
- return 0;
- }
- /*********************************************************************
- * @fn zclSampleSw_ProcessZDOMsgs()
- *
- * @brief Process response messages
- *
- * @param none
- *
- * @return none
- */
- void zclSampleSw_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg )
- {
- switch ( inMsg->clusterID )
- {
- case End_Device_Bind_rsp:
- if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )
- {
- // Light LED
- HalLedSet( HAL_LED_4, HAL_LED_MODE_ON );
- }
- #if defined(BLINK_LEDS)
- else
- {
- // Flash LED to show failure
- HalLedSet ( HAL_LED_4, HAL_LED_MODE_FLASH );
- }
- #endif
- break;
- case Match_Desc_rsp:
- {
- ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );
- if ( pRsp )
- {
- if ( pRsp->status == ZSuccess && pRsp->cnt )
- {
- zclSampleSw_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
- zclSampleSw_DstAddr.addr.shortAddr = pRsp->nwkAddr;
- // Take the first endpoint, Can be changed to search through endpoints
- zclSampleSw_DstAddr.endPoint = pRsp->epList[0];
- // Light LED
- HalLedSet( HAL_LED_4, HAL_LED_MODE_ON );
- }
- osal_mem_free( pRsp );
- }
- }
- break;
- }
- }
- /*********************************************************************
- * @fn zclSampleSw_HandleKeys
- *
- * @brief Handles all key events for this device.
- *
- * @param shift - true if in shift/alt.
- * @param keys - bit field for key events. Valid entries:
- * HAL_KEY_SW_4
- * HAL_KEY_SW_3
- * HAL_KEY_SW_2
- * HAL_KEY_SW_1
- *
- * @return none
- */
- static void zclSampleSw_HandleKeys( byte shift, byte keys )
- {
- zAddrType_t dstAddr;
- (void)shift; // Intentionally unreferenced parameter
- if ( keys & HAL_KEY_SW_1 )
- {
- // Using this as the "Light Switch"
- #ifdef ZCL_ON_OFF
- zclGeneral_SendOnOff_CmdToggle( SAMPLESW_ENDPOINT, &zclSampleSw_DstAddr, false, 0 );
- #endif
- }
- if ( keys & HAL_KEY_SW_2 )
- {
- HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );
- // Initiate an End Device Bind Request, this bind request will
- // only use a cluster list that is important to binding.
- dstAddr.addrMode = afAddr16Bit;
- dstAddr.addr.shortAddr = 0; // Coordinator makes the match
- ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
- SAMPLESW_ENDPOINT,
- ZCL_HA_PROFILE_ID,
- 0, NULL, // No incoming clusters to bind
- ZCLSAMPLESW_BINDINGLIST, bindingOutClusters,
- TRUE );
- }
- if ( keys & HAL_KEY_SW_3 )
- {
- }
- if ( keys & HAL_KEY_SW_4 )
- {
- HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );
- // Initiate a Match Description Request (Service Discovery)
- dstAddr.addrMode = AddrBroadcast;
- dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
- ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,
- ZCL_HA_PROFILE_ID,
- ZCLSAMPLESW_BINDINGLIST, bindingOutClusters,
- 0, NULL, // No incoming clusters to bind
- FALSE );
- }
- }
- /*********************************************************************
- * @fn zclSampleSw_ProcessIdentifyTimeChange
- *
- * @brief Called to process any change to the IdentifyTime attribute.
- *
- * @param none
- *
- * @return none
- */
- static void zclSampleSw_ProcessIdentifyTimeChange( void )
- {
- if ( zclSampleSw_IdentifyTime > 0 )
- {
- osal_start_timerEx( zclSampleSw_TaskID, SAMPLESW_IDENTIFY_TIMEOUT_EVT, 1000 );
- HalLedBlink ( HAL_LED_4, 0xFF, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME );
- }
- else
- {
- if ( zclSampleSw_OnOff )
- HalLedSet ( HAL_LED_4, HAL_LED_MODE_ON );
- else
- HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );
- osal_stop_timerEx( zclSampleSw_TaskID, SAMPLESW_IDENTIFY_TIMEOUT_EVT );
- }
- }
- /*********************************************************************
- * @fn zclSampleSw_BasicResetCB
- *
- * @brief Callback from the ZCL General Cluster Library
- * to set all the Basic Cluster attributes to default values.
- *
- * @param none
- *
- * @return none
- */
- static void zclSampleSw_BasicResetCB( void )
- {
- }
- /*********************************************************************
- * @fn zclSampleSw_IdentifyCB
- *
- * @brief Callback from the ZCL General Cluster Library when
- * it received an Identity Command for this application.
- *
- * @param srcAddr - source address and endpoint of the response message
- * @param identifyTime - the number of seconds to identify yourself
- *
- * @return none
- */
- static void zclSampleSw_IdentifyCB( zclIdentify_t *pCmd )
- {
- zclSampleSw_IdentifyTime = pCmd->identifyTime;
- zclSampleSw_ProcessIdentifyTimeChange();
- }
- /*********************************************************************
- * @fn zclSampleSw_IdentifyQueryRspCB
- *
- * @brief Callback from the ZCL General Cluster Library when
- * it received an Identity Query Response Command for this application.
- *
- * @param srcAddr - source address
- * @param timeout - number of seconds to identify yourself (valid for query response)
- *
- * @return none
- */
- static void zclSampleSw_IdentifyQueryRspCB( zclIdentifyQueryRsp_t *pRsp )
- {
- // Query Response (with timeout value)
- (void)pRsp;
- }
- /******************************************************************************
- *
- * Functions for processing ZCL Foundation incoming Command/Response messages
- *
- *****************************************************************************/
- /*********************************************************************
- * @fn zclSampleSw_ProcessIncomingMsg
- *
- * @brief Process ZCL Foundation incoming message
- *
- * @param pInMsg - pointer to the received message
- *
- * @return none
- */
- static void zclSampleSw_ProcessIncomingMsg( zclIncomingMsg_t *pInMsg )
- {
- switch ( pInMsg->zclHdr.commandID )
- {
- #ifdef ZCL_READ
- case ZCL_CMD_READ_RSP:
- zclSampleSw_ProcessInReadRspCmd( pInMsg );
- break;
- #endif
- #ifdef ZCL_WRITE
- case ZCL_CMD_WRITE_RSP:
- zclSampleSw_ProcessInWriteRspCmd( pInMsg );
- break;
- #endif
- #ifdef ZCL_REPORT
- // See ZCL Test Applicaiton (zcl_testapp.c) for sample code on Attribute Reporting
- case ZCL_CMD_CONFIG_REPORT:
- //zclSampleSw_ProcessInConfigReportCmd( pInMsg );
- break;
- case ZCL_CMD_CONFIG_REPORT_RSP:
- //zclSampleSw_ProcessInConfigReportRspCmd( pInMsg );
- break;
- case ZCL_CMD_READ_REPORT_CFG:
- //zclSampleSw_ProcessInReadReportCfgCmd( pInMsg );
- break;
- case ZCL_CMD_READ_REPORT_CFG_RSP:
- //zclSampleSw_ProcessInReadReportCfgRspCmd( pInMsg );
- break;
- case ZCL_CMD_REPORT:
- //zclSampleSw_ProcessInReportCmd( pInMsg );
- break;
- #endif
- case ZCL_CMD_DEFAULT_RSP:
- zclSampleSw_ProcessInDefaultRspCmd( pInMsg );
- break;
- #ifdef ZCL_DISCOVER
- case ZCL_CMD_DISCOVER_RSP:
- zclSampleSw_ProcessInDiscRspCmd( pInMsg );
- break;
- #endif
- default:
- break;
- }
- if ( pInMsg->attrCmd )
- osal_mem_free( pInMsg->attrCmd );
- }
- #ifdef ZCL_READ
- /*********************************************************************
- * @fn zclSampleSw_ProcessInReadRspCmd
- *
- * @brief Process the "Profile" Read Response Command
- *
- * @param pInMsg - incoming message to process
- *
- * @return none
- */
- static uint8 zclSampleSw_ProcessInReadRspCmd( zclIncomingMsg_t *pInMsg )
- {
- zclReadRspCmd_t *readRspCmd;
- uint8 i;
- readRspCmd = (zclReadRspCmd_t *)pInMsg->attrCmd;
- for (i = 0; i < readRspCmd->numAttr; i++)
- {
- // Notify the originator of the results of the original read attributes
- // attempt and, for each successfull request, the value of the requested
- // attribute
- }
- return TRUE;
- }
- #endif // ZCL_READ
- #ifdef ZCL_WRITE
- /*********************************************************************
- * @fn zclSampleSw_ProcessInWriteRspCmd
- *
- * @brief Process the "Profile" Write Response Command
- *
- * @param pInMsg - incoming message to process
- *
- * @return none
- */
- static uint8 zclSampleSw_ProcessInWriteRspCmd( zclIncomingMsg_t *pInMsg )
- {
- zclWriteRspCmd_t *writeRspCmd;
- uint8 i;
- writeRspCmd = (zclWriteRspCmd_t *)pInMsg->attrCmd;
- for (i = 0; i < writeRspCmd->numAttr; i++)
- {
- // Notify the device of the results of the its original write attributes
- // command.
- }
- return TRUE;
- }
- #endif // ZCL_WRITE
- /*********************************************************************
- * @fn zclSampleSw_ProcessInDefaultRspCmd
- *
- * @brief Process the "Profile" Default Response Command
- *
- * @param pInMsg - incoming message to process
- *
- * @return none
- */
- static uint8 zclSampleSw_ProcessInDefaultRspCmd( zclIncomingMsg_t *pInMsg )
- {
- // zclDefaultRspCmd_t *defaultRspCmd = (zclDefaultRspCmd_t *)pInMsg->attrCmd;
- // Device is notified of the Default Response command.
- (void)pInMsg;
- return TRUE;
- }
- #ifdef ZCL_DISCOVER
- /*********************************************************************
- * @fn zclSampleSw_ProcessInDiscRspCmd
- *
- * @brief Process the "Profile" Discover Response Command
- *
- * @param pInMsg - incoming message to process
- *
- * @return none
- */
- static uint8 zclSampleSw_ProcessInDiscRspCmd( zclIncomingMsg_t *pInMsg )
- {
- zclDiscoverRspCmd_t *discoverRspCmd;
- uint8 i;
- discoverRspCmd = (zclDiscoverRspCmd_t *)pInMsg->attrCmd;
- for ( i = 0; i < discoverRspCmd->numAttr; i++ )
- {
- // Device is notified of the result of its attribute discovery command.
- }
- return TRUE;
- }
- #endif // ZCL_DISCOVER
- /****************************************************************************
- ****************************************************************************/
|