Commit b1dbfcb7 authored by hanxu's avatar hanxu

2022.4.1 泰凌微临时版本1.1.0备份。

parent 4f207db8
......@@ -329,7 +329,7 @@ const af_simple_descriptor_t sampleTestDesc =
zcl_basicAttr_t g_zcl_basicAttrs =
{
.zclVersion = 0x03,
.appVersion = 0x28,
.appVersion = 0x29,
.stackVersion = 0x02,
.hwVersion = 0x20,
.manuName = ZCL_BASIC_MFG_NAME,
......
......@@ -2,20 +2,61 @@
#define __IKONKE_ENDPOINT_CONFIG_H___
#include "types.h"
/**
* @brief Defined for basic cluster attributes
*/
//#define SINGLE_LIGHT_PANEL
//#define DUAL_LIGHT_PANEL
#define THREE_LIGHT_PANEL
//#define FOUR_LIGHT_PANEL
#ifdef SINGLE_LIGHT_PANEL
#define SUPPORT_MAX_EP 6
#define Support_Endpoint_Array { 1 }
#define Support_Endpoint_Num 1
// Array of profile ids
#define FIXED_PROFILE_IDS { 260 }
// Array of device ids
#define FIXED_DEVICE_IDS { HA_DEV_ONOFF_LIGHT_SWITCH }
#endif
#ifdef DUAL_LIGHT_PANEL
#define SUPPORT_MAX_EP 6
#define Support_Endpoint_Array {1 ,2 ,3 ,4 }
#define Support_Endpoint_Array { 1, 2 }
#define Support_Endpoint_Num 2
// Array of profile ids
#define FIXED_PROFILE_IDS { 260, 260 }
// Array of device ids
#define FIXED_DEVICE_IDS { HA_DEV_ONOFF_LIGHT_SWITCH, HA_DEV_ONOFF_LIGHT_SWITCH }
#endif
#ifdef THREE_LIGHT_PANEL
#define SUPPORT_MAX_EP 6
#define Support_Endpoint_Array { 1, 2, 3 }
#define Support_Endpoint_Num 3
// Array of profile ids
#define FIXED_PROFILE_IDS { 260, 260, 260 }
// Array of device ids
#define FIXED_DEVICE_IDS { HA_DEV_ONOFF_LIGHT_SWITCH, HA_DEV_ONOFF_LIGHT_SWITCH, HA_DEV_ONOFF_LIGHT_SWITCH }
#endif
#ifdef FOUR_LIGHT_PANEL
#define SUPPORT_MAX_EP 6
#define Support_Endpoint_Array { 1, 2, 3, 4 }
#define Support_Endpoint_Num 4
// Array of profile ids
#define FIXED_PROFILE_IDS { 260, 260, 260, 260 }
// Array of device ids
#define FIXED_DEVICE_IDS { HA_DEV_ONOFF_LIGHT_SWITCH, HA_DEV_ONOFF_LIGHT_SWITCH, HA_DEV_ONOFF_LIGHT_SWITCH, HA_DEV_ONOFF_LIGHT_SWITCH }
#endif
typedef struct{
u8 zclVersion;
......
......@@ -101,7 +101,7 @@ extern "C" {
#endif
#define ZCL_GROUP_SUPPORT 1
#define ZCL_SCENE_SUPPORT 1
#define ZCL_OTA_SUPPORT 1
#define ZCL_OTA_SUPPORT 0
#define ZCL_PRIVATE_CLUSTER_FCC0_SUPPORT 1
#if TOUCHLINK_SUPPORT
#define ZCL_ZLL_COMMISSIONING_SUPPORT 1
......
......@@ -2,12 +2,133 @@
#define __IKONKE_CONFIG_H___
#include "types.h"
//#define SINGLE_LIGHT_PANEL
//#define DUAL_LIGHT_PANEL
#define THREE_LIGHT_PANEL
//#define FOUR_LIGHT_PANEL
#ifdef SINGLE_LIGHT_PANEL
/*Dsp: product model id */
#define PRODUCT_MODEL "KK-LP-D81X"
/*Dsp: APP Version */
#define FIRMWARE_VER 0x29
/*Dsp: Stack Version */
#define STACK_VER 0x11
/*Dsp: HARDWARE_VER */
#define HARDWARE_VERSION 0x20
/*Dsp: MANUFATURE NAME */
#define MANUFATURE_NAME "Konke"
/*Dsp: MODEL_ID */
#define MODEL_ID 0x00068621
/*Dsp: OTA_IMAGE_TYPE */
#define OTA_IMAGE_TYPE 65001
/*Dsp: OTA_FIRMVERSION */
#define OTA_FIRMVERSION 0x29
/*Dsp: MANUFATURE_CODE */
#define MANUFATURE_CODE 0x1268
/*Dsp: OTA_HARDWARE_VER */
#define OTA_HARDWARE_VER 0x20
#define MANUFACTURER_CODE_TELINK 0x1268
#define IMAGE_TYPE 65001
#define FILE_VERSION 0x10
#endif
#ifdef DUAL_LIGHT_PANEL
/*Dsp: product model id */
#define PRODUCT_MODEL "KK-LP-D82X"
/*Dsp: APP Version */
#define FIRMWARE_VER 0x29
/*Dsp: Stack Version */
#define STACK_VER 0x11
/*Dsp: HARDWARE_VER */
#define HARDWARE_VERSION 0x20
/*Dsp: MANUFATURE NAME */
#define MANUFATURE_NAME "Konke"
/*Dsp: MODEL_ID */
#define MODEL_ID 0x00068622
/*Dsp: OTA_IMAGE_TYPE */
#define OTA_IMAGE_TYPE 65002
/*Dsp: OTA_FIRMVERSION */
#define OTA_FIRMVERSION 0x29
/*Dsp: MANUFATURE_CODE */
#define MANUFATURE_CODE 0x1268
/*Dsp: OTA_HARDWARE_VER */
#define OTA_HARDWARE_VER 0x20
#define MANUFACTURER_CODE_TELINK 0x1268
#define IMAGE_TYPE 65002
#define FILE_VERSION 0x10
#endif
#ifdef THREE_LIGHT_PANEL
/*Dsp: product model id */
#define PRODUCT_MODEL "KK-LP-D83X"
/*Dsp: APP Version */
#define FIRMWARE_VER 0x29
/*Dsp: Stack Version */
#define STACK_VER 0x11
/*Dsp: HARDWARE_VER */
#define HARDWARE_VERSION 0x20
/*Dsp: MANUFATURE NAME */
#define MANUFATURE_NAME "Konke"
/*Dsp: MODEL_ID */
#define MODEL_ID 0x00068623
/*Dsp: OTA_IMAGE_TYPE */
#define OTA_IMAGE_TYPE 65003
/*Dsp: OTA_FIRMVERSION */
#define OTA_FIRMVERSION 0x29
/*Dsp: MANUFATURE_CODE */
#define MANUFATURE_CODE 0x1268
/*Dsp: OTA_HARDWARE_VER */
#define OTA_HARDWARE_VER 0x20
#define MANUFACTURER_CODE_TELINK 0x1268
#define IMAGE_TYPE 65003
#define FILE_VERSION 0x10
#endif
#ifdef FOUR_LIGHT_PANEL
/*Dsp: product model id */
#define PRODUCT_MODEL "KK-PA-M10X"
#define PRODUCT_MODEL "KK-LP-D84X"
/*Dsp: APP Version */
#define FIRMWARE_VER 0x20
#define FIRMWARE_VER 0x29
/*Dsp: Stack Version */
#define STACK_VER 0x11
......@@ -22,10 +143,10 @@
#define MODEL_ID 0x00068624
/*Dsp: OTA_IMAGE_TYPE */
#define OTA_IMAGE_TYPE 65000
#define OTA_IMAGE_TYPE 65004
/*Dsp: OTA_FIRMVERSION */
#define OTA_FIRMVERSION 0x20
#define OTA_FIRMVERSION 0x29
/*Dsp: MANUFATURE_CODE */
#define MANUFATURE_CODE 0x1268
......@@ -36,9 +157,10 @@
#define MANUFACTURER_CODE_TELINK 0x1268
#define IMAGE_TYPE 65000
#define IMAGE_TYPE 65004
#define FILE_VERSION 0x10
#endif
#include "../common/comm_cfg.h"
......
......@@ -9,11 +9,33 @@
#include "ikk-uart.h"
#include "ikk-relay.h"
#include "ikk-led.h"
#include "ikk-ota.h"
#include "ikk-network.h"
#include "ikk-command.h"
#include "ikk-common-utils.h"
#include "ikk-interpan.h"
#include "ikk-pwm.h"
#include "ikk-ota.h"
//#define SINGLE_LIGHT_PANEL
//#define DUAL_LIGHT_PANEL
#define THREE_LIGHT_PANEL
//#define FOUR_LIGHT_PANEL
#ifdef SINGLE_LIGHT_PANEL
#define g_ucRelayTotalNum 1
#endif
#ifdef DUAL_LIGHT_PANEL
#define g_ucRelayTotalNum 2
#endif
#ifdef THREE_LIGHT_PANEL
#define g_ucRelayTotalNum 3
#endif
#ifdef FOUR_LIGHT_PANEL
#define g_ucRelayTotalNum 4
#endif
#define ZERO_PIN GPIO_PA0
#define RELAY1_PIN GPIO_PC0
......@@ -43,8 +65,8 @@
#define HEART_RAND_MIN_NUM (240 * 1000)
#define HEART_RAND_MAX_NUM (300 * 1000)
#define LED_SLOW_BLINK_ON_TIME_MS 500
#define LED_SLOW_BLINK_OFF_TIME_MS 500
#define LED_SLOW_BLINK_ON_TIME_MS 800
#define LED_SLOW_BLINK_OFF_TIME_MS 800
#define LED_FAST_BLINK_ON_TIME_MS 200
#define LED_FAST_BLINK_OFF_TIME_MS 200
......@@ -53,11 +75,8 @@
#define MIN_JOINED_NWK_DELAY_TIME_MS (7 * 1000) //重新上电后最短时间,用于判断是否随机延时10~40S上报心跳和CMEI和ISN
#define RAND_MIN_NUM (3 * 1000) //最小随机数,单位MS
#define RAND_MAX_NUM (6 * 1000) //最大随机数
#define REPORT_ATTR_MAX_RAND_NUM (7 * 1000) //场景下发控制后随机最大延时上报状态,状态改变后SDK会主动上报
#define REPORT_ATTR_MIN_RAND_NUM (2.5 * 1000) //场景下发控制后随机最小延时上报状态
#define REPORT_ATTR_MAX_RAND_NUM (5 * 1000) //场景下发控制后随机最大延时上报状态,状态改变后SDK会主动上报
#define REPORT_ATTR_MIN_RAND_NUM (2 * 1000) //场景下发控制后随机最小延时上报状态
#define CHECKED_ZERO_DELAY_ON_TIME_MS (6000)//因继电器会有延时,检测到零点后,按键开关或命令下发开关延时去开的时间,
......@@ -86,28 +105,81 @@ typedef enum {RELAY_CHANNEL1_ID=1, RELAY_CHANNEL2_ID, RELAY_CHANNEL3_ID, RELAY_C
// BUTTONs CONFIG
BtnConfSt g_btnConfList[] = {
{KEY_SYS_ID, KEY_SYS_PIN, EBP_HIGH, false, true, SYS_BUTTON_LONG_PRESS_TIME_MS}, // Key1
#ifdef SINGLE_LIGHT_PANEL
{KEY1_ID, KEY2_PIN, EBP_HIGH, false, true, SYS_BUTTON_LONG_PRESS_TIME_MS}, // Key2
#endif
#ifdef DUAL_LIGHT_PANEL
{KEY1_ID, KEY2_PIN, EBP_HIGH, false, true, SYS_BUTTON_LONG_PRESS_TIME_MS}, // Key2
{KEY2_ID, KEY4_PIN, EBP_HIGH, false, false, 0xffffffff}, // Key2
#endif
#ifdef THREE_LIGHT_PANEL
{KEY1_ID, KEY1_PIN, EBP_HIGH, false, true, SYS_BUTTON_LONG_PRESS_TIME_MS}, // Key2
{KEY2_ID, KEY2_PIN, EBP_HIGH, false, false, 0xffffffff}, // Key2
{KEY3_ID, KEY3_PIN, EBP_HIGH, false, false, 0xffffffff}, // Key2
#endif
#ifdef FOUR_LIGHT_PANEL
{KEY1_ID, KEY1_PIN, EBP_HIGH, false, true, SYS_BUTTON_LONG_PRESS_TIME_MS}, // Key2
{KEY2_ID, KEY2_PIN, EBP_HIGH, false, false, 0xffffffff}, // Key2
{KEY3_ID, KEY3_PIN, EBP_HIGH, false, false, 0xffffffff}, // Key2
{KEY4_ID, KEY4_PIN, EBP_HIGH, false, false, 0xffffffff}, // Key2
#endif
};
// 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 },
#ifdef SINGLE_LIGHT_PANEL
{(uint8_t)LED1_ID, 1, {LED2_PIN, PWM1_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID}, ELP_HIGH },
{(uint8_t)LED_ALL_ID, 1, {LED2_PIN, PWM1_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID}, ELP_HIGH },
#endif
#ifdef DUAL_LIGHT_PANEL
{(uint8_t)LED1_ID, 1, {LED2_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, {LED4_PIN, PWM2_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID}, ELP_HIGH },
{(uint8_t)LED_ALL_ID, 2, {LED2_PIN, PWM1_ID, LED4_PIN, PWM2_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID}, ELP_HIGH },
#endif
#ifdef THREE_LIGHT_PANEL
{(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)LED_ALL_ID, 3, {LED1_PIN, PWM1_ID, LED2_PIN, PWM2_ID, LED3_PIN, PWM3_ID, PIN_UNKNOW, PWM_UNKNOW_ID}, ELP_HIGH },
#endif
#ifdef FOUR_LIGHT_PANEL
{(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 },
#endif
};
PwmConfSt g_pwmConfList[] = {
#ifdef SINGLE_LIGHT_PANEL
{PWM1_ID, {LED2_PIN, KK_PWM_CC1}}, //
#endif
#ifdef DUAL_LIGHT_PANEL
{PWM1_ID, {LED2_PIN, KK_PWM_CC0}}, //
{PWM2_ID, {LED4_PIN, KK_PWM_CC1}}, //
#endif
#ifdef THREE_LIGHT_PANEL
{PWM1_ID, {LED1_PIN, KK_PWM_CC0}}, //
{PWM2_ID, {LED2_PIN, KK_PWM_CC1}}, //
{PWM3_ID, {LED3_PIN, KK_PWM_CC2}}, //
#endif
#ifdef FOUR_LIGHT_PANEL
{PWM1_ID, {LED1_PIN, KK_PWM_CC0}}, //
{PWM2_ID, {LED2_PIN, KK_PWM_CC1}}, //
{PWM3_ID, {LED3_PIN, KK_PWM_CC2}}, //
{PWM4_ID, {LED4_PIN, KK_PWM_CC3}}, //
#endif
};
// ZERO-ACCESS CONFIG
RelayChannelConfSt g_relayConfList[] = {
{RELAY_CHANNEL1_ID, 1, {RELAY1_PIN, PIN_UNKNOW, PIN_UNKNOW, PIN_UNKNOW, PIN_UNKNOW, PIN_UNKNOW, PIN_UNKNOW, PIN_UNKNOW}, EZAP_HIGH }, // Channel1
......@@ -123,13 +195,31 @@ FactoryTestConfSt g_factoryTestConfList[] = {
{KEY1_ID, LONG_PRESS_1_TIMES, MECHANICAL_KEY_LONG_PRESS_TIME_MS},
};
BindObjSt cluster_obj_list[] = {
#ifdef SINGLE_LIGHT_PANEL
{ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, 1},
#endif
#ifdef DUAL_LIGHT_PANEL
{ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, 1},
{ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, 2},
#endif
#ifdef THREE_LIGHT_PANEL
{ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, 1},
{ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, 2},
{ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, 3},
#endif
#ifdef FOUR_LIGHT_PANEL
{ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, 1},
{ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, 2},
{ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, 3},
{ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, 4},
#endif
{ZCL_CLUSTER_PRIVATE_FCC0, ZCL_ATTRID_NoDisturbMode, 1},
{ZCL_CLUSTER_GEN_DIAGNOSTICS, ZCL_DIAGNOSTICS_ATTRID_LAST_MESSAGE_RSSI, 1},
};
void pOnOffAttributeChangeCallback(uint8_t endpoint,uint16_t cluster,uint16_t attribute,uint8_t *data,uint8_t data_type);
AttributeChangeConfSt attribte_change_list[] = {
......@@ -138,6 +228,7 @@ AttributeChangeConfSt attribte_change_list[] = {
uint32_t u32PeroidIntervalMS = 2*1000;
bool Human_body_induction_flag = false;
static bool power_on_sync[4] = {false,false,false,false};
#define GET_MAX_ENDPOINT(relay_num) (relay_num)
static uint8_t g_u8NoDisturbModeMinLevel = 0x01;
static uint8_t g_u8NoDisturbModeMaxLevel = 0x64;
......@@ -148,7 +239,7 @@ static uint8_t g_ucRelayIdBuff[] = {RELAY_CHANNEL1_ID, RELAY_CHANNEL2_ID, RELAY_
void JoinCompleteCallback(NwkJoinCompltEnum nwkcomplt );
void kUserNetworkStatusNotify(NwkStatusEnum nwkst );
void kUserNetworkExitCompleteCallback(void);
void kUserOnOffClusterOnOffStatusCallback(uint8_t endpoint, OnOffStatusEnum estatus );;
void kUserOnOffClusterOnOffStatusCallback(uint8_t endpoint, OnOffStatusEnum estatus );
kk_err_t kUserOODMessageIncoming(uint8_t channel, uint8_t opcode, uint8_t args_in_out[], uint8_t *length_in_out );
void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action );
......@@ -162,18 +253,17 @@ void kUserFactorTestPollCallback(FactoryTestStatusEnum status);
void kOTAMoudleUserCallback(OTAStatusEnum status);
#endif
#define UART_ENABLE false
#define UART_ENABLE true
void kUserRelayLedCallback(RelayStatusSt status);
void kRadarDetectInit(void);
void kRadarLedTragger(void);
static void kSetLedStatus(LED_ID_ENUM id);
void kSetLedStatus(LED_ID_ENUM id);
#if UART_ENABLE
void UartMsgProcessHandle(UMsgNodeSt *pMsgNode);
bool MsgCRC16(uint8_t *pdat, int length );
uint16_t check_sum( uint8_t* msg, uint8_t len);
uint8_t uart_send(void);
#endif
void Test(void );
static ev_timer_event_t *kkSystemSetUpEvent = NULL;
s32 kkSystemSetUpEventHandler(void *arg );
......@@ -184,17 +274,13 @@ AttributeChangeConfSt g_ClusterAttributeConfList[] = {
{ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, pOnOffClusterAttributeChangeCallback},
};
static bool kEndpointIsValid(uint8_t endpoint);
static void kLEDOnAction(LED_ID_ENUM led_id);
static void kLEDOffAction(LED_ID_ENUM led_id);
void App_Init(void)
{
iKonkeAfSelfPrint("\r\n************************************************\r\n");
iKonkeAfSelfPrint("\r\n****************APP Init***********************\r\n");
// iKonkeAfSelfPrint("xxx Reboot Reason: R-INFO(0x%x: %p), R-EXTEND(0x%x: %p) xxx\r\n"
// , halGetResetInfo(), halGetResetString()
// , halGetExtendedResetInfo(), halGetExtendedResetString());
// iKonkeAfSelfPrint("xxx Network Status: %d, systime: %d xxx\r\n", emberAfNetworkState()
// , halCommonGetInt32uMillisecondTick());
iKonkeAfSelfPrint("\r\n************************************************\r\n");
#if 1
kk_err_t err = kBtnModuleInit(g_btnConfList, sizeof(g_btnConfList) / sizeof(BtnConfSt), kUserButtonAcitonCallback);
......@@ -215,7 +301,7 @@ void App_Init(void)
err = kRelayModuleInit(ZERO_PIN, CHECKED_ZERO_DELAY_ON_TIME_MS, CHECKED_ZERO_DELAY_OFF_TIME_MS \
, EZAP_LOW, g_relayConfList, sizeof(g_relayConfList)/sizeof(RelayChannelConfSt), kUserRelayLedCallback);
if( err != KET_OK ) {
iKonkeAfSelfPrint("Err: Led Module Init failed(%d)!!\r\n", err);
iKonkeAfSelfPrint("Err: ZERO Module Init failed(%d)!!\r\n", err);
}
#if UART_ENABLE
uint8_t recv_header[] = {0xAA,0X55};
......@@ -223,12 +309,14 @@ void App_Init(void)
#endif
kNwkModuleInit(cluster_obj_list,sizeof(cluster_obj_list) / sizeof(cluster_obj_list[0]), kUserNetworkStatusNotify, kUserNetworkExitCompleteCallback);
//report 4~5 minutes after initialization
kNwkScheduleTaskRegister(HEARTBEAT_TIME_MS);
#if Z30_DEVICE_OTA_ENABLE
kOTAMoudleInit(kOTAMoudleUserCallback, LED_ALL_ID);
#endif
#if Z30_DEVICE_AGING_ENABLE
kFactoryTestInit(kUserFactorTestPollCallback, g_factoryTestConfList, sizeof(g_factoryTestConfList)/ sizeof(FactoryTestConfSt));
kFactoryTestInit(kUserFactorTestPollCallback, g_factoryTestConfList, sizeof(g_factoryTestConfList)/ sizeof(FactoryTestConfSt),LED_ALL_ID);
#endif
// init the private cluster protocol module.
err = kOptTunnelModuleInit(kUserOODMessageIncoming);
......@@ -245,17 +333,27 @@ void App_Init(void)
kRadarDetectInit();
kZclClusterPermitReportTableInit(cluster_obj_list, sizeof(cluster_obj_list) / sizeof(BindObjSt));
kOptTunnelTrytoWriteInstallCode();
}
void Test(void )
{
}
void kUserNetworkExitCompleteCallback()
{
bool bIsAllOffFlg = true;
for (uint8_t i = 1; i <= GET_MAX_ENDPOINT(g_ucRelayTotalNum); i++){
if (kZclOnOffClusterServerOnOffGet(i) == EOOS_ON){
bIsAllOffFlg = false;
break;
}
}
SYSTEM_RESET();
if (bIsAllOffFlg == true){
if (kGetFactoryTestStatus() == FTS_NORMAL ){
SYSTEM_RESET();
}
}
if (kGetFactoryTestStatus() != FTS_NORMAL ){
kNwkJoiningStart(NWK_STEERING_TIMEOUT_MS, JoinCompleteCallback);
}
}
static bool kClustePeriodReportCheckIsSet(uint8_t endpoint)
{
......@@ -278,12 +376,12 @@ void JoinCompleteCallback(NwkJoinCompltEnum nwkcomplt )
switch(nwkcomplt) {
case (EJC_JOIN_FAILED ):
{
LED_OPT_OFF(LED_ALL_ID);
kSetLedStatus(LED_ALL_ID);
kUserNetworkExitCompleteCallback();
break;
}
case (EJC_JOIN_SUCCEED):
{
break;
}
default: break;
......@@ -304,17 +402,35 @@ void kUserNetworkStatusNotify(NwkStatusEnum nwkst )
if ( currentTimeMS < MIN_JOINED_NWK_DELAY_TIME_MS){
randTimeMS = kGetRandNum(RAND_MIN_NUM, RAND_MAX_NUM);
}else {
kLedOptTrigger(LED_ALL_ID, 0, 0, 0, LED_OFF, LED_IGNORE);
#ifdef SINGLE_LIGHT_PANEL
kPwmOptTrigger(PWM1_ID, PWM_TIMER_MAX_DUTY_CYCLE_NUM, 0, 5*1000);
#endif
#ifdef DUAL_LIGHT_PANEL
kPwmOptTrigger(PWM2_ID, PWM_TIMER_MAX_DUTY_CYCLE_NUM, 0, 5*1000);
kPwmOptTrigger(PWM1_ID, PWM_TIMER_MAX_DUTY_CYCLE_NUM, 0, 5*1000);
#endif
#ifdef THREE_LIGHT_PANEL
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);
#endif
#ifdef FOUR_LIGHT_PANEL
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);
#endif
}
if (kIsKonkeRemoteGateway() != true){
g_bIsNotKonkeGatewayFirstReportedFlg = false;
kNwkScheduleTaskRegister(randTimeMS);
}
kNwkScheduleTaskRegister(randTimeMS);
iKonkeAfSelfPrint("Joined Network RandTime(%dms) CurrentTime(%d)\r\n", randTimeMS, currentTimeMS);
break;
}
......@@ -328,7 +444,7 @@ void kUserNetworkStatusNotify(NwkStatusEnum nwkst )
{
iKonkeAfSelfPrint("#####Enter Leave\r\n");
kLedOptTrigger((uint8_t)LED_ALL_ID, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_OFF_TIME_MS \
,LED_FAST_BLINK_CONTINUE_TIME_MS/(LED_FAST_BLINK_ON_TIME_MS+LED_FAST_BLINK_ON_TIME_MS), LED_ON, LED_IGNORE);
,LED_FAST_BLINK_CONTINUE_TIME_MS/(LED_FAST_BLINK_ON_TIME_MS+LED_FAST_BLINK_OFF_TIME_MS), LED_ON, LED_IGNORE);
//关闭勿扰模式
kSetIndicatorNotDisturbModeFlg(false);
......@@ -386,9 +502,10 @@ uint8_t Key_Press_Test_Flag[5] = {0};
void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
{
iKonkeAfSelfPrint("kUserButton: ButtonId(%d), Action(%d),%d\r\n", button_id, action,kGetFactoryTestStatus());
kOptTunneCheckNodeIdIsChangedReport();
if ( kGetFactoryTestStatus() == FTS_AGING_4HOU || kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS \
|| kGetFactoryTestStatus() == FTS_WAITING_RELEASED \
|| kGetFactoryTestStatus() == FTS_WAITING_SECOND_PRESS \
|| kNwkIsExiting() == true){
//未老化完成,单击按键不操作继电器
return;
......@@ -401,17 +518,29 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
{
case EBA_CLICK:
{
iKonkeAfSelfPrint("SYS_ID!!!!!! kNwkGetCurrentStatus = %d,kInterPanGetEnableStatus = %d\r\n",\
kNwkGetCurrentStatus(),kInterPanGetEnableStatus(),power_on_sync[0],power_on_sync[1],power_on_sync[2],power_on_sync[3]);
Key_Press_Test_Flag[0] = 1;
if( kNwkGetCurrentStatus() == ENS_ONLINE ) { // report connected!
if(kNwkGetCurrentStatus() == ENS_ONLINE){ // report connected!
iKonkeAfSelfPrint("Is Online...........\r\n");
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);
if (kIsKonkeRemoteGateway() == true){
kOptTunnelOODReport(0, 0XCD, NULL, 0);
}
}
else if(kNwkGetCurrentStatus() == ENS_LEAVED)
{
kNwkFactoryReset(false);
kNwkJoiningStart(NWK_STEERING_TIMEOUT_MS,JoinCompleteCallback); //开启组网
if(kGetFactoryTestStatus() == FTS_SINGLE_BOARD_TEST){
if (kLedIsBlinking(LED_ALL_ID) != true){
kLedOptTrigger(LED_ALL_ID, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_OFF_TIME_MS, 10, LED_ON, LED_OFF);
iKonkeAfSelfPrint("######FTS_SINGLE_BOARD_TEST Blinking 10 times######\r\n");
}
}else{
kNwkFactoryReset(false);
iKonkeAfSelfPrint("Start Joining...........\r\n");
kNwkJoiningStart(NWK_STEERING_TIMEOUT_MS,JoinCompleteCallback);
}
}
}
break;
......@@ -419,6 +548,10 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
{
if(kNwkGetCurrentStatus() == ENS_ONLINE)
{
if(kGetInterpanEnableFlg() == true){
iKonkeAfSelfPrint("Close Interpan...........\r\n");
kInterpanDisable();
}
kNwkFactoryReset(true);
iKonkeAfSelfPrint("Start Leave...........\r\n");
}
......@@ -436,7 +569,7 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
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);
kZclClusterSetPermitReportInfo(1,0x0006,true,false,true,true,NULL,RESET_ENDPOINT);
//afTest_dataSendDemo();
kZclOnOffClusterServerOnOffControl(1, state);
}else if (action == EBA_LONGPRESS){
......@@ -445,6 +578,15 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
return;
}
if(kGetFactoryTestStatus() == FTS_SINGLE_BOARD_TEST){
if( kNwkGetCurrentStatus() == ENS_LEAVED ) { // report connected!
if(kLedIsBlinking(LED_ALL_ID) != true){
kLedOptTrigger(LED_ALL_ID, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_OFF_TIME_MS, 10, LED_ON, LED_OFF);
iKonkeAfSelfPrint("######FTS_SINGLE_BOARD_TEST Blinking 10 times######\r\n");
}
}
}
static bool firstLongPressFlg = false;
if (kNwkGetCurrentStatus() == ENS_ONLINE){
static uint32_t lastTimeMS = 0;
......@@ -453,9 +595,9 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
|| (currentTimeMS - lastTimeMS >= MAX_FIRST_USER_KEY_LEAVE_NWK_INTERVAL_TIME_MS)){
firstLongPressFlg = true;
lastTimeMS = currentTimeMS;
if ( kGetOTAStatus() == OTA_NORMAL){
/*if ( kGetOTAStatus() == OTA_NORMAL){*/
kLedOptTrigger(LED_ALL_ID, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_OFF_TIME_MS, 1, LED_ON, LED_OFF);
}
/*}*/
}else {
//second times long press
if (currentTimeMS - lastTimeMS < MAX_FIRST_USER_KEY_LEAVE_NWK_INTERVAL_TIME_MS){
......@@ -485,7 +627,7 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
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);
kZclClusterSetPermitReportInfo(2,0x0006,true,false,true,true,NULL,RESET_ENDPOINT);
kZclOnOffClusterServerOnOffControl(2, state);
}
break;
......@@ -497,7 +639,7 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
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);
kZclClusterSetPermitReportInfo(3,0x0006,true,false,true,true,NULL,RESET_ENDPOINT);
kZclOnOffClusterServerOnOffControl(3, state);
}
break;
......@@ -509,7 +651,7 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
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);
kZclClusterSetPermitReportInfo(4,0x0006,true,false,true,true,NULL,RESET_ENDPOINT);
kZclOnOffClusterServerOnOffControl(4, state);
}
break;
......@@ -523,9 +665,14 @@ void kUserRelayLedCallback(RelayStatusSt status)
{
iKonkeAfSelfPrint("#########kUserZaLedCallback channel(%d) opt(%d)\r\n", status.u8RelayChannelId, status.opt);
if (/*kPwmIsChanging(PWM1_ID) == true ||*/ kLedIsBlinking(LED_ALL_ID) == true \
if (kPwmIsChanging(PWM1_ID) == true || kLedIsBlinking(LED_ALL_ID) == true \
|| kNwkGetCurrentStatus() == ENS_JOINING)
{
if(kLedIsBlinking(LED_ALL_ID)){
for(uint8_t i=0 ;i<g_ucRelayTotalNum;i++)
if( power_on_sync[i])
power_on_sync[i] = false;
}
return;
}
......@@ -535,8 +682,8 @@ void kUserRelayLedCallback(RelayStatusSt status)
if (kNwkGetCurrentStatus() == ENS_ONLINE || power_on_sync[0] == true \
|| kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){
|| kGetFactoryTestStatus() == FTS_WAITING_RELEASED \
|| kGetFactoryTestStatus() == FTS_WAITING_SECOND_PRESS){
power_on_sync[0] = false;
if (status.opt == EZAO_OFF){
kLEDOffAction(LED1_ID);
......@@ -557,8 +704,8 @@ void kUserRelayLedCallback(RelayStatusSt status)
if (kNwkGetCurrentStatus() == ENS_ONLINE || power_on_sync[1] == true \
|| kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){
|| kGetFactoryTestStatus() == FTS_WAITING_RELEASED \
|| kGetFactoryTestStatus() == FTS_WAITING_SECOND_PRESS){
power_on_sync[1] = false;
if (status.opt == EZAO_OFF){
kLEDOffAction(LED2_ID);
......@@ -579,8 +726,8 @@ void kUserRelayLedCallback(RelayStatusSt status)
if (kNwkGetCurrentStatus() == ENS_ONLINE || power_on_sync[2] == true \
|| kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){
|| kGetFactoryTestStatus() == FTS_WAITING_RELEASED \
|| kGetFactoryTestStatus() == FTS_WAITING_SECOND_PRESS){
power_on_sync[2] = false;
if (status.opt == EZAO_OFF){
kLEDOffAction(LED3_ID);
......@@ -601,8 +748,8 @@ void kUserRelayLedCallback(RelayStatusSt status)
if (kNwkGetCurrentStatus() == ENS_ONLINE || power_on_sync[3] == true \
|| kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){
|| kGetFactoryTestStatus() == FTS_WAITING_RELEASED \
|| kGetFactoryTestStatus() == FTS_WAITING_SECOND_PRESS){
power_on_sync[3] = false;
if (status.opt == EZAO_OFF){
kLEDOffAction(LED4_ID);
......@@ -648,7 +795,7 @@ void kUserPwmActionDoneCallback(unsigned char id, PwmGradientDirectionEnum opt)
}
//ota升级失败或入网成功和失败后LED闪烁完成后处理,需要根据不同产品来修改
static void kSetLedStatus(LED_ID_ENUM id)
void kSetLedStatus(LED_ID_ENUM id)
{
if (id != LED_ALL_ID){
kPwmClearGradientCounterById(id - 1);
......@@ -661,6 +808,7 @@ static void kSetLedStatus(LED_ID_ENUM id)
//恢复继电器的LED状态
if (id == LED_ALL_ID)
{
iKonkeAfSelfPrint("##########kSetLedStatus LED_ALL_ID111111111111111111\r\n");
kLedOptTrigger(LED_ALL_ID, 0, 0, 0, LED_OFF, LED_IGNORE);
for (uint8_t i = 1; i <= Support_Endpoint_Num; i++){
if (kLedIsBlinking(GET_LED_ID_BY_ENDPOINT(i, Support_Endpoint_Num)) == false){
......@@ -692,13 +840,11 @@ s32 kUserScheduleTaskHandler(void *arg)
}else {
if (cluster_obj_list[0].cluster != CLUSTER_UNKNOW){
if (cluster_obj_list[0].cluster == ZCL_CLUSTER_GEN_POWER_CFG){
//kBatteryMonitorReadADC(true);
}else {
//add by maozj 20200512 report on off status
if ((g_bIsNotKonkeGatewayFirstReportedFlg )&& kClustePeriodReportCheckIsSet(g_u8CurrentHeartEndpoint)== true){
//网关设置过report interval,使用SDK的report
//kNwkScheduleTaskStop(SCHEDULE_ALLOPT_ID);
}else {
kZclClusterSetPermitReportInfo(g_u8CurrentHeartEndpoint, ZCL_CLUSTER_GEN_ON_OFF, true, false ,true, true, NULL, RESET_ENDPOINT);//情景需要加
kOptTunnelReportingPlagiarizeOriginal(g_u8CurrentHeartEndpoint, ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF);
}
}
......@@ -719,23 +865,23 @@ s32 kUserScheduleTaskHandler(void *arg)
//LED闪烁完成,可以用来恢复继电器的LED状态
void kUserLedActionDoneCallback(unsigned char id)
{
iKonkeAfSelfPrint("##############kUserLedActionDoneCallback id(%d)nwk(%d)##################\r\n", id,kNwkGetCurrentStatus());
iKonkeAfSelfPrint("##############kUserLedActionDoneCallback id(%d)nwk(%d)##################\r\n", id, kNwkGetCurrentStatus());
kSetLedStatus(id);
}
//网关场景控制下发后的属性延时上报处理,可以根据不同场景cluster修改
/* DESP: recall scene rand delay report Attribute set
* Auth: maozj.20191224.
* */
void kZclClusterRecallSceneCallback(uint8_t endpoint, uint16_t cluster, uint8_t command_id, bool reportEnable, bool sceneRecallFlg)
void kZclClusterRecallSceneCallback(uint8_t endpoint, uint16_t cluster, uint8_t command_id, bool reportEnable, bool sceneRecallFlg,\
bool reportGatewayEnable, bool reportChildDeviceEnable, void *param)
{
iKonkeAfSelfPrint("####kZclClusterRecallSceneCallback ep(%d)cluster(%d)command_id(%d),reportEnable(%d),sceneRecallFlg(%d)\r\n");
if((cluster == ZCL_CLUSTER_GEN_ON_OFF)&&(command_id == ZCL_CMD_SCENE_RECALL_SCENE))
{
kZclClusterSetPermitReportInfo(endpoint,ZCL_CLUSTER_GEN_ON_OFF,false,true);
kZclClusterSetPermitReportInfo(endpoint,ZCL_CLUSTER_GEN_ON_OFF,false,true,true,true,NULL,RESET_ENDPOINT);
}
}
static ev_timer_event_t *kEndpoint1DelayReport = NULL;
static ev_timer_event_t *kEndpoint2DelayReport = NULL;
static ev_timer_event_t *kEndpoint3DelayReport = NULL;
......@@ -743,28 +889,28 @@ static ev_timer_event_t *kEndpoint4DelayReport = NULL;
static s32 kEndpoint1DelayReportAttrEventHandler(void *arg)
{
iKonkeAfSelfPrint("######kEndpoint1DelayReportAttrEventHandler\r\n" );
kZclClusterSetPermitReportInfo(1, ZCL_CLUSTER_GEN_ON_OFF, true, false);
kZclClusterSetPermitReportInfo(1, ZCL_CLUSTER_GEN_ON_OFF, true, false, true, true, NULL, RESET_ENDPOINT);
kOptTunnelReportingPlagiarizeOriginal(1, ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF);
return -1;
}
static s32 kEndpoint2DelayReportAttrEventHandler(void *arg)
{
iKonkeAfSelfPrint("######kEndpoint2DelayReportAttrEventHandler\r\n" );
kZclClusterSetPermitReportInfo(2, ZCL_CLUSTER_GEN_ON_OFF, true, false);
kZclClusterSetPermitReportInfo(2, ZCL_CLUSTER_GEN_ON_OFF, true, false, true, true, NULL, RESET_ENDPOINT);
kOptTunnelReportingPlagiarizeOriginal(2, ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF);
return -1;
}
static s32 kEndpoint3DelayReportAttrEventHandler(void *arg)
{
iKonkeAfSelfPrint("######kEndpoint3DelayReportAttrEventHandler\r\n" );
kZclClusterSetPermitReportInfo(3, ZCL_CLUSTER_GEN_ON_OFF, true, false);
kZclClusterSetPermitReportInfo(3, ZCL_CLUSTER_GEN_ON_OFF, true, false, true, true, NULL, RESET_ENDPOINT);
kOptTunnelReportingPlagiarizeOriginal(3, ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF);
return -1;
}
static s32 kEndpoint4DelayReportAttrEventHandler(void *arg)
{
iKonkeAfSelfPrint("######kEndpoint4DelayReportAttrEventHandler\r\n" );
kZclClusterSetPermitReportInfo(4, ZCL_CLUSTER_GEN_ON_OFF, true, false);
kZclClusterSetPermitReportInfo(4, ZCL_CLUSTER_GEN_ON_OFF, true, false, true, true, NULL, RESET_ENDPOINT);
kOptTunnelReportingPlagiarizeOriginal(4, ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF);
return -1;
}
......@@ -776,8 +922,9 @@ bool kZclClusterReportChangeCallback(uint8_t endpoint, uint16_t clusterId, uint1
{
ZclReportTableSt zclReportInfo;
bool status = kZclClusterGetPermitReportInfo(endpoint,clusterId,&zclReportInfo);
iKonkeAfSelfPrint("######kZclClusterReportChangeCallback status(%d)ep(%d)enable(%d)scene(%d)\r\n",
iKonkeAfSelfPrint("######kZclClusterReportChangeCallback111111111 status(%d)ep(%d)Reportenable(%d)sceneRecall(%d)\r\n",
status, endpoint, zclReportInfo.reportEnable, zclReportInfo.sceneRecallFlg );
//不直接上报,随机延时上报
if (status == true){
if (zclReportInfo.reportEnable != true && zclReportInfo.sceneRecallFlg == true){
uint32_t randDelayTimeMS = kGetRandNum(REPORT_ATTR_MIN_RAND_NUM, REPORT_ATTR_MAX_RAND_NUM);
......@@ -796,17 +943,9 @@ bool kZclClusterReportChangeCallback(uint8_t endpoint, uint16_t clusterId, uint1
}
else if (endpoint == 4){
if(!ev_timer_exist(kEndpoint4DelayReport)) {
kEndpoint3DelayReport = TL_ZB_TIMER_SCHEDULE(kEndpoint4DelayReportAttrEventHandler, NULL, randDelayTimeMS);
kEndpoint4DelayReport = TL_ZB_TIMER_SCHEDULE(kEndpoint4DelayReportAttrEventHandler, NULL, randDelayTimeMS);
}
}
//有多控绑定发给其它子设备, 不发给网关
// if( kZclNodeIsBindNotGatewayIeeeAddress(endpoint, ZCL_ON_OFF_CLUSTER_ID) == true) {
// iKonkeAfSelfPrint("Multi Control\r\n");
// kZclClusterSetPermitReportInfo(endpoint, true, false, false, true);
// kOptTunnelReportingPlagiarizeOriginal(endpoint, ZCL_ON_OFF_CLUSTER_ID, ZCL_ON_OFF_ATTRIBUTE_ID, CLUSTER_MASK_SERVER);
// //kZclClusterConditionallySendReport(endpoint, ZCL_ON_OFF_CLUSTER_ID, false, true);
// }
//不直接上报,随机延时上报
return false;
}
else if(!zclReportInfo.reportEnable)
......@@ -814,10 +953,11 @@ bool kZclClusterReportChangeCallback(uint8_t endpoint, uint16_t clusterId, uint1
return false;
}
}
iKonkeAfSelfPrint("reporting disable11111111111111111111111111111111\r\n");
return true;
}
//Auth: han_frc.20220105.
kk_err_t kUserOODMessageIncoming(uint8_t channel, uint8_t opcode, uint8_t args_in_out[], uint8_t *length_in_out )
{
if( NULL == args_in_out || NULL == length_in_out ) {
......@@ -831,59 +971,224 @@ kk_err_t kUserOODMessageIncoming(uint8_t channel, uint8_t opcode, uint8_t args_i
iKonkeAfSelfPrint("--------------------------------------\r\n");
switch(opcode) {
case (0x00): // get the device snap.
{
case (0x00): // get the device snap.
{
uint8_t command = args_in_out[0];
if (command == 0x00){
OnOffStatusEnum status1= kZclOnOffClusterServerOnOffGet(1);
OnOffStatusEnum status2= kZclOnOffClusterServerOnOffGet(2);
OnOffStatusEnum status3= kZclOnOffClusterServerOnOffGet(3);
#ifdef FOUR_LIGHT_PANEL
OnOffStatusEnum status4= kZclOnOffClusterServerOnOffGet(4);
#endif
uint8_t channelValue1 = (status1 == EOOS_ON)?1:(status1 == EOOS_UNKNOW?0xFF:0);
uint8_t channelValue2 = (status2 == EOOS_ON)?1:(status2 == EOOS_UNKNOW?0xFF:0);
uint8_t channelValue3 = (status3 == EOOS_ON)?1:(status3 == EOOS_UNKNOW?0xFF:0);
#ifdef FOUR_LIGHT_PANEL
uint8_t channelValue4 = (status4 == EOOS_ON)?1:(status4 == EOOS_UNKNOW?0xFF:0);
#endif
if (g_ucRelayTotalNum == 1){
channelValue2 = 0xff; //0xff为私有协议中无效值
channelValue3 = 0xff;
}else if (g_ucRelayTotalNum == 2){
channelValue3 = 0xff;
}
args_in_out[0] = 0x00;
args_in_out[1] = kZclOnOffClusterServerOnOffGet(1);
args_in_out[2] = kZclOnOffClusterServerOnOffGet(2);
args_in_out[3] = kZclOnOffClusterServerOnOffGet(3);
args_in_out[4] = kZclOnOffClusterServerOnOffGet(4);
args_in_out[1] = channelValue1;
args_in_out[2] = channelValue2;
args_in_out[3] = channelValue3;
#ifndef FOUR_LIGHT_PANEL
args_in_out[4] = kGetIndicatorNotDisturbModeFlg();
iKonkeAfSelfPrint("OOOOOOPCODE: 1(%d), 2(%d), 3(%d)\r\n", args_in_out[1], args_in_out[2], args_in_out[3]);
*length_in_out = 5;
#endif
#ifdef FOUR_LIGHT_PANEL
args_in_out[4] = channelValue4;
args_in_out[5] = kGetIndicatorNotDisturbModeFlg();
iKonkeAfSelfPrint("OOOOOOPCODE: 1(%d), 2(%d), 3(%d),4(%d),5(%d)\r\n", args_in_out[1], args_in_out[2], args_in_out[3],args_in_out[4],args_in_out[5]);
iKonkeAfSelfPrint("OOOOOOPCODE: 1(%d), 2(%d), 3(%d)\r\n", args_in_out[1], args_in_out[2], args_in_out[3]);
*length_in_out = 6;
break;
}
case (0xFE):
{
//set disturb mode
uint8_t mode = args_in_out[0];
if (mode != 0x00 && mode != 0x01){
#endif
}else if (command == 0x01){
args_in_out[0] = ERR_NO_NONE;
#ifndef FOUR_LIGHT_PANEL
OnOffCtrlEnum onoffctrl[3] = {0};
onoffctrl[0] = args_in_out[1];
onoffctrl[1] = args_in_out[2];
onoffctrl[2] = args_in_out[3];
uint8_t disturb_mode = args_in_out[4];
#endif
#ifdef FOUR_LIGHT_PANEL
OnOffCtrlEnum onoffctrl[4] = {0};
onoffctrl[0] = args_in_out[1];
onoffctrl[1] = args_in_out[2];
onoffctrl[2] = args_in_out[3];
onoffctrl[3] = args_in_out[4];
uint8_t disturb_mode = args_in_out[5];
#endif
for (uint8_t channelID = 1; channelID <= g_ucRelayTotalNum; channelID++){
if (kEndpointIsValid(channelID)){ //通道有效
if (onoffctrl[channelID - 1] != EOOC_OFF && onoffctrl[channelID - 1] != EOOC_ON && onoffctrl[channelID - 1] != EOOC_TOGGLE){
args_in_out[0] = ERR_NO_COMMAND_FORMAT;
args_in_out[channelID] = 0xff;
}else{
uint8_t status = onoffctrl[channelID - 1];
if (onoffctrl[channelID - 1] == EOOC_TOGGLE){ //对翻转需要转换成开/关
status = kZclOnOffClusterServerOnOffGet(channelID) == EOOC_ON?EOOC_OFF:EOOC_ON;
}
kZclClusterSetPermitReportInfo(channelID,ZCL_CLUSTER_GEN_ON_OFF,true,false,true,true,NULL,RESET_ENDPOINT);
kZclOnOffClusterServerOnOffControl(channelID, status);
args_in_out[channelID] = status;
}
}else{
args_in_out[channelID] = 0xff;
}
}
if (disturb_mode != 0x00 && disturb_mode != 0x01){
args_in_out[0] = ERR_NO_COMMAND_FORMAT;
}else {
#ifndef FOUR_LIGHT_PANEL
args_in_out[4] = 0xff;
#endif
#ifdef FOUR_LIGHT_PANEL
args_in_out[5] = 0xff;
#endif
}else{
//存储勿扰标志
kSetIndicatorNotDisturbModeFlg(mode);
kSetIndicatorNotDisturbModeFlg(disturb_mode);
////State Sync////
if (kLedIsBlinking(LED_ALL_ID) != true) {
kSetLedStatus(LED_ALL_ID);
}
#ifndef FOUR_LIGHT_PANEL
args_in_out[4] = kGetIndicatorNotDisturbModeFlg();
}
*length_in_out = 5;
#endif
#ifdef FOUR_LIGHT_PANEL
args_in_out[5] = kGetIndicatorNotDisturbModeFlg();
}
*length_in_out = 6;
#endif
iKonkeAfSelfPrint("OOOOOOPCODE: 1(%d), 2(%d), 3(%d)\r\n", args_in_out[1], args_in_out[2], args_in_out[3]);
}
break;
}
case (0x10): //on/off control
{
uint8_t channelID = channel;
uint8_t onOffStatus = args_in_out[0];
iKonkeAfSelfPrint("OOOOPCODE ONOFF: channel[%d], onoff[%d]\r\n", channelID, onOffStatus);
if (kEndpointIsValid(channelID)){ //通道有效
if (onOffStatus != EOOC_OFF && onOffStatus != EOOC_ON && onOffStatus != EOOC_TOGGLE){
args_in_out[0] = ERR_NO_COMMAND_FORMAT;
}else { //下发值正确
args_in_out[0] = ERR_NO_NONE;
if (channelID != 0xFF){ //网关单路下发控制
uint8_t status = onOffStatus;
if (onOffStatus == EOOC_TOGGLE){ //对翻转需要转换成开/关
status = kZclOnOffClusterServerOnOffGet(channelID) == EOOC_ON?EOOC_OFF:EOOC_ON;
}
kZclClusterSetPermitReportInfo(channelID,ZCL_CLUSTER_GEN_ON_OFF,true,false,true,true,NULL,RESET_ENDPOINT);
//commandOnOffClusterCallback(status, channelID, true, false);
kZclOnOffClusterServerOnOffControl(channelID, status);
}else { //全部
if (onOffStatus == EOOC_TOGGLE){//全部通道翻转
for (uint8_t i = 1; i <= GET_MAX_ENDPOINT(g_ucRelayTotalNum); i++){
kZclClusterSetPermitReportInfo(i,ZCL_CLUSTER_GEN_ON_OFF,true,false,true,true,NULL,RESET_ENDPOINT);
kZclOnOffClusterServerOnOffControl(i, EOOC_TOGGLE);
}
}else {
for (uint8_t i = 1; i <= GET_MAX_ENDPOINT(g_ucRelayTotalNum); i++){
kZclClusterSetPermitReportInfo(i,ZCL_CLUSTER_GEN_ON_OFF,true,false,true,true,NULL,RESET_ENDPOINT);
kZclOnOffClusterServerOnOffControl(i, onOffStatus);
}
}
}
}
iKonkeAfSelfPrint("Disturb Mode(%d)\r\n", mode);
args_in_out[1] = mode;
*length_in_out = 2;
break;
}else {
args_in_out[0] = ERR_NO_COMMAND_FORMAT;
}
case (0xFF):
{
uint8_t permitJoinTimeS = args_in_out[0]; //unit:s
iKonkeAfSelfPrint("###Opcode is channel(%d) JoinPermitTime(0x%X)!!\r\n",channel, permitJoinTimeS);
//路由协同组网,黄灯闪烁(OTA升级)时不协同组网闪灯
if (kLedIsBlinking(LED_ALL_ID) != true
&& permitJoinTimeS != 0
&& kNwkGetCurrentStatus() != ENS_JOINING){
iKonkeAfSelfPrint("####LED Blink\r\n");
kLedOptTrigger(LED_ALL_ID, LED_SLOW_BLINK_ON_TIME_MS, LED_SLOW_BLINK_OFF_TIME_MS,
permitJoinTimeS * 1000/(LED_SLOW_BLINK_ON_TIME_MS+LED_SLOW_BLINK_OFF_TIME_MS), LED_ON, LED_OFF);
}else if (kLedIsBlinking(LED2_ID) == true
&& permitJoinTimeS == 0
&& kNwkGetCurrentStatus() != ENS_JOINING){
kLedOptTrigger(LED_ALL_ID, 0, 0, 0, LED_OFF, LED_IGNORE);
// kLEDOffAction(LED_ALL_ID);
args_in_out[1] = onOffStatus;//下发命令
*length_in_out = 2;
//iKonkeAfSelfPrintln("2.retStatus[%d], channel[%d], onoff[%d]",retStatus, channelID, onOffStatus);
break;
}
case (0xE4):
{
uint8_t u8NetworkSteering_ch = args_in_out[0];
uint16_t u16NetworkSteering_panid = ((uint16_t)args_in_out[1] << 8) | ((uint16_t)args_in_out[2]);
kSetNetworkSteeringInfo(u8NetworkSteering_ch, u16NetworkSteering_panid);
args_in_out[1] = u8NetworkSteering_ch;
args_in_out[2] = (uint8_t)(u16NetworkSteering_panid >> 8);
args_in_out[3] = (uint8_t)(u16NetworkSteering_panid);
args_in_out[0] = ERR_NO_NONE;
if (kGetFactoryTestStatus() == FTS_NORMAL){
args_in_out[0] = ERR_NO_COMMAND_FORMAT;
}
*length_in_out = 4;
break;
}
case (0xE5):
{
kSetAgingTestDone();
args_in_out[0] = ERR_NO_NONE;
*length_in_out = 1;
break;
}
case (0xFE):
{
//set disturb mode
uint8_t mode = args_in_out[0];
if (mode != 0x00 && mode != 0x01){
args_in_out[0] = ERR_NO_COMMAND_FORMAT;
}else {
//存储勿扰标志
kSetIndicatorNotDisturbModeFlg(mode);
////State Sync////
if (kLedIsBlinking(LED_ALL_ID) != true) {
kSetLedStatus(LED_ALL_ID);
}
return KET_NO_RESPONSE;
args_in_out[0] = ERR_NO_NONE;
}
iKonkeAfSelfPrint("Disturb Mode(%d)\r\n", mode);
args_in_out[1] = mode;
*length_in_out = 2;
break;
}
case (0xFF):
{
int8_t permitJoinTimeS = args_in_out[0]; //unit:s
iKonkeAfSelfPrint("###Opcode is channel(%d) JoinPermitTime(0x%X)!!\r\n",channel, permitJoinTimeS);
//路由协同组网,黄灯闪烁(OTA升级)时不协同组网闪灯
if (kLedIsBlinking(LED_ALL_ID) != true
&& permitJoinTimeS != 0
&& kNwkGetCurrentStatus() != ENS_JOINING){
iKonkeAfSelfPrint("####LED Blink\r\n");
kLedOptTrigger(LED_ALL_ID, LED_SLOW_BLINK_ON_TIME_MS, LED_SLOW_BLINK_OFF_TIME_MS,
permitJoinTimeS * 1000/(LED_SLOW_BLINK_ON_TIME_MS+LED_SLOW_BLINK_OFF_TIME_MS), LED_ON, LED_OFF);
}else if (kLedIsBlinking(LED_ALL_ID) == true
/*&& kGetOTAStatus() == OTA_NORMAL*/
&& permitJoinTimeS == 0
&& kNwkGetCurrentStatus() != ENS_JOINING){
iKonkeAfSelfPrint("####LED Blink over\r\n");
kLedOptTrigger(LED_ALL_ID, 0, 0, 0, LED_OFF, LED_IGNORE);
// kLEDOffAction(LED_ALL_ID);
kSetLedStatus(LED_ALL_ID);
}
return KET_NO_RESPONSE;
}
default: {
iKonkeAfSelfPrint("Err: opcode is not exist(%d:%X)!!\r\n", channel, opcode);
args_in_out[0] = ERR_NO_OPCODE;
......@@ -895,13 +1200,30 @@ kk_err_t kUserOODMessageIncoming(uint8_t channel, uint8_t opcode, uint8_t args_i
return KET_OK;
}
//Auth: han_frc.20220105.
static bool kEndpointIsValid(uint8_t endpoint)
{
bool ret = false;
if (endpoint == 1){
ret = true;
}else if (endpoint == 2 && (g_ucRelayTotalNum == 2 || g_ucRelayTotalNum == 3 || g_ucRelayTotalNum == 4)){
ret = true;
}else if (endpoint == 3 && (g_ucRelayTotalNum == 3 || g_ucRelayTotalNum == 4)){
ret = true;
}else if (endpoint == 4 && g_ucRelayTotalNum == 4){
ret = true;
}else if (endpoint == 0xFF){
ret = true;
}
return ret;
}
static void kLEDOffAction(LED_ID_ENUM led_id)
{
iKonkeAfSelfPrint("LED_Off_Action LED_ID (%d).\r\n", led_id);
kLedOptTrigger(led_id, 0, 0, 0, LED_OFF, LED_IGNORE);
if (kGetIndicatorNotDisturbModeFlg() == false){
iKonkeAfSelfPrint("is not NotDisturbMode.\r\n");
//iKonkeAfSelfPrint("is not NotDisturbMode.\r\n");
switch (led_id)
{
case LED1_ID:
......@@ -926,10 +1248,27 @@ static void kLEDOffAction(LED_ID_ENUM led_id)
}
case LED_ALL_ID:
{
#ifdef SINGLE_LIGHT_PANEL
kPwmDriverhandler(kPwmGetIndexByID(PWM1_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMinLevel * 65535) / 100));
#endif
#ifdef DUAL_LIGHT_PANEL
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));
#endif
#ifdef THREE_LIGHT_PANEL
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));
#endif
#ifdef FOUR_LIGHT_PANEL
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));
#endif
break;
}
default:
......@@ -968,10 +1307,27 @@ static void kLEDOnAction(LED_ID_ENUM led_id)
}
case LED_ALL_ID:
{
#ifdef SINGLE_LIGHT_PANEL
kPwmDriverhandler(kPwmGetIndexByID(PWM1_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMaxLevel * 65535) / 100) );
#endif
#ifdef DUAL_LIGHT_PANEL
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) );
#endif
#ifdef THREE_LIGHT_PANEL
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) );
#endif
#ifdef FOUR_LIGHT_PANEL
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) );
#endif
break;
}
default:
......@@ -991,13 +1347,13 @@ s32 kkSystemSetUpEventHandler(void *arg )
for (uint8_t i = 1; i <= Support_Endpoint_Num; i++){
if(st == NV_SUCC)
{
relayStatusBuffer[i-1] = g_zcl_onOffAttrs[i-1].onOff;
relayStatusBuffer[i-1] = false;
}
power_on_sync[i - 1] = true;
iKonkeAfSelfPrint("###########EP(%d), status(%d)\r\n", i, relayStatusBuffer[i-1]);
kZclClusterSetPermitReportInfo(i,CLUSTER_ONOFF_ID, false, false);
kZclClusterSetPermitReportInfo(i,CLUSTER_ONOFF_ID, false, false, false, false, NULL, RESET_ENDPOINT);
kZclOnOffClusterServerOnOffSet(i,relayStatusBuffer[i-1]);
kZclClusterSetPermitReportInfo(i,CLUSTER_ONOFF_ID, false, false);
kZclClusterSetPermitReportInfo(i,CLUSTER_ONOFF_ID, false, false, false, false, NULL, RESET_ENDPOINT);
kRelayChannelOpt(i == 1?RELAY_CHANNEL1_ID:(i == 2?RELAY_CHANNEL2_ID:(i == 3?RELAY_CHANNEL3_ID:RELAY_CHANNEL4_ID)) \
,relayStatusBuffer[i-1] == false? EZAO_OFF : EZAO_ON);
......@@ -1008,6 +1364,14 @@ s32 kkSystemSetUpEventHandler(void *arg )
#if UART_ENABLE
kInterPanMoudleInit(kUserInterPanMsgInComingPaser);
#endif
addrExt_t addr1;
zb_getLocalExtAddr(addr1);
SWAP_EUI64((uint8_t *)addr1);//取反
iKonkeAfSelfPrint("mac1 :\r\n");
iKonkeAfSelfPrintBuffer(addr1,8);
return -1;
}
......@@ -1015,14 +1379,13 @@ s32 kkSystemSetUpEventHandler(void *arg )
//老化的轮询回调函数,一般用于实现老化期间的LED闪烁或继电器翻转,也可以只LED闪烁
void kUserFactorTestPollCallback(FactoryTestStatusEnum status)
{
iKonkeAfSelfPrint("##############kUserFactorTestPollCallback status(%d)##################\r\n", status);
//iKonkeAfSelfPrint("##############kUserFactorTestPollCallback status(%d)##################\r\n", status);
static RelayOptEnum eRelayStatus = EZAO_OFF;
switch(status)
{
case FTS_NORMAL:
break;
case FTS_START:
//没有老化完需先都清除网络
break;
case FTS_AGING_15MIN:
break;
......@@ -1030,6 +1393,10 @@ void kUserFactorTestPollCallback(FactoryTestStatusEnum status)
//关闭所有的蓝色LED,有可能之前蓝灯闪烁了
LED_OPT_OFF(LED_ALL_ID);
LED_OPT_OFF(LED_RADAR_ID);
if(zb_isDeviceJoinedNwk())
zb_factoryReset();
else if(kInterPanGetEnableStatus())
kInterpanDisable();
//同步所有的LED和继电器
for (uint8_t i = 1; i <= Support_Endpoint_Num; i++){
kRelayChannelOpt(g_ucRelayIdBuff[i-1], EZAO_OFF);
......@@ -1058,22 +1425,22 @@ void kUserFactorTestPollCallback(FactoryTestStatusEnum status)
//如果有单独系统LED也需要都点亮
// LED_OPT_ON(LED_SYS_ID);
break;
case FTS_AGING_FORCE_EXIT:
iKonkeAfSelfPrint("############## FactoryTestSatus is FTS_AGING_FORCE_EXIT\r\n");
case FTS_FORCE_EXIT:
iKonkeAfSelfPrint("############## FactoryTestSatus is FTS_FORCE_EXIT\r\n");
//按键强制退老化,快闪
kLedOptTrigger(LED_ALL_ID, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_OFF_TIME_MS, BLINK_DEAD, LED_ON, LED_IGNORE);
break;
case FTS_AGING_WAITING:
case FTS_WAITING_RELEASED:
break;
case FTS_AGING_FIRST_LONG_PRESSED:
case FTS_FIRST_LONG_PRESSED:
//快闪一次,指示第一次长按有效
kLedOptTrigger(LED_ALL_ID, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_OFF_TIME_MS, 1, LED_ON, LED_IGNORE);
break;
case FTS_AGING_FORCE_REBOOT:
case FTS_FORCE_REBOOT:
SYSTEM_RESET();
break;
default:
iKonkeAfSelfPrint("##############Erro: FactoryTestSatus is not exist\r\n");
//iKonkeAfSelfPrint("##############Erro: FactoryTestSatus is not exist\r\n");
break;
}
}
......@@ -1083,7 +1450,7 @@ void kUserFactorTestPollCallback(FactoryTestStatusEnum status)
//如果初始化OTA增加callback这里处理,否则使用ota模块的默认callback,就不在这里
void kOTAMoudleUserCallback(OTAStatusEnum status)
{
#if 0
#if 1
static bool flg = false; //防止网关断电后,ota失败后会间隔快闪
iKonkeAfSelfPrint("##############kOTAMoudleUserCallback status(%d)##################\r\n", status);
switch(status)
......@@ -1091,8 +1458,6 @@ void kOTAMoudleUserCallback(OTAStatusEnum status)
case OTA_NORMAL:
break;
case OTA_START:
//关闭所有蓝色LED
// LED_OPT_OFF(LED_ALL_ID);
kLedOptTrigger(LED_ALL_ID, 2 * LED_FAST_BLINK_ON_TIME_MS, 14 * LED_FAST_BLINK_ON_TIME_MS,\
OTA_UPGRADE__CONTINUE_MAX_TIME_MS /(2 * LED_FAST_BLINK_ON_TIME_MS + 14 * LED_FAST_BLINK_ON_TIME_MS), LED_ON, LED_ON);
kSetOTAStatus(OTA_START);
......@@ -1100,19 +1465,12 @@ void kOTAMoudleUserCallback(OTAStatusEnum status)
break;
case OTA_DOWNLOAD_DONE:
{
uint8_t buffer[] = {"Konke download disable watchdog.....\r\n"};
//不能注释掉, 不然无法禁用看门狗,导致第二次连续升级卡死,认为这里是相当于加了延时
emberSerialWriteData((uint8_t)APP_SERIAL, buffer, strlen((char *)buffer));
halInternalDisableWatchDog(MICRO_DISABLE_WATCH_DOG_KEY);//add by maozj 20190308文件快下载好后禁用看门狗
kSetOTAStatus(OTA_DOWNLOAD_DONE);
break;
}
case OTA_VERITY_SUCCEED:
{
//校验成功,记录继电器状态,需要复位后恢复继电器状态
//saveRelayStatusWhenOtaSucceed(relayTotalNum);
//uint8_t relayStatus = 1;
//halCommonSetToken(TOKEN_OTA_RELAY_STATUS, &relayStatus);
//常亮5S
kLedOptTrigger(LED_ALL_ID, 25 * LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_ON_TIME_MS, 1, LED_ON, LED_ON);
kSetOTAStatus(OTA_NORMAL);
......@@ -1121,14 +1479,9 @@ void kOTAMoudleUserCallback(OTAStatusEnum status)
case OTA_FAILED:
{
if (flg != true){
halInternalWatchDogEnabled(); //使能看门狗
emberAfOtaStorageClearTempDataCallback();
kLedOptTrigger(LED_ALL_ID, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_ON_TIME_MS,\
LED_FAST_BLINK_CONTINUE_TIME_MS /(LED_FAST_BLINK_ON_TIME_MS + LED_FAST_BLINK_ON_TIME_MS), LED_ON, LED_ON);
kSetOTAStatus(OTA_NORMAL);
//uint8_t status = 0;
//halCommonSetToken(TOKEN_OTA_RELAY_STATUS, &status);
//emAfOtaClientStop(); //刚加上, 未测试,防止网关断电后,一直request 5分钟
}
flg = true;
break;
......@@ -1137,20 +1490,19 @@ void kOTAMoudleUserCallback(OTAStatusEnum status)
iKonkeAfSelfPrint("##############Err: OTA status is not exist\r\n");
break;
}
#endif
}
#endif
static ev_timer_event_t *kRadarCheckEventControl = NULL;
static ev_timer_event_t *kRadarControlLedEvent = NULL;
s32 kRadarCheckEventHandler(void *arg)
{
if (kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){
|| kGetFactoryTestStatus() == FTS_WAITING_RELEASED \
|| kGetFactoryTestStatus() == FTS_WAITING_SECOND_PRESS){
return 0;
}
......@@ -1174,13 +1526,28 @@ s32 kRadarLedEventHandler(void *arg)
{
if (kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){
|| kGetFactoryTestStatus() == FTS_WAITING_RELEASED \
|| kGetFactoryTestStatus() == FTS_WAITING_SECOND_PRESS){
return 0;
}
bool OnOffFlag = false;
#ifdef SINGLE_LIGHT_PANEL
OnOffFlag |= kZclOnOffClusterServerOnOffGet(1) == EOOS_ON?true:false;
#endif
#ifdef DUAL_LIGHT_PANEL
OnOffFlag |= kZclOnOffClusterServerOnOffGet(1) == EOOS_ON?true:false;
OnOffFlag |= kZclOnOffClusterServerOnOffGet(2) == EOOS_ON?true:false;
#endif
#ifdef THREE_LIGHT_PANEL
OnOffFlag |= kZclOnOffClusterServerOnOffGet(1) == EOOS_ON?true:false;
OnOffFlag |= kZclOnOffClusterServerOnOffGet(2) == EOOS_ON?true:false;
OnOffFlag |= kZclOnOffClusterServerOnOffGet(3) == EOOS_ON?true:false;
#endif
#ifdef FOUR_LIGHT_PANEL
OnOffFlag |= kZclOnOffClusterServerOnOffGet(1) == EOOS_ON?true:false;
//iKonkeAfSelfPrint("OnOffFlag by endpoint1 : (%d).\r\n",OnOffFlag);
OnOffFlag |= kZclOnOffClusterServerOnOffGet(2) == EOOS_ON?true:false;
......@@ -1189,6 +1556,7 @@ s32 kRadarLedEventHandler(void *arg)
//iKonkeAfSelfPrint("OnOffFlag by endpoint3 : (%d).\r\n",OnOffFlag);
OnOffFlag |= kZclOnOffClusterServerOnOffGet(4) == EOOS_ON?true:false;
//iKonkeAfSelfPrint("OnOffFlag by endpoint4 : (%d).\r\n",OnOffFlag);
#endif
if (OnOffFlag == true){
kLedOptTrigger(LED_RADAR_ID, 0, 0, 0, LED_ON, LED_IGNORE);
......@@ -1312,7 +1680,6 @@ void UartMsgProcessHandle(UMsgNodeSt *pMsgNode )
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:
......@@ -1324,6 +1691,8 @@ void UartMsgProcessHandle(UMsgNodeSt *pMsgNode )
case UART_MSG_QUERY_FACTORY_INFO_OPCODE:
case UART_MSG_ENTER_FACTORY_TEST_OPCODE:
case UART_MSG_ONOFF_SWITCH_OPCODE:
case UART_MSG_QUERY_FACTORY_STATE_OPCODE:
case UART_MSG_LED_GROUP_CONTROL_OPCODE:
kkFactoryMsgInComingPaser(pMsgNode, ECOM_PORT_UART, &send_buf);
break;
......@@ -1333,6 +1702,7 @@ void UartMsgProcessHandle(UMsgNodeSt *pMsgNode )
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_UART);
}
/* DESP: rtt command message incoming and process interface.
......@@ -1422,6 +1792,8 @@ void kUserInterPanMsgInComingPaser(UMsgNodeSt *pMsgNode)
case UART_MSG_QUERY_SWITCH_ONOFF_OPCODE:
case UART_MSG_ENTER_FACTORY_TEST_OPCODE:
case UART_MSG_ONOFF_SWITCH_OPCODE:
case UART_MSG_QUERY_FACTORY_STATE_OPCODE:
case UART_MSG_LED_GROUP_CONTROL_OPCODE:
kkFactoryMsgInComingPaser(pMsgNode, ECOM_PORT_INTERPAN, &send_buf);
break;
......
......@@ -7,7 +7,9 @@
#include "ikk-led.h"
#include "ikk-network.h"
#define ZCL_ATTRID_NoDisturbMode 0x100C
void App_Init(void);
void kZclClusterRecallSceneCallback(uint8_t endpoint, uint16_t cluster, uint8_t command_id
, bool reportEnable, bool sceneRecallFlg, bool reportGatewayEnable, bool reportChildDeviceEnable,void *param);
#endif
......@@ -54,6 +54,7 @@
#include "bdb.h"
#include "ota.h"
#include PROJECT_H
#include "ikk-ota.h"
#include "ikk-debug.h"
#include "ikk-network.h"
/**********************************************************************
......@@ -258,31 +259,34 @@ void zbdemo_bdbIdentifyCb(u8 endpoint, u16 srcAddr, u16 identifyTime){
#endif
}
#ifdef ZCL_OTA
void sampleLight_otaProcessMsgHandler(u8 evt, u8 status)
{
Tl_printf("sampleLight_otaProcessMsgHandler111111, evt = %d, status = %d\r\n", evt, status);
if(evt == OTA_EVT_START){
if(status == ZCL_STA_SUCCESS){
kOTAMoudleCallback(OTA_START);
}else{
kOTAMoudleCallback(OTA_FAILED);
}
}else if(evt == OTA_EVT_COMPLETE){
if(status == ZCL_STA_SUCCESS){
kOTAMoudleCallback(OTA_DOWNLOAD_DONE);
}else{
kOTAMoudleCallback(OTA_FAILED);
}
}else if(evt == OTA_EVT_COMPLETE){
if(status == ZCL_STA_SUCCESS){
ota_mcuReboot();
kOTAMoudleCallback(OTA_VERITY_SUCCEED);
}else{
ota_queryStart(30);
kOTAMoudleCallback(OTA_FAILED);
}
}
}
#endif
/*********************************************************************
* @fn sampleLight_leaveIndHandler
*
......
......@@ -53,6 +53,9 @@
#include "zcl_include.h"
#include PROJECT_H
#include "zcl.h"
#include "ikk-debug.h"
#include "ikk-sequence.h"
#include "ikk-cluster.h"
/**********************************************************************
* LOCAL CONSTANTS
*/
......@@ -259,35 +262,117 @@ static void sampleLight_onoff_onWithRecallGlobalSceneProcess(void)
}
typedef struct{
u16 clusterId[5];
u16 attrID[5];
}ClusterAttrID;
ClusterAttrID clusterattrid;
extern void ON_OFF_Cmd_Handler(uint8_t endpoint,bool onoff);
void zclReportCmdHandler(uint8_t ep,uint16_t cluster,zclReportCmd_t *reportInfo)
static ev_timer_event_t *kSrcEp1Multieport = NULL;
static ev_timer_event_t *kSrcEp2Multieport = NULL;
static ev_timer_event_t *kSrcEp3Multieport = NULL;
static ev_timer_event_t *kSrcEp4Multieport = NULL;
static s32 kSrcEp1MultieportEventHandler(void *arg)
{
Tl_printf("######kSrcEp1MultieportEventHandler\r\n");
kZclClusterSetPermitReportInfo(1,ZCL_CLUSTER_GEN_ON_OFF, true, false, true, true,NULL,RESET_ENDPOINT);
kOptTunnelReportingStatus(1, clusterattrid.clusterId[1], clusterattrid.attrID[1]);
return -1;
}
static s32 kSrcEp2MultieportEventHandler(void *arg)
{
Tl_printf("######kSrcEp2MultieportEventHandler\r\n");
kZclClusterSetPermitReportInfo(2,ZCL_CLUSTER_GEN_ON_OFF, true, false, true, true,NULL,RESET_ENDPOINT);
kOptTunnelReportingStatus(2, clusterattrid.clusterId[2], clusterattrid.attrID[2]);
return -1;
}
static s32 kSrcEp3MultieportEventHandler(void *arg)
{
//iKonkeAfSelfPrint("######sampleLight_zclReportCmd,attr = %d,data type=%d,data = %d\r\n",reportInfo->attrList[0].attrID,reportInfo->attrList[0].dataType,reportInfo->attrList[0].attrData[0]);
Tl_printf("######kSrcEp3MultieportEventHandler\r\n");
kZclClusterSetPermitReportInfo(3,ZCL_CLUSTER_GEN_ON_OFF, true, false, true, true,NULL,RESET_ENDPOINT);
kOptTunnelReportingStatus(3, clusterattrid.clusterId[3], clusterattrid.attrID[3]);
return -1;
}
static s32 kSrcEp4MultieportEventHandler(void *arg)
{
Tl_printf("######kSrcEp4MultieportEventHandler\r\n");
kZclClusterSetPermitReportInfo(4,ZCL_CLUSTER_GEN_ON_OFF, true, false, true, true,NULL,RESET_ENDPOINT);
kOptTunnelReportingStatus(4, clusterattrid.clusterId[4], clusterattrid.attrID[4]);
return -1;
}
extern void ON_OFF_Cmd_Handler(uint8_t endpoint,bool onoff);
void zclReportCmdHandler(uint8_t ep,uint16_t cluster,zclReportCmd_t *reportInfo,zclIncoming_t *pInHdlrMsg)
{
iKonkeAfSelfPrint("######sampleLight_zclReportCmd,attr = %d,data type=%d,data = %d\r\n",reportInfo->attrList[0].attrID,reportInfo->attrList[0].dataType,reportInfo->attrList[0].attrData[0]);
switch(cluster)
{
//当report的是子设备时进行过滤
case ZCL_CLUSTER_GEN_ON_OFF:
{
for(uint8_t i = 0;i<(reportInfo->numAttr);i++)
{
if(reportInfo->attrList[i].attrID == ZCL_ATTRID_ONOFF)
{
uint16_t sender = pInHdlrMsg->msg->indInfo.src_short_addr;
for(uint8_t i = 0;i<(reportInfo->numAttr);i++){
uint8_t dataType = reportInfo->attrList[i].dataType;
if(reportInfo->attrList[i].attrID == ZCL_ATTRID_ONOFF && dataType == ZCL_DATA_TYPE_BOOLEAN){
bool on_off_ctr = reportInfo->attrList[0].attrData[i];
ON_OFF_Cmd_Handler(ep,on_off_ctr);
if (sender != 0x0000){//sender是芯科SDK里的参数
uint8_t index = 0;
uint8_t storedSequence = kSequenceFindByNodeidAndEp(sender, pInHdlrMsg->msg->indInfo.dst_ep, &index);
iKonkeAfSelfPrint("######zclReportCmdHandler111111,sender = %d,directed endpoint = %d,seqNum = %d,storedSequence = %d\r\n", \
sender,pInHdlrMsg->msg->indInfo.dst_ep,pInHdlrMsg->hdr.seqNum,storedSequence);
//过滤seq,以免早的seq改变后来的seq状态
if (pInHdlrMsg->hdr.seqNum <= storedSequence && storedSequence - pInHdlrMsg->hdr.seqNum <= 60) {
//直接不执行当前操作
iKonkeAfSelfPrint("######zclReportCmdHandler222222\r\n");
return;
}else {
iKonkeAfSelfPrint("######zclReportCmdHandler333333\r\n");
kSequenceAdd(sender, pInHdlrMsg->msg->indInfo.dst_ep, pInHdlrMsg->hdr.seqNum);
}
}
ZclOnOffControlInfoSt ZclOnOffControlInfo;
iKonkeAfSelfPrint("Multi-ContorlWrite Attribute ep(%d) value(%d)\r\n", pInHdlrMsg->msg->indInfo.dst_ep, on_off_ctr);
switch (on_off_ctr)
{
case 0x00:
case 0x01:
{
iKonkeAfSelfPrint("!!!!!!!!!!!!!OnOffValue111111 = %d!!!!!!!!!\r\n",on_off_ctr);
ON_OFF_Cmd_Handler(ep,on_off_ctr);
addrExt_t senderEui64 = {0};
for(uint8_t i = 0;i<8;i++){
senderEui64[i] = pInHdlrMsg->msg->indInfo.src_ext_addr[i];
}
memcpy(ZclOnOffControlInfo.maskEui64Addr, senderEui64, 8);
ZclOnOffControlInfo.dest_endpoint = pInHdlrMsg->msg->indInfo.src_ep;
//采用单播上报的方式,实现多控时的单向控制
kZclClusterSetPermitReportInfo(ep, ZCL_CLUSTER_GEN_ON_OFF, true, false, false, false, ZclOnOffControlInfo.maskEui64Addr, ZclOnOffControlInfo.dest_endpoint);
clusterattrid.clusterId[ep] = ZCL_CLUSTER_GEN_ON_OFF;
clusterattrid.attrID[ep] = ZCL_ATTRID_ONOFF;
if (ep == 1){
kSrcEp1Multieport = TL_ZB_TIMER_SCHEDULE(kSrcEp1MultieportEventHandler, NULL, 50);
}else if (ep == 2){
kSrcEp2Multieport = TL_ZB_TIMER_SCHEDULE(kSrcEp2MultieportEventHandler, NULL, 50);
}else if (ep == 3){
kSrcEp3Multieport = TL_ZB_TIMER_SCHEDULE(kSrcEp3MultieportEventHandler, NULL, 50);
}else if (ep == 4){
kSrcEp4Multieport = TL_ZB_TIMER_SCHEDULE(kSrcEp4MultieportEventHandler, NULL, 50);
}
}
break;
case 0x02:
break;
default:
break;
}
}
}
break;
}
default:
break;
}
}
status_t sampleLight_onOffCb(zclIncomingAddrInfo_t *pAddrInfo, u8 cmdId, void *cmdPayload)
......
......@@ -54,6 +54,7 @@
#include "ota.h"
#include PROJECT_H
#include "ikk-debug.h"
#include "ikk-ota.h"
#include "ikk-opt-tunnel.h"
/**********************************************************************
* LOCAL CONSTANTS
......@@ -110,7 +111,7 @@ static ev_timer_event_t *identifyTimerEvt = NULL;
* @return None
*/
extern kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd);
extern void zclReportCmdHandler(uint8_t ep,uint16_t cluster,zclReportCmd_t *reportInfo);
extern void zclReportCmdHandler(uint8_t ep,uint16_t cluster,zclReportCmd_t *reportInfo,zclIncoming_t *pCmd);
void sampleLight_zclProcessIncomingMsg(zclIncoming_t *pInHdlrMsg)
{
iKonkeAfSelfPrint("######sampleLight_zclProcessIncomingMsg,cmd = %d,len=%d,\n",pInHdlrMsg->hdr.cmd,pInHdlrMsg->dataLen);
......@@ -147,7 +148,7 @@ void sampleLight_zclProcessIncomingMsg(zclIncoming_t *pInHdlrMsg)
sampleLight_zclCfgReportRspCmd(pInHdlrMsg->attrCmd);
break;
case ZCL_CMD_REPORT:
zclReportCmdHandler(ep,cluster,pInHdlrMsg->attrCmd);
zclReportCmdHandler(ep,cluster,pInHdlrMsg->attrCmd,pInHdlrMsg);
break;
#endif
case ZCL_CMD_DEFAULT_RSP:
......@@ -325,19 +326,25 @@ void sampleLight_zclIdentifyTimerStop(void)
*
* @return None
*/
typedef enum {LED_RADAR_ID = 1,LED1_ID, LED2_ID, LED3_ID, LED4_ID, LED_ALL_ID}LED_ID_ENUM;
typedef enum { LED_OFF = 0, LED_ON = 1, LED_TOGGLE, LED_IGNORE = 2 }LedOptEnum;
#define LED_SLOW_BLINK_ON_TIME_MS 800
#define LED_SLOW_BLINK_OFF_TIME_MS 800
extern void kSetLedStatus(LED_ID_ENUM id);
extern void kLedOptTrigger(uint8_t id, uint32_t duration_on_ms, uint32_t duration_off_ms, uint32_t times, LedOptEnum start, LedOptEnum end );
void sampleLight_zclIdentifyCmdHandler(u8 endpoint, u16 srcAddr, u16 identifyTime)
{
// g_zcl_identifyAttrs.identifyTime = identifyTime;
//
// if(identifyTime == 0){
// sampleLight_zclIdentifyTimerStop();
// //light_blink_stop();
// }else{
// if(!identifyTimerEvt){
// //light_blink_start(identifyTime, 500, 500);
// identifyTimerEvt = TL_ZB_TIMER_SCHEDULE(sampleLight_zclIdentifyTimerCb, NULL, 1000);
// }
// }
g_zcl_identifyAttrs->identifyTime = identifyTime;
/*if(kGetOTAStatus() == OTA_NORMAL){*/
if(identifyTime == 0){
kSetLedStatus(LED_ALL_ID);
}else{
kLedOptTrigger(LED_ALL_ID, LED_SLOW_BLINK_ON_TIME_MS, LED_SLOW_BLINK_OFF_TIME_MS,
identifyTime * 1000/(LED_SLOW_BLINK_ON_TIME_MS + LED_SLOW_BLINK_OFF_TIME_MS), LED_ON, LED_OFF);
}
/* }*/
}
/*********************************************************************
......
......@@ -146,6 +146,7 @@ static void sampleLight_sceneStoreReqHandler(uint8_t ep ,zcl_sceneEntry_t *pScen
pScene->extField[extLen++] = HI_UINT16(ZCL_CLUSTER_GEN_ON_OFF);
pScene->extField[extLen++] = 1;
pScene->extField[extLen++] = pOnOff->onOff;
Tl_printf("\r\nkZclClusterRecallSceneCallback###111111\r\n");
kZclClusterRecallSceneCallback(ep,ZCL_CLUSTER_GEN_ON_OFF,ZCL_CMD_SCENE_STORE_SCENE,true,false);
#endif
......@@ -189,6 +190,7 @@ static void sampleLight_sceneStoreReqHandler(uint8_t ep ,zcl_sceneEntry_t *pScen
status_t sampleLight_sceneCb(zclIncomingAddrInfo_t *pAddrInfo, u8 cmdId, void *cmdPayload)
{
uint8_t ep = pAddrInfo->dstEp ;
Tl_printf("\r\n###sampleLight_sceneCb111111 dirCluster = %d, cmdId = %d\r\n", pAddrInfo->dirCluster, cmdId);
if(pAddrInfo->dirCluster == ZCL_FRAME_CLIENT_SERVER_DIR){
switch(cmdId){
case ZCL_CMD_SCENE_STORE_SCENE:
......
......@@ -298,14 +298,18 @@ void kLedOptTrigger(uint8_t id, uint32_t duration_on_ms, uint32_t duration_off_m
return ;
}
// iKonkeAfSelfPrint("LED_TRIGGER[%d]: id(%d), d_on(%d), d_off(%d), times(%d), start(%d), end(%d)\r\n",
// led_index, id, duration_on_ms, duration_off_ms, times, start, end);
if(id != 1)
iKonkeAfSelfPrint("LED_TRIGGER[%d]: id(%d), d_on(%d), d_off(%d), times(%d), start(%d), end(%d)\r\n",
led_index, id, duration_on_ms, duration_off_ms, times, start, end);
g_stLedCtrller[led_index].onDuration = duration_on_ms / TICK_LOOP_NMS;
g_stLedCtrller[led_index].offDuration = duration_off_ms/ TICK_LOOP_NMS;
g_stLedCtrller[led_index].start = start;
g_stLedCtrller[led_index].end = end;
if(end == LED_IGNORE)
g_stLedCtrller[led_index].end = LED_OFF;
else
g_stLedCtrller[led_index].end = end;
if( g_stLedCtrller[led_index].start == LED_ON ) {
kLedDriverhandler(led_index, LED_ON);
......@@ -321,6 +325,7 @@ void kLedOptTrigger(uint8_t id, uint32_t duration_on_ms, uint32_t duration_off_m
if (g_pLedBlinkDoneCallback[led_index] && !bFlg[led_index]){
bFlg[led_index] = true;
g_pLedBlinkDoneCallback[led_index](id);
}
}else {
bFlg[led_index] = false;
......
......@@ -24,7 +24,7 @@ static uint8_t g_u8PwmChannelNum = 0;
pPwmActionDoneCallback g_pPwmActionDoneCallback = NULL;
static bool Pwm_Tick_Detect_Running_Flag = false;
static bool Pwm_Tick_Detect_Running_Flag[PWM_OBJS_SUPPORT_MAXN] = {0};
static ev_timer_event_t *Tick_Pwm_TimerEvt = NULL;
......@@ -80,7 +80,7 @@ uint8_t kPwmGetIndexByID(uint8_t pwm_id )
*/
void kPwmDriverhandler(uint8_t pwm_index, PwmGradientDirectionEnum st, uint16_t value)
{
Pwm_Tick_Detect_Running_Flag = false;
Pwm_Tick_Detect_Running_Flag[pwm_index] = false;
if (pwm_index >= g_u8PwmChannelNum){
iKonkeAfSelfPrint("####kPwmDriverhandler index is too large\r\n");
......@@ -174,8 +174,8 @@ void kPwmOptTrigger(uint8_t id, uint32_t start_value, uint32_t end_value, uint32
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);
if(!Pwm_Tick_Detect_Running_Flag) {
Pwm_Tick_Detect_Running_Flag = true;
if(!Pwm_Tick_Detect_Running_Flag[pwm_index]) {
Pwm_Tick_Detect_Running_Flag[pwm_index] = true;
}
}
/* DESP: single LED instance register interface.
......@@ -253,15 +253,18 @@ kk_err_t kPwmModuleInit(PwmConfSt pwmlist[], unsigned char pwm_number, pPwmActio
}
static s32 kPwmGradientChangeEventHandler(void *data)
{
if(!Pwm_Tick_Detect_Running_Flag)
return 0;
for (uint8_t i = 0; i < g_u8PwmChannelNum; i++){
//iKonkeAfSelfPrint("PwmChange,flag = %d,Counter = %d,i = %d\r\n",Pwm_Tick_Detect_Running_Flag[i],g_stPwmCtrller[i].actionCounter,i);
if(!Pwm_Tick_Detect_Running_Flag[i]){
continue;
}
if (g_stPwmCtrller[i].actionCounter > 0){
if (g_stPwmCtrller[i].startDutyCycle > g_stPwmCtrller[i].endDutyCycle){
g_stPwmCtrller[i].actionCounter--;
g_stPwmCtrller[i].startDutyCycleValue -= g_stPwmCtrller[i].intervalDutyCycle;
pwmSetDuty(g_stPwmCtrller[i].gpioInfo.pwmChannel,g_stPwmCtrller[i].startDutyCycleValue);
//iKonkeAfSelfPrint("PwmChange,Counter = %d\r\n",g_stPwmCtrller[i].actionCounter);
} else if (g_stPwmCtrller[i].startDutyCycle < g_stPwmCtrller[i].endDutyCycle){
g_stPwmCtrller[i].actionCounter--;
g_stPwmCtrller[i].startDutyCycleValue += g_stPwmCtrller[i].intervalDutyCycle;
......@@ -272,7 +275,6 @@ static s32 kPwmGradientChangeEventHandler(void *data)
if (g_stPwmCtrller[i].actionCounter == 0){
//may be end duty cycle not equal, restore end duty cycle
pwmSetDuty(g_stPwmCtrller[i].gpioInfo.pwmChannel,g_stPwmCtrller[i].endDutyCycle);
if (g_pPwmActionDoneCallback){
PwmGradientDirectionEnum opt = ELP_OPT_DEFAULT;
if (g_stPwmCtrller[i].startDutyCycle > g_stPwmCtrller[i].endDutyCycle){
......
......@@ -23,7 +23,6 @@ static pClusterAttributeChangeCallback pOnOffClusterCallback = NULL;
//static pClusterAttributeChangeCallback pLevelClusterCallback = NULL;
//static pClusterAttributeChangeCallback pColorClusterCallback = NULL;
static status_t WriteServerAttribute(u8 endpoint, u16 clusterId,uint8_t attributeID,uint8_t* dataPtr, uint8_t data_type);
typedef struct {
ZclReportTableSt g_stZclReportPermitList[ENDPOINT_MAXN * CLUSTER_MAXN];
......@@ -202,11 +201,6 @@ void Update_Local_Attribute_Info(void)
Rewrite_ManufactureName();
}
typedef struct{
zcl_basicAttr_t basicAttrs_temp;
zcl_identifyAttr_t identifyAttrs_temp;
......@@ -295,6 +289,8 @@ void kZclClusterPermitReportTableInit(BindObjSt clusterBindList[], uint8_t size)
g_stZclClusterReportPermitTable.g_stZclReportPermitList[i].cluster = clusterBindList[i].cluster;
g_stZclClusterReportPermitTable.g_stZclReportPermitList[i].reportEnable = false;
g_stZclClusterReportPermitTable.g_stZclReportPermitList[i].sceneRecallFlg = false;
g_stZclClusterReportPermitTable.g_stZclReportPermitList[i].reportGatewayEnable = false;
g_stZclClusterReportPermitTable.g_stZclReportPermitList[i].reportChildDeviceEnable = false;
}
g_stZclClusterReportPermitTable.size = size;
}
......@@ -326,13 +322,15 @@ bool kZclClusterGetPermitReportInfo(uint8_t endpoint, uint16_t cluster, ZclRepor
zclReportPermit->cluster = g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].cluster;
zclReportPermit->reportEnable = g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].reportEnable;
zclReportPermit->sceneRecallFlg = g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].sceneRecallFlg;
zclReportPermit->reportGatewayEnable = g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].reportGatewayEnable;
zclReportPermit->reportChildDeviceEnable = g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].reportChildDeviceEnable;
return true;
}
return false;
}
//permit info set
bool kZclClusterSetPermitReportInfo(uint8_t endpoint, uint16_t cluster, bool reportEnable, bool sceneRecallFlg)
bool kZclClusterSetPermitReportInfo(uint8_t endpoint, uint16_t cluster, bool reportEnable, bool sceneRecallFlg, bool reportGatewayEnable, bool reportChildDeviceEnable, uint8_t *maskEui64Addr,uint8_t dest_endpoint)
{
bool ret = false;
......@@ -347,6 +345,14 @@ bool kZclClusterSetPermitReportInfo(uint8_t endpoint, uint16_t cluster, bool rep
if (index != 0xFF){
g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].reportEnable = reportEnable;
g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].sceneRecallFlg = sceneRecallFlg;
g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].reportGatewayEnable = reportGatewayEnable;
g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].reportChildDeviceEnable = reportChildDeviceEnable;
if (maskEui64Addr != NULL){
memcpy(g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].maskEui64Addr, maskEui64Addr, 8);
} else {
memset(g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].maskEui64Addr, 0xFF, 8);
}
g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].dest_endpoint = dest_endpoint;
ret = true;
}
}else { //㲥
......@@ -356,6 +362,14 @@ bool kZclClusterSetPermitReportInfo(uint8_t endpoint, uint16_t cluster, bool rep
if (index != 0xFF){
g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].reportEnable = reportEnable;
g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].sceneRecallFlg = sceneRecallFlg;
g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].reportGatewayEnable = reportGatewayEnable;
g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].reportChildDeviceEnable = reportChildDeviceEnable;
if (maskEui64Addr != NULL){
memcpy(g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].maskEui64Addr, maskEui64Addr, 8);
} else {
memset(g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].maskEui64Addr, 0xFF, 8);
}
g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].dest_endpoint = dest_endpoint;
ret = true;
}
}
......@@ -377,9 +391,10 @@ kk_err_t kZclOnOffClusterServerInit(pOnOffClusterOnOffStatusCallback pOnOffStatu
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);
kZclClusterSetPermitReportInfo(endpoint,ZCL_CLUSTER_GEN_ON_OFF,true,false,true,true,NULL,RESET_ENDPOINT);
kZclOnOffClusterServerOnOffControl(endpoint, on_off_ctr);
}
/* DESP: Modified attribute reporting interface, reference from SDK callback[emberAfReportingAttributeChangeCallback].
* Auth: dingmz_frc.20190701.
* */
......@@ -388,6 +403,7 @@ void kOptTunnelReportingPlagiarizeOriginal(uint8_t endpoint, uint16_t clusterId,
if(!zb_bindingTblSearched(clusterId,endpoint)){
return;
}
iKonkeAfSelfPrint("######kOptTunnelReportingPlagiarizeOriginal111111\r\n");
for(u8 i = 0; i < ZCL_REPORTING_TABLE_NUM; i++){
reportCfgInfo_t *pEntry = &reportingTab.reportCfgInfo[i];
if( pEntry->endPoint == endpoint
......@@ -404,6 +420,7 @@ void kOptTunnelReportingPlagiarizeOriginal(uint8_t endpoint, uint16_t clusterId,
ZB_EXCEPTION_POST(SYS_EXCEPTTION_ZB_ZCL_ENTRY);
return;
}
u16 len = zcl_getAttrSize(pAttrEntry->type, pAttrEntry->data);
len = (len>8) ? (8):(len);
......@@ -415,5 +432,43 @@ void kOptTunnelReportingPlagiarizeOriginal(uint8_t endpoint, uint16_t clusterId,
pEntry->clusterID, pAttrEntry->id, pAttrEntry->type, pAttrEntry->data);
}
}
}
void kOptTunnelReportingStatus(uint8_t endpoint, uint16_t clusterId, uint16_t attributeId )
{
if(!zb_bindingTblSearched(clusterId,endpoint)){
return;
}
iKonkeAfSelfPrint("######kOptTunnelReportingStatus111111\r\n");
for(u8 i = 0; i < ZCL_REPORTING_TABLE_NUM; i++){
reportCfgInfo_t *pEntry = &reportingTab.reportCfgInfo[i];
if( pEntry->endPoint == endpoint
&& pEntry->clusterID == clusterId
&& pEntry->attrID == attributeId) {
epInfo_t dstEpInfo;
TL_SETSTRUCTCONTENT(dstEpInfo, 0);
dstEpInfo.dstAddrMode = APS_SHORT_DSTADDR_WITHEP;
dstEpInfo.dstEp = 0x01;
dstEpInfo.dstAddr.shortAddr = 0x0000;
dstEpInfo.profileId = pEntry->profileID;
dstEpInfo.txOptions = 0;
dstEpInfo.radius = 0;
zclAttrInfo_t *pAttrEntry = zcl_findAttribute(pEntry->endPoint, pEntry->clusterID, pEntry->attrID);
if(!pAttrEntry){
//should not happen.
ZB_EXCEPTION_POST(SYS_EXCEPTTION_ZB_ZCL_ENTRY);
return;
}
u16 len = zcl_getAttrSize(pAttrEntry->type, pAttrEntry->data);
len = (len>8) ? (8):(len);
//store for next compare
memcpy(pEntry->prevData, pAttrEntry->data, len);
zcl_sendReportCmd(pEntry->endPoint, &dstEpInfo, TRUE, ZCL_FRAME_SERVER_CLIENT_DIR,
pEntry->clusterID, pAttrEntry->id, pAttrEntry->type, pAttrEntry->data);
}
}
}
......@@ -9,9 +9,20 @@
#include "zcl.h"
#include "ikk-network.h"
typedef struct {
uint8_t endpoint;
uint8_t onOffValue;
bool isMultiContorl; //whether multi-control, used to judge whether send response or multi-control
bool isSendResponse;
addrExt_t maskEui64Addr;
uint8_t dest_endpoint;
}ZclOnOffControlInfoSt;
typedef enum{ EOOS_OFF = 0, EOOS_ON, EOOS_UNKNOW }OnOffStatusEnum;
typedef enum{ EOOC_OFF = 0, EOOC_ON, EOOC_TOGGLE, EOOC_UNKNOW }OnOffCtrlEnum;
#define RESET_ENDPOINT 0xFE
#define ZCL_CMD_ONOFF_OFF 0x00
#define ZCL_CMD_ONOFF_ON 0x01
#define ZCL_CMD_ONOFF_TOGGLE 0x02
......@@ -19,12 +30,15 @@ typedef enum{ EOOC_OFF = 0, EOOC_ON, EOOC_TOGGLE, EOOC_UNKNOW }OnOffCtrlEnum;
#define ZCL_ONOFF_STATUS_OFF 0x00
#define ZCL_ONOFF_STATUS_ON 0x01
typedef struct tag_zcl_report_table{
uint8_t endpoint;
uint16_t cluster;
bool reportEnable;
bool sceneRecallFlg;
bool reportGatewayEnable;
bool reportChildDeviceEnable;
addrExt_t maskEui64Addr;
uint8_t dest_endpoint;
}ZclReportTableSt;
#define MAX_ATTR_CHANGE_SUPPORT_NUMS 8
......@@ -61,7 +75,9 @@ kk_err_t kZclOnOffClusterServerOnOffControl(uint8_t endpoint, OnOffCtrlEnum ctrl
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 kOptTunnelReportingStatus(uint8_t endpoint, uint16_t clusterId, uint16_t attributeId );
void kZclClusterPermitReportTableInit(BindObjSt clusterBindList[], uint8_t size);
bool kZclClusterGetPermitReportInfo(uint8_t endpoint, uint16_t cluster, ZclReportTableSt *zclReportPermit);
bool kZclClusterSetPermitReportInfo(uint8_t endpoint, uint16_t cluster, bool reportEnable, bool sceneRecallFlg);
bool kZclClusterSetPermitReportInfo(uint8_t endpoint, uint16_t cluster, bool reportEnable, bool sceneRecallFlg
, bool reportGatewayEnable, bool reportChildDeviceEnable, uint8_t *maskEui64Addr, uint8_t dest_endpoint);
#endif /* _SAMPLE_LIGHT_H_ */
......@@ -56,7 +56,7 @@ uint16_t kCmdGetMsgCrc16Value( uint8_t* msg, uint8_t len)
/* DESP: remap opcode, arg direction 0: FCC0->AA55 1:AA55->FCC0
* Auth:
* */
uint16_t kCmdOpcodeRemap(uint16_t Opcode, uint8_t direction)
static 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) {
......@@ -66,7 +66,6 @@ uint16_t kCmdOpcodeRemap(uint16_t Opcode, uint8_t direction)
return 0xFFFF;
}
kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st *pDataOut)
{
//UMsgNodeSt uMsgNode = {0};
......@@ -144,7 +143,7 @@ kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st
//check install code length 20200725
uint8_t length = data.u8ARG[0];
if (length != 16) {
if (length != 16) {//如果不是16位的数据就不做任何改变,只回复
send_buf.u8ARG[0] = ERR_FORMAT;
send_buf.u8ARG[1] = data.u8ARG[0];
memcpy(&send_buf.u8ARG[2], &data.u8ARG[1], length);
......@@ -247,9 +246,9 @@ kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st
memset(buffer, 0, 33);
uint8_t *data = ISN_TOKEN_GET();
iKonkeAfSelfPrint("len %x\r\n",data[0]);
iKonkeAfSelfPrintBuffer(data+1,32);
length = data[0];
iKonkeAfSelfPrint("read ISN len %x\r\n",data[0]);
iKonkeAfSelfPrintBuffer(data+1,32);
memcpy(buffer,data,length +1);
if(length > 32) {
......@@ -268,7 +267,7 @@ kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st
{
uint8_t mac_length = 0x00;
addrExt_t addr,local_addr;
flash_read(CFG_MAC_ADDRESS,8,(uint8_t*)local_addr);
zb_getLocalExtAddr(local_addr);
mac_length = data.u8ARG[0];
if (mac_length != 8) {
......@@ -293,8 +292,7 @@ kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st
case (UART_MSG_READ_MAC_CODE_OPCODE)://ok
{
addrExt_t addr;
flash_read(CFG_MAC_ADDRESS,8,(uint8_t*)addr);
// zb_getLocalExtAddr(addr);
zb_getLocalExtAddr(addr);
send_buf.u8ARG[0] = 0x00;
send_buf.u8ARG[1] = 0x08;
......@@ -403,82 +401,48 @@ kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st
}
case (UART_MSG_WRITE_INTERPAN_PARA_OPCODE):
{
extern void GetInterpanPara(uint8_t *enable, uint8_t *channel, uint16_t *panId);
uint8_t enable = 0;
uint16_t panId = 0;
uint8_t channel = 0;
int8_t radioTxPower = 0;
uint16_t panId = 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);
GetInterpanPara(&enable, &channel, &panId);
SetInterpanPara(channel,panId,enable);
send_buf.u8ARG[0] = ERR_OK;
memcpy(&send_buf.u8ARG[1], &data.u8ARG[0], data.u8ArgLen);
send_buf.u8ARG[1] = 0xff;
send_buf.u8ARG[2] = channel;
send_buf.u8ARG[3] = HI_UINT16(panId);
send_buf.u8ARG[4] = LO_UINT16(panId);
send_buf.u8ArgLen = 5;
reply_control_field = Z_TO_H_NO_ACK;
break;
}
send_buf.u8ArgLen = data.u8ArgLen + 1;
case (UART_MSG_READ_INTERPAN_PARA_OPCODE):
{
extern void GetInterpanPara(uint8_t *enable, uint8_t *channel, uint16_t *panId);
uint8_t enable = 0;
uint8_t channel = 0;
uint16_t panId = 0;
GetInterpanPara(&enable, &channel, &panId);
send_buf.u8ARG[0] = ERR_OK;
send_buf.u8ARG[1] = enable;
send_buf.u8ARG[2] = channel;
send_buf.u8ARG[3] = HI_UINT16(panId);
send_buf.u8ARG[4] = LO_UINT16(panId);
send_buf.u8ArgLen = 5;
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
{
......
......@@ -34,7 +34,6 @@ typedef struct{
}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);
......
......@@ -2,7 +2,7 @@
#define __IKONKE_MODULE_DEBUG_H______________________________
#define IKONKE_DEBUG_LOG_ENABLE (0) // ENABLE
#define IKONKE_DEBUG_LOG_ENABLE (1) // ENABLE
#define PROMPT_DSR ""
......
......@@ -3,16 +3,30 @@
#include "ikk-token.h"
#include "ikk-common-utils.h"
#include "../driver/ikk-button.h"
#include "../driver/ikk-led.h"
#include "../driver/ikk-relay.h"
#include "ikk-cluster.h"
#include "ikk-command.h"
#define AGING_TEST_15MIN_VALUE 0xA1
#define AGING_TEST_4HOU_VALUE 0xA2
#define AGINE_TEST_DONE_VALUE 0xFA
//已经置老化标志
#define SINGLE_BOARD_TEST_DONE_VALUE 0xF1 //锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷
#define FULL_DEVICE_TEST_DONE_VALUE 0xF2 //锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟?
#define FORCE_FACTORY_TEST_VALUE 0xF8 //锟斤拷锟斤拷锟斤拷锟斤拷锟角匡拷锟斤拷顺锟?
#define SINGLE_BOARD_TEST_DONE_VALUE 0xF1
#define FULL_DEVICE_TEST_DONE_VALUE 0xF2
#define FORCE_FACTORY_TEST_VALUE 0xF8
#define TEST_INIT_VALUE 0xFF
#define LED_SLOW_BLINK_ON_TIME_MS 800
#define LED_SLOW_BLINK_OFF_TIME_MS 800
#define LED_FAST_BLINK_ON_TIME_MS 200
#define LED_FAST_BLINK_OFF_TIME_MS 200
#define LED_SLOW_BLINK_CONTINUE_TIME_MS (60 * 1000)
#define LED_FAST_BLINK_CONTINUE_TIME_MS (5 * 1000)
u8 g_u8NetworkSteeringChannel = 20;
u16 g_u16NetworkSteeringPanId = 0xFFFF;
static ev_timer_event_t *kFactoryTestEvt = NULL;
s32 kFactoryTestEventHandler(void *arg);
......@@ -28,17 +42,20 @@ 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;
typedef enum{FT_SINGLE_BOARD_TEST=0x01, FT_FULL_DEVICE_TEST=0x02, FT_NORMAL_DONE=0x04, FT_FORCE_EXIT=0x08, FT_AGING_DONE = 0X10,}FT_STATUS;
extern LedConfSt g_ledConfList;
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}};
static FactoryTestStatusEnum g_eFactoryTestStatus = FTS_NORMAL;
FactoryTestStatusEnum g_eFactoryTestStatus = FTS_NORMAL;
static FactoryTestStatusEnum g_eLastFactoryTestStatus = FTS_NORMAL;
static uint32_t g_u32AgingTotalTimeMS = 0;
static uint32_t g_u32AgingMaxTimeMS = 0;
static pFactoryTestPollCallback g_pFactoryTestPollCallback = NULL;
static uint8_t g_u8LongPressedKeyIndex = 0;
static uint32_t g_u32Count = 0;
static uint8_t g_u8FactoryTestLedId = LED_UNKNOW_ID; //just for single board test or full device test
/* DESP: get the test index by id.
* Auth: mazj.20200227.
* */
......@@ -102,6 +119,10 @@ uint8_t kGetFactoryTestValueStatus(void)
status = status | FT_FORCE_EXIT;
}else if (kGetSingleBoardValue() != SINGLE_BOARD_TEST_DONE_VALUE) {
status = status | FT_SINGLE_BOARD_TEST;
}else {
#if !Z30_DEVICE_FULL_DEVICE_ENBALE
status = status | FT_NORMAL_DONE;
#endif
}
#endif
......@@ -109,12 +130,17 @@ uint8_t kGetFactoryTestValueStatus(void)
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_FULL_DEVICE_TEST;//没过整机时该标志位是1,单板整机都过的时候第三位bit为1,最后两个bit位为0
}else {
status = status | FT_NORMAL_DONE;
}
#endif
#if Z30_DEVICE_AGING_ENABLE
if (kGetAgingTestValue() != AGINE_TEST_DONE_VALUE) {
status = status | FT_AGING_DONE;
}
#endif
return status;
}
nv_sts_t General_Set_Factory_Test(nv_item_t items,uint8_t value)
......@@ -157,15 +183,34 @@ void kFactoryTestBtnActionCallback(unsigned char button_id, BtnActionEnum actio
g_stFactoryTestControllerList[u8FactoryTestIndex].eCurrentBtnAction = action;
//松手复位,触摸按键长时间按着也会自动松手
if (g_eFactoryTestStatus == FTS_AGING_WAITING && g_stFactoryTestControllerList[g_u8LongPressedKeyIndex].eCurrentBtnAction == EBA_RELEASED){
g_eFactoryTestStatus = FTS_AGING_FORCE_REBOOT;
if ((g_eFactoryTestStatus == FTS_WAITING_RELEASED || g_eFactoryTestStatus == FTS_FORCE_EXIT) && g_stFactoryTestControllerList[g_u8LongPressedKeyIndex].eCurrentBtnAction == EBA_RELEASED){
g_eFactoryTestStatus = FTS_FORCE_REBOOT;
g_u32Count = FACTORY_TEST_POLL_TIMES; //快点执行自定义函数
iKonkeAfSelfPrint("######33333333333333333 FactoryTest Released\r\n");
iKonkeAfSelfPrint("FactoryTest Released\r\n");
}
}
}
}
static uint16_t opcodeReampTable[][2] =
{
//FCC0, AA55
{0xF0, 0xED14},//打开产测
{0xF1, 0xED04},//退出产测
{0xF2, 0xED05},//查询产测(按bit位)
{0xF8, 0xED16},//查询产测(按字节)
};
static 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 kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st *pDataOut)
{
//UMsgNodeSt uMsgNode = {0};
......@@ -239,13 +284,23 @@ kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataFie
case (UART_MSG_QUERY_DEVICE_VERSION_OPCODE):
{
send_buf.u8ARG[0] = ERR_OK;
uint8_t hardversion = 0;
uint8_t softversion = 0;
status_t status;
zclAttrInfo_t *hwattrInfo = ReadServerAttribute(1,ZCL_CLUSTER_GEN_BASIC,ZCL_ATTRID_BASIC_HW_VER,&status);
hardversion = hwattrInfo->data[0];
iKonkeAfSelfPrint("hardversion = %x\r\n",hwattrInfo->data[0]);
zclAttrInfo_t *appattrInfo = ReadServerAttribute(1,ZCL_CLUSTER_GEN_BASIC,ZCL_ATTRID_BASIC_APP_VER,&status);
softversion = appattrInfo->data[0];
iKonkeAfSelfPrint("softversion = %x\r\n",appattrInfo->data[0]);
//wait to do
send_buf.u8ARG[1] = 0x20;
send_buf.u8ARG[2] = 0x20;
send_buf.u8ARG[1] = hardversion;
send_buf.u8ARG[2] = softversion;
send_buf.u8ARG[3] = 0XFF;
send_buf.u8ARG[4] = 0XFF;
send_buf.u8ARG[0] = ERR_OK;;
send_buf.u8ARG[0] = ERR_OK;
send_buf.u8ArgLen = 5;
reply_control_field = Z_TO_H_NO_ACK;
break;
......@@ -272,26 +327,27 @@ kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataFie
}
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;
g_eFactoryTestStatus = FTS_SINGLE_BOARD_TEST_DONE;
//单板结束,一直快闪
kLedOptTrigger(g_u8FactoryTestLedId, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_OFF_TIME_MS, BLINK_DEAD, LED_ON, LED_ON);
}
if(data.u8ARG[0]&0x02)
{
kSetFullDeviceValue(FULL_DEVICE_TEST_DONE_VALUE);
iKonkeAfSelfPrint("######kGetFullBoardValue(%02x)\r\n", token_data);
send_buf.u8ARG[0] = ERR_OK;
g_eFactoryTestStatus = FTS_FULL_DEVICE_TEST_DONE;
//整机结束,一直快闪
kLedOptTrigger(g_u8FactoryTestLedId, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_OFF_TIME_MS, BLINK_DEAD, LED_ON, LED_ON);
}
if( (data.u8ARG[0]&0x03 == 0x03)||(data.u8ARG[0]&0x04 == 0x04) )
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;
//g_eFactoryTestStatus = FTS_AGING_DONE;//指令退老化和正常4h退老化区分
}
send_buf.u8ARG[1] = data.u8ARG[0];
send_buf.u8ArgLen = 2;
......@@ -307,7 +363,7 @@ kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataFie
iKonkeAfSelfPrint("######UART_MSG_QUERY_FACTORY_INFO_OPCODE(%d)\r\n", send_buf.u8ArgLen);
break;
}
case UART_MSG_QUERY_SWITCH_ONOFF_OPCODE:
case (UART_MSG_QUERY_SWITCH_ONOFF_OPCODE):
{
extern uint8_t Key_Press_Test_Flag[5];
for (uint8_t i = 0; i < 6; i++){
......@@ -342,25 +398,116 @@ kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataFie
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;
case UART_MSG_ONOFF_SWITCH_OPCODE: {
uint8_t err = 0;
if (data.u8ARG[0] == 0x01) {
for (uint8_t i = 1; i < 9; i++) {
if (data.u8ARG[i] == 0x00) { // on
kZclOnOffClusterServerOnOffControl(i, EOOC_OFF);
} else if (data.u8ARG[i] == 0x01) {
kZclOnOffClusterServerOnOffControl(i, EOOC_ON);
}
}
}
//get onoff state
for (uint8_t i = 1; i < 9; i++) {
err = kZclOnOffClusterServerOnOffGet(i);
send_buf.u8ARG[i] = (err == EOOS_ON)?1:(err == EOOS_UNKNOW?0xFF:0);
}
send_buf.u8ARG[0] = ERR_OK;
memcpy(&send_buf.u8ARG[1], &data.u8ARG[1], 8);
send_buf.u8ArgLen = 10;
send_buf.u8ArgLen = 9;
break;
}
//Auth: han_frc.20220105.
case UART_MSG_QUERY_FACTORY_STATE_OPCODE: {
uint8_t factoryTest = 0;
uint8_t singleBoardTest = 0;
uint8_t fullDeviceTest = 0;
uint8_t agingTest = 0;
singleBoardTest = kGetSingleBoardValue();
fullDeviceTest = kGetFullDeviceValue();
agingTest = kGetAgingTestValue();
if (((singleBoardTest == FORCE_FACTORY_TEST_VALUE) || (singleBoardTest == SINGLE_BOARD_TEST_DONE_VALUE)) \
&& ((fullDeviceTest == FULL_DEVICE_TEST_DONE_VALUE) || (fullDeviceTest == SINGLE_BOARD_TEST_DONE_VALUE))) {
factoryTest = 0x00;
} else {
factoryTest = 0x01;
}
#if Z30_DEVICE_SINGLE_BOARD_ENABLE
if (singleBoardTest == SINGLE_BOARD_TEST_DONE_VALUE) {
singleBoardTest = 0x01;
} else if (singleBoardTest == FORCE_FACTORY_TEST_VALUE) {
singleBoardTest = 0x02;
} else {
singleBoardTest = 0x00;
}
#else
singleBoardTest = 0xff;
#endif
#if Z30_DEVICE_FULL_DEVICE_ENBALE
if (fullDeviceTest == FULL_DEVICE_TEST_DONE_VALUE) {
fullDeviceTest = 0x01;
} else if (fullDeviceTest == FORCE_FACTORY_TEST_VALUE) {
fullDeviceTest = 0x02;
} else {
fullDeviceTest = 0x00;
}
#else
fullDeviceTest = 0xff;
#endif
#if Z30_DEVICE_AGING_ENABLE
if (agingTest == AGINE_TEST_DONE_VALUE) {
agingTest = 0x01;
} else if (agingTest == FORCE_FACTORY_TEST_VALUE) {
agingTest = 0x02;
} else {
agingTest = 0x00;
}
#else
agingTest = 0xff;
#endif
send_buf.u8ARG[0] = ERR_OK;
send_buf.u8ARG[1] = factoryTest;
send_buf.u8ARG[2] = singleBoardTest;
send_buf.u8ARG[3] = fullDeviceTest;
send_buf.u8ARG[4] = agingTest;
send_buf.u8ArgLen = 5;
break;
}
//Auth: han_frc.20220105.
case UART_MSG_LED_GROUP_CONTROL_OPCODE: {
for (uint8_t i = 5; i < 9; i++){
if(data.u8ARG[i] != 0x00){
send_buf.u8ARG[0] = ERR_EXEC_FAILED;
}
}
for (uint8_t i = 0; i < 5; i++){
if(data.u8ARG[i] == 0x81){
if(send_buf.u8ARG[0] != ERR_EXEC_FAILED){
LED_OPT_ON(i+1);
send_buf.u8ARG[0] = ERR_OK;
}
}else if(data.u8ARG[i] == 0x80){
if(send_buf.u8ARG[0] != ERR_EXEC_FAILED){
LED_OPT_OFF(i+1);
send_buf.u8ARG[0] = ERR_OK;
}
}else{
if(data.u8ARG[i] == 0x00 && send_buf.u8ARG[0] != ERR_EXEC_FAILED){
send_buf.u8ARG[0] = ERR_OK;
}else{
send_buf.u8ARG[0] = ERR_EXEC_FAILED;
}
}
}
send_buf.u8ArgLen = 1;
break;
}
default:
......@@ -381,9 +528,11 @@ kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataFie
}
}
void kFactoryTestInit(pFactoryTestPollCallback callback, FactoryTestConfSt conf_list[], uint8_t btn_num)
void kFactoryTestInit(pFactoryTestPollCallback callback, FactoryTestConfSt conf_list[], uint8_t btn_num,uint8_t led_id)
{
g_eFactoryTestStatus = FTS_NORMAL;
#if FACTORY_TEST_ENABLE
iKonkeAfSelfPrint("######kFactoryTestInit11111111111111111111111111111111111111\r\n");
if(NULL == callback || NULL == conf_list || btn_num > AGING_EXIT_MAX_BTN_NUM) {
return;
}
......@@ -397,25 +546,73 @@ void kFactoryTestInit(pFactoryTestPollCallback callback, FactoryTestConfSt conf_
iKonkeAfSelfPrint("######g_stFactoryTestControllerList[0].u8BtnId= %d u8BtnLongPressTimes = %d\r\n", g_stFactoryTestControllerList[0].u8BtnId, g_stFactoryTestControllerList[0].u8BtnLongPressTimes);
iKonkeAfSelfPrint("######g_stFactoryTestControllerList[1].u8BtnId= %d u8BtnLongPressTimes = %d\r\n", g_stFactoryTestControllerList[1].u8BtnId, g_stFactoryTestControllerList[1].u8BtnLongPressTimes);
if (kGetAgingTestValue() != AGINE_TEST_DONE_VALUE){
#if Z30_DEVICE_SINGLE_BOARD_ENABLE //优先级 单板 老化 整机
if ((g_eFactoryTestStatus == FTS_NORMAL) && (kGetSingleBoardValue() != SINGLE_BOARD_TEST_DONE_VALUE) \
&& (kGetSingleBoardValue() != FORCE_FACTORY_TEST_VALUE)){
kBtnaIRQCallbackRegister(kFactoryTestBtnActionCallback);
g_eFactoryTestStatus = FTS_SINGLE_BOARD_TEST;
g_pFactoryTestPollCallback = callback;
g_u8FactoryTestLedId = led_id;
if(kFactoryTestEvt){
TL_ZB_TIMER_CANCEL(&kFactoryTestEvt);
}
kFactoryTestEvt = TL_ZB_TIMER_SCHEDULE(kFactoryTestEventHandler, NULL, 1000);
}
#endif
#if Z30_DEVICE_AGING_ENABLE
if ((g_eFactoryTestStatus == FTS_NORMAL) && (kGetAgingTestValue() != AGINE_TEST_DONE_VALUE) \
&& (kGetAgingTestValue() != FORCE_FACTORY_TEST_VALUE)){
kSetAgingTestValue(AGING_TEST_15MIN_VALUE);
kBtnaIRQCallbackRegister(kFactoryTestBtnActionCallback);
g_eFactoryTestStatus = FTS_START;
//启动老化事件
g_pFactoryTestPollCallback = callback;
g_u8FactoryTestLedId = led_id;
g_u32AgingTotalTimeMS = 0;
//load aging time
g_u32AgingMaxTimeMS = kGetAgingMaxTime();
if(kFactoryTestEvt){
TL_ZB_TIMER_CANCEL(&kFactoryTestEvt);
}
kFactoryTestEvt = TL_ZB_TIMER_SCHEDULE(kFactoryTestEventHandler, NULL, 1000);
g_eFactoryTestStatus = FTS_START;
}else {
g_eFactoryTestStatus = FTS_NORMAL;
}
kBtnaIRQCallbackRegister(kFactoryTestBtnActionCallback);
g_pFactoryTestPollCallback = callback;
g_u32AgingTotalTimeMS = 0;
// g_u8AgingForceExitBtnId = btn_id;
#endif
#if Z30_DEVICE_FULL_DEVICE_ENBALE
if ((g_eFactoryTestStatus == FTS_NORMAL) && (kGetFullDeviceValue() != FULL_DEVICE_TEST_DONE_VALUE) \
&& (kGetFullDeviceValue() != FORCE_FACTORY_TEST_VALUE)){
kBtnaIRQCallbackRegister(kFactoryTestBtnActionCallback);
g_eFactoryTestStatus = FTS_FULL_DEVICE_TEST;
g_pFactoryTestPollCallback = callback;
g_u8FactoryTestLedId = led_id;
if(kFactoryTestEvt){
TL_ZB_TIMER_CANCEL(&kFactoryTestEvt);
}
kFactoryTestEvt = TL_ZB_TIMER_SCHEDULE(kFactoryTestEventHandler, NULL, 1000);
}
#endif
iKonkeAfSelfPrint("\r\n######kFactoryTestInit status1111111111111111111111111(%d)\r\n", g_eFactoryTestStatus);
//led indicate
if (g_eFactoryTestStatus == FTS_SINGLE_BOARD_TEST) {
kLedOptTrigger(g_u8FactoryTestLedId, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_OFF_TIME_MS, 1, LED_ON, LED_OFF);
} else if (g_eFactoryTestStatus == FTS_FULL_DEVICE_TEST) {
kLedOptTrigger(g_u8FactoryTestLedId, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_OFF_TIME_MS, 2, LED_ON, LED_OFF);
} else if (g_eFactoryTestStatus == FTS_START) {
kLedOptTrigger(g_u8FactoryTestLedId, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_OFF_TIME_MS, 3, LED_ON, LED_OFF);
}
#else
uint8_t value = TEST_INIT_VALUE;
kSetAgingTestValue(value);
kSetSingleBoardValue(value);
kSetFullDeviceValue(value);
g_eFactoryTestStatus = FTS_NORMAL;
#endif
}
......@@ -427,7 +624,7 @@ s32 kFactoryTestEventHandler(void *arg)
g_u32AgingTotalTimeMS += FACTORY_TEST_POLL_TTME_1S;
if (g_eFactoryTestStatus != FTS_AGING_WAITING && g_eFactoryTestStatus != FTS_AGING_WAITING_SECOND_PRESS){
if (g_eFactoryTestStatus != FTS_WAITING_RELEASED && g_eFactoryTestStatus != FTS_WAITING_SECOND_PRESS){
switch (g_eFactoryTestStatus)
{
case (FTS_START):
......@@ -449,8 +646,8 @@ s32 kFactoryTestEventHandler(void *arg)
g_eFactoryTestStatus = FTS_AGING_4HOU;
break;
case (FTS_AGING_4HOU):
//上电后12小时老化时间到,12小时内不可以短按按键和长按,不能组网
if (g_u32AgingTotalTimeMS >= FACTORY_TEST_4HOU_MS){
//上电后4小时老化时间到,4小时内不可以短按按键和长按,不能组网
if (g_u32AgingTotalTimeMS >= g_u32AgingMaxTimeMS){
kSetAgingTestValue(AGINE_TEST_DONE_VALUE);
g_eFactoryTestStatus = FTS_AGING_DONE;
}
......@@ -460,16 +657,20 @@ s32 kFactoryTestEventHandler(void *arg)
//return;
g_u32Count = FACTORY_TEST_POLL_TIMES;//快点处理自定义函数
break;
case (FTS_AGING_FORCE_EXIT):
g_eFactoryTestStatus = FTS_AGING_WAITING;
case (FTS_FORCE_EXIT):
g_eFactoryTestStatus = FTS_WAITING_RELEASED;
break;
case (FTS_AGING_WAITING):
case (FTS_WAITING_RELEASED):
break;
case (FTS_AGING_FIRST_LONG_PRESSED):
g_eFactoryTestStatus = FTS_AGING_WAITING_SECOND_PRESS;
case (FTS_FIRST_LONG_PRESSED):
g_eFactoryTestStatus = FTS_WAITING_SECOND_PRESS;
break;
case (FTS_AGING_WAITING_SECOND_PRESS):
case (FTS_WAITING_SECOND_PRESS):
break;
//Auth: han_frc.20220105.
case (FTS_NORMAL):
iKonkeAfSelfPrint("######FTS_NORMAL STOP EVENT!!!!!!!!!!!\r\n");
return -1;
default:
break;
}
......@@ -508,8 +709,8 @@ s32 kFactoryTestEventHandler(void *arg)
if ( g_stFactoryTestControllerList[index].u8BtnLongPressTimes == LONG_PRESS_1_TIMES \
|| g_stFactoryTestControllerList[index].bIsFirstBtnLongPressed == true){
//successfully exit aging test
g_eFactoryTestStatus = FTS_AGING_FORCE_EXIT;
kSetAgingTestValue(AGINE_TEST_DONE_VALUE);
g_eFactoryTestStatus = FTS_FORCE_EXIT;
kSetAgingTestValue(FORCE_FACTORY_TEST_VALUE);
#if Z30_DEVICE_SINGLE_BOARD_ENABLE
if(kGetSingleBoardValue() != SINGLE_BOARD_TEST_DONE_VALUE)
kSetSingleBoardValue(FORCE_FACTORY_TEST_VALUE);
......@@ -532,7 +733,7 @@ s32 kFactoryTestEventHandler(void *arg)
g_u32Count = FACTORY_TEST_POLL_TIMES;//快点处理自定义函数
//记录当前的老化状态
g_eLastFactoryTestStatus = g_eFactoryTestStatus;
g_eFactoryTestStatus = FTS_AGING_FIRST_LONG_PRESSED;
g_eFactoryTestStatus = FTS_FIRST_LONG_PRESSED;
iKonkeAfSelfPrint("######2222222222222222222222 == 0\r\n");
}
......@@ -570,5 +771,20 @@ s32 kFactoryTestEventHandler(void *arg)
return 0;
}
//Auth: han_frc.20220105.
void kSetAgingTestDone(void)
{
kSetAgingTestValue(AGINE_TEST_DONE_VALUE);
g_eFactoryTestStatus = FTS_NORMAL;
}
void kSetNetworkSteeringInfo(uint8_t channel, uint16_t PanId)
{
if (channel >= 15 && channel <= 26){
g_u8NetworkSteeringChannel = channel;
}
if (0xFFFF != PanId){
g_u16NetworkSteeringPanId = PanId;
}
}
......@@ -19,14 +19,14 @@
#define TOUCH_KEY_LONG_PRESS_TIME_MS (5 * 1000)
#define MECHANICAL_KEY_LONG_PRESS_TIME_MS (20 * 1000)
#define FIRST_BTN_LONG_PRESSED_VALIED_TIME_MS (15 * 1000)
#define FIRST_BTN_LONG_PRESSED_VALIED_TIME_MS (10 * 1000)
#define FACTORY_TEST_POLL_TTME_1S (1 * 1000)
#define FACTORY_TEST_POLL_TTME_10S (10 * 1000)
#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_4HOU_MS (5 * 1 * 60 * 1000)
#define FACTORY_TEST_4HOU_MS (1 * 15 * 60 * 1000)
#else
#define FACTORY_TEST_15MIN_MS (15 * 60 * 1000)
#define FACTORY_TEST_4HOU_MS (4 * 60 * 60 * 1000)
......@@ -42,11 +42,15 @@ typedef enum{
FTS_AGING_4HOU_START,
FTS_AGING_4HOU,
FTS_AGING_DONE,
FTS_AGING_FORCE_EXIT,
FTS_AGING_WAITING,
FTS_AGING_FORCE_REBOOT,
FTS_AGING_FIRST_LONG_PRESSED,
FTS_AGING_WAITING_SECOND_PRESS
FTS_FORCE_EXIT,
FTS_WAITING_RELEASED,//waiting key released
FTS_FORCE_REBOOT,
FTS_FIRST_LONG_PRESSED,
FTS_WAITING_SECOND_PRESS,
FTS_SINGLE_BOARD_TEST,
FTS_FULL_DEVICE_TEST,
FTS_SINGLE_BOARD_TEST_DONE,
FTS_FULL_DEVICE_TEST_DONE,
}FactoryTestStatusEnum;
typedef struct{
......@@ -74,7 +78,12 @@ 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);
void kFactoryTestInit(pFactoryTestPollCallback callback, FactoryTestConfSt conf_list[], uint8_t btn_num,uint8_t led_id);
void kSetNetworkSteeringInfo(uint8_t channel, uint16_t PanId);
//Auth: han_frc.20220105.
void kSetAgingTestDone(void);
kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st *pDataOut);
#endif
......
......@@ -8,7 +8,7 @@
#include "ikk-debug.h"
#include "ikk-token.h"
#include "ikk-network.h"
#include "ikk-factory-test.h"
static bool gInterPanEnabled; // 1:enable
static uint16_t gInterPanID = 0x1111; // 1:enable
......@@ -16,12 +16,10 @@ static uint8_t g_interpanChannel = 20;
pInterPanMsgIncomingCallback gInterPanMsgIncomingCallback;
static ev_timer_event_t *Interpan_timerEvt = NULL;
static ev_timer_event_t *Interpan_DelaySendEvt = NULL;
static INCOM_MESSAGE_INFO sIncomingMessageInfo = {0};
static s32 kInterPanEventHandler(void);
static s32 kInterPanDelaySendTestDataEventHandler(void );
/**
* @brief Definition for Incoming cluster / Sever Cluster
......@@ -99,18 +97,16 @@ void afInterpan_dataSendConfirm(void *arg)
}
bool interpanleaveflg = false;
void kInterPanEnable(uint8_t channel)
{
rf_setChannel(channel);
printf("kInterPanEnable enable,Regesiter Interpan Func,network = %d\r\n!!\r\n",kNwkGetCurrentStatus());
if (kNwkGetCurrentStatus() == ENS_LEAVED) {
af_endpointRegister(INTERPAN_ENDPOINT, (af_simple_descriptor_t *)&kInterpanSimpleDesc, afInterpan_rx_handler, afInterpan_dataSendConfirm);
}
else{
kNwkFactoryReset(false);
if (zb_isDeviceJoinedNwk()){
zb_factoryReset();
interpanleaveflg = true;
}
af_endpointRegister(INTERPAN_ENDPOINT, (af_simple_descriptor_t *)&kInterpanSimpleDesc, afInterpan_rx_handler, afInterpan_dataSendConfirm);
}
void kInterpanDisable(void)
......@@ -128,19 +124,17 @@ void kInterpanDisable(void)
void kInterPanMoudleInit(pInterPanMsgIncomingCallback pfunc_incoming)
{
bool interPanEnabledFlg = kGetInterpanEnableFlg();
if (interPanEnabledFlg) {
gInterPanEnabled = true;
if (kGetFactoryTestStatus() == FTS_NORMAL) {
gInterPanEnabled = false;
af_endpointUnregister(INTERPAN_ENDPOINT);
printf("kInterPanEnable disable\r\n!!\r\n");
}
if (gInterPanEnabled == true) {
else{
gInterPanEnabled = true;
printf("kInterPanEnable enable\r\n!!\r\n");
kInterPanEnable(INTERPAN_CHANNEL);
if(Interpan_timerEvt){
TL_ZB_TIMER_CANCEL(&Interpan_timerEvt);
}
Interpan_timerEvt = TL_ZB_TIMER_SCHEDULE(kInterPanEventHandler, NULL, INTERPAN_AUTO_OFF_TIME);
if (kNwkGetCurrentStatus() == ENS_LEAVED) {
if (!zb_isDeviceJoinedNwk()) {
if(Interpan_DelaySendEvt)
TL_ZB_TIMER_CANCEL(&Interpan_DelaySendEvt);
......@@ -184,21 +178,21 @@ bool kInterPanSetEnableStatus(uint8_t enable)
kSetInterpanEnableFlg(!gInterPanEnabled);
}
void SetInterpanPara(uint8_t channel,uint16_t panid,bool is_enable)
void SetInterpanPara(uint8_t channel,uint16_t panid)
{
if((channel != 0xff)&&(channel>=11)&&(channel<=26))
g_interpanChannel = channel;
if(panid != 0xffff)
gInterPanID = panid;
if((channel != 0xff)&&(channel>=11)&&(channel<=26))
g_interpanChannel = channel;
if(is_enable)
{
gInterPanEnabled = TRUE;
kSetInterpanEnableFlg(gInterPanEnabled);
}
else
kInterpanDisable();
}
void GetInterpanPara(uint8_t *enable, uint8_t *channel, uint16_t *panId)
{
*enable = (gInterPanEnabled == false) ? 0x00 : 0x01;
*channel = g_interpanChannel;
*panId = gInterPanID;
}
static uint8_t sSend_Count = 0;
static s32 kInterPanDelaySendTestDataEventHandler(void )
{
......@@ -211,17 +205,6 @@ static s32 kInterPanDelaySendTestDataEventHandler(void )
sSend_Count = 0;
return -1;
}
static s32 kInterPanEventHandler(void)
{
iKonkeAfSelfPrint("kInterPanEventHandler\r\n");
if (gInterPanEnabled ==true) {
af_endpointUnregister(INTERPAN_ENDPOINT);
kInterPanSetEnableStatus(false);
}
return -1;
}
kk_err_t kInterPanSend(UMsgNodeSt *pMsgNode)
{
......
......@@ -12,7 +12,6 @@ extern const af_simple_descriptor_t kInterpanSimpleDesc;
#define INTERPAN_EVENT_INIT 0x00 // interPan Event
#define INTERPAN_EVENT_OFF 0x01 //
#define INTERPAN_AUTO_OFF_TIME (10 * 60 * 1000)
#define INTERPAN_DELAY_SEND_INTERVAL (3 * 1000)
#define INTERPAN_DELAY_SEND_TIMES (2)
#define INTERPAN_CHANNEL 20
......@@ -30,7 +29,8 @@ typedef struct{
uint8_t reserved[8];
}INCOM_MESSAGE_INFO;
void SetInterpanPara(uint8_t channel,uint16_t panid,bool is_enable);
void SetInterpanPara(uint8_t channel,uint16_t panid);
void GetInterpanPara(uint8_t *enable, uint8_t *channel, uint16_t *panId);
void afInterpan_dataSendConfirm(void *arg);
void afInterpan_rx_handler(void *arg);
void kInterpanDisable(void);
......@@ -38,5 +38,7 @@ kk_err_t kInterPanSend(UMsgNodeSt *pMsgNode);
void kInterpan_Init(void);
bool kInterPanSetEnableStatus(uint8_t enable);
bool kInterPanGetEnableStatus(void);
void kInterPanMoudleInit(pInterPanMsgIncomingCallback pfunc_incoming);
#endif /* _SAMPLE_LIGHT_H_ */
......@@ -86,6 +86,8 @@
#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_QUERY_FACTORY_STATE_OPCODE 0xED16
#define UART_MSG_LED_GROUP_CONTROL_OPCODE 0xED17
#define UART_MSG_GPIO_TEST_OPCODE 0xED10
#define UART_MSG_READ_RSSI_REQUEST_OPCODE 0xED12
......@@ -172,6 +174,7 @@ typedef enum {
ERR_WRITE_FAILED=0x04,
ERR_READ_WRITE_TIMEOUT=0x05,
ERR_NOT_EXIST=0x06,
ERR_EXEC_FAILED=0xe0,
ERR_UNKNOW=0xFF,
}ERR_RET_E;
typedef enum { Z3D_COORDINATOR = 0, Z3D_ROUTER, Z3D_ENDDEVICE }Z3DevTypeEm;
......
......@@ -7,6 +7,7 @@
#include "ikk-cluster.h"
#include "ikk-interpan.h"
#include "ikk-factory-test.h"
#include "ikk-ota.h"
#include "../../../../zigbee/aps/aps_api.h"
#include "../../../../zigbee/common/includes/zb_common.h"
/**********************************************************************
......@@ -24,6 +25,18 @@ addrExt_t g_Eui64GatewayAddr = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
BindObjSt g_lstBindingClusterConf[BINDING_CLUSTER_MAXN] = { {0},{0},{0},{0},{0},{0},{0},{0} };
// Automatic execution procedure after joined successed.
#define JOINED_PROCEDURE_NONE (0)
#define JOINED_PROCEDURE_REP_SNAPSHOT (1)
#define JOINED_PROCEDURE_REP_CMEI (2) //CMEI
#define JOINED_PROCEDURE_REP_ISN (3) //ISN
#define JOINED_PROCEDURE_END (0XFF)
uint8_t u8ActionIndexAfterJoined = JOINED_PROCEDURE_NONE;
static ev_timer_event_t *kUserJoinSucceedProcedureEvent = NULL;
s32 kUserJoinSucceedProcedureEventHandler(void *arg);
void kNwkjoinSucceedProcedureTrigger(uint32_t u32StartDelayNms );
static bool g_bJoiningReportFlg = false;
//static value
static bool g_bIsNwkJoiningFlg = false;
......@@ -75,7 +88,11 @@ bool IsSteeringNwkTimeout(void)
void Set_Nwk_Steering_Status(NwkSteeringStatusEnum Status)
{
NetworkSteeringState = Status;
iKonkeAfSelfPrint(" set NetworkSteeringState = %d\r\n", NetworkSteeringState);
if(zb_isDeviceJoinedNwk() && g_u32NwkJoiningCountdownCounter > 0){
g_bJoiningReportFlg = true;
}else
g_bJoiningReportFlg = false;
iKonkeAfSelfPrint(" set NetworkSteeringState = %d,g_bJoiningReportFlg = %d\r\n", NetworkSteeringState, g_bJoiningReportFlg);
}
/* DESP: 高精度随机值接口,取值[minNum, maxNum].
Auth: dingmz_frc.20190701.
......@@ -225,8 +242,17 @@ void kNwkGetGateWayEui64(addrExt_t eui64)
* */
void kNwkNetworkStatusNotifyCall(NwkStatusEnum nwkst )
{
extern bool interpanleaveflg;
if(interpanleaveflg)
{
interpanleaveflg = false;
return;
}
g_eCurrentNetworkStatus = nwkst;
iKonkeAfSelfPrint("!!!g_eCurrentNetworkStatus = %d, g_eLastNetworkStatus = %d\r\n",g_eCurrentNetworkStatus, g_eLastNetworkStatus);
if( g_eCurrentNetworkStatus != g_eLastNetworkStatus ) {
g_eLastNetworkStatus = g_eCurrentNetworkStatus;
......@@ -241,6 +267,14 @@ void kNwkNetworkStatusNotifyCall(NwkStatusEnum nwkst )
Gateway_IEEE_Addr_Save(addr);
iKonkeAfSelfPrint("#####kNwkNetworkStatusNotifyCall,Join Network addr=%x%x%x%x-%x%x%x%x!\r\n",
addr[0],addr[1],addr[2],addr[3],addr[4],addr[5],addr[6],addr[7]);
if (kIsKonkeRemoteGateway() == true){
uint32_t randTimeMS = NWK_MIN_DELAY_TIME_MS_AFTER_POWER_ON * 2;
if(g_bJoiningReportFlg == false){
iKonkeAfSelfPrint("g_u32NwkJoiningCountdownCounter = %d,zb_isDeviceJoinedNwk = %d 222222222222\r\n",g_u32NwkJoiningCountdownCounter,zb_isDeviceJoinedNwk());
randTimeMS = kGetRandNum(RAND_MIN_NUM, RAND_MAX_NUM);
}
kNwkjoinSucceedProcedureTrigger(randTimeMS);
}
}
}
/* DESP: Network module tick loop handler interface.
......@@ -250,7 +284,7 @@ void kNwkModuleActionDetectCallback(void )
{
//static EmberNetworkStatus s_old_network_st = EMBER_NO_NETWORK;
static uint16_t ucRestoreSteeringCount = 0;
//iKonkeAfSelfPrint("g_u32NwkJoiningCountdownCounter = %d,zb_isDeviceJoinedNwk = %d 111111111111\r\n",g_u32NwkJoiningCountdownCounter,zb_isDeviceJoinedNwk());
// joining procedure
if( g_u32NwkJoiningCountdownCounter > 0 ) {
--g_u32NwkJoiningCountdownCounter;
......@@ -380,17 +414,18 @@ bool kNwkIsExiting(void)
* */
void kNwkFactoryReset(bool is_nwk_indicator)
{
iKonkeAfSelfPrint("######kNwkFactoryReset is_nwk_indicator1111111111111111111111111(%d)\r\n", is_nwk_indicator);
kNwkJoiningStart(0, NULL);
memset(g_Eui64GatewayAddr, 0xFF, sizeof(g_Eui64GatewayAddr));
Gateway_IEEE_Addr_Save(g_Eui64GatewayAddr);
// //add by maozj 20200320
//#if Z30_DEVICE_OTA_ENABLE
// kSetOTAStatus(OTA_NORMAL);
//#endif
// EmberNodeId node = 0xFFFF;
// kNwksaveNodeIdToFlash(node);
#if Z30_DEVICE_OTA_ENABLE
kSetOTAStatus(OTA_NORMAL);
#endif
uint16_t node = 0xFFFF;
kNwksaveNodeIdToFlash(node);
g_u32NwkJoiningCountdownCounter = 0;
// g_u32EnrollResultCheckCounter = 0;
......@@ -400,7 +435,8 @@ void kNwkFactoryReset(bool is_nwk_indicator)
//led can blink when network leaved
if (is_nwk_indicator == true){
zb_factoryReset();
if(zb_isDeviceJoinedNwk())//true status
zb_factoryReset();
g_KeyPressCauasLeave = true;
//add by maozj 20200407 for reset count down after network leaved
g_u32NwkExitCountDownCounter = MS2COUNT(LED_FAST_BLINK_CONTINUE_TIME_MS);
......@@ -444,7 +480,7 @@ void NetworkLeaveHandler(nlme_leave_cnf_t *pLeaveCnf)
NwkStatusEnum kNwkGetCurrentStatus(void )
{
NwkStatusEnum status;
if(zb_isDeviceJoinedNwk()){
if(zb_isDeviceJoinedNwk() ||(kInterPanGetEnableStatus())){
status = ENS_ONLINE;
g_bIsNwkJoiningFlg = false;
}
......@@ -486,15 +522,16 @@ void kNwkJoiningStart(uint32_t u32JoiningDuration, pJoinCompleteCallback callbac
if( u32JoiningDuration > 0 )
{
#if Z30_DEVICE_AGING_ENABLE
if (kGetFactoryTestStatus() != FTS_NORMAL /*&& kGetFactoryTestStatus() != FTS_AGING_15MIN*/){
if (kGetFactoryTestStatus() != FTS_NORMAL && kGetFactoryTestStatus() != FTS_AGING_15MIN \
&& kGetFactoryTestStatus() != FTS_FULL_DEVICE_TEST){
return;
}
#endif
if(!zb_isDeviceJoinedNwk())
{
//disable interpan
kInterpanDisable();
if(kInterPanGetEnableStatus())
kInterpanDisable();
iKonkeAfSelfPrint("#####Set Steering Counter\r\n");
g_u32NwkJoiningCountdownCounter= MS2COUNT(u32JoiningDuration);
g_pJoinCompleteCallback = callback;
......@@ -502,6 +539,10 @@ void kNwkJoiningStart(uint32_t u32JoiningDuration, pJoinCompleteCallback callbac
//add by maozj 20191206
g_bNwkSteeringCompleteFlg = true;
g_eLastNetworkStatus = ENS_UNKNOW;
//add by Han. 20220210
g_bJoiningReportFlg = true;
}
}
else
......@@ -518,6 +559,7 @@ status_t General_Report(uint8_t src_ep,uint8_t des_ep,uint16_t cluster,uint16_t
static ReportAttrData_ST reportInfo;
uint8_t paload_len = 0;
TL_SETSTRUCTCONTENT(dstEpInfo, 0);
iKonkeAfSelfPrint("General_Report111111\r\n");
dstEpInfo.dstAddrMode = APS_SHORT_DSTADDR_WITHEP;
dstEpInfo.dstEp = des_ep;
......@@ -542,3 +584,58 @@ status_t General_Report(uint8_t src_ep,uint8_t des_ep,uint16_t cluster,uint16_t
ZCL_FRAME_SERVER_CLIENT_DIR, true, 0, ZCL_SEQ_NUM, (uint16_t )paload_len, (uint8_t *)&reportInfo);
}
/*Auth: Han_frc.20220125.*/
void kNwkjoinSucceedProcedureTrigger(uint32_t u32StartDelayNms)
{
u8ActionIndexAfterJoined = JOINED_PROCEDURE_REP_SNAPSHOT;
if(!ev_timer_exist(kUserJoinSucceedProcedureEvent)){
kUserJoinSucceedProcedureEvent = TL_ZB_TIMER_SCHEDULE(kUserJoinSucceedProcedureEventHandler, NULL, u32StartDelayNms);
}
}
extern kk_err_t kOptTunnelCommonReport(uint16_t attribute_id );
s32 kUserJoinSucceedProcedureEventHandler(void *arg)
{
iKonkeAfSelfPrint("\r\n6666Join Succeed procedure here(step: %d)\r\n", u8ActionIndexAfterJoined);
OPTTUNEL_TOKEN_ST sOptunnel_Token_temp;
flash_read(TOKEN_USER_LOCATION,USER_SIZE,(uint8_t*)&sOptunnel_Token_temp);
switch(u8ActionIndexAfterJoined) {
case (JOINED_PROCEDURE_REP_SNAPSHOT):
{
// report the device snap info,don't change the order.
iKonkeAfSelfPrint("++++++++++++== report OPTDATA\r\n");
u8ActionIndexAfterJoined = JOINED_PROCEDURE_REP_CMEI;//step 1
kOptTunnelCommonReport(ECA_OPTDATA);//step 2
return 500;
}
case (JOINED_PROCEDURE_REP_CMEI):
{
// report the device snap info.
iKonkeAfSelfPrint("++++++++++++== report CMEI\r\n");
u8ActionIndexAfterJoined = JOINED_PROCEDURE_REP_ISN;
if(!All_Same_Data((uint8_t*)&sOptunnel_Token_temp.cmei,0xff,32)){
kOptTunnelCommonReport(ECA_CMEI);
}
return 500;
}
case (JOINED_PROCEDURE_REP_ISN):
{
// report the device snap info.
iKonkeAfSelfPrint("++++++++++++== report ISN\r\n");
u8ActionIndexAfterJoined = JOINED_PROCEDURE_END;
if(!All_Same_Data((uint8_t*)&sOptunnel_Token_temp.isn,0xff,32)){
kOptTunnelCommonReport(ECA_ISN);
}
return 200;
}
case (JOINED_PROCEDURE_END):
{
// report the device snap info.
iKonkeAfSelfPrint("++++++++++++== JSP ended!\r\n");
u8ActionIndexAfterJoined = JOINED_PROCEDURE_NONE;
return -1;
}
default: break;
}
return 0;
}
#ifndef _IKK_NETWORK_H_
#define _IKK_NETWORK_H_
#include "ikk-module-def.h"
#include "ikk-opt-tunnel.h"
#include "ikk-debug.h"
#include "tl_common.h"
#include "zb_api.h"
......@@ -12,6 +13,9 @@
#define BINDING_CLUSTER_MAXN 8
#define BINDING_EP_DEF 1 // default endpoint for binding
#define NWK_MIN_DELAY_TIME_MS_AFTER_POWER_ON (500)
#define RAND_MIN_NUM (10 * 1000) //最小随机数,单位MS
#define RAND_MAX_NUM (40 * 1000 - RAND_MIN_NUM) //最大随机数
#define MAX_PALOAD_LEN 128
typedef struct tag_bind_objector_st {
......
......@@ -6,6 +6,11 @@
#include "ikk-config.h"
#include "ikk-token.h"
#include "../../../../zigbee/zcl/zcl_include.h"
#include "ikk-command.h"
#include "../driver/ikk-uart.h"
#include "ikk-factory-test.h"
#include "ikk-common-utils.h"
// FCC0-0000
#pragma pack(1)
typedef struct tag_private_clsFCC0_attr0000_frame_st {
......@@ -27,55 +32,27 @@ 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);
//
//
//
//
//_CODE_ZCL_ status_t zcl_private_fcc0_register(u8 endpoint, u16 manuCode, u8 attrNum, const zclAttrInfo_t attrTbl[], cluster_forAppCb_t cb)
//{
// return zcl_registerCluster(endpoint, ZCL_CLUSTER_PRIVATE_FCC0, manuCode, attrNum, attrTbl, zcl_Private_cmdHandler, cb);
//}
//
//_CODE_ZCL_ static status_t zcl_private_clientCmdHandler(zclIncoming_t *pInMsg)
//{
// u8 status = ZCL_STA_SUCCESS;
// apsdeDataInd_t *pApsdeInd = (apsdeDataInd_t*)pInMsg->msg;
// iKonkeAfSelfPrint("#############zcl_private_clientCmdHandler ,command id =%x!!!!!!!\r\n",pInMsg->hdr.cmd);
//// switch(pInMsg->hdr.cmd)
//// {
//// case ZCL_CMD_BASIC_RESET_FAC_DEFAULT:
//// if(pInMsg->clusterAppCb){
//// zclIncomingAddrInfo_t addrInfo;
//// addrInfo.dirCluster = pInMsg->hdr.frmCtrl.bf.dir;
//// addrInfo.profileId = pApsdeInd->indInfo.profile_id;
//// addrInfo.srcAddr = pApsdeInd->indInfo.src_short_addr;
//// addrInfo.dstAddr = pApsdeInd->indInfo.dst_addr;
//// addrInfo.srcEp = pApsdeInd->indInfo.src_ep;
//// addrInfo.dstEp = pApsdeInd->indInfo.dst_ep;
////
//// status = pInMsg->clusterAppCb(&addrInfo, ZCL_CMD_BASIC_RESET_FAC_DEFAULT, NULL);
//// }else{
//// status = ZCL_STA_FAILURE;
//// }
//// break;
//// default:
//// status = ZCL_STA_UNSUP_CLUSTER_COMMAND;
//// break;
//// }
//
// return status;
//}
//
//_CODE_ZCL_ static status_t zcl_Private_cmdHandler(zclIncoming_t *pInMsg)
//{
// if(pInMsg->hdr.frmCtrl.bf.dir == ZCL_FRAME_CLIENT_SERVER_DIR){
// return zcl_private_clientCmdHandler(pInMsg);
// }else{
// return ZCL_STA_UNSUP_CLUSTER_COMMAND;
// }
//}
//
void kOptTunneCheckNodeIdIsChangedReport(void)
{
uint16_t currentNodeId= 0x1234;
uint16_t savedNodeId;
if (zb_isDeviceJoinedNwk()){
savedNodeId = kNwkgetNodeIdFromFlash();
currentNodeId = zb_getLocalShortAddr();
//iKonkeAfSelfPrint("!!!checkNodeIdIsChanged savedNodeId = %d, currentNodeId = %d\r\n", savedNodeId, currentNodeId);
if (savedNodeId != currentNodeId){
//report AssociateAnnounce attr of private cluster
iKonkeAfSelfPrint("!!!checkNodeIdIsChanged savedNodeId = %d, currentNodeId = %d\r\n", savedNodeId, currentNodeId);
if (savedNodeId != 0xFFFF){
kOptTunnelCommonReport(ECA_ASSOCIATED_AOUNCE);
}
//save changed nodeId to flash
kNwksaveNodeIdToFlash(currentNodeId);
}
}
}
uint8_t kOptTunnelChunkRead(uint8_t endpoint,
uint16_t clusterId,
uint16_t attributeId,
......@@ -83,7 +60,7 @@ uint8_t kOptTunnelChunkRead(uint8_t endpoint,
uint8_t *buffer,
uint8_t *length_out)
{
iKonkeAfSelfPrint("&&&&&&&&&&&&&Token Read cluster(%2X), attr(%2X)\r\n", clusterId, attributeId);
iKonkeAfSelfPrint("&&&&&&&&&&&&&Token Read cluster(%d), attr(%d)\r\n", clusterId, attributeId);
uint8_t length = 0;
if (buffer == NULL){
iKonkeAfSelfPrint("Err: Buffer is null(%d)!!\r\n");
......@@ -113,6 +90,10 @@ uint8_t kOptTunnelChunkRead(uint8_t endpoint,
memcpy(&buffer[1], INSTALL_CODE_TOKEN_GET(), length);
break;
}
case (ZCL_CHUNK_N1_ATTRIBUTE_ID):
{
break;
}
default:
return 0xfe;
}
......@@ -153,32 +134,32 @@ status_t kOptTunnelMessageReadResponse(zclIncoming_t *pInHdlrMsg,uint8_t *pData)
u16 clusterId = pInHdlrMsg->msg->indInfo.cluster_id;
u8 endpoint = pInHdlrMsg->msg->indInfo.dst_ep;
/* Parse In Read Command */
zclReadCmd_t *pReadCmd = zcl_parseInReadCmd(pInHdlrMsg);
if(pReadCmd == NULL){
return ZCL_STA_INSUFFICIENT_SPACE;
}else{
pInHdlrMsg->attrCmd = (void *)pReadCmd;
u8 *pBuf = pInHdlrMsg->pData;
zclReadCmd_t pReadCmd ={0};
pReadCmd.numAttr = pInHdlrMsg->dataLen / 2; //attr ID
for(u8 i = 0; i < pReadCmd.numAttr; i++){
pReadCmd.attrID[i] = BUILD_U16(pBuf[0], pBuf[1]);
pBuf += 2;
}
iKonkeAfSelfPrint("#########kOptTunnelMessageReadResponse111111 attr = %d,%d\r\n",pReadCmd.attrID[0],pReadCmd.numAttr);
if(!pInHdlrMsg->msg->indInfo.security_status){
return ZCL_STA_FAILURE;
status = ZCL_STA_FAILURE;
}
/* Build Read Response Command */
u16 len = sizeof(zclReadRspCmd_t) + (pReadCmd->numAttr * sizeof(zclReadRspStatus_t));
u16 len = sizeof(zclReadRspCmd_t) + (pReadCmd.numAttr * sizeof(zclReadRspStatus_t));
zclReadRspCmd_t *pReadRspCmd = (zclReadRspCmd_t *)ev_buf_allocate(len);
if(!pReadRspCmd){
return ZCL_STA_INSUFFICIENT_SPACE;
}
pReadRspCmd->numAttr = pReadCmd->numAttr;
pReadRspCmd->numAttr = pReadCmd.numAttr;
pReadRspCmd->attrList[0].attrID = pReadCmd.attrID[0];
pReadRspCmd->attrList[0].status = status;
pReadRspCmd->attrList[0].dataType = ZCL_DATA_TYPE_CHAR_STR;
pReadRspCmd->attrList[0].data = pData;
pReadRspCmd->attrList[0].attrID = pReadCmd->attrID[0];
pReadRspCmd->attrList[0].status = ZCL_STA_SUCCESS;
epInfo_t dstEp;
TL_SETSTRUCTCONTENT(dstEp, 0);
......@@ -191,8 +172,11 @@ status_t kOptTunnelMessageReadResponse(zclIncoming_t *pInHdlrMsg,uint8_t *pData)
if(pInHdlrMsg->msg->indInfo.security_status & SECURITY_IN_APSLAYER){
dstEp.txOptions |= APS_TX_OPT_SECURITY_ENABLED;
}
status = zcl_readRsp(endpoint, &dstEp, clusterId, pInHdlrMsg->hdr.manufCode, false, !pInHdlrMsg->hdr.frmCtrl.bf.dir, pInHdlrMsg->hdr.seqNum, pReadRspCmd);
//free data
ev_buf_free((void *)pReadRspCmd);
return status;
}
status_t kOptTunnelMessageWriteResponse(zclIncoming_t *pCmd,uint8_t *pData)
......@@ -204,7 +188,6 @@ status_t kOptTunnelMessageWriteResponse(zclIncoming_t *pCmd,uint8_t *pData)
uint8_t i =0;
uint8_t payload_len = pData[0];
// 8 0 51 86 10 0 0 0 0
if(pCmd->hdr.cmd == ZCL_CMD_WRITE){
tmp_buffer[i++] = 0x00;
......@@ -242,16 +225,21 @@ kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd)
kk_err_t status = KET_OK;
// 0 0 42 7 6 0 51 86 10 0 0 oring data zcl global write 0xfcc0 0x0000 0x42 {06 00 51 86 10 00 00}
//out 6 0 51 86 10 0 0 0
iKonkeAfSelfPrint("\r\n-------------------------\r\n");
// device id
uint32_t modeid = (uint32_t)MODEL_ID;
uint16_t attribute_id = 0xffff;
uint8_t tmp_buffer[6];
tmp_buffer[0] = 5;
tmp_buffer[1] = modeid>>24;
tmp_buffer[2] = modeid>>16;
tmp_buffer[3] = modeid>>8;
tmp_buffer[4] = modeid;
attribute_id = (pCmd->pData[1]>>8) + (pCmd->pData[0]);
iKonkeAfSelfPrint("pData(1)=0x%x,pData(0)=0x%x,attribute_id=%d\r\n",pCmd->pData[1],pCmd->pData[0],attribute_id);
switch(method) {
case (EOM_WRITE):
{
......@@ -260,10 +248,13 @@ kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd)
memcpy(g_tmp_buffer, pCmd->pData+4, length);
g_tmp_length = length;
}
iKonkeAfSelfPrint("#######kOptTunnelMessageIncoming length(0x%d)\r\n", length);
iKonkeAfSelfPrintBuffer(g_tmp_buffer,length);
//copy device id
memcpy(&g_tmp_buffer[1],&tmp_buffer[1],4);
// switch(attribute_id)
// {
......@@ -271,7 +262,29 @@ kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd)
// {
if( length >= 7 ) {
iKonkeAfSelfPrint("\r\n########################OPTDATA WRITE,g_tmp_length = %d\r\n",g_tmp_length);
if( g_pOptDataIncomingMessageCallback ) {
extern kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st *pDataOut);
UMsgNodeSt msgNode;
DataField_st dataOut;
// length pid ch opcode arg
memcpy(msgNode.buffer, &g_tmp_buffer[0], g_tmp_length);
msgNode.length = g_tmp_length;
if (kCmdGeneralMsgPaser(&msgNode, ECOM_PORT_FCC0, &dataOut) == KET_OK) {
iKonkeAfSelfPrint("length(%d)\r\n" , dataOut.u8Datalen);
iKonkeAfSelfPrintBuffer(dataOut.u8ARG, dataOut.u8Datalen);
g_tmp_length = dataOut.u8Datalen + 7;
g_tmp_buffer[0] = g_tmp_length - 1;
memcpy(&g_tmp_buffer[7], dataOut.u8ARG, dataOut.u8Datalen);
kOptTunnelMessageWriteResponse(pCmd, g_tmp_buffer);
} else if (kkFactoryMsgInComingPaser(&msgNode, ECOM_PORT_FCC0, &dataOut) == KET_OK) {
iKonkeAfSelfPrint("length(%d)\r\n" , dataOut.u8Datalen);
iKonkeAfSelfPrintBuffer(dataOut.u8ARG, dataOut.u8Datalen);
g_tmp_length = dataOut.u8Datalen + 7;
g_tmp_buffer[0] = g_tmp_length - 1;
memcpy(&g_tmp_buffer[7], dataOut.u8ARG, dataOut.u8Datalen);
kOptTunnelMessageWriteResponse(pCmd, g_tmp_buffer);
}
else if( g_pOptDataIncomingMessageCallback ) {
g_tmp_length = g_tmp_length - 6;
if(KET_NO_RESPONSE == g_pOptDataIncomingMessageCallback(g_tmp_buffer[5], g_tmp_buffer[6], g_tmp_buffer + 7, &g_tmp_length)){
return KET_NO_RESPONSE;
......@@ -293,10 +306,10 @@ kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd)
}
case (EOM_READ ):
{
// switch(attribute_id){
// // OptData read command is same to write opcode 0x00, read the device snap.
// case (ECA_OPTDATA):
// {
switch(attribute_id){
// OptData read command is same to write opcode 0x00, read the device snap.
case (ECA_OPTDATA):
{
iKonkeAfSelfPrint("\r\n########################OPTDATA READ\r\n");
if( g_pOptDataIncomingMessageCallback ) {
memcpy(&g_tmp_buffer[2],&tmp_buffer[1],4);
......@@ -311,9 +324,63 @@ kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd)
g_tmp_buffer[1] = g_tmp_length - 1; //string length
kOptTunnelMessageReadResponse(pCmd, g_tmp_buffer);
}
// break;
// }
// }
break;
}
case (ECA_TTS):
case (ECA_MTORR_RR):
{
kOptTunnelMessageReadResponse(pCmd, g_tmp_buffer);
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;
memmove(&g_tmp_buffer[1],&g_tmp_buffer[0],g_tmp_length);
g_tmp_buffer[0] = g_tmp_length;
kOptTunnelMessageReadResponse(pCmd, g_tmp_buffer);
iKonkeAfSelfPrint("#########Token Get Buffer(length(%d)): ", g_tmp_length);
iKonkeAfSelfPrintBuffer(g_tmp_buffer, g_tmp_length);
iKonkeAfSelfPrint("\r\n");
break;
}
case (ECA_CMEI):
case (ECA_ISN ):
case (ECA_CHUNK_N1):
case (ECA_INSTALL_CODE):
{
g_tmp_length = OPTTUNNEL_CHUNK_MAXLEN;
kk_err_t status = kOptTunnelAttrChunkLocalRead(attribute_id, g_tmp_buffer, &g_tmp_length);
iKonkeAfSelfPrint("#########Token Get Buffer(length(%d)): ", g_tmp_length);
if(g_tmp_length > 1){
memmove(&g_tmp_buffer[1],&g_tmp_buffer[0],g_tmp_length);
g_tmp_buffer[0] = g_tmp_length;
}
if (status == KET_OK){
kOptTunnelMessageReadResponse(pCmd, g_tmp_buffer);
}else {
tmp_buffer[5] = ZCL_STA_FAILURE;
kOptTunnelMessageReadResponse(pCmd, tmp_buffer);
}
break;
}
}
g_tmp_length = 0;
g_tmp_buffer[0] = 0;
memset(g_tmp_buffer,0,32);
break;
}
default: break;
......@@ -339,7 +406,7 @@ static status_t kOptTunnelCommonReportSend(uint16_t attribute_id, uint8_t *arg,
/* DESP: Private protocol common report interface.
* Auth: dingmz_frc.20191113.
* */
kk_err_t kOptTunnelCommonReport(uint16_t attribute_id )
kk_err_t kOptTunnelCommonReport(uint16_t attribute_id)
{
if( attribute_id == OPTTUNNEL_UNKNOW ) {
return KET_ERR_NON_EXIST;
......@@ -347,7 +414,6 @@ kk_err_t kOptTunnelCommonReport(uint16_t attribute_id )
kk_err_t err = KET_OK;
uint8_t bufCount = 0;
switch(attribute_id) {
case (ECA_OPTDATA):
{
......@@ -390,7 +456,7 @@ kk_err_t kOptTunnelCommonReport(uint16_t attribute_id )
break;
}
case (ECA_CMEI):
case (ECA_ISN ):
case (ECA_ISN):
{
g_tmp_length = OPTTUNNEL_CHUNK_MAXLEN;
kOptTunnelAttrChunkLocalRead(attribute_id, g_tmp_buffer, &g_tmp_length);
......@@ -414,6 +480,10 @@ kk_err_t kOptTunnelCommonReport(uint16_t attribute_id )
err = KET_FAILED;
}
g_tmp_length = 0;
g_tmp_buffer[0] = 0;
memset(g_tmp_buffer,0,32);
return err;
}
/* DESP: Private protocol message(command) reporting interface
......@@ -450,4 +520,40 @@ kk_err_t kOptTunnelModuleInit(pFUNC_OPTDATA_MESSAGE_CALLBACK pOptdataIncomingCal
return KET_OK;
}
uint8_t HexToASCII(uint8_t hex){
if((hex>=0x0A)&&(hex<=0x0F))//дĸ
hex += 0x37;
else if ((hex>=0x00)&&(hex<=0x09))
hex += 0x30;
else hex = 0xff;
return hex;
}
//DESP: write default installcode.
bool kOptTunnelTrytoWriteInstallCode(void)
{
OPTTUNEL_TOKEN_ST sOptunnel_Token_temp;
flash_read(TOKEN_USER_LOCATION,USER_SIZE,(uint8_t*)&sOptunnel_Token_temp);
if(All_Same_Data((uint8_t*)&sOptunnel_Token_temp.install_code.install_code_data,0xff,16)){
uint8_t installcode_buffer[16] = {0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30};
uint8_t length = 16;
addrExt_t long_address;
zb_getLocalExtAddr(long_address);
SWAP_EUI64((uint8_t *)long_address);//ȡ
uint8_t mac_address[8] = {0};
for(uint8_t i=4;i<8;i++){//0-7
mac_address[2*i-8] = long_address[i] >> 4;
mac_address[2*i-7] = long_address[i] & 0x0f;
}
iKonkeAfSelfPrint("!!!MAC_address:\r\n");
iKonkeAfSelfPrintBuffer(mac_address,8);
for(uint8_t i=0;i<8;i++)
mac_address[i] = HexToASCII(mac_address[i]);
memcpy(&installcode_buffer[8], &mac_address[0], 8);
INSTALL_CODE_TOKEN_SET(installcode_buffer,length);
}
}
......@@ -71,8 +71,10 @@ void Set2NwkJoiningCountdownCounter(u32 time_ms);
* */
kk_err_t kOptTunnelModuleInit(pFUNC_OPTDATA_MESSAGE_CALLBACK pOptdataIncomingCallback );
/*Auth: han_frc.20220119.*/
uint8_t HexToASCII(uint8_t hex);
bool kOptTunnelTrytoWriteInstallCode(void);
kk_err_t kOptTunnelCommonReport(uint16_t attribute_id);
kk_err_t kOptTunnelOODReport(uint8_t channel, uint8_t opcode, uint8_t *arg, uint8_t length );
......
/*
//#include "app/framework/plugin/network-steering/network-steering.h"
//#include "app/framework/plugin/network-steering/network-steering-internal.h"
#include "ikk-ota.h"
......@@ -21,11 +22,6 @@ pOTACallback g_pOTACallback = NULL;
static void kOTAMoudleOptCallback(OTAStatusEnum status);
//__no_init OTAGpioStatusST g_stOTAGpioStatus @ 0x2000FFF0;
static OTAGpioStatusST g_stOTAGpioStatus;
OTAStatusEnum kGetOTAStatus(void)
{
return g_eOTAStatus;
......@@ -76,7 +72,6 @@ static void kOTAMoudleOptCallback(OTAStatusEnum status)
break;
case OTA_DOWNLOAD_DONE:
{
g_eOTAStatus = OTA_DOWNLOAD_DONE;
break;
}
......@@ -99,3 +94,4 @@ static void kOTAMoudleOptCallback(OTAStatusEnum status)
break;
}
}
*/
/*
#ifndef __IKONKE_MODULE_OTA_H_______________________
#define __IKONKE_MODULE_OTA_H_______________________
#include "tl_common.h"
......@@ -9,7 +10,6 @@
typedef enum{OTA_NORMAL=0, OTA_START,OTA_DOWNLOAD_DONE, OTA_VERITY_SUCCEED, OTA_FAILED}OTAStatusEnum;
typedef enum{OTA_GPIO_OFF=0, OAT_GPIO_ON}OTAGpioEnum;
#pragma pack(1) //按1字节对齐
typedef struct {
......@@ -40,3 +40,4 @@ void kOTAMoudleCallback(OTAStatusEnum status);
#endif
*/
......@@ -111,12 +111,13 @@ bool kGetIndicatorNotDisturbModeFlg(void)
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");
//iKonkeAfSelfPrint("kGetIndicatorNotDisturbModeFlg failed!!\r\n");
}
iKonkeAfSelfPrint("Read st =%d,data=%d\r\n",st,temp);
return (temp == 1) ;
//iKonkeAfSelfPrint("Read st =%d,data=%d\r\n",st,temp);
return (temp == 1) ;
}
nv_sts_t kSetIndicatorNotDisturbModeFlg(uint8_t value)
{
nv_sts_t st = NV_SUCC;
......@@ -132,6 +133,7 @@ nv_sts_t kSetIndicatorNotDisturbModeFlg(uint8_t value)
{
iKonkeAfSelfPrint("kSetIndicatorNotDisturbModeFlg failed!!\r\n");
}
return st;
}
......@@ -144,9 +146,10 @@ bool kGetInterpanEnableFlg(void)
temp = 1;
iKonkeAfSelfPrint("kGetInterpanEnableFlg failed!!\r\n");
}
return (temp == 1) ;
return (temp == 1) ;
}
nv_sts_t kSetInterpanEnableFlg(uint8_t value)
{
nv_sts_t st = NV_SUCC;
......@@ -156,6 +159,35 @@ nv_sts_t kSetInterpanEnableFlg(uint8_t value)
{
iKonkeAfSelfPrint("kSetIndicatorNotDisturbModeFlg failed!!\r\n");
}
return st;
}
uint16_t kNwkgetNodeIdFromFlash(void)
{
nv_sts_t st = NV_SUCC;
uint16_t temp;
st = nv_flashReadNew(1, NV_MODULE_APP, NV_NODE_ID_FLG, sizeof(temp), (u8*)&temp);
if(st != NV_SUCC){
temp = 0xFFFF;
}
return temp ;
}
nv_sts_t kNwksaveNodeIdToFlash(uint16_t node_id)
{
nv_sts_t st = NV_SUCC;
uint16_t temp;
st = nv_flashReadNew(1, NV_MODULE_APP, NV_NODE_ID_FLG, sizeof(temp), (u8*)&temp);
if(st == NV_SUCC){
if(temp != node_id){
st = nv_flashWriteNew(1, NV_MODULE_APP, NV_NODE_ID_FLG, sizeof(uint16_t), (u8*)&node_id);
iKonkeAfSelfPrint("NodeId_Save result = %d\r\n",st);
}
}else if(st == NV_ITEM_NOT_FOUND){
st = nv_flashWriteNew(1, NV_MODULE_APP, NV_NODE_ID_FLG, sizeof(uint16_t), (u8*)&node_id);
}
return st;
}
......@@ -288,7 +320,11 @@ uint8_t General_Custom_Token_Save(uint8_t item,uint8_t *buff,uint8_t 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);
//Auth: han_frc.20220105.
u8 modelid_buff[35]={0};
modelid_buff[0] = len;
memcpy(modelid_buff+1,buff,len);
flash_write(TOKEN_USER_LOCATION+MODEL_ID_LOC_OFFSET,len+1,modelid_buff);
return 0;
}else{
sOptunnel_Token_temp.modeid.modeid_len = len;
......@@ -309,7 +345,11 @@ uint8_t General_Custom_Token_Save(uint8_t item,uint8_t *buff,uint8_t 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);
//Auth: han_frc.20220105.
u8 cmei_buff[35]={0};
cmei_buff[0] = len;
memcpy(cmei_buff+1,buff,len);
flash_write(TOKEN_USER_LOCATION+CMEI_LOC_OFFSET,len+1,cmei_buff);
return 0;
}else{
sOptunnel_Token_temp.cmei.cmei_len = len;
......@@ -330,7 +370,11 @@ uint8_t General_Custom_Token_Save(uint8_t item,uint8_t *buff,uint8_t 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);
//Auth: han_frc.20220105.
u8 isn_buff[35]={0};
isn_buff[0] = len;
memcpy(isn_buff+1,buff,len);
flash_write(TOKEN_USER_LOCATION+ISN_LOC_OFFSET,len+1,isn_buff);
return 0;
}else{
sOptunnel_Token_temp.isn.isn_len = len;
......
......@@ -82,6 +82,10 @@ nv_sts_t kSetIndicatorNotDisturbModeFlg(uint8_t value);
nv_sts_t kSetInterpanEnableFlg(uint8_t value);
bool kGetInterpanEnableFlg(void);
uint16_t kNwkgetNodeIdFromFlash(void);
nv_sts_t kNwksaveNodeIdToFlash(uint16_t node_id);
#if 1
void falsh_test(uint8_t count);
#endif
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -216,5 +216,15 @@
<type>1</type>
<locationURI>PARENT-2-PROJECT_LOC/platform/services/b85m/irq_handler.c</locationURI>
</link>
<link>
<name>apps/common/00ikonke_app/general/ikk-sequence.c</name>
<type>1</type>
<location>E:/telin_zigbee_sdk/tl_zigbee_sdk/apps/common/00ikonke_app/general/ikk-sequence.c</location>
</link>
<link>
<name>apps/common/00ikonke_app/general/ikk-sequence.h</name>
<type>1</type>
<location>E:/telin_zigbee_sdk/tl_zigbee_sdk/apps/common/00ikonke_app/general/ikk-sequence.h</location>
</link>
</linkedResources>
</projectDescription>
......@@ -360,6 +360,7 @@ typedef enum{
NV_NO_DISTURB_MODE, //lmm add
NV_AGING_TEST_TIME, //lmm add
NV_INTERPAN_ENABLE_FLG, //lmm add
NV_NODE_ID_FLG, //han add
NV_ITEM_ID_MAX = 0xFF,/* Item id 0xFF should not be used. */
}nv_item_t;
......
......@@ -228,6 +228,7 @@ buf_sts_t ev_buf_free(u8 *pBuf)
#endif
ZB_EXCEPTION_POST(SYS_EXCEPTTION_EV_BUFFER_EXCEPTION_FREE_OVERFLON);
}
ev_bufItem_t *pDelBuf = ev_buf_getHead(pBuf);
......@@ -247,7 +248,9 @@ buf_sts_t ev_buf_free(u8 *pBuf)
}
mempool_free(ev_buf_v->bufGroups[pDelBuf->groupIndex].qHead, ev_buf_retriveMempoolHeader(pBuf));
ev_buf_v->bufGroups[pDelBuf->groupIndex].availBufNum++;
ev_buf_v->bufGroups[pDelBuf->groupIndex].availBufNum++;
//Tl_printf("ev_buf_free pBuf = %d 11111111111111111\r\n",pBuf);
#if EV_BUFFER_DEBUG
pDelBuf->line = line;
......
......@@ -47,8 +47,7 @@
* INCLUDES
*/
#include "zcl_include.h"
#include "../common/00ikonke_app/general/ikk-cluster.h"
/**********************************************************************
* LOCAL CONSTANTS
*/
......@@ -643,6 +642,7 @@ _CODE_ZCL_ static u8 zcl_buildHdr(u8 *buf, u8 clusterSpec, u8 dir, u8 disDefRsp,
_CODE_ZCL_ status_t zcl_sendCmd(u8 srcEp, epInfo_t *pDstEpInfo, u16 clusterId, u8 cmd, u8 specific,
u8 direction, u8 disableDefaultRsp, u16 manuCode, u8 seqNo, u16 cmdPldLen, u8 *cmdPld)
{
Tl_printf("\r\n###zcl_sendCmd111111 srcEp = %d, direction = %d\r\n", srcEp, direction);
u8 *asdu = (u8 *)ev_buf_allocate(sizeof(zclHdr_t) + cmdPldLen);
if(!asdu){
return ZCL_STA_INSUFFICIENT_SPACE;
......@@ -1063,8 +1063,8 @@ _CODE_ZCL_ status_t zcl_readRspHandler(zclIncoming_t *pCmd)
_CODE_ZCL_ zclReadCmd_t *zcl_parseInReadCmd(zclIncoming_t *pCmd)
{
u8 *pBuf = pCmd->pData;
zclReadCmd_t *p = (zclReadCmd_t *)ev_buf_allocate(sizeof(zclReadCmd_t) + pCmd->dataLen);
if(p != NULL){
p->numAttr = pCmd->dataLen / 2; //attr ID
for(u8 i = 0; i < p->numAttr; i++){
......@@ -1656,7 +1656,42 @@ _CODE_ZCL_ status_t zcl_report(u8 srcEp, epInfo_t *pDstEpInfo, u8 disableDefault
*pBuf++ = dataType;
memcpy(pBuf, pData, attrSize);
//modify
ZclReportTableSt zclReportInfo;
addrExt_t g_Eui64GatewayAddr;
extern void kNwkGetGateWayEui64(addrExt_t eui64);
kNwkGetGateWayEui64(g_Eui64GatewayAddr);
zdo_bind_req_t req;
memset(&req, 0, sizeof(zdo_bind_req_t));
bool permitStatus = kZclClusterGetPermitReportInfo(srcEp, clusterId, &zclReportInfo);
if (permitStatus && (!zclReportInfo.reportGatewayEnable || !zclReportInfo.reportChildDeviceEnable)){
if ((zclReportInfo.reportGatewayEnable && !memcmp(g_Eui64GatewayAddr, req.dst_ext_addr, 8)) \
|| (zclReportInfo.reportChildDeviceEnable && memcmp(g_Eui64GatewayAddr, req.dst_ext_addr, 8))){
Tl_printf("\r\n###111111 ep(%d),cluster(%d),Send child(%d),gateway(%d),permitStatus(%d)\r\n",srcEp, clusterId, zclReportInfo.reportChildDeviceEnable, zclReportInfo.reportGatewayEnable, permitStatus);
}else {
Tl_printf("\r\n###222222 ep(%d),cluster(%d),Send child(%d),gateway(%d),permitStatus(%d)\r\n",srcEp, clusterId, zclReportInfo.reportChildDeviceEnable, zclReportInfo.reportGatewayEnable, permitStatus);
ev_buf_free(buf);
return 0;
}
}else if (!permitStatus){
Tl_printf("\r\n###333333 ep(%d),cluster(%d),Send child(%d),gateway(%d),permitStatus(%d)\r\n",srcEp, clusterId, zclReportInfo.reportChildDeviceEnable, zclReportInfo.reportGatewayEnable, permitStatus);
ev_buf_free(buf);
return 0;
}
if (!memcmp(zclReportInfo.maskEui64Addr, req.dst_ext_addr, 8) && (zclReportInfo.dest_endpoint == req.dst_endpoint) && (zclReportInfo.endpoint == srcEp) ){
memset(zclReportInfo.maskEui64Addr, 0xff, 8);
zclReportInfo.endpoint = RESET_ENDPOINT;
zclReportInfo.dest_endpoint = RESET_ENDPOINT;
//KKK clear addr
Tl_printf("\r\n###444444 ep(%d),cluster(%d),Send child(%d),gateway(%d),permitStatus(%d)\r\n",srcEp, clusterId, zclReportInfo.reportChildDeviceEnable, zclReportInfo.reportGatewayEnable, permitStatus);
kZclClusterSetPermitReportInfo(srcEp, zclReportInfo.cluster, zclReportInfo.reportEnable, zclReportInfo.sceneRecallFlg, zclReportInfo.reportGatewayEnable, zclReportInfo.reportChildDeviceEnable, NULL, RESET_ENDPOINT);
ev_buf_free(buf);
return 0;
}
u8 status = zcl_sendCmd(srcEp, pDstEpInfo, clusterId, ZCL_CMD_REPORT, FALSE, direction, disableDefaultRsp, manuCode, seqNo, len, buf);
Tl_printf("\r\n###555555 ep(%d),cluster(%d),Send child(%d),gateway(%d),permitStatus(%d)\r\n",srcEp, clusterId, zclReportInfo.reportChildDeviceEnable, zclReportInfo.reportGatewayEnable, permitStatus);
ev_buf_free(buf);
......
......@@ -562,7 +562,7 @@ typedef struct {
* @brief Definition for ZCL layer sequence number.
*/
extern u8 zcl_seqNum;
#define ZCL_SEQ_NUM (zcl_seqNum++)
#define ZCL_SEQ_NUM (zcl_seqNum < 127?(++zcl_seqNum):((zcl_seqNum = 0?(++zcl_seqNum):0)))
extern const u16 zcl_attr_global_clusterRevision;
......
......@@ -465,6 +465,10 @@ _CODE_ZCL_ void reportNoMinLimit(void)
|| ((zcl_analogDataType(pAttrEntry->type)
&& reportableChangeValueChk(pAttrEntry->type, pAttrEntry->data, pEntry->prevData, pEntry->reportableChange)))
){
Tl_printf("ReportAttrTimerCb!!!!!!(%d),(%d)\r\n", \
(!zcl_analogDataType(pAttrEntry->type) && (memcmp(pEntry->prevData, pAttrEntry->data, len) != SUCCESS)),\
((zcl_analogDataType(pAttrEntry->type) && reportableChangeValueChk(pAttrEntry->type, pAttrEntry->data, pEntry->prevData, pEntry->reportableChange))));
//lmm add for report control
extern bool kZclClusterReportChangeCallback(uint8_t endpoint, uint16_t clusterId, uint16_t attributeId);
if (!kZclClusterReportChangeCallback(pEntry->endPoint, pEntry->clusterID, pEntry->attrID)){
......
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