288 lines
7.0 KiB
C
288 lines
7.0 KiB
C
|
/********************************************************************************************************
|
||
|
* @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__ */
|