Commit 682c75ca authored by limm's avatar limm

V1.0 VERSION

parent 25f1f17b
......@@ -188,6 +188,11 @@ void user_app_init(void)
zcl_register(fixedEndpoints[i], Cluster_Num_List[i], (zcl_specClusterInfo_t *)g_EPClusterAllList[i]);
}
#if AF_TEST_ENABLE
/* Register endPoint */
u8 status = af_endpointRegister(SAMPLE_TEST_ENDPOINT, (af_simple_descriptor_t *)&sampleTestDesc, afTest_rx_handler, afTest_dataSendConfirm);
printf("af_test regester status =%d\r\n",status);
#endif
#ifdef ZCL_GREEN_POWER
/* Initialize GP */
......@@ -272,6 +277,7 @@ void user_init(bool isRetention)
user_app_init();
App_Init();
printf("###########init !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n");
/* Register except handler for test */
sys_exceptHandlerRegister(sampleLightSysException);
......
......@@ -47,12 +47,11 @@
#define _SAMPLE_LIGHT_H_
#include ENDPOINT_CONFIG_H
/**********************************************************************
* CONSTANT
*/
#define SAMPLE_LIGHT_ENDPOINT 0x01
#define SAMPLE_TEST_ENDPOINT 0x02
#define SAMPLE_TEST_ENDPOINT 0x06
/**********************************************************************
* TYPEDEFS
......
......@@ -58,7 +58,7 @@
*/
#define ZCL_BASIC_MFG_NAME {5,'K','o','n','k','e'}
#define ZCL_BASIC_MODEL_ID {16,'3','A','F','E','2','8','2','0','0','0','0','6','8','6','2','1'}
#define ZCL_BASIC_MODEL_ID {16,'3','A','F','E','2','0','2','0','0','0','0','6','8','6','2','4'}
#ifndef ZCL_BASIC_MFG_NAME
#define ZCL_BASIC_MFG_NAME {6,'T','E','L','I','N','K'}
......@@ -120,7 +120,6 @@ const u16 EP1_inClusterList[] =
#ifdef ZCL_FCC0
ZCL_CLUSTER_PRIVATE_FCC0,
#endif
};
/**
......@@ -162,10 +161,6 @@ const u16 EP2_inClusterList[] =
#ifdef ZCL_ZLL_COMMISSIONING
ZCL_CLUSTER_TOUCHLINK_COMMISSIONING,
#endif
#ifdef ZCL_FCC0
ZCL_CLUSTER_PRIVATE_FCC0,
#endif
};
/**
......@@ -208,10 +203,6 @@ const u16 EP3_inClusterList[] =
#ifdef ZCL_ZLL_COMMISSIONING
ZCL_CLUSTER_TOUCHLINK_COMMISSIONING,
#endif
#ifdef ZCL_FCC0
ZCL_CLUSTER_PRIVATE_FCC0,
#endif
};
/**
......@@ -253,10 +244,6 @@ const u16 EP4_inClusterList[] =
#ifdef ZCL_ZLL_COMMISSIONING
ZCL_CLUSTER_TOUCHLINK_COMMISSIONING,
#endif
#ifdef ZCL_FCC0
ZCL_CLUSTER_PRIVATE_FCC0,
#endif
};
/**
......@@ -299,6 +286,7 @@ const u16 sampleTest_inClusterList[] =
ZCL_CLUSTER_TELINK_SDK_TEST_RSP,
ZCL_CLUSTER_TELINK_SDK_TEST_CLEAR_REQ,
ZCL_CLUSTER_TELINK_SDK_TEST_CLEAR_RSP,
0x0001,
};
......@@ -324,8 +312,8 @@ const u16 sampleTest_outClusterList[] =
*/
const af_simple_descriptor_t sampleTestDesc =
{
HA_PROFILE_ID, /* Application profile identifier */
HA_DEV_DIMMABLE_LIGHT, /* Application device identifier */
ZDO_PROFILE_ID, /* Application profile identifier */
HA_DEV_ONOFF_LIGHT_SWITCH, /* Application device identifier */
SAMPLE_TEST_ENDPOINT, /* Endpoint */
0, /* Application device version */
0, /* Reserved */
......@@ -559,7 +547,7 @@ zcl_onOffAttr_t g_zcl_onOffAttrs[Support_Endpoint_Num] ={ONOFF_DEFAULT1,ONOFF_DE
const zclAttrInfo_t onOff_attrTbl[] =
{
{ ZCL_ATTRID_ONOFF, ZCL_DATA_TYPE_BOOLEAN, ACCESS_CONTROL_READ | ACCESS_CONTROL_REPORTABLE, (u8*)&g_zcl_onOffAttrs[0].onOff},
{ ZCL_ATTRID_ONOFF, ZCL_DATA_TYPE_BOOLEAN, ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE | ACCESS_CONTROL_REPORTABLE, (u8*)&g_zcl_onOffAttrs[0].onOff},
{ ZCL_ATTRID_GLOBAL_SCENE_CONTROL, ZCL_DATA_TYPE_BOOLEAN, ACCESS_CONTROL_READ, (u8*)&g_zcl_onOffAttrs[0].globalSceneControl},
{ ZCL_ATTRID_ON_TIME, ZCL_DATA_TYPE_UINT16, ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE, (u8*)&g_zcl_onOffAttrs[0].onTime},
{ ZCL_ATTRID_OFF_WAIT_TIME, ZCL_DATA_TYPE_UINT16, ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE, (u8*)&g_zcl_onOffAttrs[0].offWaitTime},
......@@ -569,7 +557,7 @@ const zclAttrInfo_t onOff_attrTbl[] =
};
const zclAttrInfo_t onOff_attrTb2[] =
{
{ ZCL_ATTRID_ONOFF, ZCL_DATA_TYPE_BOOLEAN, ACCESS_CONTROL_READ | ACCESS_CONTROL_REPORTABLE, (u8*)&g_zcl_onOffAttrs[1].onOff},
{ ZCL_ATTRID_ONOFF, ZCL_DATA_TYPE_BOOLEAN, ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE | ACCESS_CONTROL_REPORTABLE, (u8*)&g_zcl_onOffAttrs[1].onOff},
{ ZCL_ATTRID_GLOBAL_SCENE_CONTROL, ZCL_DATA_TYPE_BOOLEAN, ACCESS_CONTROL_READ, (u8*)&g_zcl_onOffAttrs[1].globalSceneControl},
{ ZCL_ATTRID_ON_TIME, ZCL_DATA_TYPE_UINT16, ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE, (u8*)&g_zcl_onOffAttrs[1].onTime},
{ ZCL_ATTRID_OFF_WAIT_TIME, ZCL_DATA_TYPE_UINT16, ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE, (u8*)&g_zcl_onOffAttrs[1].offWaitTime},
......@@ -579,7 +567,7 @@ const zclAttrInfo_t onOff_attrTb2[] =
};
const zclAttrInfo_t onOff_attrTb3[] =
{
{ ZCL_ATTRID_ONOFF, ZCL_DATA_TYPE_BOOLEAN, ACCESS_CONTROL_READ | ACCESS_CONTROL_REPORTABLE, (u8*)&g_zcl_onOffAttrs[2].onOff},
{ ZCL_ATTRID_ONOFF, ZCL_DATA_TYPE_BOOLEAN, ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE | ACCESS_CONTROL_REPORTABLE, (u8*)&g_zcl_onOffAttrs[2].onOff},
{ ZCL_ATTRID_GLOBAL_SCENE_CONTROL, ZCL_DATA_TYPE_BOOLEAN, ACCESS_CONTROL_READ, (u8*)&g_zcl_onOffAttrs[2].globalSceneControl},
{ ZCL_ATTRID_ON_TIME, ZCL_DATA_TYPE_UINT16, ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE, (u8*)&g_zcl_onOffAttrs[2].onTime},
{ ZCL_ATTRID_OFF_WAIT_TIME, ZCL_DATA_TYPE_UINT16, ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE, (u8*)&g_zcl_onOffAttrs[2].offWaitTime},
......@@ -589,7 +577,7 @@ const zclAttrInfo_t onOff_attrTb3[] =
};
const zclAttrInfo_t onOff_attrTb4[] =
{
{ ZCL_ATTRID_ONOFF, ZCL_DATA_TYPE_BOOLEAN, ACCESS_CONTROL_READ | ACCESS_CONTROL_REPORTABLE, (u8*)&g_zcl_onOffAttrs[3].onOff},
{ ZCL_ATTRID_ONOFF, ZCL_DATA_TYPE_BOOLEAN, ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE | ACCESS_CONTROL_REPORTABLE, (u8*)&g_zcl_onOffAttrs[3].onOff},
{ ZCL_ATTRID_GLOBAL_SCENE_CONTROL, ZCL_DATA_TYPE_BOOLEAN, ACCESS_CONTROL_READ, (u8*)&g_zcl_onOffAttrs[3].globalSceneControl},
{ ZCL_ATTRID_ON_TIME, ZCL_DATA_TYPE_UINT16, ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE, (u8*)&g_zcl_onOffAttrs[3].onTime},
{ ZCL_ATTRID_OFF_WAIT_TIME, ZCL_DATA_TYPE_UINT16, ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE, (u8*)&g_zcl_onOffAttrs[3].offWaitTime},
......
......@@ -119,6 +119,8 @@ extern zcl_lightColorCtrlAttr_t g_zcl_colorCtrlAttrs;
#define zcl_sceneAttrGet(ep) &g_zcl_sceneAttrs[ep-1]
#define zcl_onoffAttrGet(ep) &g_zcl_onOffAttrs[ep-1]
#define zcl_BasicAttrGet() &g_zcl_basicAttrs
void SimpleDesc_Init(uint8_t endpint);
nv_sts_t zcl_onOffAttr_get(void);
nv_sts_t zcl_onOffAttr_save(void);
......
......@@ -116,7 +116,7 @@ extern "C" {
// DEBUG
#if UART_PRINTF_MODE
#define DEBUG_INFO_TX_PIN GPIO_PA2//print
#define DEBUG_INFO_TX_PIN GPIO_PA1//print
#endif
/**********************************************************************
* Stack configuration
......@@ -148,7 +148,7 @@ extern "C" {
* @brief ZCL: MAX number of cluster list, in cluster number add + out cluster number
*
*/
#define ZCL_CLUSTER_NUM_MAX 30
#define ZCL_CLUSTER_NUM_MAX 50
/**
* @brief ZCL: maximum number for zcl reporting table
......
......@@ -19,7 +19,7 @@
#define MANUFATURE_NAME "Konke"
/*Dsp: MODEL_ID */
#define MODEL_ID 0x3AFE101000068624
#define MODEL_ID 0x00068624
/*Dsp: OTA_IMAGE_TYPE */
#define OTA_IMAGE_TYPE 65000
......
......@@ -10,28 +10,33 @@
#include "ikk-relay.h"
#include "ikk-led.h"
#include "ikk-ota.h"
#include "ikk-command.h"
#include "ikk-common-utils.h"
#include "ikk-interpan.h"
#include "ikk-pwm.h"
#define ZERO_PIN GPIO_PA0
#define RELAY1_PIN GPIO_PC1
#define RELAY1_PIN GPIO_PC0
#define RELAY2_PIN GPIO_PC4
#define RELAY3_PIN GPIO_PC6
#define RELAY4_PIN GPIO_PC5
#define LED_RADAR_PIN GPIO_PD2
#define LED1_PIN GPIO_PB6
#define LED2_PIN GPIO_PA5
#define LED3_PIN GPIO_PD4
#define LED4_PIN GPIO_PB4
#define LED_RADAR_PIN GPIO_PD4
#define LED1_PIN GPIO_PB5
#define LED2_PIN GPIO_PA4
#define LED3_PIN GPIO_PD2
#define LED4_PIN GPIO_PA3
#define KEY_SYS_PIN GPIO_PD7
#define KEY1_PIN GPIO_PC7
#define KEY2_PIN GPIO_PB5
#define KEY2_PIN GPIO_PB4
#define KEY3_PIN GPIO_PD3
#define KEY4_PIN GPIO_PA3
#define RADAR_PIN GPIO_PC0
#define KEY4_PIN GPIO_PA6
#define RADAR_PIN GPIO_PC1
#define UART_TX_PIN GPIO_PB7
#define UART_RX_PIN GPIO_PB1
#define SYS_BUTTON_LONG_PRESS_TIME_MS (5 * 1000)
#define DELAY_REPORT_DATA_AFTER_NWK_JOINED_MS (3 * 1000)
......@@ -89,11 +94,11 @@ BtnConfSt g_btnConfList[] = {
// LEDs CONFIG
LedConfSt g_ledConfList[] = {
{(uint8_t)LED_RADAR_ID, 1, {LED_RADAR_PIN, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID}, ELP_HIGH },
{(uint8_t)LED1_ID, 1, {LED1_PIN, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID}, ELP_HIGH },
{(uint8_t)LED2_ID, 1, {LED2_PIN, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID}, ELP_HIGH },
{(uint8_t)LED3_ID, 1, {LED3_PIN, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID}, ELP_HIGH },
{(uint8_t)LED4_ID, 1, {LED4_PIN, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID}, ELP_HIGH },
{(uint8_t)LED_ALL_ID, 4, {LED1_PIN, PWM_UNKNOW_ID, LED2_PIN, PWM_UNKNOW_ID, LED3_PIN, PWM_UNKNOW_ID, LED4_PIN, PWM_UNKNOW_ID}, ELP_HIGH },
{(uint8_t)LED1_ID, 1, {LED1_PIN, PWM1_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID}, ELP_HIGH },
{(uint8_t)LED2_ID, 1, {LED2_PIN, PWM2_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID}, ELP_HIGH },
{(uint8_t)LED3_ID, 1, {LED3_PIN, PWM3_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID}, ELP_HIGH },
{(uint8_t)LED4_ID, 1, {LED4_PIN, PWM4_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID}, ELP_HIGH },
{(uint8_t)LED_ALL_ID, 4, {LED1_PIN, PWM1_ID, LED2_PIN, PWM2_ID, LED3_PIN, PWM3_ID, LED4_PIN, PWM4_ID}, ELP_HIGH },
};
PwmConfSt g_pwmConfList[] = {
{PWM1_ID, {LED1_PIN, KK_PWM_CC0}}, //
......@@ -124,10 +129,18 @@ BindObjSt cluster_obj_list[] = {
{ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, 4},
};
void pOnOffAttributeChangeCallback(uint8_t endpoint,uint16_t cluster,uint16_t attribute,uint8_t *data,uint8_t data_type);
AttributeChangeConfSt attribte_change_list[] = {
{ZCL_CLUSTER_GEN_ON_OFF, pOnOffAttributeChangeCallback},
};
uint32_t u32PeroidIntervalMS = 2*1000;
bool Human_body_induction_flag = false;
static bool power_on_sync[4] = {false,false,false,false};
static uint8_t g_u8NoDisturbModeMinLevel = 0x01;
static uint8_t g_u8NoDisturbModeMaxLevel = 0x64;
//非控客网关首次数据是否上报标志
static bool g_bIsNotKonkeGatewayFirstReportedFlg = false;
static uint8_t g_u8CurrentHeartEndpoint = 1;
......@@ -149,7 +162,7 @@ void kUserFactorTestPollCallback(FactoryTestStatusEnum status);
void kOTAMoudleUserCallback(OTAStatusEnum status);
#endif
#define UART_ENABLE false
void kUserRelayLedCallback(RelayStatusSt status);
void kRadarDetectInit(void);
void kRadarLedTragger(void);
......@@ -164,12 +177,13 @@ void Test(void );
static ev_timer_event_t *kkSystemSetUpEvent = NULL;
s32 kkSystemSetUpEventHandler(void *arg );
//void pOnOffClusterAttributeChangeCallback(uint8_t endpoint,uint16_t cluster,uint16_t attribute,uint8_t len,uint8_t *data);
//
//AttributeChangeConfSt g_ClusterAttributeConfList[] = {
// {ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, pOnOffClusterAttributeChangeCallback},
//};
#define UART_ENABLE false
void kUserInterPanMsgInComingPaser(UMsgNodeSt *pMsgNode);
void pOnOffClusterAttributeChangeCallback(uint8_t endpoint,uint16_t cluster,uint16_t attribute,uint8_t len,uint8_t *data);
AttributeChangeConfSt g_ClusterAttributeConfList[] = {
{ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, pOnOffClusterAttributeChangeCallback},
};
static void kLEDOnAction(LED_ID_ENUM led_id);
static void kLEDOffAction(LED_ID_ENUM led_id);
void App_Init(void)
......@@ -188,7 +202,7 @@ void App_Init(void)
iKonkeAfSelfPrint("Err: Button Module Init failed(%d)!!\r\n", err);
}
#endif
#if 0
#if 1
err = kPwmModuleInit(g_pwmConfList, sizeof(g_pwmConfList)/sizeof(PwmConfSt), kUserPwmActionDoneCallback);
if( err != KET_OK ) {
iKonkeAfSelfPrint("Err: PWM Module Init failed(%d)!!\r\n", err);
......@@ -205,7 +219,7 @@ void App_Init(void)
}
#if UART_ENABLE
uint8_t recv_header[] = {0xAA,0X55};
err = kUartModuleInit(UART_TX_PIN,UART_RX_PIN,115200,PARITY_NONE,STOP_BIT_ONE,recv_header,2,2,5,MsgCRC16,UartMsgProcessHandle,true );
err = kUartModuleInit(UART_TX_PIN,UART_RX_PIN,115200,PARITY_NONE,STOP_BIT_ONE,recv_header,2,3,6,MsgCRC16,UartMsgProcessHandle,true );
#endif
kNwkModuleInit(cluster_obj_list,sizeof(cluster_obj_list) / sizeof(cluster_obj_list[0]), kUserNetworkStatusNotify, kUserNetworkExitCompleteCallback);
......@@ -221,19 +235,16 @@ void App_Init(void)
if( err != KET_OK ) {
iKonkeAfSelfPrint("Err: kUserOODMessageIncoming Register Failed(%d)!!\r\n", err);
}
// ZCL
// //注册属性改变回调
ikkAttributeChangeCallbackRegister(attribte_change_list,sizeof(attribte_change_list)/sizeof(attribte_change_list[0]));
kZclOnOffClusterServerInit(kUserOnOffClusterOnOffStatusCallback);
if(!ev_timer_exist(kkSystemSetUpEvent)) {
kkSystemSetUpEvent = TL_ZB_TIMER_SCHEDULE(kkSystemSetUpEventHandler, NULL, 20);
kkSystemSetUpEvent = TL_ZB_TIMER_SCHEDULE(kkSystemSetUpEventHandler, NULL, 50);
}
//start radar detect event
kRadarDetectInit();
kZclClusterPermitReportTableInit(cluster_obj_list, sizeof(cluster_obj_list) / sizeof(BindObjSt));
//注册属性改变回调
//ClusterAttributeChangeCallbackRegister(g_ClusterAttributeConfList,sizeof(g_ClusterAttributeConfList)/sizeof(AttributeChangeConfSt));
//重写attribute
Update_Local_Attribute_Info();
}
......@@ -241,7 +252,11 @@ void Test(void )
{
}
void kUserNetworkExitCompleteCallback()
{
SYSTEM_RESET();
}
static bool kClustePeriodReportCheckIsSet(uint8_t endpoint)
{
uint16_t u16MinTimeMS = 0;
......@@ -264,7 +279,6 @@ void JoinCompleteCallback(NwkJoinCompltEnum nwkcomplt )
case (EJC_JOIN_FAILED ):
{
LED_OPT_OFF(LED_ALL_ID);
kUserNetworkExitCompleteCallback();
break;
}
case (EJC_JOIN_SUCCEED):
......@@ -275,6 +289,7 @@ void JoinCompleteCallback(NwkJoinCompltEnum nwkcomplt )
default: break;
}
}
void kUserNetworkStatusNotify(NwkStatusEnum nwkst )
{
iKonkeAfSelfPrint("#############################kUserNetworkStatusNotify = %d\r\n", nwkst);
......@@ -283,22 +298,24 @@ void kUserNetworkStatusNotify(NwkStatusEnum nwkst )
{
uint32_t randTimeMS = DELAY_REPORT_DATA_AFTER_NWK_JOINED_MS;
//power on after joined network
uint32_t currentTimeMS = clock_time();
uint32_t currentTimeMS = clock_time()/16/1000;
kSetLedStatus(LED_ALL_ID);
if ( currentTimeMS < MIN_JOINED_NWK_DELAY_TIME_MS){
randTimeMS = kGetRandNum(RAND_MIN_NUM, RAND_MAX_NUM);
}else {
// kPwmOptTrigger(PWM4_ID, PWM_TIMER_MAX_DUTY_CYCLE_NUM, 0, 5*1000);
// kPwmOptTrigger(PWM3_ID, PWM_TIMER_MAX_DUTY_CYCLE_NUM, 0, 5*1000);
// kPwmOptTrigger(PWM2_ID, PWM_TIMER_MAX_DUTY_CYCLE_NUM, 0, 5*1000);
// kPwmOptTrigger(PWM1_ID, PWM_TIMER_MAX_DUTY_CYCLE_NUM, 0, 5*1000);
kPwmOptTrigger(PWM4_ID, PWM_TIMER_MAX_DUTY_CYCLE_NUM, 0, 5*1000);
kPwmOptTrigger(PWM3_ID, PWM_TIMER_MAX_DUTY_CYCLE_NUM, 0, 5*1000);
kPwmOptTrigger(PWM2_ID, PWM_TIMER_MAX_DUTY_CYCLE_NUM, 0, 5*1000);
kPwmOptTrigger(PWM1_ID, PWM_TIMER_MAX_DUTY_CYCLE_NUM, 0, 5*1000);
//kLedOptTrigger(LED_ALL_ID, 0, 0, 0, LED_OFF, LED_IGNORE);
}
if (kIsKonkeRemoteGateway() != true){
g_bIsNotKonkeGatewayFirstReportedFlg = false;
}
kSetLedStatus(LED_ALL_ID);
kNwkScheduleTaskRegister(randTimeMS);
iKonkeAfSelfPrint("Joined Network RandTime(%dms) CurrentTime(%ld)\r\n", randTimeMS, currentTimeMS);
iKonkeAfSelfPrint("Joined Network RandTime(%dms) CurrentTime(%d)\r\n", randTimeMS, currentTimeMS);
break;
}
case (ENS_JOINING):
......@@ -323,6 +340,16 @@ void kUserNetworkStatusNotify(NwkStatusEnum nwkst )
}
}
}
void pOnOffAttributeChangeCallback(uint8_t endpoint,uint16_t cluster,uint16_t attribute,uint8_t *data,uint8_t data_type)
{
if((cluster == ZCL_CLUSTER_GEN_ON_OFF)&&(attribute == ZCL_ATTRID_ONOFF)&&(data_type == ZCL_DATA_TYPE_BOOLEAN))
{
OnOffStatusEnum estatus = *data;
kUserOnOffClusterOnOffStatusCallback(endpoint,estatus);
iKonkeAfSelfPrint("#####pOnOffAttributeChangeCallback,endpont = %d,value = %d\r\n",endpoint,estatus);
}
}
//on off 属性改变后的回调函数,一般用来操作继电器,过零检测,如果没有过零检测可以在这里同步LED状态
void kUserOnOffClusterOnOffStatusCallback(uint8_t endpoint, OnOffStatusEnum estatus )
{
......@@ -331,37 +358,21 @@ void kUserOnOffClusterOnOffStatusCallback(uint8_t endpoint, OnOffStatusEnum esta
switch(endpoint) {
case (1):
{
if(estatus == EOOS_OFF)
LED_OPT_OFF(LED1_ID);
else
LED_OPT_ON(LED1_ID);
kRelayChannelOpt(RELAY_CHANNEL1_ID,estatus == EOOS_OFF? EZAO_OFF : EZAO_ON);
break;
}
case (2):
{
if(estatus == EOOS_OFF)
LED_OPT_OFF(LED2_ID);
else
LED_OPT_ON(LED2_ID);
kRelayChannelOpt(RELAY_CHANNEL2_ID,estatus == EOOS_OFF? EZAO_OFF : EZAO_ON);
break;
}
case (3):
{
if(estatus == EOOS_OFF)
LED_OPT_OFF(LED3_ID);
else
LED_OPT_ON(LED3_ID);
kRelayChannelOpt(RELAY_CHANNEL3_ID,estatus == EOOS_OFF? EZAO_OFF : EZAO_ON);
break;
}
case (4):
{
if(estatus == EOOS_OFF)
LED_OPT_OFF(LED4_ID);
else
LED_OPT_ON(LED4_ID);
kRelayChannelOpt(RELAY_CHANNEL4_ID,estatus == EOOS_OFF? EZAO_OFF : EZAO_ON);
break;
}
......@@ -370,10 +381,12 @@ void kUserOnOffClusterOnOffStatusCallback(uint8_t endpoint, OnOffStatusEnum esta
kZclOnOffClusterServerOnOffControl(endpoint, estatus);
}
uint8_t Key_Press_Test_Flag[5] = {0};
void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
{
iKonkeAfSelfPrint("kUserButton: ButtonId(%d), Action(%d)\r\n", button_id, action);
if ( kGetFactoryTestStatus() == FTS_AGING_8HOU || kGetFactoryTestStatus() == FTS_AGING_DONE \
iKonkeAfSelfPrint("kUserButton: ButtonId(%d), Action(%d),%d\r\n", button_id, action,kGetFactoryTestStatus());
if ( kGetFactoryTestStatus() == FTS_AGING_4HOU || kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS \
|| kNwkIsExiting() == true){
......@@ -388,8 +401,13 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
{
case EBA_CLICK:
{
if(kNwkGetCurrentStatus() == ENS_ONLINE)
kLedOptTrigger(LED_ALL_ID,200,200,1,LED_OFF,LED_IGNORE); //绿灯闪烁一次
Key_Press_Test_Flag[0] = 1;
if( kNwkGetCurrentStatus() == ENS_ONLINE ) { // report connected!
if (kLedIsBlinking(LED_ALL_ID) != true)
kLedOptTrigger(LED_ALL_ID, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_OFF_TIME_MS, 1, LED_ON, LED_OFF);
kOptTunnelOODReport(0, 0XCD, NULL, 0);
}
else if(kNwkGetCurrentStatus() == ENS_LEAVED)
{
kNwkFactoryReset(false);
......@@ -416,11 +434,11 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
if(action == EBA_CLICK)
{
iKonkeAfSelfPrint("KEY 1 PRESS!!!\r\n");
Key_Press_Test_Flag[1] = 1;
OnOffCtrlEnum state = kZclOnOffClusterServerOnOffGet(1)? EOOC_OFF : EOOC_ON;
kZclClusterSetPermitReportInfo(1,0x0006,true,false);
//afTest_dataSendDemo();
kZclOnOffClusterServerOnOffControl(1, state);
kRelayChannelOpt(RELAY_CHANNEL1_ID,kZclOnOffClusterServerOnOffGet(1)? EZAO_ON : EZAO_OFF);
// iKonkeAfSelfPrint("Get onoff (%d),%d\r\n", pOnOff->onOff, pOnOff->startUpOnOff);
}else if (action == EBA_LONGPRESS){
if (kNwkIsExiting() == true){
iKonkeAfSelfPrint("#####NWK is exiting\r\n");
......@@ -430,7 +448,7 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
static bool firstLongPressFlg = false;
if (kNwkGetCurrentStatus() == ENS_ONLINE){
static uint32_t lastTimeMS = 0;
uint32_t currentTimeMS = clock_time();
uint32_t currentTimeMS = clock_time()/16/1000;
if (firstLongPressFlg != true \
|| (currentTimeMS - lastTimeMS >= MAX_FIRST_USER_KEY_LEAVE_NWK_INTERVAL_TIME_MS)){
firstLongPressFlg = true;
......@@ -465,10 +483,10 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
if (action == EBA_CLICK){
//restore report attribute immediately
iKonkeAfSelfPrint("KEY 2 PRESS!!!\r\n");
Key_Press_Test_Flag[2] = 1;
OnOffCtrlEnum state = kZclOnOffClusterServerOnOffGet(2)? EOOC_OFF : EOOC_ON;
kZclClusterSetPermitReportInfo(2,0x0006,true,false);
kZclOnOffClusterServerOnOffControl(2, state);
kRelayChannelOpt(RELAY_CHANNEL2_ID,kZclOnOffClusterServerOnOffGet(2)? EZAO_ON : EZAO_OFF);
}
break;
}
......@@ -477,10 +495,10 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
if (action == EBA_CLICK){
//restore report attribute immediately
iKonkeAfSelfPrint("KEY 3 PRESS!!!\r\n");
Key_Press_Test_Flag[3] = 1;
OnOffCtrlEnum state = kZclOnOffClusterServerOnOffGet(3)? EOOC_OFF : EOOC_ON;
kZclClusterSetPermitReportInfo(3,0x0006,true,false);
kZclOnOffClusterServerOnOffControl(3, state);
kRelayChannelOpt(RELAY_CHANNEL3_ID,kZclOnOffClusterServerOnOffGet(3)? EZAO_ON : EZAO_OFF);
}
break;
}
......@@ -489,10 +507,10 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
if (action == EBA_CLICK){
//restore report attribute immediately
iKonkeAfSelfPrint("KEY 4 PRESS!!!\r\n");
Key_Press_Test_Flag[4] = 1;
OnOffCtrlEnum state = kZclOnOffClusterServerOnOffGet(4)? EOOC_OFF : EOOC_ON;
kZclClusterSetPermitReportInfo(4,0x0006,true,false);
kZclOnOffClusterServerOnOffControl(4, state);
kRelayChannelOpt(RELAY_CHANNEL4_ID,kZclOnOffClusterServerOnOffGet(4)? EZAO_ON : EZAO_OFF);
}
break;
}
......@@ -515,7 +533,7 @@ void kUserRelayLedCallback(RelayStatusSt status)
{
case RELAY_CHANNEL1_ID:
if (kNwkGetCurrentStatus() == ENS_ONLINE || power_on_sync[0] == true \
|| kGetFactoryTestStatus() == FTS_AGING_8HOU \
|| kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){
......@@ -527,13 +545,17 @@ void kUserRelayLedCallback(RelayStatusSt status)
}
}else if (kNwkGetCurrentStatus() == ENS_LEAVED \
|| kNwkGetCurrentStatus() == ENS_OFFLINE){
if(kZclOnOffClusterServerOnOffGet(1)== EOOC_OFF)
kLedOptTrigger(LED1_ID, LED_FAST_BLINK_ON_TIME_MS, \
LED_FAST_BLINK_OFF_TIME_MS, 3, LED_ON, LED_IGNORE);
LED_FAST_BLINK_OFF_TIME_MS, 3, EOOC_OFF, EOOC_OFF);
else
kLedOptTrigger(LED1_ID, LED_FAST_BLINK_ON_TIME_MS, \
LED_FAST_BLINK_OFF_TIME_MS, 3, LED_ON, LED_ON);
}
break;
case RELAY_CHANNEL2_ID:
if (kNwkGetCurrentStatus() == ENS_ONLINE || power_on_sync[1] == true \
|| kGetFactoryTestStatus() == FTS_AGING_8HOU \
|| kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){
......@@ -545,13 +567,17 @@ void kUserRelayLedCallback(RelayStatusSt status)
}
}else if (kNwkGetCurrentStatus() == ENS_LEAVED \
|| kNwkGetCurrentStatus() == ENS_OFFLINE){
if(kZclOnOffClusterServerOnOffGet(2)== EOOC_OFF)
kLedOptTrigger(LED2_ID, LED_FAST_BLINK_ON_TIME_MS, \
LED_FAST_BLINK_OFF_TIME_MS, 3, LED_ON, LED_IGNORE);
LED_FAST_BLINK_OFF_TIME_MS, 3, EOOC_OFF, EOOC_OFF);
else
kLedOptTrigger(LED2_ID, LED_FAST_BLINK_ON_TIME_MS, \
LED_FAST_BLINK_OFF_TIME_MS, 3, LED_ON, LED_ON);
}
break;
case RELAY_CHANNEL3_ID:
if (kNwkGetCurrentStatus() == ENS_ONLINE || power_on_sync[2] == true \
|| kGetFactoryTestStatus() == FTS_AGING_8HOU \
|| kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){
......@@ -563,13 +589,17 @@ void kUserRelayLedCallback(RelayStatusSt status)
}
}else if (kNwkGetCurrentStatus() == ENS_LEAVED \
|| kNwkGetCurrentStatus() == ENS_OFFLINE){
if(kZclOnOffClusterServerOnOffGet(3)== EOOC_OFF)
kLedOptTrigger(LED3_ID, LED_FAST_BLINK_ON_TIME_MS, \
LED_FAST_BLINK_OFF_TIME_MS, 3, EOOC_OFF, EOOC_OFF);
else
kLedOptTrigger(LED3_ID, LED_FAST_BLINK_ON_TIME_MS, \
LED_FAST_BLINK_OFF_TIME_MS, 3, LED_ON, LED_IGNORE);
LED_FAST_BLINK_OFF_TIME_MS, 3, LED_ON, LED_ON);
}
break;
case RELAY_CHANNEL4_ID:
if (kNwkGetCurrentStatus() == ENS_ONLINE || power_on_sync[3] == true \
|| kGetFactoryTestStatus() == FTS_AGING_8HOU \
|| kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){
......@@ -581,8 +611,12 @@ void kUserRelayLedCallback(RelayStatusSt status)
}
}else if (kNwkGetCurrentStatus() == ENS_LEAVED \
|| kNwkGetCurrentStatus() == ENS_OFFLINE){
if(kZclOnOffClusterServerOnOffGet(4)== EOOC_OFF)
kLedOptTrigger(LED4_ID, LED_FAST_BLINK_ON_TIME_MS, \
LED_FAST_BLINK_OFF_TIME_MS, 3, EOOC_OFF, EOOC_OFF);
else
kLedOptTrigger(LED4_ID, LED_FAST_BLINK_ON_TIME_MS, \
LED_FAST_BLINK_OFF_TIME_MS, 3, LED_ON, LED_IGNORE);
LED_FAST_BLINK_OFF_TIME_MS, 3, LED_ON, LED_ON);
}
break;
......@@ -591,9 +625,39 @@ void kUserRelayLedCallback(RelayStatusSt status)
break;
}
}
//add by zbw
void kUserPwmActionDoneCallback(unsigned char id, PwmGradientDirectionEnum opt)
{
switch(id)
{
case PWM1_ID:
kSetLedStatus(LED1_ID);
break;
case PWM2_ID:
kSetLedStatus(LED2_ID);
break;
case PWM3_ID:
kSetLedStatus(LED3_ID);
break;
case PWM4_ID:
kSetLedStatus(LED4_ID);
break;
default:
break;
}
}
//ota升级失败或入网成功和失败后LED闪烁完成后处理,需要根据不同产品来修改
static void kSetLedStatus(LED_ID_ENUM id)
{
if (id != LED_ALL_ID){
kPwmClearGradientCounterById(id - 1);
}else{
kPwmClearGradientCounterById(PWM1_ID);
kPwmClearGradientCounterById(PWM2_ID);
kPwmClearGradientCounterById(PWM3_ID);
kPwmClearGradientCounterById(PWM4_ID);
}
//恢复继电器的LED状态
if (id == LED_ALL_ID)
{
......@@ -608,6 +672,7 @@ static void kSetLedStatus(LED_ID_ENUM id)
}
}
}else if (id == LED1_ID || id == LED2_ID || id == LED3_ID || id == LED4_ID){
iKonkeAfSelfPrint("###kSetLedStatus:%d,%d,%d\r\n",kLedIsBlinking(id),kZclOnOffClusterServerOnOffGet(GET_ENDPOINT(id)),kGetIndicatorNotDisturbModeFlg());
if (kLedIsBlinking(id) == false){
if ((kZclOnOffClusterServerOnOffGet(GET_ENDPOINT(id)) == EOOS_ON)&&(!kGetIndicatorNotDisturbModeFlg())){
kLEDOnAction(id);
......@@ -657,11 +722,6 @@ void kUserLedActionDoneCallback(unsigned char id)
iKonkeAfSelfPrint("##############kUserLedActionDoneCallback id(%d)nwk(%d)##################\r\n", id,kNwkGetCurrentStatus());
kSetLedStatus(id);
}
void kUserPwmActionDoneCallback(unsigned char id, PwmGradientDirectionEnum opt)
{
iKonkeAfSelfPrint("####kUserPwmActionDoneCallback id(%d)opt(%d)##################\r\n", id,opt);
}
//网关场景控制下发后的属性延时上报处理,可以根据不同场景cluster修改
/* DESP: recall scene rand delay report Attribute set
* Auth: maozj.20191224.
......@@ -749,6 +809,10 @@ bool kZclClusterReportChangeCallback(uint8_t endpoint, uint16_t clusterId, uint1
//不直接上报,随机延时上报
return false;
}
else if(!zclReportInfo.reportEnable)
{
return false;
}
}
......@@ -835,13 +899,85 @@ kk_err_t kUserOODMessageIncoming(uint8_t channel, uint8_t opcode, uint8_t args_i
static void kLEDOffAction(LED_ID_ENUM led_id)
{
iKonkeAfSelfPrint("LED_Off_Action LED_ID (%d).\r\n", led_id);
LED_OPT_OFF(led_id);
kLedOptTrigger(led_id, 0, 0, 0, LED_OFF, LED_IGNORE);
if (kGetIndicatorNotDisturbModeFlg() == false){
iKonkeAfSelfPrint("is not NotDisturbMode.\r\n");
switch (led_id)
{
case LED1_ID:
{
kPwmDriverhandler(kPwmGetIndexByID(PWM1_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMinLevel * 65535) / 100) );
break;
}
case LED2_ID:
{
kPwmDriverhandler(kPwmGetIndexByID(PWM2_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMinLevel * 65535) / 100) );
break;
}
case LED3_ID:
{
kPwmDriverhandler(kPwmGetIndexByID(PWM3_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMinLevel * 65535) / 100));
break;
}
case LED4_ID:
{
kPwmDriverhandler(kPwmGetIndexByID(PWM4_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMinLevel * 65535) / 100));
break;
}
case LED_ALL_ID:
{
kPwmDriverhandler(kPwmGetIndexByID(PWM1_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMinLevel * 65535) / 100));
kPwmDriverhandler(kPwmGetIndexByID(PWM2_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMinLevel * 65535) / 100));
kPwmDriverhandler(kPwmGetIndexByID(PWM3_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMinLevel * 65535) / 100));
kPwmDriverhandler(kPwmGetIndexByID(PWM4_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMinLevel * 65535) / 100));
break;
}
default:
break;
}
}
}
static void kLEDOnAction(LED_ID_ENUM led_id)
{
iKonkeAfSelfPrint("LED_ON_Action LED_ID (%d).\r\n", led_id);
LED_OPT_ON(led_id);
kLedOptTrigger(led_id, 0, 0, 0, LED_OFF, LED_IGNORE);
if (kGetIndicatorNotDisturbModeFlg() == false){
iKonkeAfSelfPrint("is not NotDisturbMode.\r\n");
switch (led_id)
{
case LED1_ID:
{
kPwmDriverhandler(kPwmGetIndexByID(PWM1_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMaxLevel * 65535) / 100) );
break;
}
case LED2_ID:
{
kPwmDriverhandler(kPwmGetIndexByID(PWM2_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMaxLevel * 65535) / 100) );
break;
}
case LED3_ID:
{
kPwmDriverhandler(kPwmGetIndexByID(PWM3_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMaxLevel * 65535) / 100) );
break;
}
case LED4_ID:
{
kPwmDriverhandler(kPwmGetIndexByID(PWM4_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMaxLevel * 65535) / 100) );
break;
}
case LED_ALL_ID:
{
kPwmDriverhandler(kPwmGetIndexByID(PWM1_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMaxLevel * 65535) / 100) );
kPwmDriverhandler(kPwmGetIndexByID(PWM2_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMaxLevel * 65535) / 100) );
kPwmDriverhandler(kPwmGetIndexByID(PWM3_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMaxLevel * 65535) / 100) );
kPwmDriverhandler(kPwmGetIndexByID(PWM4_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMaxLevel * 65535) / 100) );
break;
}
default:
break;
}
}
}
//芯片上电后延时操作事件,一般处理继电器状态恢复或者禁用SWD口作为普通IO,也用来根据gpio读取电平修改同一类型的不同型号
/* DESP: system setup delay callback handler, called once.
......@@ -867,27 +1003,14 @@ s32 kkSystemSetUpEventHandler(void *arg )
,relayStatusBuffer[i-1] == false? EZAO_OFF : EZAO_ON);
}
//重写attribute
Update_Local_Attribute_Info();
#if UART_ENABLE
kInterPanMoudleInit(kUserInterPanMsgInComingPaser);
#endif
return -1;
}
//退网5S快闪结束后的回调函数,一般用于面板、插座和窗帘面板退网完成后在全部关闭时复位
void kUserNetworkExitCompleteCallback(void)
{
iKonkeAfSelfPrint("##############kUserNetworkExitCompleteCallback(%d)##################\r\n");
bool bIsAllOffFlg = true;
for (uint8_t i = 1; i <= Support_Endpoint_Num; i++){
zcl_onOffAttr_t *pOnOff = zcl_onoffAttrGet(i);
if (pOnOff->onOff){
bIsAllOffFlg = false;
break;
}
}
if (bIsAllOffFlg == true){
SYSTEM_RESET();
}
}
#if Z30_DEVICE_AGING_ENABLE
//老化的轮询回调函数,一般用于实现老化期间的LED闪烁或继电器翻转,也可以只LED闪烁
void kUserFactorTestPollCallback(FactoryTestStatusEnum status)
......@@ -903,7 +1026,7 @@ void kUserFactorTestPollCallback(FactoryTestStatusEnum status)
break;
case FTS_AGING_15MIN:
break;
case FTS_AGING_8HOU_START:
case FTS_AGING_4HOU_START:
//关闭所有的蓝色LED,有可能之前蓝灯闪烁了
LED_OPT_OFF(LED_ALL_ID);
LED_OPT_OFF(LED_RADAR_ID);
......@@ -913,7 +1036,7 @@ void kUserFactorTestPollCallback(FactoryTestStatusEnum status)
}
eRelayStatus = EZAO_ON;
break;
case FTS_AGING_8HOU:
case FTS_AGING_4HOU:
//翻转继电器,LED也会同步
eRelayStatus = eRelayStatus == EZAO_ON?EZAO_OFF:EZAO_ON;
if (eRelayStatus == EZAO_ON){
......@@ -1024,7 +1147,7 @@ static ev_timer_event_t *kRadarControlLedEvent = NULL;
s32 kRadarCheckEventHandler(void *arg)
{
if (kGetFactoryTestStatus() == FTS_AGING_8HOU \
if (kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){
......@@ -1049,7 +1172,7 @@ s32 kRadarCheckEventHandler(void *arg)
s32 kRadarLedEventHandler(void *arg)
{
if (kGetFactoryTestStatus() == FTS_AGING_8HOU \
if (kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){
......@@ -1128,15 +1251,189 @@ uint8_t uart_send(void)
}
void UartMsgProcessHandle(UMsgNodeSt *pMsgNode )
{
uint16_t opcode;
uint16_t frameLenth = 0;
uint8_t *args_in;
uint8_t reply_control_field;
DataField_st send_buf;
if( NULL == pMsgNode ) {
return ;
}
#if 1 // Just for debug
iKonkeAfSelfPrint("\r\nUartMsgProcessHandle,MSG INCOMING[%d]:\r\n", pMsgNode->length);
iKonkeAfSelfPrint("\r\n-- RTT MSG INCOMING[%d]:\r\n", pMsgNode->length);
iKonkeAfSelfPrintBuffer(pMsgNode->buffer, pMsgNode->length);
iKonkeAfSelfPrint("\r\n--------------------\r\n");
#endif
// check SOF
if ((pMsgNode->buffer[0] != 0xAA) || (pMsgNode->buffer[1] != 0x55)) {
return ;
}
frameLenth = UINT16_HL(pMsgNode->buffer[2], pMsgNode->buffer[3]);
// check for parsable packets
if( pMsgNode->length < 10 /* Minimum Packet Length */ ) {
iKonkeAfSelfPrint("Err: Unparsable Packets!!\r\n");
return ;
}
opcode = ((uint16_t)pMsgNode->buffer[9] << 8) | (uint16_t)(pMsgNode->buffer[10]);
args_in = &pMsgNode->buffer[8];
send_buf.seq = UINT16_HL(pMsgNode->buffer[5],pMsgNode->buffer[6] );
send_buf.u8ChannelID = args_in[0];
send_buf.u16Opcode = opcode;
iKonkeAfSelfPrint("opcode(%d)\r\n", opcode);
reply_control_field = Z_TO_H_NO_ACK;
switch(opcode){
case UART_MSG_READ_DEVICE_SNAP_OPCODE:
case UART_MSG_JOIN_NWK_REQUEST_OPCODE:
case UART_MSG_LEAVE_NWK_REQUEST_OPCODE:
case UART_MSG_QUERY_NWK_STATUS_REQUEST_OPCODE:
case UART_MSG_NWK_STATUS_NOTIFY_OPCODE:
case UART_MSG_READ_ATTRIBUTE_REQUEST_OPCODE:
case UART_MSG_WRITE_ATTRIBUTE_REQUEST_OPCODE:
case UART_MSG_WRITE_CMEI_CODE_OPCODE:
case UART_MSG_READ_CMEI_CODE_OPCODE:
case UART_MSG_WRITE_ISN_CODE_OPCODE:
case UART_MSG_READ_ISN_CODE_OPCODE:
case UART_MSG_ZCL_COMMAND_REQUEST_OPCODE:
case UART_MSG_BIND_REQUEST_OPCODE:
case UART_MSG_WRITE_INSTALL_CODE_OPCODE:
case UART_MSG_READ_INSTALL_CODE_OPCODE:
case UART_MSG_WRITE_MAC_CODE_OPCODE:
case UART_MSG_READ_MAC_CODE_OPCODE:
case UART_MSG_WRITE_MOUDLE_ID_OPCODE:
case UART_MSG_READ_MOUDLE_ID_OPCODE:
case UART_MSG_READ_DEV_RSSI_OPCODE:
case UART_MSG_WRITE_AGING_TIME_OPCODE:
case UART_MSG_READ_AGING_TIME_OPCODE:
case UART_MSG_WRITE_INTERPAN_PARA_OPCODE:
case UART_MSG_READ_INTERPAN_PARA_OPCODE:
reply_control_field = Z_TO_H_NO_ACK;
kCmdGeneralMsgPaser(pMsgNode, ECOM_PORT_UART, &send_buf);
break;
case UART_MSG_QUERY_INFO_OPCODE:
case UART_MSG_QUERY_DEVICE_VERSION_OPCODE:
case UART_MSG_QUERY_DEVICE_INFO_OPCODE:
case UART_MSG_CONFIG_DEVICE_SLEEP_OPCODE:
case UART_MSG_EXIT_FACTORY_TEST_OPCODE:
case UART_MSG_QUERY_SWITCH_ONOFF_OPCODE:
case UART_MSG_QUERY_FACTORY_INFO_OPCODE:
case UART_MSG_ENTER_FACTORY_TEST_OPCODE:
case UART_MSG_ONOFF_SWITCH_OPCODE:
kkFactoryMsgInComingPaser(pMsgNode, ECOM_PORT_UART, &send_buf);
break;
default:
send_buf.u8ARG[0] = ERR_NOT_EXIST;
send_buf.u8ArgLen = 1;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
kCmdMsgDataSentByPort(reply_control_field, send_buf, false, ECOM_PORT_UART);
}
/* DESP: rtt command message incoming and process interface.
* Auth: kkk.20210222.
* */
void kUserInterPanMsgInComingPaser(UMsgNodeSt *pMsgNode)
{
uint16_t opcode;
uint16_t frameLenth = 0;
uint16_t crc16DataIn = 0;
uint16_t crc16Value = 0;
uint8_t *args_in;
uint8_t reply_control_field;
DataField_st send_buf;
if( NULL == pMsgNode ) {
return ;
}
#if 0 // Just for debug
iKonkeAfSelfPrint("\r\n-- InterPan MSG INCOMING[%d]:\r\n", pMsgNode->length);
iKonkeAfSelfPrintBuffer(pMsgNode->buffer, pMsgNode->length);
iKonkeAfSelfPrint("\r\n--------------------\r\n");
#endif
// check SOF
if ((pMsgNode->buffer[0] != 0xAA) || (pMsgNode->buffer[1] != 0x55)) {
return ;
}
frameLenth = UINT16_HL(pMsgNode->buffer[2], pMsgNode->buffer[3]);
// check CRC16
crc16Value = kCmdGetMsgCrc16Value(&pMsgNode->buffer[4], frameLenth);
crc16DataIn = UINT16_HL(pMsgNode->buffer[pMsgNode->length - 2], pMsgNode->buffer[pMsgNode->length - 1]);
if (crc16Value != crc16DataIn) {
iKonkeAfSelfPrint("Err: CRC(%d)(%d)\r\n", crc16Value, crc16DataIn);
return ;
}
// check for parsable packets
if( pMsgNode->length < 10 /* Minimum Packet Length */ ) {
iKonkeAfSelfPrint("Err: Unparsable Packets!!\r\n");
return ;
}
opcode = ((uint16_t)pMsgNode->buffer[9] << 8) | (uint16_t)(pMsgNode->buffer[10]);
args_in = &pMsgNode->buffer[8];
send_buf.seq = UINT16_HL(pMsgNode->buffer[5],pMsgNode->buffer[6] );
send_buf.u8ChannelID = args_in[0];
send_buf.u16Opcode = opcode;
iKonkeAfSelfPrint("opcode(%d)\r\n", opcode);
switch(opcode){
case UART_MSG_READ_DEVICE_SNAP_OPCODE:
case UART_MSG_JOIN_NWK_REQUEST_OPCODE:
case UART_MSG_LEAVE_NWK_REQUEST_OPCODE:
case UART_MSG_QUERY_NWK_STATUS_REQUEST_OPCODE:
case UART_MSG_NWK_STATUS_NOTIFY_OPCODE:
case UART_MSG_READ_ATTRIBUTE_REQUEST_OPCODE:
case UART_MSG_WRITE_ATTRIBUTE_REQUEST_OPCODE:
case UART_MSG_WRITE_CMEI_CODE_OPCODE:
case UART_MSG_READ_CMEI_CODE_OPCODE:
case UART_MSG_WRITE_ISN_CODE_OPCODE:
case UART_MSG_READ_ISN_CODE_OPCODE:
case UART_MSG_ZCL_COMMAND_REQUEST_OPCODE:
case UART_MSG_BIND_REQUEST_OPCODE:
case UART_MSG_WRITE_INSTALL_CODE_OPCODE:
case UART_MSG_READ_INSTALL_CODE_OPCODE:
case UART_MSG_WRITE_MAC_CODE_OPCODE:
case UART_MSG_READ_MAC_CODE_OPCODE:
case UART_MSG_WRITE_MOUDLE_ID_OPCODE:
case UART_MSG_READ_MOUDLE_ID_OPCODE:
case UART_MSG_READ_DEV_RSSI_OPCODE:
case UART_MSG_WRITE_AGING_TIME_OPCODE:
case UART_MSG_READ_AGING_TIME_OPCODE:
case UART_MSG_WRITE_INTERPAN_PARA_OPCODE:
case UART_MSG_READ_INTERPAN_PARA_OPCODE:
kCmdGeneralMsgPaser(pMsgNode, ECOM_PORT_INTERPAN, &send_buf);
break;
case UART_MSG_QUERY_INFO_OPCODE:
case UART_MSG_QUERY_DEVICE_VERSION_OPCODE:
case UART_MSG_QUERY_DEVICE_INFO_OPCODE:
case UART_MSG_CONFIG_DEVICE_SLEEP_OPCODE:
case UART_MSG_EXIT_FACTORY_TEST_OPCODE:
case UART_MSG_QUERY_FACTORY_INFO_OPCODE:
case UART_MSG_QUERY_SWITCH_ONOFF_OPCODE:
case UART_MSG_ENTER_FACTORY_TEST_OPCODE:
case UART_MSG_ONOFF_SWITCH_OPCODE:
kkFactoryMsgInComingPaser(pMsgNode, ECOM_PORT_INTERPAN, &send_buf);
break;
default:
send_buf.u8ARG[0] = ERR_NOT_EXIST;
send_buf.u8ArgLen = 1;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
reply_control_field = Z_TO_H_NO_ACK;
kCmdMsgDataSentByPort(reply_control_field, send_buf, false, ECOM_PORT_INTERPAN);
}
uint16_t check_sum( uint8_t* msg, uint8_t len)
{
......@@ -1169,10 +1466,10 @@ bool MsgCRC16(uint8_t *pdat, int length )
if((NULL == pdat) || (length < 9)){
return false;
}
crc_data = check_sum(&pdat[3], pdat[2]);
crc_data = check_sum(&pdat[4], pdat[3]);
CRC_H = (crc_data>>8) & 0xff;
CRC_L = crc_data & 0xff;
iKonkeAfSelfPrint("\r\nMsgCRC16,%d,%d\r\n",CRC_H,CRC_L);
//iKonkeAfSelfPrint("\r\nMsgCRC16,%d,%d\r\n",CRC_H,CRC_L);
if((pdat[length - 1] == CRC_L) && (pdat[length - 2]== CRC_H))
{
return true;
......
......@@ -55,7 +55,7 @@
#if ZBHCI_EN
#include "zbhci.h"
#endif
#include "ikk-debug.h"
#if AF_TEST_ENABLE
/**********************************************************************
* LOCAL CONSTANTS
......@@ -126,17 +126,40 @@ static void afTest_testClearReqPrc(apsdeDataInd_t *pApsdeInd)
dstEp.profileId = pApsdeInd->indInfo.profile_id;
dstEp.dstAddrMode = APS_SHORT_DSTADDR_WITHEP;
dstEp.dstAddr.shortAddr = pApsdeInd->indInfo.src_short_addr;
u8 st = SUCCESS;
u8 apsCnt = 0;
af_dataSend(pApsdeInd->indInfo.dst_ep, &dstEp, ZCL_CLUSTER_TELINK_SDK_TEST_CLEAR_RSP, 1, &st, &apsCnt);
}
static void afTest_dataSendDemo(apsdeDataInd_t *pApsdeInd)
{
epInfo_t dstEp;
TL_SETSTRUCTCONTENT(dstEp, 0);
dstEp.dstAddrMode = APS_LONG_DSTADDR_WITHEP;
dstEp.dstEp = pApsdeInd->indInfo.src_ep;
memcpy(dstEp.dstAddr.extAddr,pApsdeInd->indInfo.src_ext_addr,8);
dstEp.profileId = HA_PROFILE_ID;
dstEp.txOptions = APS_TX_OPT_INTRA_PAN;
dstEp.radius = 0;
u8 apsCnt = 0;
u8 asdu[] = {0xAA, 0x55, 0x00, 0x08, 0x10, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0d, 0x00, 0xF3, 0xD0};
u8 asdulength = sizeof(asdu);
//af_dataSend(pApsdeInd->indInfo.dst_ep, &dstEp, 0x0001, asdulength, asdu, &apsCnt);
printf("afTest_Receive--------------ok!!\r\n");
}
void afTest_rx_handler(void *arg)
{
apsdeDataInd_t *pApsdeInd = (apsdeDataInd_t *)arg;
iKonkeAfSelfPrint("interpan data received,data len =%d\r\n",pApsdeInd->indInfo.asduLength);
iKonkeAfSelfPrintBuffer(pApsdeInd->indInfo.asdu,pApsdeInd->indInfo.asduLength);
switch(pApsdeInd->indInfo.cluster_id){
case ZCL_CLUSTER_TELINK_SDK_TEST_CLEAR_REQ:
g_afTest_rcvReqCnt = 0;
......@@ -147,8 +170,12 @@ void afTest_rx_handler(void *arg)
afTest_testReqPrc(pApsdeInd);
break;
case ZCL_CLUSTER_TELINK_SDK_TEST_RSP:
break;
// case ZCL_CLUSTER_PRIVATE_FCC0:
// {
// afTest_dataSendDemo(pApsdeInd);
// break;
// }
default:
break;
}
......@@ -159,8 +186,8 @@ void afTest_rx_handler(void *arg)
void afTest_dataSendConfirm(void *arg)
{
// apsdeDataConf_t *pApsDataCnf = (apsdeDataConf_t *)arg;
apsdeDataConf_t *pApsDataCnf = (apsdeDataConf_t *)arg;
printf("afTest_dataSendConfirm,dest ep = %d\r\n!!\r\n",pApsDataCnf->dstEndpoint);
}
#endif /* AF_TEST_ENABLE */
......
......@@ -64,7 +64,7 @@ void pwmSetDuty(u8 ch, u16 dutycycle)
uint8_t kPwmGetIndexByID(uint8_t pwm_id )
{
for(int index = 0; index < g_u8PwmChannelNum; ++index ) {
iKonkeAfSelfPrint("####kPwmGetIndexByID index[%d] pwm_id[%d]\r\n",index, g_stPwmConfList[index].u8PwmId);
//iKonkeAfSelfPrint("####kPwmGetIndexByID index[%d] pwm_id[%d]\r\n",index, g_stPwmConfList[index].u8PwmId);
if( g_stPwmConfList[index].u8PwmId != PWM_UNUSED_ID ) {
if( g_stPwmConfList[index].u8PwmId == pwm_id ) {
return index;
......@@ -86,7 +86,7 @@ void kPwmDriverhandler(uint8_t pwm_index, PwmGradientDirectionEnum st, uint16_t
iKonkeAfSelfPrint("####kPwmDriverhandler index is too large\r\n");
return;
}
iKonkeAfSelfPrint("######kPwmDriverhandler index(%d), direction(%d), value(%d)\r\n", pwm_index, st, value);
//iKonkeAfSelfPrint("######kPwmDriverhandler index(%d), direction(%d), value(%d)\r\n", pwm_index, st, value);
switch(st) {
case (ELP_MIN):
......@@ -170,7 +170,7 @@ void kPwmOptTrigger(uint8_t id, uint32_t start_value, uint32_t end_value, uint32
g_stPwmCtrller[pwm_index].startDutyCycle = start_value;
g_stPwmCtrller[pwm_index].endDutyCycle = end_value;
g_stPwmCtrller[pwm_index].startDutyCycleValue = start_value;
memcpy(&g_stPwmCtrller[pwm_index].gpioInfo, &g_stPwmConfList[pwm_index].gpioInfo, sizeof(PwmGpioListSt));
memcpy(&g_stPwmCtrller[pwm_index].gpioInfo, &g_stPwmConfList[pwm_index].gpioInfo, sizeof(PwmGpioSt));
iKonkeAfSelfPrint("action (%d) , interval[%d]\r\n",g_stPwmCtrller[pwm_index].actionCounter,g_stPwmCtrller[pwm_index].intervalDutyCycle);
pwmSetDuty(g_stPwmConfList[pwm_index].gpioInfo.pwmChannel,start_value);
......@@ -267,7 +267,7 @@ static s32 kPwmGradientChangeEventHandler(void *data)
g_stPwmCtrller[i].startDutyCycleValue += g_stPwmCtrller[i].intervalDutyCycle;
pwmSetDuty(g_stPwmCtrller[i].gpioInfo.pwmChannel,g_stPwmCtrller[i].startDutyCycleValue);
}
iKonkeAfSelfPrint("BREATH index(%d)channel(%d) count(%d),%d\r\n", i,g_stPwmCtrller[i].gpioInfo.pwmChannel, g_stPwmCtrller[i].actionCounter,g_stPwmCtrller[i].startDutyCycleValue);
//iKonkeAfSelfPrint("BREATH index(%d)channel(%d) count(%d),%d\r\n", i,g_stPwmCtrller[i].gpioInfo.pwmChannel, g_stPwmCtrller[i].actionCounter,g_stPwmCtrller[i].startDutyCycleValue);
//PWM_IDص
if (g_stPwmCtrller[i].actionCounter == 0){
//may be end duty cycle not equal, restore end duty cycle
......@@ -291,7 +291,29 @@ static s32 kPwmGradientChangeEventHandler(void *data)
}
return 0;
}
/* DESP: clear pwm gradient counter interface by pwm id.
* Auth: maozj.20200212.
* */
bool kPwmClearGradientCounterById(uint8_t pwm_id)
{
if (pwm_id == PWM_UNUSED_ID){
iKonkeAfSelfPrint("#Err: kPwmClearGradientCounterById pwm id is invalid\r\n");
return false;
}
for (int index = 0; index < PWM_OBJS_SUPPORT_MAXN; ++index ) {
//iKonkeAfSelfPrint("####kPwmGetIndexByID index[%d] pwm_id[%d]\r\n",index, g_stPwmConfList[index].u8PwmId);
if (g_stPwmConfList[index].u8PwmId == pwm_id) {
iKonkeAfSelfPrint("###kPwmClearGradientCounterById success index(%d) id(%d)\r\n", index, pwm_id);
g_stPwmCtrller[index].actionCounter = 0;
return true;
}
}
return false;
}
void PWM_Test(uint8_t data)
{
......
......@@ -89,7 +89,7 @@ kk_err_t kPwmModuleInit(PwmConfSt pwmlist[], unsigned char pwm_number, pPwmActio
*/
void kPwmOptTrigger(uint8_t id, uint32_t start_value, uint32_t end_value, uint32_t duration_time );
bool kPwmClearGradientCounterById(uint8_t pwm_id);
void PWM_Test(uint8_t data);
......
......@@ -265,8 +265,8 @@ static void dma_uartRcvHandler(void)
uint8_t head_index = 0;
uint32_t len = *dma_uartRxBuf;
// iKonkeAfSelfPrint("#############dma_uartRcvHandler,recv data len = %d \r\n",len);
// iKonkeAfSelfPrintBuffer(dma_uartRxBuf+4,len);
iKonkeAfSelfPrint("#############dma_uartRcvHandler,recv data len = %d \r\n",len);
iKonkeAfSelfPrintBuffer(dma_uartRxBuf+4,len);
memset(&MsgNode,0,sizeof(UMsgNodeSt));
for(uint8_t i = 0;i< len;i++)
{
......
......@@ -5,7 +5,7 @@
#include "drv_uart.h"
// MSG BUFFER OF NODE MAXLENGTH
#define UMSG_NODE_SIZE 32
#define UMSG_NODE_SIZE 96
// Maximum number of message nodes in the queue
#define UMSG_NODE_MAX 4
// Maximum Cache Length of Message Receiver
......@@ -17,7 +17,7 @@ typedef enum { EQU_RECV = 0, EQU_SENT }QueueEm;
// uart recv/send buffer node
typedef struct tag_uart_message_node {
unsigned char buffer[UMSG_NODE_SIZE];
unsigned char length;
uint16_t length;
// just for sending, Used to match instruction responses. For example, according to the instruction opcode!
unsigned char matcher[4];
unsigned char matcher_offset;
......@@ -26,6 +26,8 @@ typedef struct tag_uart_message_node {
bool bRspNeedtoDispatch;
// Attempt to send number of times, decreases to 0 when invalid!!!
unsigned char sent_try;
unsigned char *ack;
unsigned char ack_length;
}UMsgNodeSt;
typedef struct tag_uart_message_queue {
......
......@@ -19,7 +19,7 @@ static uint8_t g_tmp_buffer[64] = { 0 };
pOnOffClusterOnOffStatusCallback g_pfOnOffStatusCallback = NULL;
//static pClusterAttributeChangeCallback pOnOffClusterCallback = NULL;
static pClusterAttributeChangeCallback pOnOffClusterCallback = NULL;
//static pClusterAttributeChangeCallback pLevelClusterCallback = NULL;
//static pClusterAttributeChangeCallback pColorClusterCallback = NULL;
......@@ -33,27 +33,12 @@ typedef struct {
static ZclClusterReportTableSt g_stZclClusterReportPermitTable;
//bool kZclOnOffClusterServerOnOffGet(uint8_t endpoint)
//{
// uint8_t status;
// zclAttrInfo_t *onoff = zcl_attrRead(endpoint,ZCL_CLUSTER_GEN_ON_OFF,ZCL_ATTRID_ONOFF,&status);
//
// iKonkeAfSelfPrint("kZclOnOffClusterServerOnOffGet:status(%d), endpoint(%d), status(%d)\r\n",status, endpoint, onoff->data[0]);
// iKonkeAfSelfPrint("kZclOnOffClusterServerOnOffGet:id(%d), type(%d), access(%d)\r\n",onoff->id, onoff->type, onoff->access);
//
// return onoff->data[0];
//}
bool kZclOnOffClusterServerOnOffGet(uint8_t endpoint)
{
zcl_onOffAttr_t *pOnOff = zcl_onoffAttrGet(endpoint);
return pOnOff->onOff;
}
void kZclOnOffClusterServerOnOffSet(uint8_t endpoint,bool onoff)
{
zcl_onOffAttr_t *pOnOff = zcl_onoffAttrGet(endpoint);
pOnOff->onOff = onoff;
WriteServerAttribute(endpoint,CLUSTER_ONOFF_ID,ZCL_ATTRID_ONOFF,(uint8_t*)&onoff,ZCL_DATA_TYPE_BOOLEAN);
// zcl_onOffAttr_t *pOnOff = zcl_onoffAttrGet(endpoint);
//
// pOnOff->onOff = onoff;
zcl_onOffAttr_save();
}
/* DESP: on-off cluster control operate.
......@@ -69,7 +54,6 @@ kk_err_t kZclOnOffClusterServerOnOffControl(uint8_t endpoint, OnOffCtrlEnum ctrl
setValue = 1;
else
setValue = 0;
kZclOnOffClusterServerOnOffSet(endpoint,setValue);
if( kNwkGetCurrentStatus() == ENS_ONLINE ) {
// check binding table
......@@ -81,7 +65,12 @@ kk_err_t kZclOnOffClusterServerOnOffControl(uint8_t endpoint, OnOffCtrlEnum ctrl
return KET_OK;
}
bool kZclOnOffClusterServerOnOffGet(uint8_t endpoint)
{
status_t status ;
zclAttrInfo_t *pOnOff = zcl_attrRead(endpoint,CLUSTER_ONOFF_ID,ZCL_ATTRID_ONOFF,&status);
return (status == ZCL_STA_SUCCESS )? (pOnOff->data[0]): (0);
}
static status_t WriteServerAttribute(u8 endpoint, u16 clusterId,uint8_t attributeID,uint8_t* dataPtr, uint8_t data_type)
......@@ -90,15 +79,41 @@ static status_t WriteServerAttribute(u8 endpoint, u16 clusterId,uint8_t attribut
attr_data.attrID = attributeID;
attr_data.dataType = data_type;
u16 dataLen = zcl_getAttrSize(data_type, dataPtr);
memcpy(attr_data.attrData,dataPtr,dataLen);
attr_data.attrData = dataPtr;
// iKonkeAfSelfPrint("##WriteServerAttribute attr =%x,attr = %x,len=%d :\r\n",clusterId,attr_data.attrID,dataLen);
// iKonkeAfSelfPrint("##DataBuffer len = %d,data=%x-%x:\r\n",dataLen,attr_data.attrData[1],attr_data.attrData[2]);
// iKonkeAfSelfPrintBuffer(attr_data.attrData,attr_data.attrData[0]+1);
return zcl_attrWrite(endpoint,clusterId,&attr_data,false);
iKonkeAfSelfPrint("##WriteServerAttribute cluster =%d,attr = %d,len=%d :\r\n",clusterId,attr_data.attrID,dataLen);
if(dataLen == 1)
iKonkeAfSelfPrint("##data=%d:\r\n",*dataPtr);
else
iKonkeAfSelfPrintBuffer(dataPtr,dataLen);
return zcl_attrWrite(endpoint,clusterId,&attr_data,true);
}
bool Get_Model_ID(uint8_t *ModeID)
{
status_t status ;
zclAttrInfo_t *pAttrInfo = zcl_attrRead(1,ZCL_CLUSTER_GEN_BASIC,ZCL_ATTRID_BASIC_MODEL_ID,&status);
if(status == ZCL_STA_SUCCESS )
{
uint8_t len = pAttrInfo->data[0];
if((ModeID)&&(len >0)&&(pAttrInfo->type == ZCL_DATA_TYPE_CHAR_STR))
{
uint8_t temp[16] = {0};
memcpy(ModeID,&pAttrInfo->data[1],len); //Get ASCII Data
if((len >0)&&(len %2 == 0))
{
kUtilsStr2Hex(ModeID,temp,len);
memcpy(ModeID,temp,len/2);
iKonkeAfSelfPrint("##Trans Data Buffer Len =%d:\r\n",len);
iKonkeAfSelfPrintBuffer(ModeID,8);
return true;
}
}
}
return false;
}
static status_t Rewrite_Modeid(uint8_t *modeid,uint8_t software,uint8_t hardware)
{
uint8_t Modeid_Temp[] = "3AFE101003008611" ;
......@@ -140,6 +155,10 @@ static status_t Rewrite_Modeid(uint8_t *modeid,uint8_t software,uint8_t hardwar
g_tmp_buffer[0] = 16;
g_tmp_buffer[0+ 2+16] = '0';
uint8_t *data = MODEL_ID_TOKEN_GET();
if(!All_Same_Data(&data[1],0xff,32))
memcpy(g_tmp_buffer,data,data[0]+1);
status = WriteServerAttribute(1, ZCL_CLUSTER_GEN_BASIC, ZCL_ATTRID_BASIC_MODEL_ID ,(uint8_t*)g_tmp_buffer,ZCL_DATA_TYPE_CHAR_STR);
if(status != ZCL_STA_SUCCESS)
{
......@@ -188,73 +207,54 @@ void Update_Local_Attribute_Info(void)
//
//static typedef struct{
// zcl_basicAttr_t basicAttrs_temp;
// zcl_identifyAttr_t identifyAttrs_temp
// zcl_onOffAttr_t onOffAttrs_temp;
// zcl_onOffAttr_t levelAttrs_temp;
//}AttrListST;
//static AttrListST Attr_List_Value[MAX_ATTR_CHANGE_SUPPORT_NUMS] ;
//void ClusterAttributeChangeCallbackRegister(AttributeChangeConfSt *ConfSt,unint8_t num)
//{
// for(uint8_t i=0;i<num;i++)
// {
// if(i > MAX_ATTR_CHANGE_SUPPORT_NUMS)
// {
// iKonkeAfSelfPrint("attribute change callback totals number beyond!!\r\n");
// break;
// }
// switch(ConfSt[i]->cluster)
// {
// case ZCL_CLUSTER_GEN_ON_OFF:
// {
// if(ConfSt[i]->attribute == ZCL_ATTRID_ONOFF)
// {
// pOnOffClusterCallback = ConfSt[i]->change_callback;
// }
// }
// break;
typedef struct{
zcl_basicAttr_t basicAttrs_temp;
zcl_identifyAttr_t identifyAttrs_temp;
zcl_onOffAttr_t onOffAttrs_temp;
zcl_levelAttr_t levelAttrs_temp;
}AttrListST;
static AttrListST Attr_List_Value[MAX_ATTR_CHANGE_SUPPORT_NUMS] ;
void ikkAttributeChangeCallbackRegister(AttributeChangeConfSt *ConfSt,uint8_t num)
{
for(uint8_t i=0;i<MAX_ATTR_CHANGE_SUPPORT_NUMS;i++)
{
if(i > MAX_ATTR_CHANGE_SUPPORT_NUMS)
{
iKonkeAfSelfPrint("attribute change callback totals number beyond!!\r\n");
break;
}
switch(ConfSt->cluster)
{
case ZCL_CLUSTER_GEN_ON_OFF:
{
pOnOffClusterCallback = ConfSt->change_callback;
}
break;
// case ZCL_CLUSTER_GEN_LEVEL_CONTROL:
// {
// if(ConfSt[i]->attribute == ZCL_ATTRID_LEVEL_CURRENT_LEVEL)
// pLevelClusterCallback = ConfSt[i]->change_callback;
// pLevelClusterCallback = ConfSt->change_callback;
// }
// break;
// default:
// break;
// }
// }
//// memcpy(&Attr_List_Value.basicAttrs_temp,&g_zcl_basicAttrs,sizeof(zcl_basicAttr_t));
//// memcpy(&Attr_List_Value.identifyAttrs_temp,&g_zcl_identifyAttrs,sizeof(zcl_basicAttr_t));
//// memcpy(&Attr_List_Value.onOffAttrs_temp,&g_zcl_onOffAttrs,sizeof(zcl_basicAttr_t));
//// memcpy(&Attr_List_Value.levelAttrs_temp,&g_zcl_levelAttrs,sizeof(zcl_basicAttr_t));
//}
default:
break;
}
}
}
void AttributeValueCheck(void)
void AttributeValueCheckCallback(void)
{
// if((Attr_List_Value.onOffAttrs_temp.onOff !=g_zcl_onOffAttrs.onOff)&&(pOnOffClusterCallback))
// {
// pOnOffClusterCallback(1,ZCL_CLUSTER_GEN_ON_OFF,ZCL_ATTRID_ONOFF,g_zcl_onOffAttrs.onOff,1,g_zcl_onOffAttrs.onOff);
//
//
// }
for(uint8_t i = 0;i<Support_Endpoint_Num;i++)
{
if(memcmp((uint8_t*)&Attr_List_Value[i].onOffAttrs_temp,(uint8_t*)&g_zcl_onOffAttrs[i],sizeof(zcl_onOffAttr_t)) )
{
if(Attr_List_Value[i].onOffAttrs_temp.onOff != g_zcl_onOffAttrs[i].onOff)
{
if(pOnOffClusterCallback)
pOnOffClusterCallback(i+1,ZCL_CLUSTER_GEN_ON_OFF,ZCL_ATTRID_ONOFF,(uint8_t *)&g_zcl_onOffAttrs[i].onOff,ZCL_DATA_TYPE_BOOLEAN);
}
memcpy((uint8_t*)&Attr_List_Value[i].onOffAttrs_temp,(uint8_t*)&g_zcl_onOffAttrs[i],sizeof(zcl_onOffAttr_t));
}
}
}
......@@ -379,7 +379,6 @@ void ON_OFF_Cmd_Handler(uint8_t endpoint,bool onoff)
OnOffStatusEnum on_off_ctr = (OnOffStatusEnum)onoff;
kZclClusterSetPermitReportInfo(endpoint,ZCL_CLUSTER_GEN_ON_OFF,true,false);
kZclOnOffClusterServerOnOffControl(endpoint, on_off_ctr);
g_pfOnOffStatusCallback(endpoint,on_off_ctr);
}
/* DESP: Modified attribute reporting interface, reference from SDK callback[emberAfReportingAttributeChangeCallback].
* Auth: dingmz_frc.20190701.
......
......@@ -28,11 +28,10 @@ typedef struct tag_zcl_report_table{
}ZclReportTableSt;
#define MAX_ATTR_CHANGE_SUPPORT_NUMS 8
typedef void (*pClusterAttributeChangeCallback)(uint8_t endpoint,uint16_t cluster,uint16_t attribute,uint8_t len,uint8_t *data);
typedef void (*pClusterAttributeChangeCallback)(uint8_t endpoint,uint16_t cluster,uint16_t attribute,uint8_t *data,uint8_t data_type);
typedef struct {
uint16_t cluster;
uint16_t attribute;
pClusterAttributeChangeCallback change_callback;
}AttributeChangeConfSt;
......@@ -41,20 +40,25 @@ typedef void (*pOnOffClusterOnOffStatusCallback)(uint8_t endpoint, OnOffStatusEn
void kZclOnOffClusterServerOnOffSet(uint8_t endpoint,bool onoff);
extern status_t zcl_attrWrite(u8 endpoint, u16 clusterId, zclWriteRec_t *pWriteRec, bool enable);
extern zclAttrInfo_t *zcl_attrRead(u8 endpoint, u16 clusterId, u16 attrId, status_t *status);
#define ReadServerAttribute(endpoint,clusterId,attributeID,status) (zcl_attrRead(endpoint,clusterId,attributeID,status))
#define kGetLastRssi() (g_sysDiags.lastMessageRSSI)
#define kGetLastLQI() (g_sysDiags.lastMessageLQI)
void Update_Local_Attribute_Info(void);
bool kIsKonkeRemoteGateway(void);
kk_err_t kZclOnOffClusterServerInit(pOnOffClusterOnOffStatusCallback pOnOffStatusCallback );
void ikkAttributeChangeCallbackRegister(AttributeChangeConfSt *ConfSt,uint8_t num);
void ON_OFF_Cmd_Handler(uint8_t endpoint,uint8_t cmd);
bool kZclOnOffClusterServerOnOffGet(uint8_t endpoint);
kk_err_t kZclOnOffClusterServerOnOffControl(uint8_t endpoint, OnOffCtrlEnum ctrlopt );
void ClusterAttributeChangeCallbackRegister(AttributeChangeConfSt *ConfSt,uint8_t num);
bool Get_Model_ID(uint8_t *ModeID);
bool kkClusterGetReportingPeriod(uint8_t endpoint, uint16_t cluster_id, uint16_t attribute_id,uint16_t *min_interval, uint16_t *max_interval );
void kOptTunnelReportingPlagiarizeOriginal(uint8_t endpoint, uint16_t clusterId, uint16_t attributeId );
void kZclClusterPermitReportTableInit(BindObjSt clusterBindList[], uint8_t size);
......
#include "ikk-debug.h"
#include "ikk-command.h"
#include "ikk-common-utils.h"
#include "ikk-token.h"
#include "ikk-network.h"
#include "ikk-cluster.h"
#include "ikk-factory-test.h"
#include "ikk-interpan.h"
//#define OPCODE_REMAP_TABLE_SIZE 20
static uint16_t opcodeReampTable[][2] =
{
//FCC0, AA55
{0xE0, 0x0001}, //write install code,
{0xE1, 0x0003}, //write cmei
{0xE2, 0x0005}, //write isn
{0xE3, 0x0007}, //write mac
{0xE6, 0x0002},
{0xE7, 0x0004},
{0xE8, 0x0006},
{0xE9, 0x0008},
{0xEA, 0x0009},
{0xEB, 0x000A},
//{0xF0, 0xED14},//????
//{0xF1, 0xED04},//????
//{0xF2, 0xED05},//??????
{0xF3, 0x000C}, //??????
{0xF4, 0x000D}, //??????
{0xF5, 0x000E}, //??interPan??
{0xF6, 0x000F}, //??interPan??
{0xF7, 0x0010}, //??????
};
uint16_t kCmdGetMsgCrc16Value( uint8_t* msg, uint8_t len)
{
uint16_t crc = 0xFFFF;
uint16_t i, j = 0;
for (i = 0; i < len; i++)
{
for (j = 0; j < 8; j++)
{
//????a?? ADD BY YWQ
uint8_t c15 = (uint8_t)((crc >> 15 & 1) == 1);
uint8_t bit = (uint8_t)((msg[i] >> (7 - j) & 1) == 1);
crc <<= 1;
if (c15 ^ bit)
{
crc ^= 0x1021;
}
}
}
return crc;
}
/* DESP: remap opcode, arg direction 0: FCC0->AA55 1:AA55->FCC0
* Auth:
* */
uint16_t kCmdOpcodeRemap(uint16_t Opcode, uint8_t direction)
{
for (uint8_t i = 0; i < (sizeof(opcodeReampTable)/(2*sizeof(uint16_t))); i++ ) {
if (opcodeReampTable[i][0] == Opcode) {
return opcodeReampTable[i][1];
}
}
return 0xFFFF;
}
kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st *pDataOut)
{
//UMsgNodeSt uMsgNode = {0};
uint16_t length = 0;
uint8_t control_field = 0;
DataField_st data;
DataField_st send_buf;
uint8_t reply_control_field = 0;
if( NULL == pMsgNode ) {
return KET_ERR_INVALID_PARAM;
}
#if 1 // Just for debug
iKonkeAfSelfPrint("\r\n-- MSG INCOMING[%d]:\r\n", pMsgNode->length);
iKonkeAfSelfPrintBuffer(pMsgNode->buffer, pMsgNode->length);
iKonkeAfSelfPrint("\r\n--------------------\r\n");
#endif
// check for parsable packets
if( pMsgNode->length < 5 /* Minimum Packet Length */ ) {
iKonkeAfSelfPrint("Err: Unparsable Packets!!\r\n");
return KET_ERR_INVALID_PARAM;
}
//length(1) pid(4) ch(1) opcode(1) arg
if (port == ECOM_PORT_FCC0) {
length = (uint16_t)pMsgNode->length;
//control_field = pMsgNode->buffer[4];
data.seq = 0x00;
data.u8Datalen = pMsgNode->buffer[0];
data.u8ArgLen = data.u8Datalen - 6; // fcc0 - id (4) - ch(1) - opcode(1)
data.u8ChannelID = pMsgNode->buffer[5];
data.u16Opcode = kCmdOpcodeRemap((uint16_t)(pMsgNode->buffer[6]), 0);
if(data.u16Opcode == 0xFFFF) {
return KET_ERR_INVALID_PARAM;
}
memcpy(data.u8ARG,&pMsgNode->buffer[7], data.u8ArgLen); //6 = pid(4) + ch(1) + opcode(1)
send_buf.seq = data.seq;
send_buf.u8ChannelID = data.u8ChannelID;
send_buf.u16Opcode = data.u16Opcode;
} else {
length = ((uint16_t)pMsgNode->buffer[2] << 8) | (uint16_t)(pMsgNode->buffer[3]);
control_field = pMsgNode->buffer[4];
data.seq = ((uint16_t)pMsgNode->buffer[5] << 8) | (uint16_t)(pMsgNode->buffer[6]);
data.u8Datalen = pMsgNode->buffer[7];
data.u8ArgLen = data.u8Datalen - 3; // aa55 - ch(1) - opcode(2)
data.u8ChannelID = pMsgNode->buffer[8];
data.u16Opcode = ((uint16_t)pMsgNode->buffer[9] << 8) | (uint16_t)(pMsgNode->buffer[10]);
memcpy(data.u8ARG,&pMsgNode->buffer[11],data.u8Datalen - 3);
send_buf.seq = data.seq;
send_buf.u8ChannelID = data.u8ChannelID;
send_buf.u16Opcode = data.u16Opcode;
}
send_buf.u8Datalen = 0;
iKonkeAfSelfPrint("opcode = %x%x\r\n",send_buf.u16Opcode>>8,(u8)send_buf.u16Opcode);
iKonkeAfSelfPrint("channel = %x\r\n",data.u8ChannelID );
switch(data.u16Opcode) {
case (UART_MSG_QUERY_INFO_OPCODE):
{
reply_control_field = Z_TO_H_NO_ACK;
send_buf.u8ARG[0] = ERR_OK;
send_buf.u8ArgLen = 1;
break;
}
case (UART_MSG_WRITE_INSTALL_CODE_OPCODE): // write install code
{
uint8_t buffer[16]= {0};
//check install code length 20200725
uint8_t length = data.u8ARG[0];
if (length != 16) {
send_buf.u8ARG[0] = ERR_FORMAT;
send_buf.u8ARG[1] = data.u8ARG[0];
memcpy(&send_buf.u8ARG[2], &data.u8ARG[1], length);
//send_buf.u8Datalen = data.u8ARG[0] + 5;
send_buf.u8ArgLen = length + 1 + 1;
break;
}
memcpy(buffer, &data.u8ARG[1], 16);
INSTALL_CODE_TOKEN_SET(buffer,16);
send_buf.u8ARG[0] = ERR_OK;
send_buf.u8ARG[1] = data.u8ARG[0];
memcpy(&send_buf.u8ARG[2], &data.u8ARG[1], length);
send_buf.u8ArgLen = length + 1 + 1;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_READ_INSTALL_CODE_OPCODE): //read install code
{
uint8_t install_code_len = 0;
send_buf.u8ARG[0] = ERR_OK;
install_code_len = 16;
memcpy(&send_buf.u8ARG[2], INSTALL_CODE_TOKEN_GET(), install_code_len);
send_buf.u8ARG[1] = install_code_len;
send_buf.u8ArgLen = install_code_len + 2; // err(1) + codelen(1)
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_WRITE_CMEI_CODE_OPCODE): // write cmei
{
uint8_t buffer[33];
uint8_t length = data.u8ARG[0];
memset(buffer, 0, 33);
if(length > 32) {
send_buf.u8ARG[0] = ERR_NOT_EXPECTED;
//send_buf.u8Datalen = 1 + 1 + 3;
}else{
send_buf.u8ARG[0] = ERR_OK;
memcpy(buffer, &data.u8ARG[1], length);
CMEI_TOKEN_SET(buffer,length);
}
memcpy(&send_buf.u8ARG[1], &data.u8ARG[0], data.u8ARG[0] + 1);
send_buf.u8ArgLen = data.u8ARG[0] + 1 + 1;
//send_buf.u8Datalen = data.u8ARG[0] + 4;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_READ_CMEI_CODE_OPCODE): //read cmei
{
uint8_t buffer[33];
uint8_t length = 0;
memset(buffer, 0, 33);
uint8_t *data = CMEI_TOKEN_GET();
iKonkeAfSelfPrint("len %x\r\n",data[0]);
iKonkeAfSelfPrintBuffer(data+1,32);
length = data[0];
memcpy(buffer,data,length +1);
if(length > 32) {
send_buf.u8ARG[0] = ERR_NOT_EXPECTED;
send_buf.u8ARG[1] = 0x00;
send_buf.u8ArgLen = 2;
} else {
send_buf.u8ARG[0] = ERR_OK;
memcpy(&send_buf.u8ARG[1], buffer, length + 1);
send_buf.u8ArgLen = length + 1 + 1;
}
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_WRITE_ISN_CODE_OPCODE): // write isn
{
uint8_t buffer[33];
uint8_t length = data.u8ARG[0];
memset(buffer, 0, 33);
if(length > 32) {
send_buf.u8ARG[0] = ERR_NOT_EXPECTED;
//send_buf.u8Datalen = 1 + 1 + 3;
}else{
send_buf.u8ARG[0] = ERR_OK;
memcpy(buffer, &data.u8ARG[1], length);
ISN_TOKEN_SET(buffer,length);
}
memcpy(&send_buf.u8ARG[1], &data.u8ARG[0], data.u8ARG[0] + 1);
send_buf.u8ArgLen = data.u8ARG[0] + 1 + 1;
//send_buf.u8Datalen = data.u8ARG[0] + 4;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_READ_ISN_CODE_OPCODE): //read isn
{
uint8_t buffer[33];
uint8_t length = 0;
memset(buffer, 0, 33);
uint8_t *data = ISN_TOKEN_GET();
iKonkeAfSelfPrint("len %x\r\n",data[0]);
iKonkeAfSelfPrintBuffer(data+1,32);
length = data[0];
memcpy(buffer,data,length +1);
if(length > 32) {
send_buf.u8ARG[0] = ERR_NOT_EXPECTED;
send_buf.u8ARG[1] = 0x00;
send_buf.u8ArgLen = 2;
} else {
send_buf.u8ARG[0] = ERR_OK;
memcpy(&send_buf.u8ARG[1], buffer, length + 1);
send_buf.u8ArgLen = length + 1 + 1;
}
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_WRITE_MAC_CODE_OPCODE)://ok
{
uint8_t mac_length = 0x00;
addrExt_t addr,local_addr;
flash_read(CFG_MAC_ADDRESS,8,(uint8_t*)local_addr);
mac_length = data.u8ARG[0];
if (mac_length != 8) {
send_buf.u8ARG[0] = ERR_NOT_EXPECTED;
} else {
send_buf.u8ARG[0] = ERR_OK;
memcpy(addr, &data.u8ARG[1], 8);
SWAP_EUI64((uint8_t *)local_addr);
if(memcmp(local_addr,addr,8) ){
SWAP_EUI64((uint8_t *)addr);
flash_erase(CFG_MAC_ADDRESS);
flash_write(CFG_MAC_ADDRESS,8,addr);
}
}
send_buf.u8ARG[1] = 8;
memcpy(&send_buf.u8ARG[2], &data.u8ARG[1], 8);
send_buf.u8ArgLen = 1 + 1 + 8;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_READ_MAC_CODE_OPCODE)://ok
{
addrExt_t addr;
flash_read(CFG_MAC_ADDRESS,8,(uint8_t*)addr);
// zb_getLocalExtAddr(addr);
send_buf.u8ARG[0] = 0x00;
send_buf.u8ARG[1] = 0x08;
SWAP_EUI64((uint8_t *)addr);
iKonkeAfSelfPrintBuffer(addr,8);
memcpy(&send_buf.u8ARG[2], addr, 8);
send_buf.u8ArgLen = 1 + 1 + 8;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_WRITE_MOUDLE_ID_OPCODE): // write modeid code
{
uint8_t buffer[33];
uint8_t length = data.u8ARG[0];
memset(buffer, 0, 33);
if(length > 32) {
send_buf.u8ARG[0] = ERR_NOT_EXPECTED;
//send_buf.u8Datalen = 1 + 1 + 3;
}else{
send_buf.u8ARG[0] = ERR_OK;
memcpy(buffer, &data.u8ARG[1], length);
MODEL_ID_TOKEN_SET(buffer,length);
}
memcpy(&send_buf.u8ARG[1], &data.u8ARG[0], data.u8ARG[0] + 1);
send_buf.u8ArgLen = data.u8ARG[0] + 1 + 1;
//send_buf.u8Datalen = data.u8ARG[0] + 4;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_READ_MOUDLE_ID_OPCODE): //read modeid code
{
uint8_t buffer[33];
uint8_t length = 0;
memset(buffer, 0, 33);
uint8_t *data = MODEL_ID_TOKEN_GET();
if(All_Same_Data(&data[1],0xff,32))
{
status_t status;
zclAttrInfo_t *attrInfo = ReadServerAttribute(1,0x0000,0x0005,&status);
length = attrInfo->data[0];
iKonkeAfSelfPrint("len %x\r\n",length);
iKonkeAfSelfPrintBuffer( attrInfo->data+1,32);
memcpy(buffer,attrInfo->data,length +1);
}else{
length = data[0];
iKonkeAfSelfPrint("len %x\r\n",length);
iKonkeAfSelfPrintBuffer(data+1,32);
memcpy(buffer,data,length +1);
}
if(length > 32) {
send_buf.u8ARG[0] = ERR_NOT_EXPECTED;
send_buf.u8ARG[1] = 0x00;
send_buf.u8ArgLen = 2;
//send_buf.u8Datalen = 1 + 1 + 3;
} else {
send_buf.u8ARG[0] = ERR_OK;
memcpy(&send_buf.u8ARG[1], buffer, length + 1);
send_buf.u8ArgLen = length + 1 + 1;
//send_buf.u8Datalen = length + 1 + 1 + 3;
}
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_READ_DEV_RSSI_OPCODE):
{
reply_control_field = Z_TO_H_NO_ACK;
send_buf.u8ARG[0] = ERR_OK;
send_buf.u8ARG[1] = kGetLastRssi();
send_buf.u8ArgLen = 2;
break;
}
case (UART_MSG_WRITE_AGING_TIME_OPCODE)://OK
{
uint16_t agingTime = 0;
agingTime = UINT16_HL(data.u8ARG[0], data.u8ARG[1]);
kSetAgingMaxTime(agingTime);
send_buf.u8ARG[0] = ERR_OK;
send_buf.u8ARG[1] = data.u8ARG[0];
send_buf.u8ARG[2] = data.u8ARG[1];
send_buf.u8ArgLen = 3;
//send_buf.u8Datalen = 3 + 3;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_READ_AGING_TIME_OPCODE)://OK
{
uint32_t agingTime = 0;
agingTime = kGetAgingMaxTime();
agingTime = agingTime / 1000 / 60;
send_buf.u8ARG[0] = ERR_OK;
send_buf.u8ARG[1] = H1_UINT32(agingTime);
send_buf.u8ARG[2] = H0_UINT32(agingTime);
send_buf.u8ArgLen = 3;
//send_buf.u8Datalen = 3 + 3;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_WRITE_INTERPAN_PARA_OPCODE):
{
uint8_t enable = 0;
uint16_t panId = 0;
uint8_t channel = 0;
int8_t radioTxPower = 0;
enable = data.u8ARG[0];
channel = data.u8ARG[1];
panId = UINT16_HL(data.u8ARG[2], data.u8ARG[3]);
radioTxPower = data.u8ARG[4];
if (enable == 1)
zb_factoryReset();
SetInterpanPara(channel,panId,enable);
send_buf.u8ARG[0] = ERR_OK;
memcpy(&send_buf.u8ARG[1], &data.u8ARG[0], data.u8ArgLen);
send_buf.u8ArgLen = data.u8ArgLen + 1;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
// case (UART_MSG_READ_DEVICE_SNAP_OPCODE):
// {
// uint8_t tmp_value = 0;
// uint8_t send_length = 0;
//
// send_buf.u8ARG[send_length++] = ERR_OK;
// emberAfReadAttribute(1, ZCL_BASIC_CLUSTER_ID, ZCL_STACK_VERSION_ATTRIBUTE_ID, CLUSTER_MASK_SERVER,
// &tmp_value, 1, NULL);
// send_buf.u8ARG[send_length++] = tmp_value;
//
// EmberEUI64 localEui64;
// EmberNodeType nodeTypeResult = 0xFF;
// EmberNetworkParameters networkParams;
// emberAfGetEui64(localEui64);
// SWAP_EUI64((uint8_t *)&localEui64);
//
// if(emberAfNetworkState() == EMBER_JOINED_NETWORK) {
// emberAfGetNetworkParameters(&nodeTypeResult, &networkParams);
// send_buf.u8ARG[send_length++] = HI_UINT16(networkParams.panId);
// send_buf.u8ARG[send_length++] = LO_UINT16(networkParams.panId);
// send_buf.u8ARG[send_length++] = HI_UINT16(emberAfGetNodeId());
// send_buf.u8ARG[send_length++] = LO_UINT16(emberAfGetNodeId());
// memcpy(&send_buf.u8ARG[send_length], localEui64, 8);
// send_length = send_length + 8;
// send_buf.u8ARG[send_length++] = networkParams.radioChannel;
// send_buf.u8ARG[send_length++] = networkParams.radioTxPower;
// } else {
// emberAfGetNetworkParameters(&nodeTypeResult, &networkParams);
// send_buf.u8ARG[send_length++] = 0xff;
// send_buf.u8ARG[send_length++] = 0xff;
// send_buf.u8ARG[send_length++] = 0xff;
// send_buf.u8ARG[send_length++] = 0xff;
// memcpy(&send_buf.u8ARG[send_length], localEui64, 8);
// send_length = send_length + 8;
// send_buf.u8ARG[send_length++] = 0xff;
// send_buf.u8ARG[send_length++] = 0xff;
// }
// //SV
// emberAfReadAttribute(1, ZCL_BASIC_CLUSTER_ID, ZCL_APPLICATION_VERSION_ATTRIBUTE_ID, CLUSTER_MASK_SERVER,
// &tmp_value, 1, NULL);
// send_buf.u8ARG[send_length++] = tmp_value;
// //HV
// emberAfReadAttribute(1, ZCL_BASIC_CLUSTER_ID, ZCL_HW_VERSION_ATTRIBUTE_ID, CLUSTER_MASK_SERVER,
// &tmp_value, 1, NULL);
// send_buf.u8ARG[send_length++] = tmp_value;
// memset(&send_buf.u8ARG[send_length], 0xff, 4);
// send_length = send_length + 4;
// send_buf.u8ARG[send_length++] = emberAfNetworkState();
//
// send_buf.u8ArgLen = send_length;
// //send_buf.u8Datalen = send_length + 3;
// reply_control_field = Z_TO_H_NO_ACK;
//
// break;
// }
//nwk operation request
case (UART_MSG_QUERY_NWK_STATUS_REQUEST_OPCODE)://ok
{
send_buf.u8ARG[0] = ERR_OK;
send_buf.u8ARG[1] = kNwkGetCurrentStatus();
send_buf.u8ArgLen = 2;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_JOIN_NWK_REQUEST_OPCODE)://ok
{
uint8_t duration = data.u8ARG[0];//unit:S
if (zb_isDeviceJoinedNwk()){
iKonkeAfSelfPrint("#####NWK Is Joined By Usart Duration(0x%2x)\r\n", duration);
send_buf.u8ARG[0] = ERR_NOT_EXPECTED;
}else {
send_buf.u8ARG[0] = ERR_OK;
kNwkFactoryReset(false);
//steering timeout can be set
iKonkeAfSelfPrint("#####Start Steering By Usart Duration(0x%2x)\r\n", duration);
if(duration > 0)
kNwkJoiningStart(duration * 1000, NULL);
}
send_buf.u8ARG[1] = duration;
send_buf.u8ArgLen = 2;
//send_buf.u8Datalen = 5;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_LEAVE_NWK_REQUEST_OPCODE)://ok
{
if( zb_isDeviceJoinedNwk()){
send_buf.u8ARG[0] = ERR_OK;
kNwkFactoryReset(true);
}else {
send_buf.u8ARG[0] = ERR_NOT_EXPECTED;
}
send_buf.u8ArgLen = 1;
//send_buf.u8Datalen = 4;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
/*************************************/
case (UART_MSG_ENTER_FACTORY_TEST_OPCODE):
{
uint8_t tmp_value = 0;
if ((tmp_value & 0x01) == 0x01) {
kSetSingleBoardValue(0x00);
}
if ((tmp_value & 0x02) == 0x02) {
kSetFullDeviceValue(0x00);
}
if ((tmp_value & 0x04) == 0x04) {
kSetAgingTestValue(0x00);
}
send_buf.u8ArgLen = 2;
send_buf.u8ARG[0] = ERR_OK;
reply_control_field = Z_TO_H_NO_ACK;
send_buf.u8ARG[1] = kGetFactoryTestValueStatus();
break;
}
default:
{
send_buf.u8ARG[0] = ERR_NOT_EXPECTED;
send_buf.u8ArgLen = 1;
//send_buf.u8Datalen = 4;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
}
memcpy(pDataOut, (uint8_t *)&send_buf, sizeof(DataField_st));
if (send_buf.u8ArgLen == 0) { //if cmd exist, lengtg must > 0
return KET_ERR_CMD_INVALID;
} else {
if (port == ECOM_PORT_FCC0) {
pDataOut->u8Datalen = pDataOut->u8ArgLen;
} else {
pDataOut->u8Datalen = pDataOut->u8ArgLen + 3; //AA 55 (opcode(2), ch(1))
}
return KET_OK;
}
}
uint8_t kCmdMsgDataSentByPort(uint8_t u8Control_Field, DataField_st data, bool isGetResult, ComPortEm port)
{
uint8_t length = 0;
UMsgNodeSt uMsgNode;
memset((uint8_t*)&uMsgNode,0,sizeof(UMsgNodeSt));
uMsgNode.buffer[length++] = 0xAA; //msg header
uMsgNode.buffer[length++] = 0x55; //msg header
uMsgNode.buffer[length++] = 0x00; //msg length
uMsgNode.buffer[length++] = 0x00; //msg length
uMsgNode.buffer[length++] = u8Control_Field;
// seq++;
uMsgNode.buffer[length++] = (uint8_t) (data.seq >> 8);
uMsgNode.buffer[length++] = (uint8_t) data.seq;
uMsgNode.buffer[length++] = data.u8Datalen;
uMsgNode.buffer[length++] = data.u8ChannelID;
uMsgNode.buffer[length++] = (uint8_t) (data.u16Opcode >> 8);
uMsgNode.buffer[length++] = (uint8_t) data.u16Opcode;
memmove(&uMsgNode.buffer[length], data.u8ARG, data.u8Datalen - 3);
length = length + data.u8Datalen - 3;
uMsgNode.buffer[2] = (uint8_t) ((length - 4) >> 8);
uMsgNode.buffer[3] = (uint8_t) (length - 4);
uint16_t crc = kCmdGetMsgCrc16Value(&uMsgNode.buffer[4], length - 4);
uMsgNode.buffer[length++] = (uint8_t) (crc >> 8);
uMsgNode.buffer[length++] = (uint8_t) (crc);
uMsgNode.length = length;
// setting for matcher content.
uMsgNode.matcher[0] = uMsgNode.buffer[2]; //seq
uMsgNode.matcher[1] = uMsgNode.buffer[3];
uMsgNode.matcher_offset = 2;
uMsgNode.matcher_n = 2;
//zigbee send to host ack
if (u8Control_Field == Z_TO_H_NO_ACK) {
uMsgNode.sent_try = 0;
} else if (u8Control_Field == Z_TO_H_WITH_ACK) {
//zigbee send to host notify or control
uMsgNode.sent_try = 1;
}
if (isGetResult) {
uMsgNode.ack = uMsgNode.buffer;
} else {
uMsgNode.ack = NULL;
uMsgNode.ack_length = 0;
}
iKonkeAfSelfPrint("\r\n-- kCmdMsgDataSentByPort[%d]:\r\n", uMsgNode.length);
iKonkeAfSelfPrintBuffer(uMsgNode.buffer, uMsgNode.length);
if (port == ECOM_PORT_UART) {
return kUartMsgSent(&uMsgNode);
}
else if (port == ECOM_PORT_INTERPAN) {
return kInterPanSend(&uMsgNode);
}
return 0;
}
#ifndef __IKONKE_COMMAND_H____________________________
#define __IKONKE_COMMAND_H____________________________
#include "ikk-module-def.h"
#include "../driver/ikk-uart.h"
#define CMD_CONTROL_FIELD_HOST_TO_ZIGBEE_NEED_ACK 0x10
#define CMD_CONTROL_FIELD_HOST_TO_ZIGBEE_NO_ACK 0x00
#define CMD_CONTROL_FIELD_ZIGBEE_TO_HOST_NEED_ACK 0x30
#define CMD_CONTROL_FIELD_ZIGBEE_TO_HOST_NO_ACK 0x20
typedef enum {
H_TO_Z_WITH_ACK = CMD_CONTROL_FIELD_HOST_TO_ZIGBEE_NEED_ACK,
H_TO_Z_NO_ACK = CMD_CONTROL_FIELD_HOST_TO_ZIGBEE_NO_ACK,
Z_TO_H_WITH_ACK = CMD_CONTROL_FIELD_ZIGBEE_TO_HOST_NEED_ACK,
Z_TO_H_NO_ACK = CMD_CONTROL_FIELD_ZIGBEE_TO_HOST_NO_ACK,
}CMD_CONTROL_FIELD_E;
typedef struct{
uint16_t seq;
uint8_t u8Datalen;
uint8_t u8ChannelID;
uint16_t u16Opcode;
uint8_t u8ArgLen;
uint8_t u8ARG[128];
}DataField_st;
typedef struct{
uint8_t u8SOFHeaderBuf[2];
uint16_t u16DataLength;
uint8_t u8ControlFied;
//uint16_t u16Seq;
DataField_st stDataField;
}MsgFrameworkFormat_st;
kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st *pDataOut);
uint16_t kCmdOpcodeRemap(uint16_t Opcode, uint8_t direction);
uint16_t kCmdGetMsgCrc16Value( uint8_t* msg, uint8_t len);
uint8_t kCmdMsgDataSentByPort(uint8_t u8Control_Field, DataField_st data, bool isGetResult, ComPortEm port);
#endif
......@@ -2,7 +2,7 @@
#define __IKONKE_MODULE_DEBUG_H______________________________
#define IKONKE_DEBUG_LOG_ENABLE (1) // ENABLE
#define IKONKE_DEBUG_LOG_ENABLE (0) // ENABLE
#define PROMPT_DSR ""
......
#include "ikk-factory-test.h"
#include "ikk-debug.h"
#include "ikk-token.h"
#include "tl_common.h"
#include "ikk-common-utils.h"
#include "../driver/ikk-button.h"
#define AGING_TEST_15MIN_VALUE 0xA1
#define AGING_TEST_8HOU_VALUE 0xA2
#define AGING_TEST_4HOU_VALUE 0xA2
#define AGINE_TEST_DONE_VALUE 0xFA
//已经置老化标志
#define FACTORY_TEST_VALUE 0xF1
//初始值
#define TEST_INIT_VALUE 0xFF
#define SINGLE_BOARD_TEST_DONE_VALUE 0xF1 //锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷
#define FULL_DEVICE_TEST_DONE_VALUE 0xF2 //锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟?
#define FORCE_FACTORY_TEST_VALUE 0xF8 //锟斤拷锟斤拷锟斤拷锟斤拷锟角匡拷锟斤拷顺锟?
static ev_timer_event_t *kFactoryTestEvt = NULL;
s32 kFactoryTestEventHandler(void *arg);
......@@ -26,6 +28,8 @@ typedef struct{
uint32_t u32FirstBtnLongPressedCountDown;
}FactoryTestControllerSt;
typedef enum{FT_SINGLE_BOARD_TEST=0x01, FT_FULL_DEVICE_TEST=0x02, FT_NORMAL_DONE=0x04, FT_FORCE_EXIT=0x08}FT_STATUS;
FactoryTestControllerSt g_stFactoryTestControllerList[AGING_EXIT_MAX_BTN_NUM] \
= {{BTN_UNKNOW_ID, 0, 0, 0, EBA_IDLE, EBA_IDLE, 0, 0}, {BTN_UNKNOW_ID, 0, 0, 0, EBA_IDLE, EBA_IDLE, 0, 0}};
......@@ -56,12 +60,97 @@ FactoryTestStatusEnum kGetFactoryTestStatus(void)
return g_eFactoryTestStatus;
}
void kSetAgingMaxTime(uint16_t value)
{
nv_sts_t st = NV_SUCC;
uint16_t temp;
st = nv_flashReadNew(1, NV_MODULE_APP, NV_AGING_TEST_TIME, sizeof(uint16_t), (u8*)&temp);
if(st == NV_SUCC){
if(temp != value)
{
st = nv_flashWriteNew(1, NV_MODULE_APP, NV_AGING_TEST_TIME, sizeof(uint16_t), (u8*)&value);
iKonkeAfSelfPrint("kSetAgingTestTime:st = %d,data = %d\r\n",st,NV_AGING_TEST_TIME);
}
}else if(st == NV_ITEM_NOT_FOUND){
st = nv_flashWriteNew(1, NV_MODULE_APP, NV_AGING_TEST_TIME, sizeof(uint16_t), (u8*)&value);
}
}
uint32_t kGetAgingMaxTime(void)
{
nv_sts_t st = NV_SUCC;
uint32_t maxTime;
uint16_t value = 0;
st = nv_flashReadNew(1, NV_MODULE_APP, NV_AGING_TEST_TIME, sizeof(value), (u8*)&value);
iKonkeAfSelfPrint("kGetAgingTestTime:st = %d,value = %d\r\n",st,value);
if(st != NV_SUCC){
maxTime = FACTORY_TEST_4HOU_MS;
}
else if ((value == 0) || (value == 0xffff)) {
maxTime = FACTORY_TEST_4HOU_MS;
} else {
maxTime = value * 60 * 1000;
}
return maxTime;
}
uint8_t kGetFactoryTestValueStatus(void)
{
uint8_t status = 0;
#if Z30_DEVICE_SINGLE_BOARD_ENABLE
if (kGetSingleBoardValue() == FORCE_FACTORY_TEST_VALUE) {
status = status | FT_FORCE_EXIT;
}else if (kGetSingleBoardValue() != SINGLE_BOARD_TEST_DONE_VALUE) {
status = status | FT_SINGLE_BOARD_TEST;
}
#endif
#if Z30_DEVICE_FULL_DEVICE_ENBALE
if (kGetFullDeviceValue() == FORCE_FACTORY_TEST_VALUE) {
status = status | FT_FORCE_EXIT;
}else if (kGetFullDeviceValue() != FULL_DEVICE_TEST_DONE_VALUE){
status = status | FT_FULL_DEVICE_TEST;
}else if(kGetSingleBoardValue() == SINGLE_BOARD_TEST_DONE_VALUE){
status = status | FT_NORMAL_DONE;
}
#endif
return status;
}
nv_sts_t General_Set_Factory_Test(nv_item_t items,uint8_t value)
{
nv_sts_t st = NV_SUCC;
uint8_t temp;
st = nv_flashReadNew(1, NV_MODULE_APP, items, sizeof(uint8_t), (u8*)&temp);
if(st == NV_SUCC){
if(temp != value)
{
st = nv_flashWriteNew(1, NV_MODULE_APP, items, sizeof(uint8_t), (u8*)&value);
iKonkeAfSelfPrint("kSetSingleBoardValue:st = %d,data = %d\r\n",st,value);
}
}else if(st == NV_ITEM_NOT_FOUND){
st = nv_flashWriteNew(1, NV_MODULE_APP, items, sizeof(uint8_t), (u8*)&value);
}
return st;
}
uint8_t General_Get_Factory_Test(nv_item_t items,uint8_t default_value)
{
nv_sts_t st = NV_SUCC;
uint8_t temp;
st = nv_flashReadNew(1, NV_MODULE_APP, items, sizeof(temp), (u8*)&temp);
iKonkeAfSelfPrint("kGetSingleBoardValue:st = %d,data = %d\r\n",st,temp);
if(st != NV_SUCC){
temp = default_value;
}
return temp;
}
void kFactoryTestBtnActionCallback(unsigned char button_id, BtnActionEnum action)
{
if (kGetFactoryTestStatus() != FTS_NORMAL)
{
uint8_t u8FactoryTestIndex = kGetFactoryTestIndexByID(button_id);
iKonkeAfSelfPrint("######kFactoryTestBtnActionCallback,index(%d) id (%d)action(%d)\r\n",u8FactoryTestIndex,button_id, action);
if (u8FactoryTestIndex != 0xFF){
//add bby maozj 20200828
if(action == EBA_LONGPRESS)
g_stFactoryTestControllerList[u8FactoryTestIndex].eCurrentBtnAction = EBA_PRESSED;
else
......@@ -74,9 +163,224 @@ void kFactoryTestBtnActionCallback(unsigned char button_id, BtnActionEnum actio
iKonkeAfSelfPrint("######33333333333333333 FactoryTest Released\r\n");
}
}
}
}
kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st *pDataOut)
{
//UMsgNodeSt uMsgNode = {0};
uint16_t length = 0;
uint8_t control_field = 0;
DataField_st data;
DataField_st send_buf;
uint8_t reply_control_field = 0;
if( NULL == pMsgNode ) {
return KET_ERR_INVALID_PARAM;
}
#if 0 // Just for debug
iKonkeAfSelfPrint("\r\n-- MSG INCOMING[%d]:\r\n", pMsgNode->length);
iKonkeAfSelfPrintBuffer(pMsgNode->buffer, pMsgNode->length, true);
iKonkeAfSelfPrint("\r\n--------------------\r\n");
#endif
// check for parsable packets
if( pMsgNode->length < 5 /* Minimum Packet Length */ ) {
iKonkeAfSelfPrint("Err: Unparsable Packets!!\r\n");
return KET_ERR_INVALID_PARAM;
}
//length(1) pid(4) ch(1) opcode(1) arg
if (port == ECOM_PORT_FCC0) {
length = pMsgNode->length;
//control_field = pMsgNode->buffer[4];
data.seq = 0x00;
data.u8Datalen = pMsgNode->buffer[0];
data.u8ArgLen = data.u8Datalen - 6; // fcc0 - id (4) - ch(1) - opcode(1)
data.u8ChannelID = pMsgNode->buffer[5];
data.u16Opcode = kCmdOpcodeRemap((uint16_t)(pMsgNode->buffer[6]), 0);
if(data.u16Opcode == 0xFFFF) {
return KET_ERR_INVALID_PARAM;
}
memcpy(data.u8ARG,&pMsgNode->buffer[7], data.u8ArgLen); //6 = pid(4) + ch(1) + opcode(1)
send_buf.seq = data.seq;
send_buf.u8ChannelID = data.u8ChannelID;
send_buf.u16Opcode = data.u16Opcode;
} else {
length = ((uint16_t)pMsgNode->buffer[2] << 8) | (uint16_t)(pMsgNode->buffer[3]);
control_field = pMsgNode->buffer[4];
data.seq = ((uint16_t)pMsgNode->buffer[5] << 8) | (uint16_t)(pMsgNode->buffer[6]);
data.u8Datalen = pMsgNode->buffer[7];
data.u8ArgLen = data.u8Datalen - 3; // aa55 - ch(1) - opcode(2)
data.u8ChannelID = pMsgNode->buffer[8];
data.u16Opcode = ((uint16_t)pMsgNode->buffer[9] << 8) | (uint16_t)(pMsgNode->buffer[10]);
memcpy(data.u8ARG,&pMsgNode->buffer[11],data.u8Datalen - 3);
send_buf.seq = data.seq;
send_buf.u8ChannelID = data.u8ChannelID;
send_buf.u16Opcode = data.u16Opcode;
}
send_buf.u8Datalen = 0;
switch (data.u16Opcode) {
case (UART_MSG_QUERY_INFO_OPCODE):
{
send_buf.u8ARG[0] = ERR_OK;
send_buf.u8ArgLen = 1;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_QUERY_DEVICE_VERSION_OPCODE):
{
send_buf.u8ARG[0] = ERR_OK;
//wait to do
send_buf.u8ARG[1] = 0x20;
send_buf.u8ARG[2] = 0x20;
send_buf.u8ARG[3] = 0XFF;
send_buf.u8ARG[4] = 0XFF;
send_buf.u8ARG[0] = ERR_OK;;
send_buf.u8ArgLen = 5;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_QUERY_DEVICE_INFO_OPCODE):
{
addrExt_t addr;
flash_read(CFG_MAC_ADDRESS,8,(uint8_t*)addr);
send_buf.u8ARG[0] = ERR_OK;
SWAP_EUI64((uint8_t *)addr);
memcpy(&send_buf.u8ARG[1],addr,8);
send_buf.u8ArgLen = 9;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_CONFIG_DEVICE_SLEEP_OPCODE):
{
send_buf.u8ARG[0] = ERR_OK;
send_buf.u8ArgLen = 1;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_EXIT_FACTORY_TEST_OPCODE):
{
uint8_t token_data = 0;
if(data.u8ARG[0]&0x01)
{
kSetSingleBoardValue(SINGLE_BOARD_TEST_DONE_VALUE);
iKonkeAfSelfPrint("######kGetSingleBoardValue(%x)\r\n", token_data);
send_buf.u8ARG[0] = ERR_OK;
}
if(data.u8ARG[0]&0x02)
{
kSetFullDeviceValue(FULL_DEVICE_TEST_DONE_VALUE);
iKonkeAfSelfPrint("######kGetFullBoardValue(%02x)\r\n", token_data);
send_buf.u8ARG[0] = ERR_OK;
}
if( (data.u8ARG[0]&0x03 == 0x03)||(data.u8ARG[0]&0x04 == 0x04) )
{
kSetAgingTestValue(AGINE_TEST_DONE_VALUE);
iKonkeAfSelfPrint("######kGetAgingTestValue(%02x)\r\n", token_data);
send_buf.u8ARG[0] = ERR_OK;
g_eFactoryTestStatus = FTS_AGING_DONE;
}
send_buf.u8ARG[1] = data.u8ARG[0];
send_buf.u8ArgLen = 2;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
case (UART_MSG_QUERY_FACTORY_INFO_OPCODE):
{
send_buf.u8ARG[0] = ERR_OK;
send_buf.u8ARG[1] = kGetFactoryTestValueStatus();
send_buf.u8ArgLen = 2;
reply_control_field = Z_TO_H_NO_ACK;
iKonkeAfSelfPrint("######UART_MSG_QUERY_FACTORY_INFO_OPCODE(%d)\r\n", send_buf.u8ArgLen);
break;
}
case UART_MSG_QUERY_SWITCH_ONOFF_OPCODE:
{
extern uint8_t Key_Press_Test_Flag[5];
for (uint8_t i = 0; i < 6; i++){
if(i < 5){
send_buf.u8ARG[i+1] = Key_Press_Test_Flag[i];
}
else{
send_buf.u8ARG[i+1] = 0xff;
}
}
send_buf.u8ARG[0] = ERR_OK;
send_buf.u8ArgLen = 7;
break;
}
case (UART_MSG_ENTER_FACTORY_TEST_OPCODE):
{
uint8_t tmp_value = data.u8ARG[0];
reply_control_field = Z_TO_H_NO_ACK;
if ((tmp_value & 0x01) == 0x01) {
kSetSingleBoardValue(0x00);
}
if ((tmp_value & 0x02) == 0x02) {
kSetFullDeviceValue(0x00);
}
if ((tmp_value & 0x04) == 0x04) {
kSetAgingTestValue(0x00);
}
send_buf.u8ArgLen = 2;
send_buf.u8ARG[0] = ERR_OK;
send_buf.u8ARG[1] = kGetFactoryTestValueStatus();
break;
}
case UART_MSG_ONOFF_SWITCH_OPCODE:
{
uint8_t command = data.u8ARG[0];
if(command == 1){ //控制命令
for (uint8_t i = 0; i < 9; i++){
if(i < 4){
if(data.u8ARG[i+1] == 1)
kZclOnOffClusterServerOnOffControl(i+1, 1);
else if(data.u8ARG[i+1] == 0)
kZclOnOffClusterServerOnOffControl(i+1, 0);
}
else{
data.u8ARG[i+1] = 0xff;
}
}
}
send_buf.u8ARG[0] = ERR_OK;
memcpy(&send_buf.u8ARG[1], &data.u8ARG[1], 8);
send_buf.u8ArgLen = 10;
break;
}
default:
break;
}
memcpy(pDataOut, (uint8_t *)&send_buf, sizeof(DataField_st));
if (send_buf.u8ArgLen == 0) { //if cmd exist, lengtg must > 0
return KET_ERR_CMD_INVALID;
} else {
if (port == ECOM_PORT_FCC0) {
pDataOut->u8Datalen = pDataOut->u8ArgLen;
} else {
pDataOut->u8Datalen = pDataOut->u8ArgLen + 3; //AA 55 (opcode(2), ch(1))
}
return KET_OK;
}
}
void kFactoryTestInit(pFactoryTestPollCallback callback, FactoryTestConfSt conf_list[], uint8_t btn_num)
{
#if FACTORY_TEST_ENABLE
......@@ -119,7 +423,7 @@ void kFactoryTestInit(pFactoryTestPollCallback callback, FactoryTestConfSt conf_
s32 kFactoryTestEventHandler(void *arg)
{
iKonkeAfSelfPrint("######kFactoryTestEventHandler status(%d)\r\n", g_eFactoryTestStatus);
// iKonkeAfSelfPrint("######kFactoryTestEventHandler status(%d)\r\n", g_eFactoryTestStatus);
g_u32AgingTotalTimeMS += FACTORY_TEST_POLL_TTME_1S;
......@@ -133,20 +437,20 @@ s32 kFactoryTestEventHandler(void *arg)
case (FTS_AGING_15MIN):
//上电后15分钟时间到,15分钟内可以短按按键和长按,但不能组网
if (g_u32AgingTotalTimeMS >= FACTORY_TEST_15MIN_MS){
kSetAgingTestValue(AGING_TEST_8HOU_VALUE);
g_eFactoryTestStatus = FTS_AGING_8HOU_START;
kSetAgingTestValue(AGING_TEST_4HOU_VALUE);
g_eFactoryTestStatus = FTS_AGING_4HOU_START;
//15分钟后重新开始计时
g_u32AgingTotalTimeMS = 0;
g_u32Count = FACTORY_TEST_POLL_TIMES;//快点处理自定义函数
}
break;
case (FTS_AGING_8HOU_START):
case (FTS_AGING_4HOU_START):
//可以设置所有的LED状态一致,在回调函数实现
g_eFactoryTestStatus = FTS_AGING_8HOU;
g_eFactoryTestStatus = FTS_AGING_4HOU;
break;
case (FTS_AGING_8HOU):
case (FTS_AGING_4HOU):
//上电后12小时老化时间到,12小时内不可以短按按键和长按,不能组网
if (g_u32AgingTotalTimeMS >= FACTORY_TEST_8HOU_MS){
if (g_u32AgingTotalTimeMS >= FACTORY_TEST_4HOU_MS){
kSetAgingTestValue(AGINE_TEST_DONE_VALUE);
g_eFactoryTestStatus = FTS_AGING_DONE;
}
......@@ -206,6 +510,14 @@ s32 kFactoryTestEventHandler(void *arg)
//successfully exit aging test
g_eFactoryTestStatus = FTS_AGING_FORCE_EXIT;
kSetAgingTestValue(AGINE_TEST_DONE_VALUE);
#if Z30_DEVICE_SINGLE_BOARD_ENABLE
if(kGetSingleBoardValue() != SINGLE_BOARD_TEST_DONE_VALUE)
kSetSingleBoardValue(FORCE_FACTORY_TEST_VALUE);
#endif
#if Z30_DEVICE_FULL_DEVICE_ENBALE
if(kGetFullDeviceValue() != FULL_DEVICE_TEST_DONE_VALUE)
kSetFullDeviceValue(FORCE_FACTORY_TEST_VALUE);
#endif
g_u32Count = FACTORY_TEST_POLL_TIMES; //快点执行自定义函数
//防止老化状态被重置
g_stFactoryTestControllerList[index].u32FirstBtnLongPressedCountDown = 0;
......
#ifndef __IKONKE_MODULE_FACTORY_TEST_H_______________________
#define __IKONKE_MODULE_FACTORY_TEST_H_______________________
#include "ikk-module-def.h"
#include "ikk-debug.h"
#include "../driver/ikk-uart.h"
#include "ikk-command.h"
// 定义是否需要产测
#define FACTORY_TEST_ENABLE true
//使能debug快速测试老化
......@@ -26,19 +26,21 @@
#define FACTORY_TEST_POLL_TIMES (FACTORY_TEST_POLL_TTME_10S / FACTORY_TEST_POLL_TTME_1S)
#if AGING_DEBUG
#define FACTORY_TEST_15MIN_MS (2 * 60 * 1000)
#define FACTORY_TEST_8HOU_MS (5 * 1 * 60 * 1000)
#define FACTORY_TEST_4HOU_MS (5 * 1 * 60 * 1000)
#else
#define FACTORY_TEST_15MIN_MS (15 * 60 * 1000)
#define FACTORY_TEST_8HOU_MS (8 * 60 * 60 * 1000)
#define FACTORY_TEST_4HOU_MS (4 * 60 * 60 * 1000)
#endif
#define FACTORY_TEST_1S (1000)
//初始值
#define TEST_INIT_VALUE 0xFF
typedef enum{
FTS_NORMAL=0,
FTS_START,
FTS_AGING_15MIN,
FTS_AGING_8HOU_START,
FTS_AGING_8HOU,
FTS_AGING_4HOU_START,
FTS_AGING_4HOU,
FTS_AGING_DONE,
FTS_AGING_FORCE_EXIT,
FTS_AGING_WAITING,
......@@ -55,11 +57,25 @@ typedef struct{
//10S轮询操作函数,可根据不同长供电产品自定义实现
typedef void (*pFactoryTestPollCallback)(FactoryTestStatusEnum status);
nv_sts_t General_Set_Factory_Test(nv_item_t items,uint8_t value);
uint8_t General_Get_Factory_Test(nv_item_t items,uint8_t default_value);
#define kSetSingleBoardValue(value) General_Set_Factory_Test(NV_SINGLE_BOARD_TEST_FLG,value)
#define kSetFullDeviceValue(value) General_Set_Factory_Test(NV_FULL_DEVICE_TEST_FLG,value)
#define kSetAgingTestValue(value) General_Set_Factory_Test(NV_AGE_TEST_STEP,value)
#define kGetSingleBoardValue() General_Get_Factory_Test(NV_SINGLE_BOARD_TEST_FLG,TEST_INIT_VALUE)
#define kGetFullDeviceValue() General_Get_Factory_Test(NV_FULL_DEVICE_TEST_FLG,TEST_INIT_VALUE)
#define kGetAgingTestValue() General_Get_Factory_Test(NV_AGE_TEST_STEP,0)
uint8_t kGetFactoryTestValueStatus(void);
uint32_t kGetAgingMaxTime(void);
void kSetAgingMaxTime(uint16_t value);
//获取当前产测状态
FactoryTestStatusEnum kGetFactoryTestStatus(void);
//void kGetFactoryTestBtnAction(uint8_t btn_id, BtnActionEnum action);
void kFactoryTestInit(pFactoryTestPollCallback callback, FactoryTestConfSt conf_list[], uint8_t btn_num);
kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st *pDataOut);
#endif
......@@ -11,7 +11,12 @@
#define Z30_DEVICE_DTYPE (Z30_DEVICE_ZR)
#define Z30_DEVICE_OTA_ENABLE false
// 定义是否需要老化,目前一般路由设备需要
#define Z30_DEVICE_AGING_ENABLE true
//单板测试,目前一般是休眠设备需要
#define Z30_DEVICE_SINGLE_BOARD_ENABLE true
//整机测试, 目前一般是休眠设备需要
#define Z30_DEVICE_FULL_DEVICE_ENBALE true
// Real time IO operation, no optimization!!!
#define _IO volatile
......@@ -39,6 +44,92 @@
#define PORT_UNKNOW 0xFF
#define PIN_UNKNOW (uint32_t)0XFF
//串口通信协议OPCODE
#define UART_MSG_QUERY_INFO_OPCODE 0x0000
#define UART_MSG_WRITE_INSTALL_CODE_OPCODE 0x0001
#define UART_MSG_READ_INSTALL_CODE_OPCODE 0x0002
#define UART_MSG_WRITE_CMEI_CODE_OPCODE 0x0003
#define UART_MSG_READ_CMEI_CODE_OPCODE 0x0004
#define UART_MSG_WRITE_ISN_CODE_OPCODE 0x0005
#define UART_MSG_READ_ISN_CODE_OPCODE 0x0006
#define UART_MSG_WRITE_MAC_CODE_OPCODE 0x0007
#define UART_MSG_READ_MAC_CODE_OPCODE 0x0008
#define UART_MSG_WRITE_MOUDLE_ID_OPCODE 0x0009
#define UART_MSG_READ_MOUDLE_ID_OPCODE 0x000A
#define UART_MSG_READ_DEV_RSSI_OPCODE 0x000B
#define UART_MSG_WRITE_AGING_TIME_OPCODE 0x000C
#define UART_MSG_READ_AGING_TIME_OPCODE 0x000D
#define UART_MSG_WRITE_INTERPAN_PARA_OPCODE 0x000E
#define UART_MSG_READ_INTERPAN_PARA_OPCODE 0x000F
#define UART_MSG_READ_DEVICE_SNAP_OPCODE 0x0010
#define UART_MSG_JOIN_NWK_REQUEST_OPCODE 0x0100
#define UART_MSG_LEAVE_NWK_REQUEST_OPCODE 0x0101
#define UART_MSG_QUERY_NWK_STATUS_REQUEST_OPCODE 0x0102
#define UART_MSG_NWK_STATUS_NOTIFY_OPCODE 0x0103
#define UART_MSG_READ_ATTRIBUTE_REQUEST_OPCODE 0x0104
#define UART_MSG_WRITE_ATTRIBUTE_REQUEST_OPCODE 0x0105
#define UART_MSG_ZCL_COMMAND_REQUEST_OPCODE 0x0106
#define UART_MSG_BIND_REQUEST_OPCODE 0x0110
#define UART_MSG_GATEWAY_NWK_CHANNEL_ONOFF_OPCODE 0x00FC
#define UART_MSG_PRIVATE_PROTOCOL_CONTROL_CHILD_DEVICE_START_OPCODE 0xF000
#define UART_MSG_PRIVATE_PROTOCOL_CONTROL_CHILD_DEVICE_END_OPCODE 0xF0FF
#define UART_MSG_TTS_OPCODE 0xF100
//factory test message opcode
#define UART_MSG_QUERY_DEVICE_VERSION_OPCODE 0xED00
#define UART_MSG_QUERY_DEVICE_INFO_OPCODE 0xED01
#define UART_MSG_CONFIG_DEVICE_SLEEP_OPCODE 0xED02
#define UART_MSG_EXIT_FACTORY_TEST_OPCODE 0xED04
#define UART_MSG_QUERY_FACTORY_INFO_OPCODE 0xED05
#define UART_MSG_QUERY_SWITCH_ONOFF_OPCODE 0xED06
#define UART_MSG_ENTER_FACTORY_TEST_OPCODE 0xED14
#define UART_MSG_ONOFF_SWITCH_OPCODE 0xED15
#define UART_MSG_GPIO_TEST_OPCODE 0xED10
#define UART_MSG_READ_RSSI_REQUEST_OPCODE 0xED12
//offline voice panel
#define UART_MSG_HOST_SNAP_REQUEST_OPCODE 0x1000
#define UART_MSG_CTRL_HOST_ONOFF_OPCODE 0x1001 //zigbee module control panel
#define UART_MSG_HOST_ONOFF_NOTIFY_OPCODE 0x1002 //panel onoff status changed notify zigbee
#define UART_MSG_HOST_TRIGGER_SCENE_NOTIFY_OPCODE 0x1003 //pannel recall scene notify zigbees
#define UART_MSG_KEY_LIGHT_SCENE_TRANSFORM_OPCODE 0x1004
#define UART_MSG_TIME_SET_OPCODE 0x1005
#define UART_MSG_TIME_GET_OPCODE 0x1006
#define UART_MSG_DEVICE_OPERATOR_OPCODE 0x1007
#define UART_MSG_FILE_UPDATE_NOTIFY_OPCODE 0x1008
#define UART_MSG_FILE_DATA_REQUEST_OPCODE 0x1009
#define UART_MSG_FILE_UPDATE_STATUS_NOTIFY 0x100A
//bangde human body sensor
#define UART_MSG_BODY_TRIGGER_START_REPORT_OPCODE 0xED03
//bangde sos button
#define UART_MSG_SOS_REPORT_OPCODE 0xED03
//bangde scene button
#define UART_MSG_BUTTON_SCENE_REPORT_OPCODE 0xED03
//bangde environment sensor
#define UART_MSG_QUERY_TEMP_HUMI_INFO_OPCODE 0xED03
//bangde door sensor
#define UART_MSG_BUTTON_ONOFF_REPORT_OPCODE 0xED03
//offline voice panel
//define opcode for private cluster
#define NWK_CHANNEL_ONOFF (uint8_t)(UART_MSG_GATEWAY_NWK_CHANNEL_ONOFF_OPCODE)
#define SNAP_INFO (uint8_t)(UART_MSG_HOST_SNAP_REQUEST_OPCODE)
//#define ONOFF_CONTROL (uint8_t)(UART_MSG_CTRL_HOST_ONOFF_OPCODE)
#define SCENE_TRGGER (uint8_t)(UART_MSG_HOST_TRIGGER_SCENE_NOTIFY_OPCODE)
#define KEY_FUNCTION (uint8_t)(UART_MSG_KEY_LIGHT_SCENE_TRANSFORM_OPCODE)
#define TIME_SET (uint8_t)(UART_MSG_TIME_SET_OPCODE)
#define TIME_GET (uint8_t)(UART_MSG_TIME_GET_OPCODE)
#define DEVICE_OPT (uint8_t)(UART_MSG_DEVICE_OPERATOR_OPCODE)
#define FILE_UPDATE_NOTIFY (uint8_t)(UART_MSG_FILE_UPDATE_NOTIFY_OPCODE)
#define FILE_DATA_REQUEST (uint8_t)(UART_MSG_FILE_DATA_REQUEST_OPCODE )
#define FILE_STATUS_STATUS (uint8_t)(UART_MSG_FILE_UPDATE_STATUS_NOTIFY)
typedef enum kk_error_type {
KET_OK = 0, // 正常(成功)
......@@ -73,11 +164,23 @@ typedef enum kk_error_type {
KET_ERR_OPRATE_IN_PROGRESS = -908, // 操作进行中
KET_ERR_UNKNOW = -999, // 位置错误
}kk_err_t;
typedef enum {
ERR_OK=0x00,
ERR_EXIST=0x01,
ERR_FORMAT=0x02,
ERR_NOT_EXPECTED=0x03,
ERR_WRITE_FAILED=0x04,
ERR_READ_WRITE_TIMEOUT=0x05,
ERR_NOT_EXIST=0x06,
ERR_UNKNOW=0xFF,
}ERR_RET_E;
typedef enum { Z3D_COORDINATOR = 0, Z3D_ROUTER, Z3D_ENDDEVICE }Z3DevTypeEm;
typedef void (*pFUNC_VOID)(void *);
// 操作
typedef enum { ECOM_PORT_UART = 0, ECOM_PORT_RTT, ECOM_PORT_ZIGBEE, ECOM_PORT_INTERPAN, ECOM_PORT_FCC0}ComPortEm;
typedef struct tag_common_opt_callback_st {
pFUNC_VOID pfunc;
void *param;
......
......@@ -5,15 +5,19 @@
#include "ikk-token.h"
#include "tl_common.h"
#include "ikk-cluster.h"
#include "ikk-interpan.h"
#include "ikk-factory-test.h"
#include "../../../../zigbee/aps/aps_api.h"
#include "../../../../zigbee/common/includes/zb_common.h"
/**********************************************************************
* INCLUDES
*/
#define DELAY_RESTORE_NWK_STEERING_TIME_MS (10 * 1000)
#define DELAY_RESTORE_NWK_STEERING_TIME_MS (6 * 1000)
#define DELAY_NWK_DETECT_POWER_ON_TIME_MS (3 * 1000)
#define LED_SLOW_BLINK_CONTINUE_TIME_MS (60 * 1000)
#define LED_FAST_BLINK_CONTINUE_TIME_MS (5 * 1000)
//global value
addrExt_t g_Eui64GatewayAddr = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
......@@ -30,6 +34,8 @@ static uint32_t g_u32NwkDetectCountDownCounter = 0;
static uint32_t g_u32NwkJoiningCountdownCounter = 0;
static bool g_KeyPressCauasLeave = false;
// copy current network status.
static NwkStatusEnum g_eCurrentNetworkStatus = ENS_UNKNOW;
//add by maozj 20200225
......@@ -378,7 +384,7 @@ void kNwkFactoryReset(bool is_nwk_indicator)
memset(g_Eui64GatewayAddr, 0xFF, sizeof(g_Eui64GatewayAddr));
Gateway_IEEE_Addr_Save(g_Eui64GatewayAddr);
Update_Local_Attribute_Info();
// //add by maozj 20200320
//#if Z30_DEVICE_OTA_ENABLE
// kSetOTAStatus(OTA_NORMAL);
......@@ -395,23 +401,24 @@ void kNwkFactoryReset(bool is_nwk_indicator)
//led can blink when network leaved
if (is_nwk_indicator == true){
zb_factoryReset();
kNwkNetworkStatusNotifyCall(ENS_LEAVED);
g_KeyPressCauasLeave = true;
//add by maozj 20200407 for reset count down after network leaved
g_u32NwkExitCountDownCounter = MS2COUNT(5*1000);
g_u32NwkExitCountDownCounter = MS2COUNT(LED_FAST_BLINK_CONTINUE_TIME_MS);
kNwkNetworkStatusNotifyCall(ENS_LEAVED);
Update_Local_Attribute_Info();
}
Set_Nwk_Steering_Status(NWK_STEERING_STATUS_FAILED);
// kNwkScheduleTaskStop(SCHEDULE_ALLOPT_ID);
//
// //add by maozj 20191213 need identify whether gateway is made by konke
// uint8_t isKonkeGateway = 0;
// halCommonSetToken(TOKEN_IS_KONKE_GATEWAY, &isKonkeGateway);
iKonkeAfSelfPrint("kNwkFactoryReset\r\n");
}
void NetworkLeaveHandler(nlme_leave_cnf_t *pLeaveCnf)
{
if(g_KeyPressCauasLeave)
{
g_KeyPressCauasLeave = false;
return;
}
iKonkeAfSelfPrint("Leave Handler,Nwk State = %d\r\n",kNwkGetCurrentStatus());
if((pLeaveCnf->status == 0)&&(kNwkGetCurrentStatus() != ENS_JOINING))
{
//如果正处于离网中状态,则不执行以下函数
......@@ -424,8 +431,8 @@ void NetworkLeaveHandler(nlme_leave_cnf_t *pLeaveCnf)
Gateway_IEEE_Addr_Save(g_Eui64GatewayAddr);
kNwkNetworkStatusNotifyCall(ENS_LEAVED);
//add by maozj 20200407 for reset count down after network leaved
g_u32NwkExitCountDownCounter = MS2COUNT(5*1000);
// //add by maozj 20200407 for reset count down after network leaved
//g_u32NwkExitCountDownCounter = MS2COUNT(5*1000);
}
}
}
......@@ -466,12 +473,11 @@ static ev_timer_event_t *kUserScheduleTaskEvt = NULL;
extern s32 kUserScheduleTaskHandler(void *arg);
kk_err_t kNwkScheduleTaskRegister(uint32_t TimeOut)
{
kk_err_t err = KET_FAILED;
if(!ev_timer_exist(kUserScheduleTaskEvt)) {
kUserScheduleTaskEvt = TL_ZB_TIMER_SCHEDULE(kUserScheduleTaskHandler, NULL, TimeOut);
err = KET_OK;
if(kUserScheduleTaskEvt){
TL_ZB_TIMER_CANCEL(&kUserScheduleTaskEvt);
}
return err;
kUserScheduleTaskEvt = TL_ZB_TIMER_SCHEDULE(kUserScheduleTaskHandler, NULL, TimeOut);
return KET_OK;
}
......@@ -479,8 +485,16 @@ void kNwkJoiningStart(uint32_t u32JoiningDuration, pJoinCompleteCallback callbac
{
if( u32JoiningDuration > 0 )
{
#if Z30_DEVICE_AGING_ENABLE
if (kGetFactoryTestStatus() != FTS_NORMAL /*&& kGetFactoryTestStatus() != FTS_AGING_15MIN*/){
return;
}
#endif
if(!zb_isDeviceJoinedNwk())
{
//disable interpan
kInterpanDisable();
iKonkeAfSelfPrint("#####Set Steering Counter\r\n");
g_u32NwkJoiningCountdownCounter= MS2COUNT(u32JoiningDuration);
g_pJoinCompleteCallback = callback;
......
......@@ -4,8 +4,8 @@
#include "ikk-opt-tunnel.h"
#include "ikk-debug.h"
#include "ikk-config.h"
#include "ikk-token.h"
#include "../../../../zigbee/zcl/zcl_include.h"
// FCC0-0000
#pragma pack(1)
typedef struct tag_private_clsFCC0_attr0000_frame_st {
......@@ -24,7 +24,7 @@ uint8_t g_tmp_buffer[OPTTUNNEL_CHUNK_MAXLEN+1] = { 0 }, g_tmp_length = 0;
// private protocol optdata message incoming process callback
pFUNC_OPTDATA_MESSAGE_CALLBACK g_pOptDataIncomingMessageCallback = NULL;
extern bool Get_Model_ID(uint8_t *ModeID);
extern _CODE_ZCL_ zclReadCmd_t *zcl_parseInReadCmd(zclIncoming_t *pCmd);
extern _CODE_ZCL_ status_t zcl_readRsp(u8 srcEp, epInfo_t *pDstEpInfo, u16 clusterId, u16 manuCode, u8 disableDefaultRsp, u8 direction, u8 seqNo, zclReadRspCmd_t *readRspCmd);
//_CODE_ZCL_ static status_t zcl_Private_cmdHandler(zclIncoming_t *pInMsg);
......@@ -76,36 +76,77 @@ extern _CODE_ZCL_ status_t zcl_readRsp(u8 srcEp, epInfo_t *pDstEpInfo, u16 clust
// }
//}
//
///*********************************************************************
// * @fn private_fcc0Cb
// *
// * @brief Handler for ZCL FCC0 command. This function will set attribute first.
// *
// * @param pAddrInfo
// * @param cmdId - onoff cluster command id
// * @param cmdPayload
// *
// * @return status_t
// */
//status_t private_fcc0Cb(zclIncomingAddrInfo_t *pAddrInfo, u8 cmdId, void *cmdPayload)
//{
// zcl_privateAttr_t *pFcc0_data = zcl_privateAttrGet();
// iKonkeAfSelfPrint("#############private_fcc0Cb ,command id =%x!!!!!!!\r\n",cmdId);
// if(pAddrInfo->dstEp == SAMPLE_LIGHT_ENDPOINT){
// switch(cmdId){
// case ZCL_CMD_ONOFF_ON:
// case ZCL_CMD_ONOFF_OFF:
// case ZCL_CMD_ONOFF_TOGGLE:
// //sampleLight_onoff(cmdId);
// break;
// default:
// break;
// }
// }
//
// return ZCL_STA_SUCCESS;
//}
uint8_t kOptTunnelChunkRead(uint8_t endpoint,
uint16_t clusterId,
uint16_t attributeId,
uint16_t manufacturerCode,
uint8_t *buffer,
uint8_t *length_out)
{
iKonkeAfSelfPrint("&&&&&&&&&&&&&Token Read cluster(%2X), attr(%2X)\r\n", clusterId, attributeId);
uint8_t length = 0;
if (buffer == NULL){
iKonkeAfSelfPrint("Err: Buffer is null(%d)!!\r\n");
return 0xff;
}
if( clusterId == PRIV_CLUSTER_FCC0 ) {
switch(attributeId) {
case (ZCL_CMEI_ATTRIBUTE_ID):
{
uint8_t *data = CMEI_TOKEN_GET();
length = data[0];
memcpy(buffer, data, length+1);
break;
}
case (ZCL_ISN_ATTRIBUTE_ID):
{
uint8_t *data = ISN_TOKEN_GET();
length = data[0];
memcpy(buffer, data, length+1);
break;
}
case (ZCL_InstallCode_ATTRIBUTE_ID):
{
length = 16;
buffer[0] = length;
memcpy(&buffer[1], INSTALL_CODE_TOKEN_GET(), length);
break;
}
default:
return 0xfe;
}
}
if (buffer[0] <= OPTTUNNEL_CHUNK_MAXLEN){
*length_out = buffer[0];
}else {
*length_out = 0;
}
return 0;
}
/* DESP: Private clsuter attribute read interface, for chunk data.
* Auth: dingmz_frc.20190703.
* */
kk_err_t kOptTunnelAttrChunkLocalRead(uint16_t attribute_id, unsigned char *chunk_buffer, unsigned char *length_in_out )
{
if( NULL == chunk_buffer || NULL == length_in_out ) {
return KET_ERR_INVALID_POINTER;
}
uint8_t status = 0;
kk_err_t err = KET_OK;
status = kOptTunnelChunkRead(1, PRIV_CLUSTER_FCC0, attribute_id, 0x1268, chunk_buffer, length_in_out);
if( status == 0 ) {
*length_in_out = chunk_buffer[0] + 1;
}else {
iKonkeAfSelfPrint("Err: Chunk read err(%d)!!\r\n", status);
*length_in_out = 0;
err = KET_ERR_UNKNOW;
}
return err;
}
status_t kOptTunnelMessageReadResponse(zclIncoming_t *pInHdlrMsg,uint8_t *pData)
{
u8 status = ZCL_STA_SUCCESS;
......@@ -285,15 +326,15 @@ kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd)
* Auth: dingmz_frc.20191113.
* */
extern status_t General_Report(uint8_t src_ep,uint8_t des_ep,uint16_t cluster,uint16_t Attribute,uint8_t Data_Type,uint8_t *value);
static status_t kOptTunnelOODReport(uint16_t attribute_id,uint8_t channel, uint8_t opcode, uint8_t *arg, uint8_t length )
static status_t kOptTunnelCommonReportSend(uint16_t attribute_id, uint8_t *arg, uint8_t length )
{
uint8_t temp_buffer[64] = {0};
if(length < 64)
if( arg && length > 0 )
memmove(temp_buffer+1, arg, length);
temp_buffer[0] = length;
memmove(g_tmp_buffer,temp_buffer,length+1);
return General_Report(channel,1,PRIV_CLUSTER_FCC0,attribute_id,ZCL_DATA_TYPE_CHAR_STR,g_tmp_buffer);
return General_Report(1,1,PRIV_CLUSTER_FCC0,attribute_id,ZCL_DATA_TYPE_CHAR_STR,g_tmp_buffer);
}
/* DESP: Private protocol common report interface.
* Auth: dingmz_frc.20191113.
......@@ -305,18 +346,22 @@ kk_err_t kOptTunnelCommonReport(uint16_t attribute_id )
}
kk_err_t err = KET_OK;
uint8_t bufCount = 0;
switch(attribute_id) {
case (ECA_OPTDATA):
{
uint32_t modeid = (uint32_t)MODEL_ID;
iKonkeAfSelfPrint("#######kOptTunnelCommonReport OPTDATA\r\n");
g_tmp_buffer[1] = modeid>>24;
g_tmp_buffer[2] = modeid>>16;
g_tmp_buffer[3] = modeid>>8;
g_tmp_buffer[4] = modeid;
uint8_t modeid[8] = {0};
if(Get_Model_ID(modeid))
{
g_tmp_buffer[bufCount++] = 0;
g_tmp_buffer[bufCount++] = modeid[4];
g_tmp_buffer[bufCount++] = modeid[5];
g_tmp_buffer[bufCount++] = modeid[6];
g_tmp_buffer[bufCount++] = modeid[7];
g_tmp_buffer[5] = 0x00;//channel
g_tmp_buffer[6] = 0x00;//opcode
}
if( g_pOptDataIncomingMessageCallback ) {
g_tmp_length = 0;
g_tmp_buffer[7] = 0x00;//add by maozj 20200511
......@@ -328,6 +373,34 @@ kk_err_t kOptTunnelCommonReport(uint16_t attribute_id )
}
break;
}
case (ECA_ASSOCIATED_AOUNCE):
{
addrExt_t u64LocalEui64 = { 0 };
uint16_t NodeID = zb_getLocalShortAddr();
uint16_t index;
tl_zbExtAddrByShortAddr(NodeID,u64LocalEui64,&index);
g_tmp_buffer[0] = (NodeID >> 8) & 0xff;
g_tmp_buffer[1] = (NodeID >> 0) & 0xff;
SWAP_EUI64(u64LocalEui64);
memcpy(g_tmp_buffer + 2, u64LocalEui64, 8);
g_tmp_length = 10;
break;
}
case (ECA_CMEI):
case (ECA_ISN ):
{
g_tmp_length = OPTTUNNEL_CHUNK_MAXLEN;
kOptTunnelAttrChunkLocalRead(attribute_id, g_tmp_buffer, &g_tmp_length);
iKonkeAfSelfPrint("####Report CHUNK Read length(0x%x) \r\n", g_tmp_length);
break;
}
case (ECA_INSTALL_CODE):
g_tmp_length = OPTTUNNEL_CHUNK_MAXLEN;
kOptTunnelAttrChunkLocalRead(ZCL_InstallCode_ATTRIBUTE_ID, g_tmp_buffer, &g_tmp_length);
break;
default:
{
err = KET_ERR_OPRATE_ILLEGAL;
......@@ -335,7 +408,7 @@ kk_err_t kOptTunnelCommonReport(uint16_t attribute_id )
}
}
if( err == KET_OK && g_tmp_length > 1) {
if(kOptTunnelOODReport(attribute_id,g_tmp_buffer[5],g_tmp_buffer[6],g_tmp_buffer,g_tmp_buffer[0]+1)== ZCL_STA_SUCCESS)
if(kOptTunnelCommonReportSend(attribute_id,g_tmp_buffer,g_tmp_buffer[0]+1)== ZCL_STA_SUCCESS)
err = KET_OK;
else
err = KET_FAILED;
......@@ -343,11 +416,38 @@ kk_err_t kOptTunnelCommonReport(uint16_t attribute_id )
return err;
}
/* DESP: Private protocol message(command) reporting interface
* Auth: dingmz_frc.20191113.
* */
kk_err_t kOptTunnelOODReport(uint8_t channel, uint8_t opcode, uint8_t *arg, uint8_t length )
{
uint8_t bufCount = 0;
uint8_t modeid[8] = {0};
if(Get_Model_ID(modeid))
{
g_tmp_buffer[bufCount++] = 0; // totle length
g_tmp_buffer[bufCount++] = modeid[4];
g_tmp_buffer[bufCount++] = modeid[5];
g_tmp_buffer[bufCount++] = modeid[6];
g_tmp_buffer[bufCount++] = modeid[7];
g_tmp_buffer[bufCount++] = channel;//channel
g_tmp_buffer[bufCount++] = opcode;//opcode
}
if( arg && length > 0 ) {
memcpy(g_tmp_buffer + bufCount, arg, length);
bufCount += length;
}
g_tmp_buffer[0] = bufCount - 1;
return kOptTunnelCommonReportSend(ECA_OPTDATA, g_tmp_buffer, bufCount);
}
kk_err_t kOptTunnelModuleInit(pFUNC_OPTDATA_MESSAGE_CALLBACK pOptdataIncomingCallback )
{
g_pOptDataIncomingMessageCallback = pOptdataIncomingCallback;
return KET_OK;
}
......@@ -10,6 +10,18 @@
#define PRIV_CLUSTER_FCC0 0XFCC0
// Server attributes
#define ZCL_OPT_DATA_ATTRIBUTE_ID 0x0000 // Ver.: always
#define ZCL_TTS_ATTRIBUTE_ID 0x0001 // Ver.: always
#define ZCL_MTO_RR_RspRandom_ATTRIBUTE_ID 0x0002 // Ver.: always
#define ZCL_AssociatedAnnounce_ATTRIBUTE_ID 0x0003 // Ver.: always
#define ZCL_CMEI_ATTRIBUTE_ID 0x0010 // Ver.: always
#define ZCL_ISN_ATTRIBUTE_ID 0x0011 // Ver.: always
#define ZCL_InstallCode_ATTRIBUTE_ID 0x0012 // Ver.: always
#define ZCL_CHUNK_N1_ATTRIBUTE_ID 0x0013 // Ver.: always
#define OPTTUNNEL_OPTDATA_ID 0x0000 // FCC0 Cluster Attribute 0x0000
#define OPTTUNNEL_OPTDATA_MAXLEN 128
......@@ -51,10 +63,6 @@ typedef kk_err_t (*pFUNC_OPTDATA_MESSAGE_CALLBACK)(uint8_t channel, uint8_t opco
void Set2NwkJoiningCountdownCounter(u32 time_ms);
/* DESP: Private protocol common report interface.
* Auth: mengmengli_frc.20210527.
* */
kk_err_t kOptTunnelCommonReport(uint16_t attribute_id );
/* DESP: private clsuter protocol module init interface.
......@@ -66,14 +74,7 @@ kk_err_t kOptTunnelModuleInit(pFUNC_OPTDATA_MESSAGE_CALLBACK pOptdataIncomingCal
kk_err_t kOptTunnelOODReport(uint8_t channel, uint8_t opcode, uint8_t *arg, uint8_t length );
......
#if (__PROJECT_TL_DIMMABLE_LIGHT__)
/**********************************************************************
* INCLUDES
*/
......@@ -17,8 +15,10 @@ extern void kBtnModuleActionDetectCallback(void );
extern void kLedModuleActionDetectCallback(void );
//extern bool kLedModuleActionIsGoing(void );
extern void kNwkModuleActionDetectCallback(void );
//attribute change check callback
extern void kRelayModuleActionDetectCallback(uint8_t poll_time);
//attribute change check callback
extern void AttributeValueCheckCallback(void);
static s32 kTickEventHandler(void *arg)
{
......@@ -26,6 +26,7 @@ static s32 kTickEventHandler(void *arg)
kBtnModuleActionDetectCallback();
kNwkModuleActionDetectCallback();
kRelayModuleActionDetectCallback(TICK_LOOP_NMS);
AttributeValueCheckCallback();
return 0;
}
......@@ -52,5 +53,5 @@ void kTickRunnningTrigger(void )
}
#endif /* __PROJECT_TL_DIMMABLE_LIGHT__ */
......@@ -15,5 +15,4 @@ void Tick_Time_Init(void);
* */
void kTickRunnningTrigger(void );
#endif
......@@ -2,13 +2,15 @@
* INCLUDES
*/
#include "ikk-token.h"
#include "../../../../zigbee/zcl/zcl_include.h"
#include "ikk-common-utils.h"
extern addrExt_t g_Eui64GatewayAddr;
uint8_t Flash_Buffer_Data[USER_SIZE];
OPTTUNEL_TOKEN_ST sOptunnel_Token = {{1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6},{16,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26},{16,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46},{16,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66}};
/*********************************************************************
* @fn Get Gateway Addr
*
......@@ -22,7 +24,7 @@ uint8_t* Gateway_IEEE_Addr_Get(void)
{
nv_sts_t st = NV_SUCC;
st = nv_flashReadNew(1, NV_MODULE_KEYPAIR, NV_GATEWAY_ADDR, sizeof(addrExt_t), (u8*)g_Eui64GatewayAddr);
st = nv_flashReadNew(1, NV_MODULE_APP, NV_GATEWAY_ADDR, sizeof(addrExt_t), (u8*)g_Eui64GatewayAddr);
iKonkeAfSelfPrint("flashRead:::\r\n");
DEBUG_ARRAY(1,g_Eui64GatewayAddr,sizeof(addrExt_t));
if(st != NV_SUCC){
......@@ -44,14 +46,14 @@ nv_sts_t Gateway_IEEE_Addr_Save(addrExt_t addr)
nv_sts_t st = NV_SUCC;
addrExt_t temp_addr;
st = nv_flashReadNew(1, NV_MODULE_KEYPAIR, NV_GATEWAY_ADDR, sizeof(addrExt_t), (u8*)temp_addr);
st = nv_flashReadNew(1, NV_MODULE_APP, NV_GATEWAY_ADDR, sizeof(addrExt_t), (u8*)temp_addr);
iKonkeAfSelfPrint("flashRead:::temp_addr\r\n");
DEBUG_ARRAY(1,temp_addr,sizeof(addrExt_t));
if(st == NV_SUCC){
if(memcmp(temp_addr,addr,sizeof(addrExt_t)))
st = nv_flashWriteNew(1, NV_MODULE_KEYPAIR, NV_GATEWAY_ADDR, sizeof(addrExt_t), (u8*)addr);
st = nv_flashWriteNew(1, NV_MODULE_APP, NV_GATEWAY_ADDR, sizeof(addrExt_t), (u8*)addr);
}else if(st == NV_ITEM_NOT_FOUND){
st = nv_flashWriteNew(1, NV_MODULE_KEYPAIR, NV_GATEWAY_ADDR, sizeof(addrExt_t), (u8*)addr);
st = nv_flashWriteNew(1, NV_MODULE_APP, NV_GATEWAY_ADDR, sizeof(addrExt_t), (u8*)addr);
}
iKonkeAfSelfPrint("Gateway_IEEE_Addr_Save result = %d\r\n",st);
return st;
......@@ -69,7 +71,7 @@ uint16_t MFG_Code_Get(void)
{
nv_sts_t st = NV_SUCC;
uint16_t mfg_code_temp;
st = nv_flashReadNew(1, NV_MODULE_KEYPAIR, NV_MFG_CODE, sizeof(mfg_code_temp), (u8*)&mfg_code_temp);
st = nv_flashReadNew(1, NV_MODULE_APP, NV_MFG_CODE, sizeof(mfg_code_temp), (u8*)&mfg_code_temp);
if(st != NV_SUCC){
mfg_code_temp = 0;
}
......@@ -89,96 +91,282 @@ nv_sts_t MFG_Code_Save(uint16_t mfgcode)
nv_sts_t st = NV_SUCC;
uint16_t mfg_code_temp;
st = nv_flashReadNew(1, NV_MODULE_KEYPAIR, NV_MFG_CODE, sizeof(mfg_code_temp), (u8*)&mfg_code_temp);
st = nv_flashReadNew(1, NV_MODULE_APP, NV_MFG_CODE, sizeof(mfg_code_temp), (u8*)&mfg_code_temp);
if(st == NV_SUCC){
if(mfg_code_temp != mfgcode)
st = nv_flashWriteNew(1, NV_MODULE_KEYPAIR, NV_MFG_CODE, sizeof(uint16_t), (u8*)&mfgcode);
if(mfg_code_temp != mfgcode){
st = nv_flashWriteNew(1, NV_MODULE_APP, NV_MFG_CODE, sizeof(uint16_t), (u8*)&mfgcode);
iKonkeAfSelfPrint("MFG_CODE_Save result = %d\r\n",st);
}
}else if(st == NV_ITEM_NOT_FOUND){
st = nv_flashWriteNew(1, NV_MODULE_KEYPAIR, NV_MFG_CODE, sizeof(uint16_t), (u8*)&mfgcode);
st = nv_flashWriteNew(1, NV_MODULE_APP, NV_MFG_CODE, sizeof(uint16_t), (u8*)&mfgcode);
}
iKonkeAfSelfPrint("MFG_CODE_Save result = %d\r\n",st);
return st;
}
/*********************************************************************
* @fn Get age test step
*
* @brief
*
* @param None
*
* @return
*/
uint8_t kGetAgingTestValue(void)
bool kGetIndicatorNotDisturbModeFlg(void)
{
nv_sts_t st = NV_SUCC;
uint8_t temp;
st = nv_flashReadNew(1, NV_MODULE_KEYPAIR, NV_AGE_TEST_STEP, sizeof(temp), (u8*)&temp);
iKonkeAfSelfPrint("kGetAgingTestValue:st = %d,data = %d\r\n",st,temp);
st = nv_flashReadNew(1, NV_MODULE_APP, NV_NO_DISTURB_MODE, sizeof(temp), (u8*)&temp);
if(st != NV_SUCC){
temp = 0;
iKonkeAfSelfPrint("kGetIndicatorNotDisturbModeFlg failed!!\r\n");
}
return temp;
iKonkeAfSelfPrint("Read st =%d,data=%d\r\n",st,temp);
return (temp == 1) ;
}
/*********************************************************************
* @fn Save age test step
*
* @brief
*
* @param None
*
* @return
*/
nv_sts_t kSetAgingTestValue(uint8_t value)
nv_sts_t kSetIndicatorNotDisturbModeFlg(uint8_t value)
{
nv_sts_t st = NV_SUCC;
uint8_t temp;
st = nv_flashReadNew(1, NV_MODULE_KEYPAIR, NV_AGE_TEST_STEP, sizeof(uint8_t), (u8*)&temp);
st = nv_flashReadNew(1, NV_MODULE_APP, NV_NO_DISTURB_MODE, sizeof(temp), (u8*)&temp);
if(st == NV_SUCC){
if(temp != value)
{
st = nv_flashWriteNew(1, NV_MODULE_KEYPAIR, NV_AGE_TEST_STEP, sizeof(uint8_t), (u8*)&value);
iKonkeAfSelfPrint("kSetAgingTestValue:st = %d,data = %d\r\n",st,value);
}
st = nv_flashWriteNew(1, NV_MODULE_APP, NV_NO_DISTURB_MODE, sizeof(uint8_t), (u8*)&value);
}else if(st == NV_ITEM_NOT_FOUND){
st = nv_flashWriteNew(1, NV_MODULE_KEYPAIR, NV_AGE_TEST_STEP, sizeof(uint8_t), (u8*)&value);
st = nv_flashWriteNew(1, NV_MODULE_APP, NV_NO_DISTURB_MODE, sizeof(uint8_t), (u8*)&value);
}
if(st != NV_SUCC)
{
iKonkeAfSelfPrint("kSetIndicatorNotDisturbModeFlg failed!!\r\n");
}
return st;
}
bool kGetIndicatorNotDisturbModeFlg(void)
bool kGetInterpanEnableFlg(void)
{
nv_sts_t st = NV_SUCC;
uint8_t temp;
st = nv_flashReadNew(1, NV_MODULE_KEYPAIR, NV_NO_DISTURB_MODE, sizeof(temp), (u8*)&temp);
st = nv_flashReadNew(1, NV_MODULE_APP, NV_INTERPAN_ENABLE_FLG, sizeof(temp), (u8*)&temp);
if(st != NV_SUCC){
temp = 0;
iKonkeAfSelfPrint("kGetIndicatorNotDisturbModeFlg failed!!\r\n");
temp = 1;
iKonkeAfSelfPrint("kGetInterpanEnableFlg failed!!\r\n");
}
return (temp == 1) ;
}
nv_sts_t kSetIndicatorNotDisturbModeFlg(uint8_t value)
nv_sts_t kSetInterpanEnableFlg(uint8_t value)
{
nv_sts_t st = NV_SUCC;
st = nv_flashWriteNew(1, NV_MODULE_KEYPAIR, NV_NO_DISTURB_MODE, sizeof(uint8_t), (u8*)&value);
st = nv_flashWriteNew(1, NV_MODULE_APP, NV_INTERPAN_ENABLE_FLG, sizeof(uint8_t), (u8*)&value);
if(st != NV_SUCC)
{
iKonkeAfSelfPrint("kSetIndicatorNotDisturbModeFlg failed!!\r\n");
}
return st;
}
void falsh_test(void)
void Flash_Test_Save(uint8_t value)
{
uint8_t data = Flash_Test_Get();
if(value != data)
{
flash_read(TOKEN_USER_LOCATION,USER_SIZE,Flash_Buffer_Data);
iKonkeAfSelfPrintBuffer(Flash_Buffer_Data,USER_SIZE);
iKonkeAfSelfPrint("Erase Sector!!\r\n");
Flash_Buffer_Data[0] = value;
flash_erase(TOKEN_USER_LOCATION);
flash_write(TOKEN_USER_LOCATION,1,&value);
}
}
uint8_t Flash_Test_Get(void)
{
addrExt_t addr;
memcpy(addr,Gateway_IEEE_Addr_Get(),sizeof(addrExt_t));
iKonkeAfSelfPrint("flashRead11111:::\r\n");
DEBUG_ARRAY(1,addr,sizeof(addrExt_t));
addr[0] = 11;
addr[1] = 22;
Gateway_IEEE_Addr_Save(addr);
iKonkeAfSelfPrint("flashRead22222:::\r\n");
DEBUG_ARRAY(1,addr,sizeof(addrExt_t));
uint8_t value;
flash_read(TOKEN_USER_LOCATION,1,&value);
return value;
}
void Print_Flash_Data(void)
{
flash_read(TOKEN_USER_LOCATION,USER_SIZE,(uint8_t*)&sOptunnel_Token);
iKonkeAfSelfPrint("install code :\r\n");
iKonkeAfSelfPrintBuffer(sOptunnel_Token.install_code.install_code_data,16);
iKonkeAfSelfPrint("modeid :len = %d\r\n",sOptunnel_Token.modeid.modeid_len);
iKonkeAfSelfPrintBuffer(sOptunnel_Token.modeid.modeid_data,32);
iKonkeAfSelfPrint("cmei :len = %d\r\n",32);
iKonkeAfSelfPrintBuffer(sOptunnel_Token.cmei.cmei_data,sOptunnel_Token.cmei.cmei_len);
iKonkeAfSelfPrint("isn :len = %d\r\n",sOptunnel_Token.isn.isn_len);
iKonkeAfSelfPrintBuffer(sOptunnel_Token.isn.isn_data,32);
uint8_t addr[254] = {0};
flash_read(CFG_MAC_ADDRESS,254,(uint8_t*)addr);
iKonkeAfSelfPrint("mac data::::\r\n");
iKonkeAfSelfPrintBuffer(addr,254);
}
uint8_t g_buffer[33] = {0};
uint8_t* General_Custom_Token_Get(uint8_t item)
{
flash_read(TOKEN_USER_LOCATION,USER_SIZE,(uint8_t*)&sOptunnel_Token);
switch(item)
{
case CUSTOM_ITEMS_INSTALL_CODE:
{
memcpy(g_buffer,sOptunnel_Token.install_code.install_code_data,16);
break;
}
case CUSTOM_ITEMS_MODEL_ID:
{
if(sOptunnel_Token.modeid.modeid_len != 0xff)
memcpy(g_buffer,(uint8_t*)&sOptunnel_Token.modeid,sOptunnel_Token.modeid.modeid_len+1);
else{
g_buffer[0] = 32;
memset(g_buffer+1,0xff,32);
}
break;
}
case CUSTOM_ITEMS_CMEI_CODE:
{
if(sOptunnel_Token.cmei.cmei_len != 0xff)
memcpy(g_buffer,(uint8_t*)&sOptunnel_Token.cmei,sOptunnel_Token.cmei.cmei_len+1);
else{
g_buffer[0] = 32;
memset(g_buffer+1,0xff,32);
}
break;
}
case CUSTOM_ITEMS_ISN_CODE:
{
if(sOptunnel_Token.isn.isn_len != 0xff)
memcpy(g_buffer,(uint8_t*)&sOptunnel_Token.isn,sOptunnel_Token.isn.isn_len+1);
else{
g_buffer[0] = 32;
memset(g_buffer+1,0xff,32);
}
break;
}
default:
break;
}
return g_buffer;
}
uint8_t General_Custom_Token_Save(uint8_t item,uint8_t *buff,uint8_t len)
{
if((buff == NULL)||((len == 0)))
return 0xff;
if(len > 32)
return 0xfe;
OPTTUNEL_TOKEN_ST sOptunnel_Token_temp;
uint8_t rewrite_flash = 0;
uint8_t valid_len = 0;
iKonkeAfSelfPrint("will write data len =%d:\r\n",len);
iKonkeAfSelfPrintBuffer(buff,len);
flash_read(TOKEN_USER_LOCATION,USER_SIZE,(uint8_t*)&sOptunnel_Token_temp);
switch(item)
{
case CUSTOM_ITEMS_INSTALL_CODE:
{
iKonkeAfSelfPrint("read install code:\r\n");
iKonkeAfSelfPrintBuffer(sOptunnel_Token_temp.install_code.install_code_data,16);
if(len >16)
return 0xfe;
if((!memcmp(sOptunnel_Token_temp.install_code.install_code_data,buff,len))
&&(All_Same_Data(&sOptunnel_Token_temp.install_code.install_code_data[len],0xff,16-len)))
{
//same data ,not need rewrite!
return 0;
}else if(All_Same_Data((uint8_t*)&sOptunnel_Token_temp.install_code.install_code_data,0xff,16)){
flash_write(TOKEN_USER_LOCATION+INSTALL_CODE_LOC_OFFSET,len,buff);
return 0;
}else{
memset(sOptunnel_Token_temp.install_code.install_code_data,0xff,16);
memcpy(sOptunnel_Token_temp.install_code.install_code_data,buff,len);
rewrite_flash = 1;
}
break;
}
case CUSTOM_ITEMS_MODEL_ID:
{
iKonkeAfSelfPrint("read modeid data len =%d:\r\n",sOptunnel_Token_temp.modeid.modeid_len);
iKonkeAfSelfPrintBuffer(sOptunnel_Token_temp.modeid.modeid_data,32);
valid_len = (sOptunnel_Token_temp.modeid.modeid_len > len)?sOptunnel_Token_temp.modeid.modeid_len :len;
if((!memcmp(sOptunnel_Token_temp.modeid.modeid_data,buff,len))
&&(All_Same_Data(&sOptunnel_Token_temp.modeid.modeid_data[len],0xff,32-len)))
{
//same data ,not need rewrite!
return 0;
}else if(All_Same_Data((uint8_t*)&sOptunnel_Token_temp.modeid,0xff,32)){
flash_write(TOKEN_USER_LOCATION+MODEL_ID_LOC_OFFSET,len,buff);
return 0;
}else{
sOptunnel_Token_temp.modeid.modeid_len = len;
memset(sOptunnel_Token_temp.modeid.modeid_data,0xff,valid_len);
memcpy(sOptunnel_Token_temp.modeid.modeid_data,buff,len);
rewrite_flash = 1;
}
break;
}
case CUSTOM_ITEMS_CMEI_CODE:
{
iKonkeAfSelfPrint("read cmei data len =%d:\r\n",sOptunnel_Token_temp.cmei.cmei_len);
iKonkeAfSelfPrintBuffer(sOptunnel_Token_temp.cmei.cmei_data,32);
valid_len = (sOptunnel_Token_temp.cmei.cmei_len > len)?sOptunnel_Token_temp.cmei.cmei_len :len;
if((!memcmp(sOptunnel_Token_temp.cmei.cmei_data,buff,len))
&&(All_Same_Data(&sOptunnel_Token_temp.cmei.cmei_data[len],0xff,32-len)))
{
//same data ,not need rewrite!
return 0;
}else if(All_Same_Data((uint8_t*)&sOptunnel_Token_temp.cmei,0xff,32)){
flash_write(TOKEN_USER_LOCATION+CMEI_LOC_OFFSET,len,buff);
return 0;
}else{
sOptunnel_Token_temp.cmei.cmei_len = len;
memset(sOptunnel_Token_temp.cmei.cmei_data,0xff,valid_len);
memcpy(sOptunnel_Token_temp.cmei.cmei_data,buff,len);
rewrite_flash = 1;
}
break;
}
case CUSTOM_ITEMS_ISN_CODE:
{
iKonkeAfSelfPrint("read isn data len =%d:\r\n",sOptunnel_Token_temp.isn.isn_len);
iKonkeAfSelfPrintBuffer(sOptunnel_Token_temp.isn.isn_data,32);
valid_len = (sOptunnel_Token_temp.isn.isn_len > len)?sOptunnel_Token_temp.isn.isn_len :len;
if((!memcmp(sOptunnel_Token_temp.isn.isn_data,buff,len))
&&(All_Same_Data(&sOptunnel_Token_temp.isn.isn_data[len],0xff,32-len)))
{
//same data ,not need rewrite!
return 0;
}else if(All_Same_Data((uint8_t*)&sOptunnel_Token_temp.isn,0xff,32)){
flash_write(TOKEN_USER_LOCATION+ISN_LOC_OFFSET,len,buff);
return 0;
}else{
sOptunnel_Token_temp.isn.isn_len = len;
memset(sOptunnel_Token_temp.isn.isn_data,0xff,valid_len);
memcpy(sOptunnel_Token_temp.isn.isn_data,buff,len);
rewrite_flash = 1;
}
break;
}
default:
break;
}
if(rewrite_flash){
flash_erase(TOKEN_USER_LOCATION);
flash_write(TOKEN_USER_LOCATION,USER_SIZE,(uint8_t*)&sOptunnel_Token_temp);
Print_Flash_Data();
return 0;
}
return 0xfd;
}
void falsh_test(uint8_t count)
{
// uint8_t install_code1[] = {1,2,3,4,5,6,7,8,9,0x0a};
// uint8_t install_code2[] = {1,2,3,4,5,6,7,8,9,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10};
// if(count%2)
// General_Custom_Token_Save(CUSTOM_ITEMS_INSTALL_CODE,install_code1,sizeof(install_code1));
// else
// General_Custom_Token_Save(CUSTOM_ITEMS_INSTALL_CODE,install_code2,sizeof(install_code2));
// uint8_t *p = MODEL_ID_TOKEN_GET();
Print_Flash_Data();
// iKonkeAfSelfPrint("len =%d:\r\n",p[0]);
// iKonkeAfSelfPrintBuffer(p+1,32);
}
......@@ -4,6 +4,70 @@
#include "tl_common.h"
#define TOKEN_USER_LOCATION 0x78000
#define USER_SIZE 256
#define INSTALL_CODE_LOC_OFFSET 0 //16Byte //0
#define MODEL_ID_LOC_OFFSET 64 //33Byte //16+33
#define CMEI_LOC_OFFSET 64+64 //33Byte //16+33+33
#define ISN_LOC_OFFSET 64+64+64 //33Byte //16+33+33+33
enum{
CUSTOM_ITEMS_INSTALL_CODE = 1,
CUSTOM_ITEMS_MODEL_ID ,
CUSTOM_ITEMS_CMEI_CODE ,
CUSTOM_ITEMS_ISN_CODE ,
CUSTOM_ITEMS_RESERVED ,
}CUSTOM_ITEMS;
#define INSTALL_CODE_INDEX 0
#define MODEL_ID_INDEX 1
#define INSTALL_CODE_INDEX 0
#define INSTALL_CODE_INDEX 0
#define INSTALL_CODE_INDEX 0
typedef struct
{
struct{
uint8_t install_code_data[16];
uint8_t res[48];
}install_code;
struct{
uint8_t modeid_len;
uint8_t modeid_data[32];
uint8_t res[31];
}modeid;
struct{
uint8_t cmei_len;
uint8_t cmei_data[32];
uint8_t res[31];
}cmei;
struct{
uint8_t isn_len;
uint8_t isn_data[32];
uint8_t res[31];
}isn;
uint8_t reserved[32];
}OPTTUNEL_TOKEN_ST;
extern OPTTUNEL_TOKEN_ST sOptunnel_Token;
void Flash_Test_Save(uint8_t value);
uint8_t Flash_Test_Get(void);
uint8_t General_Custom_Token_Save(uint8_t item,uint8_t *buff,uint8_t len);
uint8_t *General_Custom_Token_Get(uint8_t item);
#define INSTALL_CODE_TOKEN_GET() (General_Custom_Token_Get(CUSTOM_ITEMS_INSTALL_CODE))
#define MODEL_ID_TOKEN_GET() (General_Custom_Token_Get(CUSTOM_ITEMS_MODEL_ID))
#define CMEI_TOKEN_GET() (General_Custom_Token_Get(CUSTOM_ITEMS_CMEI_CODE))
#define ISN_TOKEN_GET() (General_Custom_Token_Get(CUSTOM_ITEMS_ISN_CODE))
#define INSTALL_CODE_TOKEN_SET(buffer,len) (General_Custom_Token_Save(CUSTOM_ITEMS_INSTALL_CODE,buffer,len))
#define MODEL_ID_TOKEN_SET(buffer,len) (General_Custom_Token_Save(CUSTOM_ITEMS_MODEL_ID,buffer,len))
#define CMEI_TOKEN_SET(buffer,len) (General_Custom_Token_Save(CUSTOM_ITEMS_CMEI_CODE,buffer,len))
#define ISN_TOKEN_SET(buffer,len) (General_Custom_Token_Save(CUSTOM_ITEMS_ISN_CODE,buffer,len))
nv_sts_t Gateway_IEEE_Addr_Save(addrExt_t addr);
......@@ -13,14 +77,12 @@ uint16_t MFG_Code_Get(void);
nv_sts_t MFG_Code_Save(uint16_t mfgcode);
uint8_t kGetAgingTestValue(void);
nv_sts_t kSetAgingTestValue(uint8_t value);
bool kGetIndicatorNotDisturbModeFlg(void);
nv_sts_t kSetIndicatorNotDisturbModeFlg(uint8_t value);
#if 0
void falsh_test(void);
nv_sts_t kSetInterpanEnableFlg(uint8_t value);
bool kGetInterpanEnableFlg(void);
#if 1
void falsh_test(uint8_t count);
#endif
#endif /* _SAMPLE_LIGHT_H_ */
......@@ -22,7 +22,7 @@ uint8_t* Gateway_IEEE_Addr_Get(void)
{
nv_sts_t st = NV_SUCC;
st = nv_flashReadNew(1, NV_MODULE_USER, NV_GATEWAY_ADDR, sizeof(addrExt_t), (u8*)g_Eui64GatewayAddr);
st = nv_flashReadNew(1, NV_MODULE_APP, NV_GATEWAY_ADDR, sizeof(addrExt_t), (u8*)g_Eui64GatewayAddr);
iKonkeAfSelfPrint("flashRead:::\r\n");
DEBUG_ARRAY(1,g_Eui64GatewayAddr,sizeof(addrExt_t));
if(st != NV_SUCC){
......@@ -44,14 +44,14 @@ nv_sts_t Gateway_IEEE_Addr_Save(addrExt_t addr)
nv_sts_t st = NV_SUCC;
addrExt_t temp_addr;
st = nv_flashReadNew(1, NV_MODULE_USER, NV_GATEWAY_ADDR, sizeof(addrExt_t), (u8*)temp_addr);
st = nv_flashReadNew(1, NV_MODULE_APP, NV_GATEWAY_ADDR, sizeof(addrExt_t), (u8*)temp_addr);
iKonkeAfSelfPrint("flashRead:::temp_addr\r\n");
DEBUG_ARRAY(1,temp_addr,sizeof(addrExt_t));
if(st == NV_SUCC){
if(memcmp(temp_addr,addr,sizeof(addrExt_t)))
st = nv_flashWriteNew(1, NV_MODULE_USER, NV_GATEWAY_ADDR, sizeof(addrExt_t), (u8*)addr);
st = nv_flashWriteNew(1, NV_MODULE_APP, NV_GATEWAY_ADDR, sizeof(addrExt_t), (u8*)addr);
}else if(st == NV_ITEM_NOT_FOUND){
st = nv_flashWriteNew(1, NV_MODULE_USER, NV_GATEWAY_ADDR, sizeof(addrExt_t), (u8*)addr);
st = nv_flashWriteNew(1, NV_MODULE_APP, NV_GATEWAY_ADDR, sizeof(addrExt_t), (u8*)addr);
}
iKonkeAfSelfPrint("Gateway_IEEE_Addr_Save result = %d\r\n",st);
return st;
......@@ -69,7 +69,7 @@ uint16_t MFG_Code_Get(void)
{
nv_sts_t st = NV_SUCC;
uint16_t mfg_code_temp;
st = nv_flashReadNew(1, NV_MODULE_USER, NV_MFG_CODE, sizeof(mfg_code_temp), (u8*)&mfg_code_temp);
st = nv_flashReadNew(1, NV_MODULE_APP, NV_MFG_CODE, sizeof(mfg_code_temp), (u8*)&mfg_code_temp);
if(st != NV_SUCC){
mfg_code_temp = 0;
}
......@@ -89,12 +89,12 @@ nv_sts_t MFG_Code_Save(uint16_t mfgcode)
nv_sts_t st = NV_SUCC;
uint16_t mfg_code_temp;
st = nv_flashReadNew(1, NV_MODULE_USER, NV_MFG_CODE, sizeof(mfg_code_temp), (u8*)&mfg_code_temp);
st = nv_flashReadNew(1, NV_MODULE_APP, NV_MFG_CODE, sizeof(mfg_code_temp), (u8*)&mfg_code_temp);
if(st == NV_SUCC){
if(mfg_code_temp != mfgcode)
st = nv_flashWriteNew(1, NV_MODULE_USER, NV_MFG_CODE, sizeof(uint16_t), (u8*)&mfgcode);
st = nv_flashWriteNew(1, NV_MODULE_APP, NV_MFG_CODE, sizeof(uint16_t), (u8*)&mfgcode);
}else if(st == NV_ITEM_NOT_FOUND){
st = nv_flashWriteNew(1, NV_MODULE_USER, NV_MFG_CODE, sizeof(uint16_t), (u8*)&mfgcode);
st = nv_flashWriteNew(1, NV_MODULE_APP, NV_MFG_CODE, sizeof(uint16_t), (u8*)&mfgcode);
}
iKonkeAfSelfPrint("MFG_CODE_Save result = %d\r\n",st);
return st;
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -189,7 +189,7 @@
<link>
<name>apps/common/00ikonke_app</name>
<type>2</type>
<location>E:/TeLin_Zigbee_SDK/tl_zigbee_sdk/apps/common/00ikonke_app</location>
<location>E:/telin_zigbee_sdk/tl_zigbee_sdk/apps/common/00ikonke_app</location>
</link>
<link>
<name>platform/boot/8258</name>
......
......@@ -52,6 +52,7 @@
#if defined(MCU_CORE_826x) || defined(MCU_CORE_8258) || defined(MCU_CORE_8278)
int Tl_printf(const char *format, ...);
#endif
#define SKD_LOG_ENABLE FALSE
#if (UART_PRINTF_MODE || USB_PRINTF_MODE)
......@@ -59,6 +60,7 @@ int Tl_printf(const char *format, ...);
#define printf Tl_printf
#endif
#define TRACE printf
#define DEBUG(compileFlag, ...) do{ \
......@@ -75,6 +77,11 @@ int Tl_printf(const char *format, ...);
TRACE("\n*********************************\n"); \
} \
}while(0)
#if SKD_LOG_ENABLE
#define sdk_printf printf
#else
#define sdk_printf
#endif
#else
#if defined(MCU_CORE_826x) || defined(MCU_CORE_8258) || defined(MCU_CORE_8278)
#define printf
......
......@@ -601,7 +601,7 @@ nv_sts_t nv_resetToFactoryNew(void){
}
foreach(i, NV_MAX_MODULS){
if((i != NV_MODULE_NWK_FRAME_COUNT)&&(i != NV_MODULE_KEYPAIR)){
if((i != NV_MODULE_NWK_FRAME_COUNT)&&(i != NV_MODULE_APP)){
nv_resetModule(i);
}
}
......
......@@ -354,8 +354,12 @@ typedef enum{
NV_GATEWAY_ADDR, //lmm add
NV_MFG_CODE, //lmm add
NV_AGE_TEST_STEP, //lmm add
NV_SINGLE_BOARD_TEST_FLG, //lmm add
NV_FULL_DEVICE_TEST_FLG, //lmm add
NV_MFC_CODE, //lmm add
NV_NO_DISTURB_MODE, //lmm add
NV_AGING_TEST_TIME, //lmm add
NV_INTERPAN_ENABLE_FLG, //lmm add
NV_ITEM_ID_MAX = 0xFF,/* Item id 0xFF should not be used. */
}nv_item_t;
......
......@@ -49,7 +49,7 @@
/**
* @brief Definition for timer event
*/
#define TIMER_EVENT_NUM (40)
#define TIMER_EVENT_NUM (24)
#define TIMER_EVENT_ENOUGH_NUM (TIMER_EVENT_NUM - 4)
/**
......
......@@ -83,3 +83,4 @@
#include "drivers/drv_putchar.h"
#include "drivers/drv_usb.h"
......@@ -854,7 +854,7 @@ _CODE_BDB_ static void bdb_nodeDescRespHandler(void *arg)
//lmm add for getting coo manufacture code
u16 manufactureCode = (u16)(rsp->node_descriptor.mcH8) <<8 | rsp->node_descriptor.mcL8;
MFG_Code_Save(manufactureCode);
Tl_printf("sdk print,nodeDescResp,manufactureCode = %d\r\n",manufactureCode); //just debug for sdk test
sdk_printf("sdk print,nodeDescResp,manufactureCode = %d\r\n",manufactureCode); //just debug for sdk test
if(stackRev >= 21){
ss_apsRequestKeyReq_t requestKey;
TL_SETSTRUCTCONTENT(requestKey, 0);
......@@ -926,6 +926,7 @@ _CODE_BDB_ static s32 bdb_retrieveTcLinkKeyTimeout(void *arg)
*/
_CODE_BDB_ static s32 bdb_retrieveTcLinkKeyStart(void *arg)
{
sdk_printf("bdb_retrieveTcLinkKeyStart, g_bdbAttrs.tcLinkKeyExchangeMethod= %d\n", g_bdbAttrs.tcLinkKeyExchangeMethod);
if(g_bdbAttrs.tcLinkKeyExchangeMethod == TCKEY_EXCHANGE_METHOD_APSRK){
/* send node description */
u8 sn = 0;
......@@ -1108,7 +1109,6 @@ static void bdb_task(void *arg)
g_bdbCtx.bdbAppCb->bdbcommissioningCb(g_bdbAttrs.commissioningStatus, NULL);
}
}
Tl_printf("sdk print,bdb_task,BDB_STATE_IDLE,status = %d\r\n",status); //just debug for sdk test
BDB_STATE_SET(status);
}else if(evt == BDB_STATE_REJOIN_DONE){
bdb_topLevelCommissiongConfirm();
......@@ -1116,6 +1116,7 @@ static void bdb_task(void *arg)
break;
case BDB_STATE_COMMISSIONING_TOUCHLINK:
sdk_printf("sdk printf,touch link ,evt = %d\r\n",evt);
if(evt == BDB_EVT_COMMISSIONING_TOUCHLINK_NO_RESP){
/*
* if no scan response received, start network steer
......@@ -1143,7 +1144,7 @@ static void bdb_task(void *arg)
break;
case BDB_STATE_COMMISSIONING_NETWORK_STEER:
Tl_printf("sdk print,bdb_task,networ steering,evt = %d\r\n",evt); //just debug for sdk test
sdk_printf("sdk printf,start retry tclink_key event,evt = %d\r\n",evt);
if(evt == BDB_EVT_COMMISSIONING_NETWORK_STEER_RETRIEVE_TCLINK_KEY){
TL_ZB_TIMER_SCHEDULE(bdb_retrieveTcLinkKeyStart, NULL, 1000);
}else if(evt == BDB_EVT_COMMISSIONING_NETWORK_STEER_PERMITJOIN){
......@@ -1156,13 +1157,11 @@ static void bdb_task(void *arg)
#if ZB_COORDINATOR_ROLE
ss_securityModeSet(SS_SEMODE_CENTRALIZED);
#else
Tl_printf("sdk print,bdb_task,networ steering,----\r\n");
if((!g_bdbAttrs.nodeIsOnANetwork)||(ZB_IEEE_ADDR_IS_INVAILD(ss_ib.trust_center_address))){
ss_securityModeSet(SS_SEMODE_DISTRIBUTED);
}
#endif
status = bdb_commissioningNetworkFormation();
Tl_printf("sdk print,bdb_task,networ steering,status = %d\r\n",status);
if(status == BDB_STATE_IDLE){
/* confirm to application */
bdb_topLevelCommissiongConfirm();
......@@ -1172,6 +1171,7 @@ static void bdb_task(void *arg)
break;
case BDB_STATE_COMMISSIONING_NETWORK_FORMATION:
sdk_printf("sdk printf,BDB_STATE_COMMISSIONING_NETWORK_FORMATION,evt = %d\r\n",evt);
if( evt == BDB_EVT_COMMISSIONING_NETWORK_FORMATION_PERMITJOIN){
g_bdbAttrs.commissioningMode.networkSteer = 1;
zb_mgmtPermitJoinReq(0xfffc, BDBC_MIN_COMMISSIONING_TIME, 0x01, &sn, NULL);
......@@ -1187,6 +1187,7 @@ static void bdb_task(void *arg)
break;
case BDB_STATE_COMMISSIONING_FINDORBIND:
sdk_printf("sdk printf,FINDORBIND,evt = %d\r\n",evt);
if(evt == BDB_EVT_COMMISSIONING_FINDORBIND_SIMPLE_DESC_REQ){
bdb_commissioningFindBindSimpleDescReq();
}else if(evt == BDB_EVT_COMMISSIONING_FINDORBIND_FINISH){
......@@ -1228,7 +1229,7 @@ _CODE_BDB_ static s32 bdb_task_delay(void *arg)
_CODE_BDB_ void bdb_zdoStartDevCnf(zdo_start_device_confirm_t *startDevCnf){
u32 evt = BDB_EVT_IDLE;
u8 state = BDB_STATE_GET();
Tl_printf("sdk print,bdb_zdoStartDevCnf,get bdb status = %d,start status = %d\r\n",state,startDevCnf->status);
switch(state){
case BDB_STATE_IDLE:
/* for rejoin indication by the stack */
......@@ -1287,7 +1288,6 @@ _CODE_BDB_ void bdb_zdoStartDevCnf(zdo_start_device_confirm_t *startDevCnf){
#endif
case BDB_STATE_COMMISSIONING_NETWORK_STEER:
Tl_printf("sdk print,bdb_zdoStartDevCnf,status = %d\r\n",startDevCnf->status); //just debug for sdk test
if(startDevCnf->status == SUCCESS){
//g_bdbAttrs.commissioningStatus = BDB_COMMISSION_STA_SUCCESS;
g_bdbAttrs.nodeIsOnANetwork = 1;
......@@ -1454,7 +1454,7 @@ _CODE_BDB_ static u8 bdb_topLevelCommissiongConfirm(void){
*/
_CODE_BDB_ static u8 bdb_topLevelCommissioning(u8 target){
/* restore persistent ZigBee data */
Tl_printf("sdk print,bdb_topLevelCommissioning = %d,%d\r\n",BDB_STATE_GET(),g_bdbAttrs.commissioningStatus);
if(BDB_STATE_GET() != BDB_STATE_IDLE || g_bdbAttrs.commissioningStatus == BDB_COMMISSION_STA_IN_PROGRESS){
return BDB_STATE_COMMISSIONING_BUSY;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment