/********************************************************************* * @fn zclSampleTemperatureSensor_IdentifyQueryRspCB * * @brief Callback from the ZCL General Cluster Library when * it received an Identity Query Response Command for this application. * * @param srcAddr - requestor's address * @param timeout - number of seconds to identify yourself (valid for query response) * * @return none */ static void zclSampleTemperatureSensor_IdentifyQueryRspCB( zclIdentifyQueryRsp_t *pRsp ) { (void)pRsp; #ifdef ZCL_EZMODE { zclEZMode_ActionData_t data; data.pIdentifyQueryRsp = pRsp; zcl_EZModeAction ( EZMODE_ACTION_IDENTIFY_QUERY_RSP, &data ); } #endif }
/********************************************************************* * @fn zclSampleSw_ProcessZDOMsgs * * @brief Called when this node receives a ZDO/ZDP response. * * @param none * * @return status */ static void zclSampleSw_ProcessZDOMsgs( zdoIncomingMsg_t *pMsg ) { // Let EZ-Mode know of the Match Descriptor Reponse (same as ActiveEP Response) if ( pMsg->clusterID == Match_Desc_rsp ) { zclEZMode_ActionData_t data; ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( pMsg ); data.pMatchDescRsp = pRsp; zcl_EZModeAction( EZMODE_ACTION_MATCH_DESC_RSP, &data ); osal_mem_free(pRsp); } }
/********************************************************************* * @fn zclSampleTemperatureSensor_ProcessZDOMsgs * * @brief Called when this node receives a ZDO/ZDP response. * * @param none * * @return status */ static void zclSampleTemperatureSensor_ProcessZDOMsgs( zdoIncomingMsg_t *pMsg ) { zclEZMode_ActionData_t data; ZDO_MatchDescRsp_t *pMatchDescRsp; // Let EZ-Mode know of the Match Descriptor Response if ( pMsg->clusterID == Match_Desc_rsp ) { pMatchDescRsp = ZDO_ParseEPListRsp( pMsg ); data.pMatchDescRsp = pMatchDescRsp; zcl_EZModeAction( EZMODE_ACTION_MATCH_DESC_RSP, &data ); osal_mem_free( pMatchDescRsp ); } }
/********************************************************************* * @fn zclSample_event_loop * * @brief Event Loop Processor for zclGeneral. * * @param none * * @return none */ uint16 zclSampleTemperatureSensor_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( zclSampleTemperatureSensor_TaskID )) ) { switch ( MSGpkt->hdr.event ) { #ifdef ZCL_EZMODE case ZDO_CB_MSG: zclSampleTemperatureSensor_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt ); break; #endif case ZCL_INCOMING_MSG: // Incoming ZCL Foundation command/response messages zclSampleTemperatureSensor_ProcessIncomingMsg( (zclIncomingMsg_t *)MSGpkt ); break; case KEY_CHANGE: zclSampleTemperatureSensor_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys ); break; case ZDO_STATE_CHANGE: zclSampleTemperatureSensor_NwkState = (devStates_t)(MSGpkt->hdr.status); // now on the network if ( (zclSampleTemperatureSensor_NwkState == DEV_ZB_COORD) || (zclSampleTemperatureSensor_NwkState == DEV_ROUTER) || (zclSampleTemperatureSensor_NwkState == DEV_END_DEVICE) ) { #ifndef HOLD_AUTO_START giTemperatureSensorScreenMode = TEMPSENSE_MAINMODE; zclSampleTemperatureSensor_LcdDisplayUpdate(); #endif #ifdef ZCL_EZMODE zcl_EZModeAction( EZMODE_ACTION_NETWORK_STARTED, NULL ); #endif // ZCL_EZMODE } break; default: break; } // Release the memory osal_msg_deallocate( (uint8 *)MSGpkt ); } // return unprocessed events return (events ^ SYS_EVENT_MSG); } if ( events & SAMPLETEMPERATURESENSOR_IDENTIFY_TIMEOUT_EVT ) { if ( zclSampleTemperatureSensor_IdentifyTime > 0 ) zclSampleTemperatureSensor_IdentifyTime--; zclSampleTemperatureSensor_ProcessIdentifyTimeChange(); return ( events ^ SAMPLETEMPERATURESENSOR_IDENTIFY_TIMEOUT_EVT ); } #ifdef ZCL_EZMODE // going on to next state if ( events & SAMPLETEMPERATURESENSOR_EZMODE_NEXTSTATE_EVT ) { zcl_EZModeAction ( EZMODE_ACTION_PROCESS, NULL ); // going on to next state return ( events ^ SAMPLETEMPERATURESENSOR_EZMODE_NEXTSTATE_EVT ); } // the overall EZMode timer expired, so we timed out if ( events & SAMPLETEMPERATURESENSOR_EZMODE_TIMEOUT_EVT ) { zcl_EZModeAction ( EZMODE_ACTION_TIMED_OUT, NULL ); // EZ-Mode timed out return ( events ^ SAMPLETEMPERATURESENSOR_EZMODE_TIMEOUT_EVT ); } #endif // ZLC_EZMODE if ( events & SAMPLETEMPERATURESENSOR_MAIN_SCREEN_EVT ) { giTemperatureSensorScreenMode = TEMPSENSE_MAINMODE; zclSampleTemperatureSensor_LcdDisplayUpdate(); return ( events ^ SAMPLETEMPERATURESENSOR_MAIN_SCREEN_EVT ); } if ( events & SAMPLETEMPERATURESENSOR_TEMP_SEND_EVT ) { zclSampleTemperatureSensor_SendTemp(); // report current temperature reading every 10 seconds osal_start_timerEx( zclSampleTemperatureSensor_TaskID, SAMPLETEMPERATURESENSOR_TEMP_SEND_EVT, SAMPLETEMPERATURESENSOR_REPORT_INTERVAL ); return ( events ^ SAMPLETEMPERATURESENSOR_TEMP_SEND_EVT ); } // Discard unknown events return 0; }
/********************************************************************* * @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 ) { #ifdef ZCL_EZMODE case ZDO_CB_MSG: zclSampleSw_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt ); break; #endif case ZCL_INCOMING_MSG: // Incoming ZCL Foundation command/response messages zclSampleSw_ProcessIncomingMsg( (zclIncomingMsg_t *)MSGpkt ); break; case KEY_CHANGE: zclSampleSw_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys ); break; case ZDO_STATE_CHANGE: zclSampleSw_NwkState = (devStates_t)(MSGpkt->hdr.status); // now on the network if ( (zclSampleSw_NwkState == DEV_ZB_COORD) || (zclSampleSw_NwkState == DEV_ROUTER) || (zclSampleSw_NwkState == DEV_END_DEVICE) ) { #ifndef HOLD_AUTO_START giSwScreenMode = SW_MAINMODE; zclSampleSw_LcdDisplayUpdate(); #endif #ifdef ZCL_EZMODE zcl_EZModeAction( EZMODE_ACTION_NETWORK_STARTED, NULL ); #endif } break; #if defined (OTA_CLIENT) && (OTA_CLIENT == TRUE) case ZCL_OTA_CALLBACK_IND: zclSampleSw_ProcessOTAMsgs( (zclOTA_CallbackMsg_t*)MSGpkt ); break; #endif 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 ); } if ( events & SAMPLESW_MAIN_SCREEN_EVT ) { giSwScreenMode = SW_MAINMODE; zclSampleSw_LcdDisplayUpdate(); #ifdef LCD_SUPPORTED HalLcdWriteString( (char *)sClearLine, HAL_LCD_LINE_2 ); #endif return ( events ^ SAMPLESW_MAIN_SCREEN_EVT ); } #ifdef ZCL_EZMODE if ( events & SAMPLESW_EZMODE_NEXTSTATE_EVT ) { zcl_EZModeAction ( EZMODE_ACTION_PROCESS, NULL ); // going on to next state return ( events ^ SAMPLESW_EZMODE_NEXTSTATE_EVT ); } if ( events & SAMPLESW_EZMODE_TIMEOUT_EVT ) { zcl_EZModeAction ( EZMODE_ACTION_TIMED_OUT, NULL ); // EZ-Mode timed out return ( events ^ SAMPLESW_EZMODE_TIMEOUT_EVT ); } #endif // ZLC_EZMODE // Discard unknown events return 0; }