/******************************************************************************************************** * @file zb_appCb.c * * @brief This is the source file for zb_appCb * * @author Zigbee Group * @date 2021 * * @par Copyright (c) 2021, Telink Semiconductor (Shanghai) Co., Ltd. ("TELINK") * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************************************/ #if (__PROJECT_TL_DIMMABLE_LIGHT__) /********************************************************************** * INCLUDES */ #include "tl_common.h" #include "zb_api.h" #include "zcl_include.h" #include "bdb.h" #include "ota.h" #include "sampleLight.h" #include "sampleLightCtrl.h" /********************************************************************** * LOCAL CONSTANTS */ #define DEBUG_HEART 0 /********************************************************************** * TYPEDEFS */ /********************************************************************** * LOCAL FUNCTIONS */ void zbdemo_bdbInitCb(u8 status, u8 joinedNetwork); void zbdemo_bdbCommissioningCb(u8 status, void *arg); void zbdemo_bdbIdentifyCb(u8 endpoint, u16 srcAddr, u16 identifyTime); /********************************************************************** * GLOBAL VARIABLES */ bdb_appCb_t g_zbDemoBdbCb = {zbdemo_bdbInitCb, zbdemo_bdbCommissioningCb, zbdemo_bdbIdentifyCb, NULL}; #ifdef ZCL_OTA ota_callBack_t sampleLight_otaCb = { sampleLight_otaProcessMsgHandler, }; #endif /********************************************************************** * LOCAL VARIABLES */ u32 heartInterval = 0; #if DEBUG_HEART ev_timer_event_t *heartTimerEvt = NULL; #endif /********************************************************************** * FUNCTIONS */ #if DEBUG_HEART static s32 heartTimerCb(void *arg) { if (heartInterval == 0) { heartTimerEvt = NULL; return -1; } gpio_toggle(LED_POWER); return heartInterval; } #endif s32 sampleLight_bdbNetworkSteerStart(void *arg) { bdb_networkSteerStart(); return -1; } #if FIND_AND_BIND_SUPPORT s32 sampleLight_bdbFindAndBindStart(void *arg) { bdb_findAndBindStart(BDB_COMMISSIONING_ROLE_TARGET); return -1; } #endif /********************************************************************* * @fn zbdemo_bdbInitCb * * @brief application callback for bdb initiation * * @param status - the status of bdb init BDB_INIT_STATUS_SUCCESS or BDB_INIT_STATUS_FAILURE * * @param joinedNetwork - 1: node is on a network, 0: node isn't on a network * * @return None */ void zbdemo_bdbInitCb(u8 status, u8 joinedNetwork) { if (status == BDB_INIT_STATUS_SUCCESS) { /* * start bdb commissioning * */ if (joinedNetwork) { heartInterval = 1000; #ifdef ZCL_OTA ota_queryStart(OTA_PERIODIC_QUERY_INTERVAL); #endif } else { heartInterval = 500; #if (!ZBHCI_EN) u16 jitter = 0; do { jitter = zb_random() % 0x0fff; } while (jitter == 0); TL_ZB_TIMER_SCHEDULE(sampleLight_bdbNetworkSteerStart, NULL, jitter); #endif } } else { heartInterval = 200; } #if DEBUG_HEART if (heartTimerEvt) { TL_ZB_TIMER_CANCEL(&heartTimerEvt); } heartTimerEvt = TL_ZB_TIMER_SCHEDULE(heartTimerCb, NULL, heartInterval); #endif } /********************************************************************* * @fn zbdemo_bdbCommissioningCb * * @brief application callback for bdb commissioning * * @param status - the status of bdb commissioning * * @param arg * * @return None */ void zbdemo_bdbCommissioningCb(u8 status, void *arg) { if (status == BDB_COMMISSION_STA_SUCCESS) { heartInterval = 1000; #if FIND_AND_BIND_SUPPORT if (!gLightCtx.bdbFindBindFlg) { gLightCtx.bdbFindBindFlg = TRUE; #endif light_blink_start(2, 200, 200); #ifdef ZCL_OTA ota_queryStart(OTA_PERIODIC_QUERY_INTERVAL); #endif #if FIND_AND_BIND_SUPPORT // start Finding & Binding TL_ZB_TIMER_SCHEDULE(sampleLight_bdbFindAndBindStart, NULL, 1000); } #endif } else if (status == BDB_COMMISSION_STA_IN_PROGRESS) { } else if (status == BDB_COMMISSION_STA_NOT_AA_CAPABLE) { } else if ((status == BDB_COMMISSION_STA_NO_NETWORK) || (status == BDB_COMMISSION_STA_TCLK_EX_FAILURE)) { u16 jitter = 0; do { jitter = zb_random() % 0x0fff; } while (jitter == 0); TL_ZB_TIMER_SCHEDULE(sampleLight_bdbNetworkSteerStart, NULL, jitter); } else if (status == BDB_COMMISSION_STA_TARGET_FAILURE) { } else if (status == BDB_COMMISSION_STA_FORMATION_FAILURE) { } else if (status == BDB_COMMISSION_STA_NO_IDENTIFY_QUERY_RESPONSE) { } else if (status == BDB_COMMISSION_STA_BINDING_TABLE_FULL) { } else if (status == BDB_COMMISSION_STA_NO_SCAN_RESPONSE) { } else if (status == BDB_COMMISSION_STA_NOT_PERMITTED) { } else if (status == BDB_COMMISSION_STA_REJOIN_FAILURE) { zb_rejoinReq(NLME_REJOIN_METHOD_REJOIN, zb_apsChannelMaskGet()); } else if (status == BDB_COMMISSION_STA_FORMATION_DONE) { #if ZBHCI_EN #else tl_zbMacChannelSet(DEFAULT_CHANNEL); // set default channel #endif } } extern void sampleLight_zclIdentifyCmdHandler(u8 endpoint, u16 srcAddr, u16 identifyTime); void zbdemo_bdbIdentifyCb(u8 endpoint, u16 srcAddr, u16 identifyTime) { #if FIND_AND_BIND_SUPPORT sampleLight_zclIdentifyCmdHandler(endpoint, srcAddr, identifyTime); #endif } #ifdef ZCL_OTA void sampleLight_otaProcessMsgHandler(u8 evt, u8 status) { if (evt == OTA_EVT_START) { if (status == ZCL_STA_SUCCESS) { } else { } } else if (evt == OTA_EVT_COMPLETE) { if (status == ZCL_STA_SUCCESS) { ota_mcuReboot(); } else { ota_queryStart(OTA_PERIODIC_QUERY_INTERVAL); } } } #endif s32 sampleLight_softReset(void *arg) { SYSTEM_RESET(); return -1; } /********************************************************************* * @fn sampleLight_leaveCnfHandler * * @brief Handler for ZDO Leave Confirm message. * * @param pRsp - parameter of leave confirm * * @return None */ void sampleLight_leaveCnfHandler(nlme_leave_cnf_t *pLeaveCnf) { if (pLeaveCnf->status == SUCCESS) { light_blink_start(3, 200, 200); // waiting blink over TL_ZB_TIMER_SCHEDULE(sampleLight_softReset, NULL, 2 * 1000); } } /********************************************************************* * @fn sampleLight_leaveIndHandler * * @brief Handler for ZDO leave indication message. * * @param pInd - parameter of leave indication * * @return None */ void sampleLight_leaveIndHandler(nlme_leave_ind_t *pLeaveInd) { } u8 sampleLight_nwkUpdateIndicateHandler(nwkCmd_nwkUpdate_t *pNwkUpdate) { return FAILURE; } #endif /* __PROJECT_TL_DIMMABLE_LIGHT__ */